summaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/src/meshbay_node/hub_client.py
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-node/src/meshbay_node/hub_client.py')
-rw-r--r--packages/meshbay-node/src/meshbay_node/hub_client.py16
1 files changed, 15 insertions, 1 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/hub_client.py b/packages/meshbay-node/src/meshbay_node/hub_client.py
index a9a1d6c..ca0e776 100644
--- a/packages/meshbay-node/src/meshbay_node/hub_client.py
+++ b/packages/meshbay-node/src/meshbay_node/hub_client.py
@@ -81,6 +81,7 @@ class HubClient:
self._keys = keys
self._http = httpx.AsyncClient(timeout=15, base_url=config.hub_url)
self._session: HubSession | None = None
+ self._ws: Any = None
async def __aenter__(self):
return self
@@ -246,6 +247,15 @@ class HubClient:
# ── Persistent WebSocket (signaling + revocations) ──────────────────────
+ async def send_ws(self, data: str) -> None:
+ """Send a message on the hub WebSocket (if connected). Best-effort."""
+ ws = self._ws
+ if ws:
+ try:
+ await ws.send(data)
+ except Exception:
+ pass
+
async def maintain_ws(
self,
on_incoming: Any = None,
@@ -282,6 +292,7 @@ class HubClient:
log.error("WS auth failed: %s", auth_resp)
return
+ self._ws = ws
log.info("Hub WS connected")
async for raw in ws:
@@ -310,10 +321,13 @@ class HubClient:
elif mtype == "pong":
pass
+ except asyncio.CancelledError:
+ raise
except Exception as e:
log.warning("Hub WS disconnected: %s — reconnecting in 5s", e)
- import asyncio
await asyncio.sleep(5)
+ finally:
+ self._ws = None
# ── Convenience: full startup sequence ───────────────────────────────────