websocket.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. {
  19. "type": "printer_status",
  20. "printer_id": printer_id,
  21. "data": printer_state_to_dict(state, printer_id, printer_manager.get_model(printer_id)),
  22. }
  23. )
  24. logger.info("Sent initial status for %s printers", len(statuses))
  25. # Keep connection alive and handle incoming messages
  26. while True:
  27. data = await websocket.receive_json()
  28. # Handle ping/pong for keepalive
  29. if data.get("type") == "ping":
  30. await websocket.send_json({"type": "pong"})
  31. # Handle status request
  32. elif data.get("type") == "get_status":
  33. printer_id = data.get("printer_id")
  34. if printer_id:
  35. state = printer_manager.get_status(printer_id)
  36. if state:
  37. await websocket.send_json(
  38. {
  39. "type": "printer_status",
  40. "printer_id": printer_id,
  41. "data": printer_state_to_dict(state, printer_id, printer_manager.get_model(printer_id)),
  42. }
  43. )
  44. except WebSocketDisconnect:
  45. logger.info("WebSocket client disconnected normally")
  46. await ws_manager.disconnect(websocket)
  47. except Exception as e:
  48. logger.error("WebSocket error: %s", e, exc_info=True)
  49. await ws_manager.disconnect(websocket)