websocket.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import logging
  2. from fastapi import APIRouter, WebSocket, WebSocketDisconnect
  3. from backend.app.core.websocket import ws_manager
  4. from backend.app.services.printer_manager import printer_manager, printer_state_to_dict
  5. logger = logging.getLogger(__name__)
  6. router = APIRouter()
  7. @router.websocket("/ws")
  8. async def websocket_endpoint(websocket: WebSocket):
  9. """WebSocket endpoint for real-time updates."""
  10. logger.info("WebSocket client connecting...")
  11. await ws_manager.connect(websocket)
  12. logger.info("WebSocket client connected")
  13. try:
  14. # Send initial status of all printers
  15. statuses = printer_manager.get_all_statuses()
  16. for printer_id, state in statuses.items():
  17. await websocket.send_json({
  18. "type": "printer_status",
  19. "printer_id": printer_id,
  20. "data": printer_state_to_dict(state),
  21. })
  22. logger.info(f"Sent initial status for {len(statuses)} printers")
  23. # Keep connection alive and handle incoming messages
  24. while True:
  25. data = await websocket.receive_json()
  26. # Handle ping/pong for keepalive
  27. if data.get("type") == "ping":
  28. await websocket.send_json({"type": "pong"})
  29. # Handle status request
  30. elif data.get("type") == "get_status":
  31. printer_id = data.get("printer_id")
  32. if printer_id:
  33. state = printer_manager.get_status(printer_id)
  34. if state:
  35. await websocket.send_json({
  36. "type": "printer_status",
  37. "printer_id": printer_id,
  38. "data": printer_state_to_dict(state),
  39. })
  40. except WebSocketDisconnect:
  41. logger.info("WebSocket client disconnected normally")
  42. await ws_manager.disconnect(websocket)
  43. except Exception as e:
  44. logger.error(f"WebSocket error: {e}", exc_info=True)
  45. await ws_manager.disconnect(websocket)