From cf06c236cb197b4a2ae99012c8ff83b46c11a050 Mon Sep 17 00:00:00 2001 From: David Zhao Date: Mon, 24 Feb 2025 19:41:41 -0800 Subject: [PATCH] fix: race that causes LocalParticipant to show up as RemoteParticipant (#619) * fix: race that causes LocalParticipant to show up as RemoteParticipant RTCEngine.JoinContext starts SignalClient's dispatch loop. If there's an update to the local participant (in the form of ParticipantUpdate) before PeerConnection is established, then we would incorrectly categorize the LocalParticipant as a RemoteParticipant. * actually call it * fix staticcheck --- engine.go | 5 +++++ regionurlprovider.go | 9 +++++++-- room.go | 46 ++++++++++++++++++++++++-------------------- 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/engine.go b/engine.go index e7f722a7..b1d96fa0 100644 --- a/engine.go +++ b/engine.go @@ -83,6 +83,7 @@ type RTCEngine struct { OnResuming func() OnResumed func() OnTranscription func(*livekit.Transcription) + OnSignalClientConnected func(*livekit.JoinResponse) // callbacks to get data CbGetLocalParticipantSID func() string @@ -160,6 +161,10 @@ func (e *RTCEngine) JoinContext(ctx context.Context, url string, token string, p return nil, err } + if e.OnSignalClientConnected != nil { + e.OnSignalClientConnected(res) + } + e.client.Start() // send offer diff --git a/regionurlprovider.go b/regionurlprovider.go index 415ba810..b804919d 100644 --- a/regionurlprovider.go +++ b/regionurlprovider.go @@ -78,14 +78,19 @@ func (r *regionURLProvider) RefreshRegionSettings(cloudHostname, token string) e return errors.New("refreshRegionSettings failed to decode region settings: " + err.Error()) } - r.mutex.Lock() - r.hostnameSettingsCache[cloudHostname] = &hostnameSettingsCacheItem{ + item := &hostnameSettingsCacheItem{ regionSettings: regions, updatedAt: time.Now(), regionURLAttempts: map[string]int{}, } + r.mutex.Lock() + r.hostnameSettingsCache[cloudHostname] = item r.mutex.Unlock() + if len(item.regionSettings.Regions) == 0 { + logger.Warnw("no regions returned", nil, "cloudHostname", cloudHostname) + } + return nil } diff --git a/room.go b/room.go index d4177114..d8a6f3a5 100644 --- a/room.go +++ b/room.go @@ -189,6 +189,7 @@ func NewRoom(callback *RoomCallback) *Room { r.LocalParticipant = newLocalParticipant(engine, r.callback) // callbacks from engine + engine.OnSignalClientConnected = r.handleSignalClientConnected engine.OnMediaTrack = r.handleMediaTrack engine.OnDisconnected = r.handleDisconnect engine.OnParticipantUpdate = r.handleParticipantUpdate @@ -328,6 +329,7 @@ func (r *Room) JoinWithToken(url, token string, opts ...ConnectOption) error { d := time.Duration(1<