import type { BeadSystem, Excitation, SimOptions, SimResult } from './types'; export interface Running { promise: Promise; cancel: () => void; } // onPartial gets the result so far every few seconds while the run is in progress export function runInWorker( sys: BeadSystem, exc: Excitation, opt: SimOptions, gpu: boolean, onProgress: (f: number) => void, onPartial?: (r: SimResult) => void, ): Running { const worker = new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' }); let reject!: (e: Error) => void; const promise = new Promise((res, rej) => { reject = rej; worker.onmessage = (ev) => { const m = ev.data; if (m.type === 'progress') onProgress(m.fraction); else if (m.type === 'partial') onPartial?.(m.result); else if (m.type === 'done') { worker.terminate(); res(m.result); } else { worker.terminate(); rej(new Error(m.message)); } }; worker.onerror = (e) => { worker.terminate(); rej(new Error(e.message)); }; }); worker.postMessage({ sys, exc, opt, gpu }); return { promise, cancel: () => { worker.terminate(); reject(new Error('cancelled')); }, }; }