Spaces:
Configuration error
Configuration error
| """ | |
| 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() | |
| 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) | |