From 90de06ce020ec7c5274977ed03e7f5ea7c916e9b Mon Sep 17 00:00:00 2001 From: cnderrauber Date: Fri, 26 Apr 2024 15:24:41 +0800 Subject: [PATCH] Make datachannel optional for publisher (#2686) --- pkg/rtc/participant.go | 1 - pkg/rtc/transport.go | 29 ++++++++++++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/pkg/rtc/participant.go b/pkg/rtc/participant.go index a80d3bee6..0c3481449 100644 --- a/pkg/rtc/participant.go +++ b/pkg/rtc/participant.go @@ -987,7 +987,6 @@ func (p *ParticipantImpl) SetMigrateState(s types.MigrateState) { p.TransportManager.ProcessPendingPublisherOffer() case types.MigrateStateComplete: - p.TransportManager.ProcessPendingPublisherDataChannels() } diff --git a/pkg/rtc/transport.go b/pkg/rtc/transport.go index 9ceca8e72..8e062f6d9 100644 --- a/pkg/rtc/transport.go +++ b/pkg/rtc/transport.go @@ -149,10 +149,12 @@ type PCTransport struct { lock sync.RWMutex - reliableDC *webrtc.DataChannel - reliableDCOpened bool - lossyDC *webrtc.DataChannel - lossyDCOpened bool + firstOfferReceived bool + firstOfferNoDataChannel bool + reliableDC *webrtc.DataChannel + reliableDCOpened bool + lossyDC *webrtc.DataChannel + lossyDCOpened bool iceStartedAt time.Time iceConnectedAt time.Time @@ -694,7 +696,9 @@ func (t *PCTransport) isFullyEstablished() bool { t.lock.RLock() defer t.lock.RUnlock() - return t.reliableDCOpened && t.lossyDCOpened && !t.connectedAt.IsZero() + dataChannelReady := t.firstOfferNoDataChannel || (t.reliableDCOpened && t.lossyDCOpened) + + return dataChannelReady && !t.connectedAt.IsZero() } func (t *PCTransport) SetPreferTCP(preferTCP bool) { @@ -1698,6 +1702,21 @@ func (t *PCTransport) handleRemoteOfferReceived(sd *webrtc.SessionDescription) e if err != nil { return nil } + + t.lock.Lock() + if !t.firstOfferReceived { + t.firstOfferReceived = true + var dataChannelFound bool + for _, media := range parsed.MediaDescriptions { + if strings.EqualFold(media.MediaName.Media, "application") { + dataChannelFound = true + break + } + } + t.firstOfferNoDataChannel = !dataChannelFound + } + t.lock.Unlock() + iceCredential, offerRestartICE, err := t.isRemoteOfferRestartICE(parsed) if err != nil { return errors.Wrap(err, "check remote offer restart ice failed")