export class Thread R> { private _worker: Worker; constructor(fn: F) { const stringFn = `self.onmessage = (event) => { const data = event.data; const fn = ${fn.toString()}; const result = fn(...data.data); self.postMessage(result); }`; const jsFile = new File([stringFn], `${fn.name}.js`, { type: "application/javascript" }); const jsFileUrl = URL.createObjectURL(jsFile); this._worker = new Worker(jsFileUrl); } public run(...args: Parameters): Promise { this._worker.postMessage({ data: [...args] }); return new Promise((res, rej) => { this._worker.addEventListener("message", (event) => res(event.data)); this._worker.addEventListener("error", (event) => rej(event)); }); } public terminate(): void { this._worker.terminate(); } }