Skip to content

Commit 36ec01b

Browse files
authored
feat: unpublish track (#21)
1 parent 8600e24 commit 36ec01b

File tree

6 files changed

+73
-57
lines changed

6 files changed

+73
-57
lines changed

client-sdk-rust

livekit/_proto/ffi_pb2.py

Lines changed: 12 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

livekit/_proto/ffi_pb2.pyi

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ class FfiEvent(google.protobuf.message.Message):
292292
DISCONNECT_FIELD_NUMBER: builtins.int
293293
DISPOSE_FIELD_NUMBER: builtins.int
294294
PUBLISH_TRACK_FIELD_NUMBER: builtins.int
295+
UNPUBLISH_TRACK_FIELD_NUMBER: builtins.int
295296
PUBLISH_DATA_FIELD_NUMBER: builtins.int
296297
@property
297298
def room_event(self) -> room_pb2.RoomEvent: ...
@@ -310,6 +311,8 @@ class FfiEvent(google.protobuf.message.Message):
310311
@property
311312
def publish_track(self) -> room_pb2.PublishTrackCallback: ...
312313
@property
314+
def unpublish_track(self) -> room_pb2.UnpublishTrackCallback: ...
315+
@property
313316
def publish_data(self) -> room_pb2.PublishDataCallback: ...
314317
def __init__(
315318
self,
@@ -322,11 +325,12 @@ class FfiEvent(google.protobuf.message.Message):
322325
disconnect: room_pb2.DisconnectCallback | None = ...,
323326
dispose: global___DisposeCallback | None = ...,
324327
publish_track: room_pb2.PublishTrackCallback | None = ...,
328+
unpublish_track: room_pb2.UnpublishTrackCallback | None = ...,
325329
publish_data: room_pb2.PublishDataCallback | None = ...,
326330
) -> None: ...
327-
def HasField(self, field_name: typing_extensions.Literal["audio_stream_event", b"audio_stream_event", "connect", b"connect", "disconnect", b"disconnect", "dispose", b"dispose", "message", b"message", "publish_data", b"publish_data", "publish_track", b"publish_track", "room_event", b"room_event", "track_event", b"track_event", "video_stream_event", b"video_stream_event"]) -> builtins.bool: ...
328-
def ClearField(self, field_name: typing_extensions.Literal["audio_stream_event", b"audio_stream_event", "connect", b"connect", "disconnect", b"disconnect", "dispose", b"dispose", "message", b"message", "publish_data", b"publish_data", "publish_track", b"publish_track", "room_event", b"room_event", "track_event", b"track_event", "video_stream_event", b"video_stream_event"]) -> None: ...
329-
def WhichOneof(self, oneof_group: typing_extensions.Literal["message", b"message"]) -> typing_extensions.Literal["room_event", "track_event", "video_stream_event", "audio_stream_event", "connect", "disconnect", "dispose", "publish_track", "publish_data"] | None: ...
331+
def HasField(self, field_name: typing_extensions.Literal["audio_stream_event", b"audio_stream_event", "connect", b"connect", "disconnect", b"disconnect", "dispose", b"dispose", "message", b"message", "publish_data", b"publish_data", "publish_track", b"publish_track", "room_event", b"room_event", "track_event", b"track_event", "unpublish_track", b"unpublish_track", "video_stream_event", b"video_stream_event"]) -> builtins.bool: ...
332+
def ClearField(self, field_name: typing_extensions.Literal["audio_stream_event", b"audio_stream_event", "connect", b"connect", "disconnect", b"disconnect", "dispose", b"dispose", "message", b"message", "publish_data", b"publish_data", "publish_track", b"publish_track", "room_event", b"room_event", "track_event", b"track_event", "unpublish_track", b"unpublish_track", "video_stream_event", b"video_stream_event"]) -> None: ...
333+
def WhichOneof(self, oneof_group: typing_extensions.Literal["message", b"message"]) -> typing_extensions.Literal["room_event", "track_event", "video_stream_event", "audio_stream_event", "connect", "disconnect", "dispose", "publish_track", "unpublish_track", "publish_data"] | None: ...
330334

331335
global___FfiEvent = FfiEvent
332336

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version https://git-lfs.github.com/spec/v1
2-
oid sha256:f98811d47068760e512e51ba9967b70597977059a41ff9c9959c4540827c0007
3-
size 15007512
2+
oid sha256:c78d6904e35e79e4c9d731cd36a387e5bedfa45adaee400ba39f5db257845918
3+
size 15024824

livekit/participant.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ def __init__(self, message: str) -> None:
3434
self.message = message
3535

3636

37+
class UnpublishTrackError(Exception):
38+
def __init__(self, message: str) -> None:
39+
self.message = message
40+
41+
3742
class PublishDataError(Exception):
3843
def __init__(self, message: str) -> None:
3944
self.message = message
@@ -147,6 +152,30 @@ def on_publish_callback(cb: proto_room.PublishTrackCallback):
147152
self.tracks[track_publication.sid] = track_publication
148153
return track_publication
149154

155+
async def unpublish_track(self, track_sid: str) -> None:
156+
req = proto_ffi.FfiRequest()
157+
req.unpublish_track.local_participant_handle = self._ffi_handle.handle
158+
req.unpublish_track.track_sid = track_sid
159+
160+
resp = ffi_client.request(req)
161+
162+
future: asyncio.Future[proto_room.UnpublishTrackCallback] = asyncio.Future(
163+
)
164+
165+
@ffi_client.on('unpublish_track')
166+
def on_unpublish_callback(cb: proto_room.UnpublishTrackCallback):
167+
if cb.async_id == resp.unpublish_track.async_id:
168+
future.set_result(cb)
169+
ffi_client.remove_listener(
170+
'unpublish_track', on_unpublish_callback)
171+
172+
cb = await future
173+
if cb.error:
174+
raise UnpublishTrackError(cb.error)
175+
176+
publication = self.tracks.pop(track_sid)
177+
publication.track = None
178+
150179

151180
class RemoteParticipant(Participant):
152181
def __init__(self, handle: FfiHandle, info: proto_participant.ParticipantInfo) \

0 commit comments

Comments
 (0)