From f61dc8c9578eb76f6cdf0a686af024ebbeab5b6b Mon Sep 17 00:00:00 2001 From: samosvalishe Date: Tue, 25 Aug 2026 01:56:19 +0300 Subject: [PATCH] =?UTF-8?q?feat(session):=20=D1=80=D0=B5=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D0=BD=D0=B5=D0=BA=D1=82=20=D1=80=D0=B5=D0=BB=D0=B5=D1=8F=20?= =?UTF-8?q?=D0=B1=D0=B5=D0=B7=20=D0=BF=D0=B5=D1=80=D0=B5=D1=81=D0=BE=D0=B7?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=82=D1=83=D0=BD=D0=BD=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/session/session.go | 15 ++++++++------- mobile/api.go | 13 +++++++++++++ 2 files changed, 21 insertions(+), 7 deletions(-) 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 {