diff --git a/go.mod b/go.mod index 96d337038..e5f3ed930 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/pion/sdp/v3 v3.0.9 github.com/pion/transport/v2 v2.2.10 github.com/pion/turn/v2 v2.1.6 - github.com/pion/webrtc/v3 v3.3.1 + github.com/pion/webrtc/v3 v3.3.2 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.20.3 github.com/redis/go-redis/v9 v9.6.1 diff --git a/go.sum b/go.sum index 4e32b7d4a..3ac74391b 100644 --- a/go.sum +++ b/go.sum @@ -272,8 +272,8 @@ github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uP github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= -github.com/pion/webrtc/v3 v3.3.1 h1:VAJr70z+YQ5sNwMhYA7HgRFfu9qlHWKRtNPTU7EY71s= -github.com/pion/webrtc/v3 v3.3.1/go.mod h1:hVmrDJvwhEertRWObeb1xzulzHGeVUoPlWvxdGzcfU0= +github.com/pion/webrtc/v3 v3.3.2 h1:9Cjt3n90UVG1am1JZ3I7qdIosc7F2rVBeJdhlfqn9R4= +github.com/pion/webrtc/v3 v3.3.2/go.mod h1:hVmrDJvwhEertRWObeb1xzulzHGeVUoPlWvxdGzcfU0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/pkg/rtc/transport.go b/pkg/rtc/transport.go index 21b897d40..3a7183552 100644 --- a/pkg/rtc/transport.go +++ b/pkg/rtc/transport.go @@ -225,6 +225,7 @@ type PCTransport struct { pendingRestartIceOffer *webrtc.SessionDescription connectionDetails *types.ICEConnectionDetails + selectedPair atomic.Pointer[webrtc.ICECandidatePair] } type TransportParams struct { @@ -464,6 +465,12 @@ func (t *PCTransport) createPeerConnection() error { t.pc.OnDataChannel(t.onDataChannel) t.pc.OnTrack(t.params.Handler.OnTrack) + t.pc.SCTP().Transport().ICETransport().OnSelectedCandidatePairChange(func(pair *webrtc.ICECandidatePair) { + t.params.Logger.Debugw("selected ICE candidate pair changed", "pair", wrappedICECandidatePairLogger{pair}) + t.connectionDetails.SetSelectedPair(pair) + t.selectedPair.Store(pair) + }) + t.me = me if bwe != nil && t.streamAllocator != nil { @@ -575,34 +582,6 @@ func (t *PCTransport) IsShortConnection(at time.Time) (bool, time.Duration) { return duration < shortConnectionThreshold, duration } -func (t *PCTransport) getSelectedPair() (*webrtc.ICECandidatePair, error) { - s := t.pc.SCTP() - if s == nil { - return nil, errors.New("no SCTP") - } - - dtlsTransport := s.Transport() - if dtlsTransport == nil { - return nil, errors.New("no DTLS transport") - } - - iceTransport := dtlsTransport.ICETransport() - if iceTransport == nil { - return nil, errors.New("no ICE transport") - } - - pair, err := iceTransport.GetSelectedCandidatePair() - if err != nil { - return nil, err - } - - if pair == nil { - return nil, errors.New("no selected pair") - } - - return pair, err -} - func (t *PCTransport) setConnectedAt(at time.Time) bool { t.lock.Lock() t.connectedAt = at @@ -641,8 +620,7 @@ func (t *PCTransport) handleConnectionFailed(forceShortConn bool) { var duration time.Duration isShort, duration = t.IsShortConnection(time.Now()) if isShort { - pair, err := t.getSelectedPair() - t.params.Logger.Debugw("short ICE connection", "error", err, "pair", wrappedICECandidatePairLogger{pair}, "duration", duration) + t.params.Logger.Debugw("short ICE connection", "pair", wrappedICECandidatePairLogger{t.selectedPair.Load()}, "duration", duration) } } @@ -654,14 +632,6 @@ func (t *PCTransport) onICEConnectionStateChange(state webrtc.ICEConnectionState switch state { case webrtc.ICEConnectionStateConnected: t.setICEConnectedAt(time.Now()) - go func() { - pair, err := t.getSelectedPair() - if err != nil { - t.params.Logger.Warnw("failed to get selected candidate pair", err) - return - } - t.connectionDetails.SetSelectedPair(pair) - }() case webrtc.ICEConnectionStateChecking: t.setICEStartedAt(time.Now()) @@ -679,8 +649,7 @@ func (t *PCTransport) onPeerConnectionStateChange(state webrtc.PeerConnectionSta t.maybeNotifyFullyEstablished() } else { - pair, err := t.getSelectedPair() - t.params.Logger.Infow("ice reconnected", "error", err, "pair", wrappedICECandidatePairLogger{pair}) + t.params.Logger.Infow("ice reconnected", "pair", wrappedICECandidatePairLogger{t.selectedPair.Load()}) } case webrtc.PeerConnectionStateFailed: t.clearConnTimer()