From 3a6c9786e838f4a29c58dac38c69685ff7efae50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Conchillo=20Flaqu=C3=A9?= Date: Wed, 17 Sep 2025 09:33:26 -0700 Subject: [PATCH] LiveKitTransport: added synchronous before_disconnect event --- CHANGELOG.md | 3 ++- src/pipecat/transports/livekit/transport.py | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8964c174c..3573bec5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Added `on_before_disconnect` synchronous event to `DailyTransport`. +- Added `on_before_disconnect` synchronous event to `DailyTransport` and + `LiveKitTransport`. - It is now possible to register synchronous event handlers. By default, all event handlers are executed in a separate task. However, in some cases we want diff --git a/src/pipecat/transports/livekit/transport.py b/src/pipecat/transports/livekit/transport.py index 3e7ccfdf7..227a9f4f9 100644 --- a/src/pipecat/transports/livekit/transport.py +++ b/src/pipecat/transports/livekit/transport.py @@ -114,6 +114,7 @@ class LiveKitCallbacks(BaseModel): on_connected: Callable[[], Awaitable[None]] on_disconnected: Callable[[], Awaitable[None]] + on_before_disconnect: Callable[[], Awaitable[None]] on_participant_connected: Callable[[str], Awaitable[None]] on_participant_disconnected: Callable[[str], Awaitable[None]] on_audio_track_subscribed: Callable[[str], Awaitable[None]] @@ -282,6 +283,7 @@ class LiveKitTransportClient: return logger.info(f"Disconnecting from {self._room_name}") + await self._callbacks.on_before_disconnect() await self.room.disconnect() self._connected = False logger.info(f"Disconnected from {self._room_name}") @@ -918,6 +920,7 @@ class LiveKitTransport(BaseTransport): callbacks = LiveKitCallbacks( on_connected=self._on_connected, on_disconnected=self._on_disconnected, + on_before_disconnect=self._on_before_disconnect, on_participant_connected=self._on_participant_connected, on_participant_disconnected=self._on_participant_disconnected, on_audio_track_subscribed=self._on_audio_track_subscribed, @@ -947,6 +950,7 @@ class LiveKitTransport(BaseTransport): self._register_event_handler("on_first_participant_joined") self._register_event_handler("on_participant_left") self._register_event_handler("on_call_state_updated") + self._register_event_handler("on_before_disconnect", sync=True) def input(self) -> LiveKitInputTransport: """Get the input transport for receiving media and events. @@ -1041,6 +1045,10 @@ class LiveKitTransport(BaseTransport): """Handle room disconnected events.""" await self._call_event_handler("on_disconnected") + async def _on_before_disconnect(self): + """Handle before disconnection room events.""" + await self._call_event_handler("on_before_disconnect") + async def _on_participant_connected(self, participant_id: str): """Handle participant connected events.""" await self._call_event_handler("on_participant_connected", participant_id)