Description
In web/app/node/page.tsx (lines 76-93), useNodeHealth polls node endpoints over plain HTTP with a rigid 8-second timeout:
const res = await fetch(`${NODE_BASE}/health`, {
cache: "no-store",
signal: AbortSignal.timeout(8000),
});
Root Cause
- Aggressive Timeout: An 8-second network delay or temporary CPU load spike on the node instantly triggers an
AbortSignal exception, flipping node health to DOWN and clearing UI state.
- CORS Requirement: Browser
fetch() calls to NODE_BASE fail with opaque network errors if remote witness nodes do not explicitly return Access-Control-Allow-Origin headers for the web app origin.
Expected Behavior
- Implement retry logic or exponential backoff before marking a node as
DOWN.
- Add clear developer/operator documentation or warning banners regarding CORS configuration when connecting to non-local witness nodes.
Location
Description
In
web/app/node/page.tsx(lines 76-93),useNodeHealthpolls node endpoints over plain HTTP with a rigid 8-second timeout:Root Cause
AbortSignalexception, flipping node health toDOWNand clearing UI state.fetch()calls toNODE_BASEfail with opaque network errors if remote witness nodes do not explicitly returnAccess-Control-Allow-Originheaders for the web app origin.Expected Behavior
DOWN.Location
web/app/node/page.tsx