import type { MatmulResult } from './types' // Dedicated classic worker for the pthread-capable WASM modules (threaded // custom C, libFLAME/BLIS st + mt). It's a classic worker served verbatim // from public/matmul/ (see worker.js for why it can't be a Vite module // worker). Resolve it relative to the deployed base. const WORKER_URL = new URL( `${import.meta.env.BASE_URL}matmul/worker.js`, window.location.href, ) let worker: Worker | null = null let nextId = 0 const pending = new Map void; reject: (e: Error) => void }>() function getWorker(): Worker { if (!worker) { worker = new Worker(WORKER_URL) // classic worker (no { type: 'module' }) worker.onmessage = (e: MessageEvent<{ id: number; ms?: number; sample?: number; error?: string }>) => { const p = pending.get(e.data.id) if (!p) return pending.delete(e.data.id) if (e.data.error) p.reject(new Error(e.data.error)) else p.resolve({ ms: e.data.ms!, sample: e.data.sample! }) } } return worker } export function runInThreadedWorker( kind: string, n: number, seedA: number, seedB: number, threads: number, ): Promise { const w = getWorker() const id = nextId++ return new Promise((resolve, reject) => { pending.set(id, { resolve, reject }) w.postMessage({ id, kind, n, seedA, seedB, threads }) }) }