85 lines
2.3 KiB
Python
85 lines
2.3 KiB
Python
"""
|
|
ⒸAngelaMos | 2025
|
|
WebSocket endpoints for real time chat communication
|
|
"""
|
|
|
|
import json
|
|
import logging
|
|
from uuid import UUID
|
|
|
|
from fastapi import (
|
|
APIRouter,
|
|
WebSocket,
|
|
WebSocketDisconnect,
|
|
Query,
|
|
)
|
|
from app.core.websocket_manager import connection_manager
|
|
from app.services.websocket_service import websocket_service
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
router = APIRouter(prefix = "/ws", tags = ["websocket"])
|
|
|
|
|
|
@router.websocket("")
|
|
async def websocket_endpoint(
|
|
websocket: WebSocket,
|
|
user_id: str = Query(...),
|
|
) -> None:
|
|
"""
|
|
Main WebSocket endpoint for real time messaging
|
|
"""
|
|
try:
|
|
user_uuid = UUID(user_id)
|
|
except ValueError:
|
|
logger.error("Invalid user_id format: %s", user_id)
|
|
await websocket.close(code = 1008, reason = "Invalid user ID")
|
|
return
|
|
|
|
connected = await connection_manager.connect(websocket, user_uuid)
|
|
|
|
if not connected:
|
|
return
|
|
|
|
try:
|
|
while True:
|
|
data = await websocket.receive_text()
|
|
|
|
try:
|
|
message = json.loads(data)
|
|
await websocket_service.route_message(
|
|
websocket,
|
|
user_uuid,
|
|
message
|
|
)
|
|
except json.JSONDecodeError:
|
|
logger.error(
|
|
"Invalid JSON from user %s: %s",
|
|
user_uuid,
|
|
data[: 100]
|
|
)
|
|
await websocket.send_json(
|
|
{
|
|
"type": "error",
|
|
"error_code": "invalid_json",
|
|
"error_message": "Invalid JSON format"
|
|
}
|
|
)
|
|
except Exception as e:
|
|
logger.error("Error handling message from %s: %s", user_uuid, e)
|
|
await websocket.send_json(
|
|
{
|
|
"type": "error",
|
|
"error_code": "processing_error",
|
|
"error_message": str(e)
|
|
}
|
|
)
|
|
|
|
except WebSocketDisconnect:
|
|
logger.info("WebSocket disconnected for user %s", user_uuid)
|
|
except Exception as e:
|
|
logger.error("WebSocket error for user %s: %s", user_uuid, e)
|
|
finally:
|
|
await connection_manager.disconnect(websocket, user_uuid)
|