diff --git a/internal/session/session.go b/internal/session/session.go index 0a68605..c061dad 100644 --- a/internal/session/session.go +++ b/internal/session/session.go @@ -250,9 +250,13 @@ func (s *Session) Wake() { } } -// Рецикл только по факту тишины: сон сам по себе аллокацию не убивает (lifetime 600 c), -// а keepalive туннеля идёт через тот же relay и растит Rx. Заодно схлопывает каскад - -// гэп-детектор ядра и SCREEN_ON с платформы приходят почти одновременно. +func (s *Session) Reconnect() { + select { + case s.reconnectCh <- struct{}{}: + default: + } +} + func (s *Session) watchWake(ctx context.Context) { for { select { @@ -261,10 +265,7 @@ func (s *Session) watchWake(ctx context.Context) { case <-s.wakeCh: } if s.wakeNeedsRecycle(ctx) { - select { - case s.reconnectCh <- struct{}{}: - default: - } + s.Reconnect() } } } diff --git a/mobile/api.go b/mobile/api.go index d1d152a..2c579af 100644 --- a/mobile/api.go +++ b/mobile/api.go @@ -11,6 +11,7 @@ import ( "sync/atomic" "time" + "github.com/samosvalishe/free-turn-proxy/internal/client/dnsdial" "github.com/samosvalishe/free-turn-proxy/internal/config" "github.com/samosvalishe/free-turn-proxy/internal/provider/vk" "github.com/samosvalishe/free-turn-proxy/internal/session" @@ -155,6 +156,18 @@ func Wake() { } } +// Reconnect пересоздаёт TURN-аллокации, не трогая туннель и tun-дескриптор. +func Reconnect() { + if l := current.Load(); l != nil { + l.sess.Reconnect() + } +} + +// SetDNSServers подменяет UDP-резолверы на лету, без перезапуска сессии. +func SetDNSServers(servers string) { + dnsdial.SetUDPDNSServers(strings.Split(servers, ",")) +} + func stopLocked() { l := current.Swap(nil) if l == nil {