""" FastAPI integration for WebRTC WebSocket endpoints Mounts alongside Gradio for real-time audio streaming """ from fastapi import FastAPI, WebSocket, WebSocketDisconnect from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles import json import logging import uuid from .websocket_handler import webrtc_handler logger = logging.getLogger(__name__) def create_fastapi_app() -> FastAPI: """Create FastAPI app with WebRTC WebSocket endpoints""" app = FastAPI( title="ChatCal WebRTC API", description="Real-time audio streaming API for ChatCal Voice", version="0.4.1" ) @app.websocket("/ws/webrtc/{client_id}") async def websocket_endpoint(websocket: WebSocket, client_id: str): """WebRTC WebSocket endpoint for real-time audio streaming""" try: await webrtc_handler.connect(websocket, client_id) while True: # Receive message from client try: message = await websocket.receive_text() data = json.loads(message) # Handle message through WebRTC handler await webrtc_handler.handle_message(client_id, data) except json.JSONDecodeError: await webrtc_handler.send_message(client_id, { "type": "error", "message": "Invalid JSON message format" }) except WebSocketDisconnect: logger.info(f"Client {client_id} disconnected") except Exception as e: logger.error(f"WebSocket error for {client_id}: {e}") finally: await webrtc_handler.disconnect(client_id) @app.get("/webrtc/test") async def webrtc_test(): """Test endpoint to verify WebRTC API is working""" return { "status": "ok", "message": "WebRTC API is running", "version": "0.4.1", "endpoints": { "websocket": "/ws/webrtc/{client_id}", "test_page": "/webrtc/demo" } } @app.get("/webrtc/demo") async def webrtc_demo(): """Serve WebRTC demo page for testing""" demo_html = """