From 6378a8ccd325ddcf79357f372bfe664549cfe5b7 Mon Sep 17 00:00:00 2001 From: Filipi Fuchter Date: Thu, 10 Apr 2025 23:02:27 -0300 Subject: [PATCH 1/3] Starting to implement a signalling message to when the bot has left --- src/pipecat/transports/network/small_webrtc.py | 2 +- src/pipecat/transports/network/webrtc_connection.py | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/pipecat/transports/network/small_webrtc.py b/src/pipecat/transports/network/small_webrtc.py index 2eea370b4..2b4583288 100644 --- a/src/pipecat/transports/network/small_webrtc.py +++ b/src/pipecat/transports/network/small_webrtc.py @@ -308,7 +308,7 @@ class SmallWebRTCClient: if self.is_connected and not self.is_closing: logger.info(f"Disconnecting to Small WebRTC") self._closing = True - await self._webrtc_connection.close() + await self._webrtc_connection.disconnect() await self._handle_client_disconnected() async def send_message(self, frame: TransportMessageFrame | TransportMessageUrgentFrame): diff --git a/src/pipecat/transports/network/webrtc_connection.py b/src/pipecat/transports/network/webrtc_connection.py index bd4a7ee1e..83e32dd48 100644 --- a/src/pipecat/transports/network/webrtc_connection.py +++ b/src/pipecat/transports/network/webrtc_connection.py @@ -226,7 +226,7 @@ class SmallWebRTCConnection(BaseObject): logger.debug("Closing old peer connection") # removing the listeners to prevent the bot from closing self._pc.remove_all_listeners() - await self.close() + await self._close() # we are initializing a new peer connection in this case. self._initialize() @@ -271,7 +271,13 @@ class SmallWebRTCConnection(BaseObject): else: logger.warning("Video transceiver not found. Cannot replace video track.") - async def close(self): + async def disconnect(self): + # TODO: we should trigger something to know we are leaving + # so the client does not try to reconnect + # Like participant left + await self._close() + + async def _close(self): if self._pc: await self._pc.close() self._message_queue.clear() @@ -296,7 +302,7 @@ class SmallWebRTCConnection(BaseObject): await self._call_event_handler(state) if state == "failed": logger.warning("Connection failed, closing peer connection.") - await self.close() + await self._close() # Despite the fact that aiortc provides this listener, they don't have a status for "disconnected" # So, there is no advantage in looking at self._pc.connectionState From 255666925b4ea87269ca7e9d2b999874b578baf1 Mon Sep 17 00:00:00 2001 From: Filipi Fuchter Date: Fri, 11 Apr 2025 15:35:50 -0300 Subject: [PATCH 2/3] Sending a new signalling message peerLeft. --- src/pipecat/transports/network/webrtc_connection.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/pipecat/transports/network/webrtc_connection.py b/src/pipecat/transports/network/webrtc_connection.py index 83e32dd48..7e8dd8a0f 100644 --- a/src/pipecat/transports/network/webrtc_connection.py +++ b/src/pipecat/transports/network/webrtc_connection.py @@ -43,6 +43,8 @@ class TrackStatusMessage(BaseModel): class RenegotiateMessage(BaseModel): type: Literal["renegotiate"] = "renegotiate" +class PeerLeftMessage(BaseModel): + type: Literal["peerLeft"] = "peerLeft" class SignallingMessage: Inbound = Union[TrackStatusMessage] # in case we need to add new messages in the future @@ -272,9 +274,9 @@ class SmallWebRTCConnection(BaseObject): logger.warning("Video transceiver not found. Cannot replace video track.") async def disconnect(self): - # TODO: we should trigger something to know we are leaving - # so the client does not try to reconnect - # Like participant left + self.send_app_message( + {"type": SIGNALLING_TYPE, "message": PeerLeftMessage().model_dump()} + ) await self._close() async def _close(self): From 816b3a95456a80c909d58154ab0a1e21c5109aa7 Mon Sep 17 00:00:00 2001 From: Filipi Fuchter Date: Fri, 11 Apr 2025 15:37:16 -0300 Subject: [PATCH 3/3] Fixing ruff format --- src/pipecat/transports/network/webrtc_connection.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pipecat/transports/network/webrtc_connection.py b/src/pipecat/transports/network/webrtc_connection.py index 7e8dd8a0f..d4e3224ed 100644 --- a/src/pipecat/transports/network/webrtc_connection.py +++ b/src/pipecat/transports/network/webrtc_connection.py @@ -43,9 +43,11 @@ class TrackStatusMessage(BaseModel): class RenegotiateMessage(BaseModel): type: Literal["renegotiate"] = "renegotiate" + class PeerLeftMessage(BaseModel): type: Literal["peerLeft"] = "peerLeft" + class SignallingMessage: Inbound = Union[TrackStatusMessage] # in case we need to add new messages in the future outbound = Union[RenegotiateMessage] @@ -274,9 +276,7 @@ class SmallWebRTCConnection(BaseObject): logger.warning("Video transceiver not found. Cannot replace video track.") async def disconnect(self): - self.send_app_message( - {"type": SIGNALLING_TYPE, "message": PeerLeftMessage().model_dump()} - ) + self.send_app_message({"type": SIGNALLING_TYPE, "message": PeerLeftMessage().model_dump()}) await self._close() async def _close(self):