|
|
from aiohttp import web |
|
|
import json |
|
|
|
|
|
|
|
|
sessions = {} |
|
|
|
|
|
|
|
|
ICE_CONFIG = { |
|
|
"iceServers": [ |
|
|
{"urls": "stun:stun.cloudflare.com:3478"}, |
|
|
{ |
|
|
"urls": "turn:turn.cloudflare.com:5349", |
|
|
"username": "g08abe68c81a07f098bb5f0914549bb32440e5aad0b216c7fba2b61e76fd62c6", |
|
|
"credential": "aed1a10dd10eba9401ad9d99e5c66036d8a970eab5ba8e6dc9845ab57c771a7d" |
|
|
} |
|
|
] |
|
|
} |
|
|
|
|
|
async def handle_post(request): |
|
|
data = await request.json() |
|
|
sid = data.get("id") |
|
|
msg_type = data.get("type") |
|
|
if not sid: return web.json_response({"error": "No ID"}, status=400) |
|
|
|
|
|
if sid not in sessions: |
|
|
sessions[sid] = {"offer": None, "answer": None, "candidates": []} |
|
|
|
|
|
if msg_type == "offer": sessions[sid]["offer"] = data["payload"] |
|
|
elif msg_type == "answer": sessions[sid]["answer"] = data["payload"] |
|
|
elif msg_type == "candidate": sessions[sid]["candidates"].append(data["payload"]) |
|
|
|
|
|
return web.json_response({"status": "stored"}) |
|
|
|
|
|
async def handle_get(request): |
|
|
sid = request.query.get("id") |
|
|
if not sid or sid not in sessions: |
|
|
return web.json_response({"status": "waiting", "offer": None, "iceConfig": ICE_CONFIG}) |
|
|
|
|
|
resp = sessions[sid].copy() |
|
|
resp["iceConfig"] = ICE_CONFIG |
|
|
return web.json_response(resp) |
|
|
|
|
|
async def cors_middleware(app, handler): |
|
|
async def middleware(request): |
|
|
if request.method == 'OPTIONS': |
|
|
resp = web.Response() |
|
|
else: |
|
|
resp = await handler(request) |
|
|
resp.headers['Access-Control-Allow-Origin'] = '*' |
|
|
resp.headers['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS' |
|
|
resp.headers['Access-Control-Allow-Headers'] = 'Content-Type' |
|
|
return resp |
|
|
return middleware |
|
|
|
|
|
app = web.Application(middlewares=[cors_middleware]) |
|
|
app.router.add_post('/signal', handle_post) |
|
|
app.router.add_get('/signal', handle_get) |
|
|
|
|
|
if __name__ == '__main__': |
|
|
print("Broker running at http://localhost:3000") |
|
|
web.run_app(app, port=3000) |