diff --git a/internal/client/client.go b/internal/client/client.go index ce482f4..d1a342c 100644 --- a/internal/client/client.go +++ b/internal/client/client.go @@ -219,14 +219,12 @@ func (c *Client) addPeer( } func (c *Client) onReconnect(peerID int, dc *webrtc.DataChannel) { - if dc == nil { - log.Printf("peer %d channel closed", peerID) - return - } + log.Printf("peer %d reconnect event: dc=%v", peerID, dc != nil) - log.Printf("peer %d reconnected", peerID) - c.mux.UpdateSendFunc(c.sendFrame) - c.mux.Reset() + if dc != nil { + c.mux.UpdateSendFunc(c.sendFrame) + c.mux.Reset() + } } func (c *Client) sendResetSignal() { diff --git a/internal/server/server.go b/internal/server/server.go index 7549128..a14c7f3 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -213,12 +213,7 @@ func (s *Server) addPeer(ctx context.Context, roomURL string, peerID int, cancel } func (s *Server) handlePeerReconnect(peerID int, dc *webrtc.DataChannel) { - if dc == nil { - log.Printf("peer %d channel closed", peerID) - return - } - - log.Printf("peer %d reconnected", peerID) + log.Printf("peer %d reconnect event: dc=%v", peerID, dc != nil) s.connMu.Lock() for sid, conn := range s.connections { @@ -229,19 +224,20 @@ func (s *Server) handlePeerReconnect(peerID int, dc *webrtc.DataChannel) { } s.connMu.Unlock() - s.mux.UpdateSendFunc(func(frame []byte) error { - encrypted, err := s.cipher.Encrypt(frame) - if err != nil { - return fmt.Errorf("%w: %w", ErrEncryptFailed, err) - } - if len(s.peers) == 0 { - return ErrNoPeers - } - idx := s.peerIdx.Add(1) % uint32(len(s.peers)) //nolint:gosec - return s.peers[idx].Send(encrypted) - }) - - s.mux.Reset() + if dc != nil { + s.mux.UpdateSendFunc(func(frame []byte) error { + encrypted, err := s.cipher.Encrypt(frame) + if err != nil { + return fmt.Errorf("%w: %w", ErrEncryptFailed, err) + } + if len(s.peers) == 0 { + return ErrNoPeers + } + idx := s.peerIdx.Add(1) % uint32(len(s.peers)) //nolint:gosec + return s.peers[idx].Send(encrypted) + }) + s.mux.Reset() + } } func (s *Server) socks5Connect(conn net.Conn, targetAddr string, targetPort int) error { diff --git a/internal/telemost/peer.go b/internal/telemost/peer.go index 7286c5e..3d68cde 100644 --- a/internal/telemost/peer.go +++ b/internal/telemost/peer.go @@ -938,6 +938,10 @@ func (p *Peer) reconnect(ctx context.Context) error { p.reconnecting.Store(true) defer p.reconnecting.Store(false) + if p.onReconnect != nil { + p.onReconnect(nil) + } + p.sendLeave(uuid.New().String()) time.Sleep(500 * time.Millisecond) p.stopSession()