Alvin3y1 commited on
Commit
fbcb5a6
·
verified ·
1 Parent(s): 4fc0a2d

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +71 -0
app.py ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from aiohttp import web
2
+ import json
3
+
4
+ # In-memory storage for signaling sessions
5
+ # Format: { "session_id": {"offer": {}, "answer": {}, "candidates": []} }
6
+ sessions = {}
7
+
8
+ # Cloudflare TURN Credentials
9
+ ICE_CONFIG = {
10
+ "iceServers": [
11
+ {"urls": "stun:stun.cloudflare.com:3478"},
12
+ {
13
+ "urls": "turn:turn.cloudflare.com:5349",
14
+ "username": "g08abe68c81a07f098bb5f0914549bb32440e5aad0b216c7fba2b61e76fd62c6",
15
+ "credential": "aed1a10dd10eba9401ad9d99e5c66036d8a970eab5ba8e6dc9845ab57c771a7d"
16
+ }
17
+ ]
18
+ }
19
+
20
+ async def handle_post(request):
21
+ """Handles uploading Offers, Answers, and ICE Candidates"""
22
+ data = await request.json()
23
+ sid = data.get("id")
24
+ msg_type = data.get("type")
25
+ payload = data.get("payload")
26
+
27
+ if not sid:
28
+ return web.json_response({"error": "No ID provided"}, status=400)
29
+
30
+ if sid not in sessions:
31
+ sessions[sid] = {"offer": None, "answer": None, "candidates": []}
32
+
33
+ if msg_type == "offer":
34
+ sessions[sid]["offer"] = payload
35
+ elif msg_type == "answer":
36
+ sessions[sid]["answer"] = payload
37
+ elif msg_type == "candidate":
38
+ sessions[sid]["candidates"].append(payload)
39
+
40
+ return web.json_response({"status": "stored"})
41
+
42
+ async def handle_get(request):
43
+ """Handles retrieving session data and TURN config"""
44
+ sid = request.query.get("id")
45
+ if not sid or sid not in sessions:
46
+ return web.json_response({"error": "Session not found"}, status=404)
47
+
48
+ response_data = sessions[sid].copy()
49
+ response_data["iceConfig"] = ICE_CONFIG
50
+ return web.json_response(response_data)
51
+
52
+ # CORS Middleware to allow browsers to talk to this server
53
+ async def cors_middleware(app, handler):
54
+ async def middleware(request):
55
+ if request.method == 'OPTIONS':
56
+ response = web.Response()
57
+ else:
58
+ response = await handler(request)
59
+ response.headers['Access-Control-Allow-Origin'] = '*'
60
+ response.headers['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS'
61
+ response.headers['Access-Control-Allow-Headers'] = 'Content-Type'
62
+ return response
63
+ return middleware
64
+
65
+ app = web.Application(middlewares=[cors_middleware])
66
+ app.router.add_post('/signal', handle_post)
67
+ app.router.add_get('/signal', handle_get)
68
+
69
+ if __name__ == '__main__':
70
+ print("WebRTC Broker Server starting on http://0.0.0.0:3000")
71
+ web.run_app(app, port=3000)