timeout: number | NodeJS.Timeout
}
+class VaultError extends Error { }
+
//@ts-expect-error
const vaultWorker = VAULT_WORKER
const LOCKED = 'locked'
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)) {
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,
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()
}
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
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)
}