chat_manager.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import json
  2. import datetime
  3. import db
  4. from typing import Dict, List, Any
  5. from fastapi import WebSocket
  6. class ChatConnectionManager:
  7. def __init__(self):
  8. # order_id -> list of active websockets
  9. self.active_connections: Dict[int, List[WebSocket]] = {}
  10. async def connect(self, websocket: WebSocket, order_id: int):
  11. await websocket.accept()
  12. if order_id not in self.active_connections:
  13. self.active_connections[order_id] = []
  14. self.active_connections[order_id].append(websocket)
  15. def disconnect(self, websocket: WebSocket, order_id: int):
  16. if order_id in self.active_connections:
  17. self.active_connections[order_id].remove(websocket)
  18. if not self.active_connections[order_id]:
  19. del self.active_connections[order_id]
  20. async def broadcast_to_order(self, order_id: int, message: Any):
  21. if order_id in self.active_connections:
  22. # We must serialize datetime to JSON string
  23. if isinstance(message, dict) and 'created_at' in message:
  24. if isinstance(message['created_at'], datetime.datetime):
  25. message['created_at'] = message['created_at'].isoformat()
  26. payload = json.dumps(message)
  27. for connection in self.active_connections[order_id]:
  28. try:
  29. await connection.send_text(payload)
  30. except:
  31. # Connection might be dead
  32. pass
  33. manager = ChatConnectionManager()