]> git.codecow.com Git - libnemo.git/commitdiff
Refactor worker termination to reject all pending promises.
authorChris Duncan <chris@codecow.com>
Tue, 12 May 2026 13:44:10 +0000 (06:44 -0700)
committerChris Duncan <chris@codecow.com>
Tue, 12 May 2026 13:44:10 +0000 (06:44 -0700)
src/lib/vault/index.ts

index 8f1e59ceeb93833150f6c4eae9235255f7fd5066..16f410871989c05c84e65d9ace5eac2d6514ae97 100644 (file)
@@ -16,16 +16,17 @@ type Task = {
 const vaultWorker = VAULT_WORKER
 const LOCKED = 'locked'
 const UNLOCKED = 'unlocked'
+const TERMINATED = 'Worker terminated'
 
 export class Vault {
-       #eventTarget = new EventTarget()
+       #eventTarget: EventTarget = new EventTarget()
        #job?: Task
        #isIdle: boolean = true
        #isLocked: boolean = true
        #isTerminated: boolean = false
        #queue: Task[] = []
        #url: string
-       #worker: Worker | NodeWorker
+       #worker: NodeWorker | Worker
 
        // Compose event emission for status changes
        addEventListener = this.#eventTarget.addEventListener.bind(this.#eventTarget)
@@ -53,7 +54,7 @@ export class Vault {
 
        request<T extends Data | Record<string, Data>> (data: Record<string, Data | Record<string, Data>>): Promise<Record<string, T>> {
                if (this.#isTerminated) {
-                       throw new Error('Worker terminated')
+                       throw new Error(TERMINATED)
                }
                return new Promise((resolve, reject): void => {
                        const task: Task = {
@@ -69,9 +70,17 @@ export class Vault {
        }
 
        terminate (): void {
-               this.#job = undefined
-               this.#worker.terminate()
                this.#isTerminated = true
+               this.#worker.terminate()
+               BROWSER: URL.revokeObjectURL(this.#url)
+               //@ts-expect-error
+               NODE: this.#worker.unref()
+               this.#job?.reject(TERMINATED)
+               this.#job = undefined
+               for (const task of this.#queue) {
+                       task?.reject?.(TERMINATED)
+               }
+               this.#queue = []
        }
 
        #process = (): void => {