fix: ensure webrtc close is executed only once.
This commit is contained in:
parent
08a5d5abb4
commit
2ff47ac920
1 changed files with 12 additions and 7 deletions
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
|
@ -567,6 +568,7 @@ func (manager *WebRTCManagerCtx) CreatePeer(session types.Session, bitrate int,
|
||||||
logger.Info().Interface("data_channel", dc).Msg("got remote data channel")
|
logger.Info().Interface("data_channel", dc).Msg("got remote data channel")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
var once sync.Once
|
||||||
connection.OnConnectionStateChange(func(state webrtc.PeerConnectionState) {
|
connection.OnConnectionStateChange(func(state webrtc.PeerConnectionState) {
|
||||||
switch state {
|
switch state {
|
||||||
case webrtc.PeerConnectionStateConnected:
|
case webrtc.PeerConnectionStateConnected:
|
||||||
|
|
@ -575,6 +577,8 @@ func (manager *WebRTCManagerCtx) CreatePeer(session types.Session, bitrate int,
|
||||||
webrtc.PeerConnectionStateFailed:
|
webrtc.PeerConnectionStateFailed:
|
||||||
connection.Close()
|
connection.Close()
|
||||||
case webrtc.PeerConnectionStateClosed:
|
case webrtc.PeerConnectionStateClosed:
|
||||||
|
// ensure we only run this once
|
||||||
|
once.Do(func() {
|
||||||
session.SetWebRTCConnected(peer, false)
|
session.SetWebRTCConnected(peer, false)
|
||||||
if err = video.RemoveReceiver(videoTrack); err != nil {
|
if err = video.RemoveReceiver(videoTrack); err != nil {
|
||||||
logger.Err(err).Msg("failed to remove video receiver")
|
logger.Err(err).Msg("failed to remove video receiver")
|
||||||
|
|
@ -582,6 +586,7 @@ func (manager *WebRTCManagerCtx) CreatePeer(session types.Session, bitrate int,
|
||||||
audioTrack.Shutdown()
|
audioTrack.Shutdown()
|
||||||
videoTrack.Shutdown()
|
videoTrack.Shutdown()
|
||||||
close(videoRtcp)
|
close(videoRtcp)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
manager.metrics.SetState(session, state)
|
manager.metrics.SetState(session, state)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue