feat(session): реконнект релея без пересоздания туннеля

This commit is contained in:
samosvalishe
2026-08-25 01:56:19 +03:00
parent 48631616f1
commit f61dc8c957
2 changed files with 21 additions and 7 deletions
+8 -7
View File
@@ -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()
}
}
}
+13
View File
@@ -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 {