feat(machine): connectivity auto-recovery + on-screen Retry
A connectivity-type init failure (e.g. "No connected relays" when the box boots before the network) landed on "ATM Unavailable" permanently: init is one-shot and the nostr reconnect only helps after a first successful connect, so a machine never self-healed when internet returned. Recover by reloading the renderer, which re-runs init from a clean JS context (no leaked actors/subscriptions) while the main process keeps HAL: - main.ts: new `app:recover` IPC → reloadRenderer() (resets secretsConsumed). - hal:init is now idempotent (reuse the existing instance) so the reload — and the pre-existing watchdog crash-reload — can't double-open serial ports. - App.vue: when initError is a connectivity type (not the operator/ self-clearing states unpaired/awaiting-fees/maintenance), watch for the `online` event (recover immediately) plus a 45s backoff safety net, and render a kiosk-sized Retry button for a person at the machine. Preserves pairing + /var/lib state (renderer reload, not a process restart). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
44f5c0dbcf
commit
6a833d357e
4 changed files with 104 additions and 1 deletions
|
|
@ -124,6 +124,8 @@ contextBridge.exposeInMainWorld('electronAPI', {
|
|||
// then relaunch so the normal boot flow pairs it.
|
||||
saveSpireSeed: (seed: string): Promise<void> => ipcRenderer.invoke('state:save-spire-seed', seed),
|
||||
relaunchApp: (): Promise<void> => ipcRenderer.invoke('app:relaunch'),
|
||||
// Reload the renderer to re-attempt initialization (connectivity recovery).
|
||||
recoverApp: (): Promise<void> => ipcRenderer.invoke('app:recover'),
|
||||
|
||||
applyOperatorCassettesConfig: (
|
||||
payload: {
|
||||
|
|
@ -243,6 +245,7 @@ declare global {
|
|||
resetForRepair: () => Promise<void>
|
||||
saveSpireSeed: (seed: string) => Promise<void>
|
||||
relaunchApp: () => Promise<void>
|
||||
recoverApp: () => Promise<void>
|
||||
applyOperatorCassettesConfig: (
|
||||
payload: { positions: Record<string, { denomination: number; count: number }> },
|
||||
eventCreatedAt: number
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue