diff --git a/src/audio_call_manager.py b/src/audio_call_manager.py index 1b32611..f7e5f88 100644 --- a/src/audio_call_manager.py +++ b/src/audio_call_manager.py @@ -15,6 +15,7 @@ class AudioCall: self.link.set_link_closed_callback(self.on_link_closed) self.link.set_packet_callback(self.on_packet) self.audio_packet_listeners = [] + self.hangup_listeners = [] def register_audio_packet_listener(self, callback): self.audio_packet_listeners.append(callback) @@ -22,10 +23,17 @@ class AudioCall: def unregister_audio_packet_listener(self, callback): self.audio_packet_listeners.remove(callback) + def register_hangup_listener(self, callback): + self.hangup_listeners.append(callback) + # handle link being closed def on_link_closed(self, link): print("[AudioCall] on_link_closed") + # call all hangup listeners + for hangup_listener in self.hangup_listeners: + hangup_listener() + # handle packet received over link def on_packet(self, message, packet): diff --git a/web.py b/web.py index 6e3aede..7f3a2eb 100644 --- a/web.py +++ b/web.py @@ -316,8 +316,18 @@ class ReticulumWebChat: # ignore errors sending audio packets to websocket pass + # close websocket when call is hungup + def on_hangup(): + if websocket_response.closed is False: + try: + asyncio.run(websocket_response.close(code=WSCloseCode.GOING_AWAY)) + except: + # ignore errors closing websocket + pass + # register audio packet listener audio_call.register_audio_packet_listener(on_audio_packet) + audio_call.register_hangup_listener(on_hangup) # prepare websocket response websocket_response = web.WebSocketResponse()