| import logging |
| from typing import Any |
| from models.event import EventType |
| from models.session_state import TurnState |
|
|
| logger = logging.getLogger("s2s_server") |
|
|
| class ErrorHandler: |
| def __init__(self, context: Any): |
| self.context = context |
|
|
| async def handle_error(self, error: Exception, context_msg: str = ""): |
| from fastapi import WebSocketDisconnect |
|
|
| is_disconnect = isinstance(error, WebSocketDisconnect) or ( |
| isinstance(error, RuntimeError) and "once a disconnect message has been received" in str(error) |
| ) |
|
|
| if is_disconnect: |
| self.context.logger.info( |
| f"[{self.context.session_id}] Connection closed by client during {context_msg}." |
| ) |
| else: |
| self.context.logger.error( |
| f"[{self.context.session_id}] ErrorHandler caught exception during {context_msg}: {error}", |
| exc_info=True |
| ) |
|
|
| |
| await self.context.event_bus.publish(EventType.SERVICE_ERROR, { |
| "error": str(error), |
| "context": context_msg |
| }) |
|
|
| |
| if not is_disconnect: |
| try: |
| await self.context.websocket.send_json({ |
| "type": "error", |
| "message": f"Service error during {context_msg}. The system is resetting." |
| }) |
| await self.context.websocket.send_json({"type": "done"}) |
| except Exception as ws_err: |
| self.context.logger.error( |
| f"[{self.context.session_id}] Failed to send error frame to WebSocket: {ws_err}" |
| ) |
|
|
| |
| self.context.cleanup_manager.perform_cleanup() |
|
|
| |
| if self.context.turn_manager: |
| self.context.turn_manager.state = TurnState.IDLE |
| await self.context.event_bus.publish(EventType.TURN_COMPLETED) |
|
|