flotilla/src/app/signer.ts

45 lines
1.2 KiB
TypeScript
Raw Normal View History

2026-07-28 16:16:26 +00:00
import {derived} from "svelte/store"
import {Logger} from "@welshman/app"
import type {LogMessage} from "@welshman/app"
import {fromApp} from "@app/core"
export type SignerRequest = {
id: string
method: string
startedAt: number
finishedAt?: number
ok?: boolean
}
// The logger records one entry per state transition, correlated by id. Fold them back into one
// entry per request so callers can reason about how long each took and how it ended.
export const signerRequests = derived(
fromApp($app => $app.use(Logger).messages.$),
($messages: LogMessage[]) => {
const requestsById = new Map<string, SignerRequest>()
for (const message of $messages) {
2026-09-21 16:48:35 +00:00
if (message.source !== "signer") {
continue
}
2026-07-28 16:16:26 +00:00
if (message.status === "pending") {
requestsById.set(message.id, {
id: message.id,
method: String(message.method),
startedAt: message.at,
})
} else {
const request = requestsById.get(message.id)
if (request) {
request.finishedAt = message.at
request.ok = message.status === "success"
}
}
}
return Array.from(requestsById.values())
},
)