Handle abrupt WebSocket disconnect (e.g. Safari tab close)
Catch ConnectionClosed in User.send() and handler_recv() so that an unclean client disconnect no longer produces "Task exception was never retrieved" / "connection handler failed" log noise. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SH2D4LRuCnhLSzoYerAfJX
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import asyncio
|
||||
import websockets.exceptions
|
||||
from ws.server.ws_server import WsServer
|
||||
from ws.user import User, UserSet, update
|
||||
from ws.connection import IConnection
|
||||
@@ -31,14 +32,17 @@ class WsServerMultiUser(WsServer):
|
||||
await self.notify_users()
|
||||
|
||||
async def handler_recv(self, websocket, path):
|
||||
while True:
|
||||
data = await websocket.recv()
|
||||
usr = self.USERS.get(websocket)
|
||||
processed = await usr.process(data)
|
||||
if processed:
|
||||
await usr.send(self.global_state)
|
||||
else:
|
||||
await self.listener.on_recv(data)
|
||||
try:
|
||||
while True:
|
||||
data = await websocket.recv()
|
||||
usr = self.USERS.get(websocket)
|
||||
processed = await usr.process(data)
|
||||
if processed:
|
||||
await usr.send(self.global_state)
|
||||
else:
|
||||
await self.listener.on_recv(data)
|
||||
except websockets.exceptions.ConnectionClosed:
|
||||
pass
|
||||
|
||||
async def handler_send(self, websocket, path):
|
||||
while True:
|
||||
|
||||
Reference in New Issue
Block a user