Terminal / api /state_sync.py
Baida—-
deploy: full backend sync for Node A [Kernel Restore]
8b87770 verified
Raw
History Blame
2.47 kB
"""
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)