]> git.codecow.com Git - libnemo.git/commitdiff
Extract worker init to static method and teardown to split up termination and rejection.
authorChris Duncan <chris@codecow.com>
Sun, 9 Aug 2026 09:13:18 +0000 (02:13 -0700)
committerChris Duncan <chris@codecow.com>
Sun, 9 Aug 2026 09:13:18 +0000 (02:13 -0700)
src/lib/vault/index.ts
src/lib/wallet/destroy.ts
src/lib/wallet/index.ts

index 805a4dfcd6dad2f2c65a3a6737e6bd5929d40fa2..25d58dc21bb6d94c67b76b36d1d4b34853f82ba4 100644 (file)
@@ -39,30 +39,9 @@ export class Vault {
        removeEventListener = this.#eventTarget.removeEventListener.bind(this.#eventTarget)
 
        constructor () {
-               const listener = (message: MessageEvent<any>) => {
-                       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()
+       }
 }
index a1007e6a0654bd93095a830227c13399aa6252f1..2e09af0f0fe5fa0f02742d1eec8b7ef076692e8f 100644 (file)
@@ -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()
                }
index a866e7307ec5c150cccf849de60077c5fd16d7c7..37cd471f27a28edf552692fb90fa86a334a2e30e 100644 (file)
@@ -346,7 +346,7 @@ export class Wallet {
                        await _lock(this, this.#vault)\r
                } catch {\r
                        console.log('Error locking wallet, terminating Vault worker for safety')\r
-                       this.#vault.terminate()\r
+                       this.#vault.shutdown()\r
                }\r
        }\r
 \r