]> git.codecow.com Git - libnemo.git/commitdiff
Use custom error for vault exceptions.
authorChris Duncan <chris@codecow.com>
Thu, 6 Aug 2026 10:31:55 +0000 (03:31 -0700)
committerChris Duncan <chris@codecow.com>
Thu, 6 Aug 2026 10:31:55 +0000 (03:31 -0700)
src/lib/vault/index.ts

index fb47b6de81bd8f9eedb4fccb1821ab2487f06ec3..44426504c9e22ff66e75e5fb851133506db1ea11 100644 (file)
@@ -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<T extends Data | Record<string, Data>> (payload: Record<string, Data | Record<string, Data>> & Record<'action', string>): Promise<Record<string, T>> {
                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)
                        }