From cca47023578e33c994065d6f18e09a0a9994d56a Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Sat, 7 Jan 2023 13:11:16 +0100 Subject: [PATCH] webrtc muxer: fix race condition this happened when server was recreated due to API or hot reloading --- internal/core/webrtc_conn.go | 40 +++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/internal/core/webrtc_conn.go b/internal/core/webrtc_conn.go index a17dad1f..7cb491f0 100644 --- a/internal/core/webrtc_conn.go +++ b/internal/core/webrtc_conn.go @@ -310,7 +310,30 @@ func (c *webRTCConn) runInner(ctx context.Context) error { if err != nil { return err } - defer pc.Close() + + pcConnected := make(chan struct{}) + pcDisconnected := make(chan struct{}) + pcClosed := make(chan struct{}) + + pc.OnConnectionStateChange(func(state webrtc.PeerConnectionState) { + c.log(logger.Debug, "peer connection state: "+state.String()) + + switch state { + case webrtc.PeerConnectionStateConnected: + close(pcConnected) + + case webrtc.PeerConnectionStateDisconnected: + close(pcDisconnected) + + case webrtc.PeerConnectionStateClosed: + close(pcClosed) + } + }) + + defer func() { + pc.Close() + <-pcClosed + }() c.mutex.Lock() c.curPC = pc @@ -335,8 +358,6 @@ func (c *webRTCConn) runInner(ctx context.Context) error { } localCandidate := make(chan *webrtc.ICECandidate) - pcConnected := make(chan struct{}) - pcDisconnected := make(chan struct{}) pc.OnICECandidate(func(i *webrtc.ICECandidate) { if i != nil { @@ -347,19 +368,6 @@ func (c *webRTCConn) runInner(ctx context.Context) error { } } }) - - pc.OnConnectionStateChange(func(state webrtc.PeerConnectionState) { - c.log(logger.Debug, "peer connection state: "+state.String()) - - switch state { - case webrtc.PeerConnectionStateConnected: - close(pcConnected) - - case webrtc.PeerConnectionStateDisconnected: - close(pcDisconnected) - } - }) - err = pc.SetRemoteDescription(*offer) if err != nil { return err