fix(reconnect): guard mux operations behind data channel validity check

This commit is contained in:
zarazaex69
2026-04-14 00:24:22 +03:00
parent 0aa73f72ef
commit 1509f28e23
3 changed files with 24 additions and 26 deletions

View File

@@ -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() {

View File

@@ -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 {

View File

@@ -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()