From cbb1f0f2fe8589fd6c0a09a27924b52ac47bd06a Mon Sep 17 00:00:00 2001 From: zarazaex69 Date: Sun, 12 Apr 2026 16:25:00 +0300 Subject: [PATCH] feat(server): add active client tracking and conditional reconnection --- internal/server/server.go | 7 +++++++ internal/telemost/peer.go | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/internal/server/server.go b/internal/server/server.go index e4222e4..1616cc5 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -30,6 +30,7 @@ type Server struct { streamPumps map[uint16]net.Conn pumpMu sync.Mutex peerIdx atomic.Uint32 + activeClients atomic.Int32 wg sync.WaitGroup dnsServer string dnsCache sync.Map @@ -171,6 +172,10 @@ func Run(ctx context.Context, roomURL, keyHex string, duo bool, dnsServer, socks log.Println("Server multiplexer reset complete") }) + peer.SetShouldReconnect(func() bool { + return s.activeClients.Load() > 0 + }) + log.Printf("Connecting peer %d to Telemost...", peerID) if err := peer.Connect(runCtx); err != nil { return err @@ -414,11 +419,13 @@ func (s *Server) handleConnect(ctx context.Context, sid uint16, req ConnectReque log.Printf("[SERVER] sid=%d CONNECT_SUCCESS dial_time=%v", sid, dialElapsed) + s.activeClients.Add(1) s.mux.SendData(sid, []byte{0x00}) s.startStreamPump(ctx, sid, conn) go func() { defer func() { + s.activeClients.Add(-1) s.mux.CloseStream(sid) s.connMu.Lock() delete(s.connections, sid) diff --git a/internal/telemost/peer.go b/internal/telemost/peer.go index 60b1073..13b54c3 100644 --- a/internal/telemost/peer.go +++ b/internal/telemost/peer.go @@ -44,6 +44,7 @@ type Peer struct { dc *webrtc.DataChannel onData func([]byte) onReconnect func(*webrtc.DataChannel) + shouldReconnect func() bool reconnectCh chan struct{} closeCh chan struct{} keepAliveCh chan struct{} @@ -131,6 +132,10 @@ func (p *Peer) queueReconnect() { if p.closed.Load() || p.reconnecting.Load() { return } + if p.shouldReconnect != nil && !p.shouldReconnect() { + log.Println("Reconnect skipped: shouldReconnect returned false") + return + } select { case p.reconnectCh <- struct{}{}: default: @@ -983,6 +988,10 @@ func (p *Peer) SetReconnectCallback(cb func(*webrtc.DataChannel)) { p.onReconnect = cb } +func (p *Peer) SetShouldReconnect(fn func() bool) { + p.shouldReconnect = fn +} + func (p *Peer) WatchConnection(ctx context.Context) { const maxReconnects = 10 const reconnectWindow = 5 * time.Minute