Spaces:
Paused
Paused
File size: 1,940 Bytes
a601b1d d35734f a601b1d d35734f a601b1d d35734f a601b1d d35734f a601b1d d35734f a601b1d d35734f a601b1d d35734f a601b1d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
"""
WebSocket connection management
"""
from typing import Dict
from fastapi import WebSocket
import logging
import json
logger = logging.getLogger(__name__)
class ConnectionManager:
"""Manages WebSocket connections for real-time updates"""
def __init__(self):
self.active_connections: Dict[str, WebSocket] = {}
async def connect(self, session_id: str, websocket: WebSocket):
await websocket.accept()
self.active_connections[session_id] = websocket
logger.info(f"✅ WebSocket connected: {session_id}")
def disconnect(self, session_id: str):
if session_id in self.active_connections:
del self.active_connections[session_id]
logger.info(f"🔌 WebSocket disconnected: {session_id}")
async def send_message(self, session_id: str, message: dict):
"""Send JSON message to client"""
if session_id in self.active_connections:
try:
# ✅ Ensure clean JSON serialization
json_str = json.dumps(message, default=str)
await self.active_connections[session_id].send_text(json_str)
logger.debug(f"📤 Sent to {session_id}: {message.get('type')}")
except Exception as e:
logger.error(f"❌ Error sending to {session_id}: {e}")
self.disconnect(session_id)
async def broadcast(self, message: dict):
"""Send message to all connected clients"""
disconnected = []
for session_id, connection in self.active_connections.items():
try:
json_str = json.dumps(message, default=str)
await connection.send_text(json_str)
except Exception:
disconnected.append(session_id)
for session_id in disconnected:
self.disconnect(session_id)
# Global manager instance
manager = ConnectionManager() |