"""Gestionnaire de connexions WebSocket.""" import json import logging from typing import Any from fastapi import WebSocket logger = logging.getLogger(__name__) class WSManager: def __init__(self): self.active: list[WebSocket] = [] async def connect(self, ws: WebSocket): await ws.accept() self.active.append(ws) logger.debug("WS connecté (%d total)", len(self.active)) def disconnect(self, ws: WebSocket): self.active.discard(ws) if hasattr(self.active, "discard") else None if ws in self.active: self.active.remove(ws) logger.debug("WS déconnecté (%d restants)", len(self.active)) async def broadcast(self, data: dict[str, Any]): if not self.active: return msg = json.dumps(data, default=str) dead = [] for ws in self.active: try: await ws.send_text(msg) except Exception: dead.append(ws) for ws in dead: self.disconnect(ws) async def send(self, ws: WebSocket, data: dict[str, Any]): try: await ws.send_text(json.dumps(data, default=str)) except Exception as e: logger.debug("Erreur envoi WS: %s", e) self.disconnect(ws)