|
|
|
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") |
|
templates = Jinja2Templates(directory="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}") |