From 20fe66dbd71bfb184104a3f56e05b3ec621cc9f2 Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Sun, 9 Aug 2026 02:13:18 -0700 Subject: [PATCH] Extract worker init to static method and teardown to split up termination and rejection. --- src/lib/vault/index.ts | 64 +++++++++++++++++++++------------------ src/lib/wallet/destroy.ts | 2 +- src/lib/wallet/index.ts | 2 +- 3 files changed, 36 insertions(+), 32 deletions(-) diff --git a/src/lib/vault/index.ts b/src/lib/vault/index.ts index 805a4df..25d58dc 100644 --- a/src/lib/vault/index.ts +++ b/src/lib/vault/index.ts @@ -39,30 +39,9 @@ export class Vault { removeEventListener = this.#eventTarget.removeEventListener.bind(this.#eventTarget) constructor () { - const listener = (message: MessageEvent) => { - this.#report(message) - } - const terminator = () => { - this.terminate() - } - BROWSER: { - this.#url = URL.createObjectURL(new Blob([vaultWorker], { type: 'text/javascript' })) - this.#worker = new Worker(this.#url, { type: 'module' }) - this.#worker.addEventListener('message', listener) - this.#worker.addEventListener('error', terminator) - this.#worker.addEventListener('messageerror', terminator) - } - NODE: { - this.#worker = new NodeWorker(vaultWorker, { - eval: true, - stderr: false, - stdout: false - }) - this.#url = dec.toString(this.#worker.threadId) - this.#worker.on('message', listener) - this.#worker.on('error', terminator) - this.#worker.on('messageerror', terminator) - } + const v = Vault.#initialize(this) + this.#url = v.#url + this.#worker = v.#worker } get isLocked (): boolean { return this.#isLocked } @@ -109,15 +88,32 @@ export class Vault { }) } - terminate (err?: any): void { - this.#isTerminated = true - this.#worker.terminate() - BROWSER: URL.revokeObjectURL(this.#url) - //@ts-expect-error - NODE: this.#worker.unref() + shutdown (err?: any): void { + this.#terminate() this.#rejectAll(err) } + static #initialize (v: Vault): Vault { + if (NodeWorker) { + v.#worker = new NodeWorker(vaultWorker, { + eval: true, + stderr: false, + stdout: false + }) + v.#url = dec.toString(v.#worker.threadId) + v.#worker.on('message', v.#report.bind(v)) + v.#worker.on('error', v.shutdown.bind(v)) + v.#worker.on('messageerror', v.shutdown.bind(v)) + } else { + v.#url = URL.createObjectURL(new Blob([vaultWorker], { type: 'text/javascript' })) + v.#worker = new Worker(v.#url, { type: 'module' }) + v.#worker.addEventListener('message', v.#report.bind(v)) + v.#worker.addEventListener('error', v.shutdown.bind(v)) + v.#worker.addEventListener('messageerror', v.shutdown.bind(v)) + } + return v + } + #rejectAll (err?: any): void { for (const [_, task] of this.#tasks) { clearTimeout(task.timeout) @@ -155,4 +151,12 @@ export class Vault { } } } + + #terminate (): void { + this.#isTerminated = true + this.#worker.terminate() + BROWSER: URL.revokeObjectURL(this.#url) + //@ts-expect-error + NODE: this.#worker.unref() + } } diff --git a/src/lib/wallet/destroy.ts b/src/lib/wallet/destroy.ts index a1007e6..2e09af0 100644 --- a/src/lib/wallet/destroy.ts +++ b/src/lib/wallet/destroy.ts @@ -7,7 +7,7 @@ import { Wallet } from '../wallet' export async function _destroy (wallet: Wallet, vault: Vault) { try { - vault.terminate() + vault.shutdown() if (wallet.type === 'Ledger') { await wallet.lock() } diff --git a/src/lib/wallet/index.ts b/src/lib/wallet/index.ts index a866e73..37cd471 100644 --- a/src/lib/wallet/index.ts +++ b/src/lib/wallet/index.ts @@ -346,7 +346,7 @@ export class Wallet { await _lock(this, this.#vault) } catch { console.log('Error locking wallet, terminating Vault worker for safety') - this.#vault.terminate() + this.#vault.shutdown() } } -- 2.52.0