websockets.py 1.3 KB

123456789101112131415161718192021222324252627282930313233
  1. from typing import List, Dict
  2. from fastapi import WebSocket
  3. class ConnectionManager:
  4. def __init__(self):
  5. # forum_id -> List[WebSocket]
  6. self.active_connections: Dict[int, List[WebSocket]] = {}
  7. async def connect(self, websocket: WebSocket, forum_id: int):
  8. try:
  9. await websocket.accept()
  10. if forum_id not in self.active_connections:
  11. self.active_connections[forum_id] = []
  12. self.active_connections[forum_id].append(websocket)
  13. print(f"WS Connected: Forum {forum_id}") # Log connection
  14. except Exception as e:
  15. print(f"WS Connect Error: {e}")
  16. raise
  17. async def disconnect(self, websocket: WebSocket, forum_id: int):
  18. if forum_id in self.active_connections:
  19. if websocket in self.active_connections[forum_id]:
  20. self.active_connections[forum_id].remove(websocket)
  21. if not self.active_connections[forum_id]:
  22. del self.active_connections[forum_id]
  23. print(f"WS Disconnected: Forum {forum_id}") # Log disconnection
  24. async def broadcast(self, forum_id: int, message: dict):
  25. if forum_id in self.active_connections:
  26. for connection in self.active_connections[forum_id]:
  27. await connection.send_json(message)
  28. manager = ConnectionManager()