""" api/state_sync.py — S901: Real-Time State Synchronizer (UltraVSS Beta Strategy) Router FastAPI per la sincronizzazione dello stato tramite WebSocket. """ from fastapi import APIRouter, WebSocket, WebSocketDisconnect from typing import List, Dict, Any import logging _logger = logging.getLogger("api.state_sync") router = APIRouter(prefix="/api/sync", tags=["sync"]) class ConnectionManager: def __init__(self): self.active_connections: Dict[str, List[WebSocket]] = {} self.room_states: Dict[str, Any] = {} async def connect(self, websocket: WebSocket, room_id: str): await websocket.accept() if room_id not in self.active_connections: self.active_connections[room_id] = [] self.active_connections[room_id].append(websocket) if room_id in self.room_states: await websocket.send_json({ "type": "SYNC_STATE", "payload": self.room_states[room_id] }) def disconnect(self, websocket: WebSocket, room_id: str): if room_id in self.active_connections: if websocket in self.active_connections[room_id]: self.active_connections[room_id].remove(websocket) if not self.active_connections[room_id]: del self.active_connections[room_id] async def broadcast(self, message: dict, room_id: str, exclude: WebSocket = None): if room_id not in self.active_connections: return if message.get("type") == "UPDATE_STATE": self.room_states[room_id] = message.get("payload") for connection in self.active_connections[room_id]: if connection != exclude: try: await connection.send_json(message) except Exception as e: _logger.error(f"Error broadcasting to client in room {room_id}: {e}") manager = ConnectionManager() @router.websocket("/ws/{room_id}") async def websocket_endpoint(websocket: WebSocket, room_id: str): await manager.connect(websocket, room_id) try: while True: data = await websocket.receive_json() await manager.broadcast(data, room_id, exclude=websocket) except WebSocketDisconnect: manager.disconnect(websocket, room_id) except Exception as e: _logger.error(f"WebSocket error in room {room_id}: {e}") manager.disconnect(websocket, room_id)