File size: 1,090 Bytes
0f336cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from typing import Any, Dict, Set
from fastapi import WebSocket
from core.logging import logger


class WebSocketManager:
    """Manages active WebSocket client connections for real-time live events."""

    def __init__(self):
        self.active_connections: Set[WebSocket] = set()

    async def connect(self, websocket: WebSocket):
        await websocket.accept()
        self.active_connections.add(websocket)
        logger.info(f"WebSocket client connected. Total clients: {len(self.active_connections)}")

    def disconnect(self, websocket: WebSocket):
        self.active_connections.discard(websocket)
        logger.info(f"WebSocket client disconnected. Total clients: {len(self.active_connections)}")

    async def broadcast(self, payload: Dict[str, Any]):
        if not self.active_connections:
            return
        stale = set()
        for conn in list(self.active_connections):
            try:
                await conn.send_json(payload)
            except Exception:
                stale.add(conn)
        for conn in stale:
            self.disconnect(conn)