diff --git a/.gitignore b/.gitignore index 940dcd4..9816289 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ dist/ !.env.testnet .rocm-local/* billing.sqlite +.pytest-tmp/* \ No newline at end of file diff --git a/packages/node/meshnet_node/startup.py b/packages/node/meshnet_node/startup.py index 6484c25..adb4144 100644 --- a/packages/node/meshnet_node/startup.py +++ b/packages/node/meshnet_node/startup.py @@ -368,6 +368,8 @@ def _start_heartbeat( try: resp = _post_json(f"{tracker_url}/v1/nodes/register", register_payload) node_id = resp.get("node_id", node_id) + if node_ref is not None: + setattr(node_ref, "tracker_node_id", node_id) return True except Exception: return False @@ -474,6 +476,37 @@ def _start_heartbeat( return t +_PENDING_NODE_ID = "pending" + + +def _register_with_tracker( + tracker_url: str, + reg_payload: dict, + node: Any, + start_time: float, +) -> str | None: + """Register with the tracker, or start background retries when it is unreachable.""" + try: + reg_resp = _post_json(f"{tracker_url}/v1/nodes/register", reg_payload) + tracker_node_id = str(reg_resp.get("node_id") or "?") + setattr(node, "tracker_node_id", tracker_node_id) + print(f" Registered with tracker — node ID: {tracker_node_id}", flush=True) + _start_heartbeat(tracker_url, tracker_node_id, reg_payload, node_ref=node, start_time=start_time) + return tracker_node_id + except Exception as exc: + setattr(node, "tracker_node_id", None) + print(f" Warning: tracker registration failed: {exc}", flush=True) + print(" [node] will retry registration in the background", flush=True) + _start_heartbeat( + tracker_url, + _PENDING_NODE_ID, + reg_payload, + node_ref=node, + start_time=start_time, + ) + return None + + def _warn_virtual_network_ip(ip: str | None) -> None: """Print a warning when the auto-detected advertise IP is in a known virtual-network range.