Skip to content

Commit 1add524

Browse files
authored
fix(rtc): handle repeated local track subscription events (#771)
1 parent caaa961 commit 1add524

2 files changed

Lines changed: 34 additions & 1 deletion

File tree

livekit-rtc/livekit/rtc/room.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,8 @@ def _on_room_event(self, event: proto_room.RoomEvent) -> None:
814814
elif which == "local_track_subscribed":
815815
sid = event.local_track_subscribed.track_sid
816816
lpublication = self.local_participant.track_publications[sid]
817-
lpublication._first_subscription.set_result(None)
817+
if not lpublication._first_subscription.done():
818+
lpublication._first_subscription.set_result(None)
818819
self.emit("local_track_subscribed", lpublication.track)
819820
elif which == "track_published":
820821
# The participant may already have been removed by a racing

livekit-rtc/tests/test_audio_stream_room_lifecycle.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,38 @@ def test_local_track_republished_updates_track_sid_and_repushes_metadata() -> No
550550
}
551551

552552

553+
@pytest.mark.asyncio
554+
async def test_repeated_local_track_subscribed_event_does_not_raise() -> None:
555+
"""A full reconnect can repeat local_track_subscribed for a publication
556+
whose first-subscription future is already complete.
557+
"""
558+
room = _make_room()
559+
local = _make_local_participant("agent")
560+
room._local_participant = local
561+
562+
track = _make_track(sid="TR_1")
563+
publication = _make_local_publication(sid="TR_1")
564+
publication._track = track
565+
publication._first_subscription = asyncio.Future()
566+
local._track_publications["TR_1"] = publication
567+
568+
subscribed_tracks: list[rtc.Track | None] = []
569+
570+
@room.on("local_track_subscribed")
571+
def _on_local_track_subscribed(subscribed_track: rtc.Track | None) -> None:
572+
subscribed_tracks.append(subscribed_track)
573+
574+
event = proto_room.RoomEvent(
575+
local_track_subscribed=proto_room.LocalTrackSubscribed(track_sid="TR_1")
576+
)
577+
room._on_room_event(event)
578+
await publication.wait_for_subscription()
579+
room._on_room_event(event)
580+
581+
assert publication._first_subscription.done()
582+
assert subscribed_tracks == [track, track]
583+
584+
553585
# -- unpublish_track / room-event race ----------------------------------------
554586

555587

0 commit comments

Comments
 (0)