From 70a405b231586842cf146fcfbdf15e74e5383579 Mon Sep 17 00:00:00 2001 From: retoor Date: Wed, 17 Dec 2025 22:54:25 +0100 Subject: [PATCH] fix: ensure socket cleanup in websocket handler --- CHANGELOG.md | 8 ++++++++ pyproject.toml | 2 +- src/snek/view/rpc.py | 29 ++++++++++++++++------------- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d5eba1..88a4c3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,14 @@ + +## Version 1.7.0 - 2025-12-17 + +Fixes socket cleanup in the websocket handler to prevent resource leaks and improve connection stability. + +**Changes:** 1 files, 29 lines +**Languages:** Python (29 lines) + ## Version 1.6.0 - 2025-12-17 Removes presence debounce to make user departures instant. Simplifies websocket connection and error handling in RPC views for improved reliability. diff --git a/pyproject.toml b/pyproject.toml index 4d42d96..75440eb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "Snek" -version = "1.6.0" +version = "1.7.0" readme = "README.md" #license = { file = "LICENSE", content-type="text/markdown" } description = "Snek Chat Application by Molodetz" diff --git a/src/snek/view/rpc.py b/src/snek/view/rpc.py index 67892c5..ec80ef9 100644 --- a/src/snek/view/rpc.py +++ b/src/snek/view/rpc.py @@ -650,17 +650,20 @@ class RPCView(BaseView): ) rpc = RPCView.RPCApi(self, ws) - async for msg in ws: - if msg.type == web.WSMsgType.TEXT: - try: - await rpc(msg.json()) - except Exception as ex: - print("XXXXXXXXXX Deleting socket", ex, flush=True) - logger.exception(ex) - await self.services.socket.delete(ws) - break - elif msg.type == web.WSMsgType.ERROR: - pass - elif msg.type == web.WSMsgType.CLOSE: - pass + try: + async for msg in ws: + if msg.type == web.WSMsgType.TEXT: + try: + await rpc(msg.json()) + except Exception as ex: + print("XXXXXXXXXX Deleting socket", ex, flush=True) + logger.exception(ex) + await self.services.socket.delete(ws) + break + elif msg.type == web.WSMsgType.ERROR: + pass + elif msg.type == web.WSMsgType.CLOSE: + pass + finally: + await self.services.socket.delete(ws) return ws