From: Chris Duncan Date: Thu, 6 Aug 2026 10:31:55 +0000 (-0700) Subject: Use custom error for vault exceptions. X-Git-Url: https://git.codecow.com/?a=commitdiff_plain;h=3c4b762fc64615fdb50d56a98104a2f597d07bc7;p=libnemo.git Use custom error for vault exceptions. --- diff --git a/src/lib/vault/index.ts b/src/lib/vault/index.ts index fb47b6d..4442650 100644 --- a/src/lib/vault/index.ts +++ b/src/lib/vault/index.ts @@ -18,6 +18,8 @@ type Task = { timeout: number | NodeJS.Timeout } +class VaultError extends Error { } + //@ts-expect-error const vaultWorker = VAULT_WORKER const LOCKED = 'locked' @@ -65,7 +67,7 @@ export class Vault { request> (payload: Record> & Record<'action', string>): Promise> { if (this.#isTerminated) { - throw new Error(TERMINATED) + throw new VaultError(TERMINATED) } const buffers: ArrayBuffer[] = [] for (const d of Object.values(payload)) { @@ -82,7 +84,7 @@ export class Vault { return new Promise((resolve, reject): void => { const timeout = setTimeout(() => { this.#tasks.delete(taskId) - reject(new Error('Vault request timed out', { cause: payload.action })) + reject(new VaultError('Vault request timed out', { cause: payload.action })) }, 10_000) const task: Task = { data, @@ -100,19 +102,19 @@ export class Vault { for (const buffer of buffers) { new Uint8Array(buffer).fill(0) } - reject(new Error(String(err))) + reject(new VaultError(String(err))) } }) } - terminate (): void { + terminate (err?: any): void { this.#isTerminated = true this.#worker.terminate() BROWSER: URL.revokeObjectURL(this.#url) //@ts-expect-error NODE: this.#worker.unref() for (const [_, task] of this.#tasks) { - task?.reject?.(TERMINATED) + task?.reject?.(err ?? TERMINATED) } this.#tasks.clear() } @@ -124,7 +126,7 @@ export class Vault { const { taskUrl, taskId, error, isLocked } = results if (taskUrl === this.#url) { if (typeof taskId !== 'string') { - return this.terminate() + return this.terminate(new VaultError('Invalid taskId', { cause: taskId ?? typeof taskId })) } if (typeof isLocked === 'boolean' && this.#isLocked !== isLocked) { this.#isLocked = isLocked @@ -133,14 +135,14 @@ export class Vault { if (taskId === 'autolock') return const task = this.#tasks.get(taskId) if (task == null) { - console.warn(`Vault worker returned results without an associated task for ID ${taskId}`) + console.warn(new VaultError('Task for results not found', { cause: taskId })) return } const { resolve, reject, timeout } = task this.#tasks.delete(taskId) clearTimeout(timeout) if (error != null) { - reject(new Error(String(error))) + reject(new VaultError(String(error))) } else { resolve(results) }