Merge pull request #229 from smittix/fix/meshcore-connect-error-reporting

fix(meshcore): surface backend error messages and extend polling window
This commit is contained in:
Smittix
2026-05-13 21:00:55 +01:00
committed by GitHub
3 changed files with 12 additions and 5 deletions
+5 -1
View File
@@ -48,7 +48,11 @@ def status():
} }
) )
c = _client() c = _client()
return jsonify({"available": True, "state": c.get_state().value}) state, message = c.get_state()
payload = {"available": True, "state": state.value}
if message:
payload["message"] = message
return jsonify(payload)
@meshcore_bp.route("/connect", methods=["POST"]) @meshcore_bp.route("/connect", methods=["POST"])
+2 -1
View File
@@ -97,7 +97,8 @@ const MeshCore = (function () {
function _pollUntilConnected(attempts) { function _pollUntilConnected(attempts) {
if (_connected) return; if (_connected) return;
if (attempts > 15) { if (attempts > 45) {
// Backend retry window (5+15+45s) has elapsed — give up
_updateStatusUI('error', 'Connection timed out'); _updateStatusUI('error', 'Connection timed out');
return; return;
} }
+5 -3
View File
@@ -250,6 +250,7 @@ class MeshcoreClient:
def __init__(self) -> None: def __init__(self) -> None:
self._state = ConnectionState.DISCONNECTED self._state = ConnectionState.DISCONNECTED
self._status_message: str | None = None
self._config: ConnectionConfig | None = None self._config: ConnectionConfig | None = None
self._event_queue: queue.Queue = queue.Queue(maxsize=500) self._event_queue: queue.Queue = queue.Queue(maxsize=500)
self._nodes: dict[str, MeshcoreNode] = {} self._nodes: dict[str, MeshcoreNode] = {}
@@ -261,14 +262,15 @@ class MeshcoreClient:
# -- State -- # -- State --
def get_state(self) -> ConnectionState: def get_state(self) -> tuple[ConnectionState, str | None]:
"""Return the current connection state.""" """Return the current connection state and last status message."""
with self._lock: with self._lock:
return self._state return self._state, self._status_message
def _set_state(self, state: ConnectionState, **extra) -> None: def _set_state(self, state: ConnectionState, **extra) -> None:
with self._lock: with self._lock:
self._state = state self._state = state
self._status_message = extra.get("message")
# Push the status event OUTSIDE the lock (avoids deadlock; _push is queue-based) # Push the status event OUTSIDE the lock (avoids deadlock; _push is queue-based)
payload: dict = {"state": state.value} payload: dict = {"state": state.value}
payload.update(extra) payload.update(extra)