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)
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 = {
}
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 => {