# app.py from fastapi import FastAPI, WebSocket, WebSocketDisconnect, Request from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles from fastrtc import RTCRoom, RTCRoomManager from fastapi.templating import Jinja2Templates import uuid import json app = FastAPI() room_manager = RTCRoomManager() app.mount("/static", StaticFiles(directory="static"), name="static") # Mount static files templates = Jinja2Templates(directory="templates") # Mount templates @app.get("/", response_class=HTMLResponse) async def read_root(request: Request): return templates.TemplateResponse("index.html", {"request": request}) @app.websocket("/ws/{room_id}/{client_id}") async def websocket_endpoint(websocket: WebSocket, room_id: str, client_id: str): await websocket.accept() room = room_manager.get_or_create_room(room_id) peer = await room.join(client_id, websocket) try: while True: message = await websocket.receive_text() data = json.loads(message) if data["type"] == "offer" or data["type"] == "answer" or data["type"] == "candidate": await peer.handle_sdp(data) else: print(f"Received unknown message: {data}") except WebSocketDisconnect: await room.leave(client_id) print(f"Client {client_id} disconnected from room {room_id}")