init
This commit is contained in:
+62
@@ -0,0 +1,62 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Minimal signaling server for NAT-traversal demos.
|
||||
Run: python signaling.py # listens on 0.0.0.0:8000
|
||||
Dependencies: none (std-lib only).
|
||||
|
||||
API
|
||||
----
|
||||
POST /register JSON {"id": "...", "ip": "...", "port": int}
|
||||
GET /peer/<id> -> JSON {"ip": "...", "port": int}
|
||||
|
||||
Security, persistence, auth, etc. are intentionally *omitted*.
|
||||
"""
|
||||
|
||||
from http.server import HTTPServer, BaseHTTPRequestHandler
|
||||
import json
|
||||
|
||||
peers: dict[str, dict[str, str | int]] = {} # in-memory registry
|
||||
|
||||
|
||||
class SignalingHandler(BaseHTTPRequestHandler):
|
||||
def _json_response(self, code: int, payload: dict | str):
|
||||
self.send_response(code)
|
||||
self.send_header("Content-Type", "application/json")
|
||||
self.end_headers()
|
||||
body = payload if isinstance(payload, str) else json.dumps(payload)
|
||||
self.wfile.write(body.encode())
|
||||
|
||||
# ---- POST /register ----------------------------------------------------
|
||||
def do_POST(self):
|
||||
if self.path != "/register":
|
||||
self._json_response(404, {"error": "unknown endpoint"})
|
||||
return
|
||||
|
||||
length = int(self.headers.get("Content-Length", 0))
|
||||
try:
|
||||
data = json.loads(self.rfile.read(length))
|
||||
pid, ip, port = data["id"], data["ip"], int(data["port"])
|
||||
except Exception as e:
|
||||
self._json_response(400, {"error": f"bad json: {e}"})
|
||||
return
|
||||
|
||||
peers[pid] = {"ip": ip, "port": port}
|
||||
self._json_response(200, {"status": "ok"})
|
||||
|
||||
# ---- GET /peer/<id> ----------------------------------------------------
|
||||
def do_GET(self):
|
||||
if not self.path.startswith("/peer/"):
|
||||
self._json_response(404, {"error": "unknown endpoint"})
|
||||
return
|
||||
|
||||
pid = self.path[len("/peer/") :]
|
||||
info = peers.get(pid)
|
||||
if info is None:
|
||||
self._json_response(404, {"error": f"peer '{pid}' not found"})
|
||||
else:
|
||||
self._json_response(200, info)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("🔥 Signaling server running on http://0.0.0.0:8000")
|
||||
HTTPServer(("0.0.0.0", 8000), SignalingHandler).serve_forever()
|
||||
Reference in New Issue
Block a user