Use OnSelectedCandidatePairChanged to keep track of selected pair. (#3004)

* Use OnSelectedCandidatePairChanged to keep track of selected pair.

* update webrtc dep
This commit is contained in:
Raja Subramanian
2024-09-16 19:44:21 +05:30
committed by GitHub
parent 3c8a7d7828
commit a0b4c39fd5
3 changed files with 12 additions and 43 deletions
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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=
+9 -40
View File
@@ -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()