|
52 | 52 | "participant_active", |
53 | 53 | "local_track_published", |
54 | 54 | "local_track_unpublished", |
| 55 | + "local_track_republished", |
55 | 56 | "local_track_subscribed", |
56 | 57 | "track_published", |
57 | 58 | "track_unpublished", |
@@ -346,6 +347,11 @@ def on(self, event: EventTypes, callback: Optional[Callable] = None) -> Callable |
346 | 347 | - Arguments: `publication` (LocalTrackPublication), `track` (Track) |
347 | 348 | - **"local_track_unpublished"**: Called when a local track is unpublished. |
348 | 349 | - 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) |
349 | 355 | - **"local_track_subscribed"**: Called when a local track is subscribed. |
350 | 356 | - Arguments: `track` (Track) |
351 | 357 | - **"track_published"**: Called when a remote participant publishes a track. |
@@ -725,6 +731,20 @@ def _on_room_event(self, event: proto_room.RoomEvent): |
725 | 731 | sid = event.local_track_unpublished.publication_sid |
726 | 732 | lpublication = self.local_participant.track_publications[sid] |
727 | 733 | 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) |
728 | 748 | elif which == "local_track_subscribed": |
729 | 749 | sid = event.local_track_subscribed.track_sid |
730 | 750 | lpublication = self.local_participant.track_publications[sid] |
|
0 commit comments