Skip to content

Commit b7f2900

Browse files
committed
feat: LocalTrackRepublished event
1 parent e796fdd commit b7f2900

2 files changed

Lines changed: 21 additions & 1 deletion

File tree

livekit-rtc/livekit/rtc/room.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
"participant_active",
5353
"local_track_published",
5454
"local_track_unpublished",
55+
"local_track_republished",
5556
"local_track_subscribed",
5657
"track_published",
5758
"track_unpublished",
@@ -346,6 +347,11 @@ def on(self, event: EventTypes, callback: Optional[Callable] = None) -> Callable
346347
- Arguments: `publication` (LocalTrackPublication), `track` (Track)
347348
- **"local_track_unpublished"**: Called when a local track is unpublished.
348349
- Arguments: `publication` (LocalTrackPublication)
350+
- **"local_track_republished"**: Called when the SDK auto-republished a local
351+
track during a full reconnect. The publication object is updated in place
352+
with the new server-assigned SIDs (its previous SID is passed alongside so
353+
callers can reconcile any external state keyed by the old SID).
354+
- Arguments: `publication` (LocalTrackPublication), `previous_sid` (str)
349355
- **"local_track_subscribed"**: Called when a local track is subscribed.
350356
- Arguments: `track` (Track)
351357
- **"track_published"**: Called when a remote participant publishes a track.
@@ -725,6 +731,20 @@ def _on_room_event(self, event: proto_room.RoomEvent):
725731
sid = event.local_track_unpublished.publication_sid
726732
lpublication = self.local_participant.track_publications[sid]
727733
self.emit("local_track_unpublished", lpublication)
734+
elif which == "local_track_republished":
735+
# The SDK auto-republished a local track during a full
736+
# reconnect: the underlying Track (and its bound source) is
737+
# preserved, but the publication and track SIDs were re-issued
738+
# by the server. Update the existing LocalTrackPublication
739+
# object in place so application code holding a cached
740+
# reference continues to see current state, then rekey it
741+
# under the new SID in the participant's publications dict.
742+
previous_sid = event.local_track_republished.previous_sid
743+
lpublication = self.local_participant._track_publications.pop(previous_sid, None)
744+
if lpublication is not None:
745+
lpublication._info = event.local_track_republished.info
746+
self.local_participant._track_publications[lpublication.sid] = lpublication
747+
self.emit("local_track_republished", lpublication, previous_sid)
728748
elif which == "local_track_subscribed":
729749
sid = event.local_track_subscribed.track_sid
730750
lpublication = self.local_participant.track_publications[sid]

0 commit comments

Comments
 (0)