@@ -106,9 +106,7 @@ def __init__(
106106 ```
107107 """
108108 self ._track : Track | None = track
109- self ._room_ref : "Optional[weakref.ref[Room]]" = (
110- weakref .ref (room ) if room is not None else None
111- )
109+ self ._room_ref : "Optional[weakref.ref[Room]]" = None
112110 self ._sample_rate = sample_rate
113111 self ._num_channels = num_channels
114112 self ._frame_size_ms = frame_size_ms
@@ -143,6 +141,8 @@ def __init__(
143141 self ._ffi_handle = FfiHandle (stream .handle .id )
144142 self ._info = stream .info
145143
144+ self ._set_room (room )
145+
146146 if self ._track is not None :
147147 self ._track ._register_audio_stream (self )
148148
@@ -248,20 +248,33 @@ def from_track(
248248 )
249249
250250 def _set_room (self , room : Optional ["Room" ]) -> None :
251+ old_room = self ._resolve_room ()
252+ if old_room is not room :
253+ if old_room is not None :
254+ old_room .off ("token_refreshed" , self ._on_room_token_refreshed )
255+ if room is not None :
256+ room .on ("token_refreshed" , self ._on_room_token_refreshed )
257+
251258 self ._room_ref = weakref .ref (room ) if room is not None else None
252259
253- if self ._processor :
254- room = self ._resolve_room ()
255- if room :
256- if room ._token is not None and room ._server_url is not None :
257- self ._processor ._on_credentials_updated (token = room ._token , url = room ._server_url )
260+ if self ._processor and room is not None :
261+ if room ._token is not None and room ._server_url is not None :
262+ self ._processor ._on_credentials_updated (token = room ._token , url = room ._server_url )
258263
259- participant_identity , publication_sid = self ._find_publication () or ("" , "" )
260- self ._processor ._on_stream_info_updated (
261- room_name = room .name ,
262- participant_identity = participant_identity ,
263- publication_sid = publication_sid ,
264- )
264+ participant_identity , publication_sid = self ._find_publication () or ("" , "" )
265+ self ._processor ._on_stream_info_updated (
266+ room_name = room .name ,
267+ participant_identity = participant_identity ,
268+ publication_sid = publication_sid ,
269+ )
270+
271+ def _on_room_token_refreshed (self ) -> None :
272+ if self ._processor is None :
273+ return
274+ room = self ._resolve_room ()
275+ if room is None or room ._token is None or room ._server_url is None :
276+ return
277+ self ._processor ._on_credentials_updated (token = room ._token , url = room ._server_url )
265278
266279 def _resolve_room (self ) -> Optional ["Room" ]:
267280 return self ._room_ref () if self ._room_ref is not None else None
@@ -360,6 +373,7 @@ async def aclose(self) -> None:
360373 """
361374 if self ._track is not None :
362375 self ._track ._unregister_audio_stream (self )
376+ self ._set_room (None )
363377 self ._ffi_handle .dispose ()
364378 await self ._task
365379
0 commit comments