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 }
})
}
- 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)
}
}
}
+
+ #terminate (): void {
+ this.#isTerminated = true
+ this.#worker.terminate()
+ BROWSER: URL.revokeObjectURL(this.#url)
+ //@ts-expect-error
+ NODE: this.#worker.unref()
+ }
}