#!/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/ -> 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/ ---------------------------------------------------- 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()