🐛 Improve swallowed hook error handling#19304
Conversation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Hive Scanner <hive-scanner@kubestellar.local>
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
✅ Deploy Preview for kubestellarconsole ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
🐝 Hi @clubanderson! I'm Trusted users — org members and contributors with write access — can mention Automation may take a moment to start, and follow-up happens through workflow activity rather than chat replies. |
|
👋 Hey @clubanderson — thanks for opening this PR!
This is an automated message. |
✅ Test Coverage CheckAll new source files in this PR have corresponding test files. Checked |
There was a problem hiding this comment.
Pull request overview
This PR aims to improve resilience in the frontend hooks layer by surfacing certain Stellar operational failures into hook state (via connectionError) and by ensuring malformed localStorage cache data for stack discovery remains non-fatal (with a warning + fallback). Build/lint are validated by CI on the PR.
Changes:
- Add a small error-to-message helper and propagate selected Stellar failures into
useStellarSource().connectionError. - Use
safeJsonParsewhen loading the Stack Discovery cache so malformed JSON falls back safely. - Add/extend vitest coverage for Stellar error propagation and malformed stack cache handling.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| web/src/hooks/useStellarSource.ts | Adds setOperationalError and updates refresh/batch/init/auto-solve paths to set connectionError on failures. |
| web/src/hooks/useStackDiscovery.ts | Switches stack cache load to safeJsonParse and treats bad JSON as a non-fatal warning + fallback. |
| web/src/hooks/tests/useStellarSource.test.tsx | Adds tests asserting connectionError updates when initial refresh, batch refresh, and auto-solve fail. |
| web/src/hooks/tests/useStackDiscovery.test.ts | Adds a test asserting malformed stack cache logs a warning and doesn’t crash. |
| const failures = results.filter(result => result.status === 'rejected') | ||
| if (failures.length > 0) console.warn('stellar: refreshState partial failure —', failures.length, 'of 7 calls failed') | ||
| }, [setNotifications]) | ||
| if (failures.length === 0) { | ||
| setConnectionError(null) | ||
| return | ||
| } | ||
| console.warn('stellar: refreshState partial failure —', failures.length, 'of', STELLAR_REFRESH_REQUEST_COUNT, 'calls failed') | ||
| const firstFailure = failures[0] | ||
| setOperationalError( | ||
| firstFailure.status === 'rejected' ? firstFailure.reason : null, | ||
| failures.length === 1 | ||
| ? 'Failed to refresh Stellar state' | ||
| : `Failed to refresh Stellar state (${failures.length}/${STELLAR_REFRESH_REQUEST_COUNT} requests failed)`, | ||
| ) |
| try { | ||
| const cached = localStorage.getItem(CACHE_KEY) | ||
| if (!cached) return null | ||
| const parsed = JSON.parse(cached) | ||
| if (parsed.timestamp && parsed.stacks) { | ||
| const parsed = safeJsonParse<{ stacks?: LLMdStack[]; timestamp?: number } | null>(cached, null, 'stack cache') | ||
| if (parsed?.timestamp && parsed.stacks) { | ||
| return parsed | ||
| } | ||
| } catch { | ||
| // Ignore parse errors | ||
| // Ignore storage errors |
The loadCachedStacks function returns `{ stacks: LLMdStack[]; timestamp: number } | null`
but safeJsonParse returns optional fields. After the truthiness guard, we must
explicitly construct the return object to satisfy TypeScript's type narrowing.
Signed-off-by: clubanderson <club.anderson@gmail.com>
Signed-off-by: clubanderson <club.anderson@gmail.com>
Signed-off-by: clubanderson <club.anderson@gmail.com>
|
Thank you for your contribution! Your PR has been merged. Check out what's new:
Stay connected: Slack #kubestellar-dev | Multi-Cluster Survey |
✅ Post-Merge Verification: passedCommit: |
|
Post-merge build verification passed ✅ Both Go and frontend builds compiled successfully against merge commit |
Fixes #19300
Improves Stellar network error propagation so init, batch refresh, and auto-solve failures update hook state, and keeps malformed localStorage cache handling non-fatal with a logged fallback.
Tests:
npx vitest run src/hooks/__tests__/useStellarSource.test.tsx src/hooks/__tests__/useStackDiscovery.test.ts