From d58a29f4f9a126442c1cba7356355c89429b42ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Sun, 24 Jul 2022 20:26:49 +0000 Subject: [PATCH] Allow closed websocket connections to be garbage collected --- custom_components/browser_mod/browser.py | 10 +++++++--- custom_components/browser_mod/connection.py | 12 ++++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/custom_components/browser_mod/browser.py b/custom_components/browser_mod/browser.py index 25d47dc..ce279b3 100644 --- a/custom_components/browser_mod/browser.py +++ b/custom_components/browser_mod/browser.py @@ -133,9 +133,13 @@ class BrowserModBrowser: def connection(self): return self._connections - @connection.setter - def connection(self, con): - self._connections.append(con) + def open_connection(self, connection, cid): + self._connections.append((connection, cid)) + + def close_connection(self, connection): + self._connections = list( + filter(lambda v: v[0] != connection, self._connections) + ) def getBrowser(hass, browserID, *, create=True): diff --git a/custom_components/browser_mod/connection.py b/custom_components/browser_mod/connection.py index 224dbff..d1e432a 100644 --- a/custom_components/browser_mod/connection.py +++ b/custom_components/browser_mod/connection.py @@ -38,13 +38,21 @@ async def async_setup_connection(hass): def listener(data): connection.send_message(event_message(msg["id"], {"result": data})) - connection.subscriptions[msg["id"]] = store.add_listener(listener) + store_listener = store.add_listener(listener) + + def unsubscriber(): + store_listener() + dev = getBrowser(hass, browserID, create=False) + if dev: + dev.close_connection(connection) + + connection.subscriptions[msg["id"]] = unsubscriber connection.send_result(msg["id"]) if store.get_browser(browserID).enabled: dev = getBrowser(hass, browserID) dev.update_settings(hass, store.get_browser(browserID).asdict()) - dev.connection = (connection, msg["id"]) + dev.open_connection(connection, msg["id"]) await store.set_browser( browserID, last_seen=datetime.now(tz=timezone.utc).isoformat() )