File size: 2,078 Bytes
fbcb5a6 7e4862f fbcb5a6 7e4862f fbcb5a6 7e4862f fbcb5a6 7e4862f fbcb5a6 7e4862f fbcb5a6 7e4862f fbcb5a6 7e4862f fbcb5a6 7e4862f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
from aiohttp import web
import json
# Storage for active handshake sessions
sessions = {}
# Cloudflare TURN Credentials
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) |