diff --git a/src/app/components/SignerStatus.svelte b/src/app/components/SignerStatus.svelte index 3e7054f56..a6f6f18b9 100644 --- a/src/app/components/SignerStatus.svelte +++ b/src/app/components/SignerStatus.svelte @@ -15,14 +15,13 @@ const pending = $derived($signerLog.filter(x => !x.finished_at)) const failure = $derived(finished.filter(spec({ok: false}))) const success = $derived(finished.filter(spec({ok: true}))) - const recent = $derived($signerLog.filter(x => x.started_at < Date.now() - 5000).slice(-10)) - const recentFinished = $derived(recent.filter(x => x.finished_at)) - const recentPending = $derived(recent.filter(x => !x.finished_at)) - const recentAvg = $derived(avg(recentFinished.map(x => x.finished_at! - x.started_at))) - const recentFailure = $derived(recentFinished.filter(x => !x.ok)) - const recentSuccess = $derived(recentFinished.filter(x => x.ok)) + const cutoff = $derived(Date.now() - 10_000) + const recentCompleted = $derived($signerLog.filter(x => x.finished_at && x.finished_at > cutoff)) + const recentAvg = $derived(avg(recentCompleted.map(x => x.finished_at! - x.started_at))) + const recentFailure = $derived(recentCompleted.filter(x => !x.ok)) + const recentSuccess = $derived(recentCompleted.filter(x => x.ok)) const isDisconnected = $derived( - recent.length > 0 && recentFailure.length + recentPending.length === recent.length, + recentCompleted.length > 0 && recentFailure.length === recentCompleted.length, ) const logout = () => pushModal(LogOut) @@ -38,7 +37,7 @@ Disconnected {:else if recentFailure.length > 3} Partial Failure - {:else if recentAvg > 1000 || recentPending.length > 3} + {:else if recentAvg > 1000 || pending.length > 10} Slow connection {:else if recentSuccess.length === 0 && recentFailure.length > 0} Partial Failure diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 2bc6f3455..e23f0015a 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -157,15 +157,20 @@ // Listen for signer errors, report to user via toast unsubscribers.push( throttled(10_000, signerLog).subscribe($log => { - const cutoff = Date.now() - 3_000 - const recent = $log.filter(x => x.started_at < cutoff).slice(-10) - const ok = recent.filter(x => x.ok) + if ($toast) return - if (!$toast && recent.length > 5 && ok.length === 0) { + const longCutoff = Date.now() - 30_000 + const shortCutoff = Date.now() - 10_000 + const pending = $log.filter(x => !x.finished_at && x.started_at < longCutoff) + const completed = $log.filter(x => x.finished_at && x.finished_at > shortCutoff) + const showPendingError = pending.length > 10 + const showCompletedError = completed.length > 5 && completed.filter(x => x.ok).length === 0 + + if (showPendingError || showCompletedError) { pushToast({ theme: "error", timeout: 60_000, - message: "Your signer appears to be unresponsive.", + message: "Your signer isn't responding.", action: { message: "Details", onclick: () => goto("/settings/profile"),