// Runs the CPU-bound methods (plain JS and both WASM kernels) off the main // thread — naive JS/WASM at n=2048 take long enough (~10s) to freeze the tab // otherwise. Regenerates inputs from the (n, seed) pair rather than // receiving them over postMessage, since that's cheaper than structured- // cloning multi-megabyte Float64Arrays for every run. import { generateMatrix } from './random' import { jsMatmul } from './jsMatmul' import { wasmNaiveMatmul, wasmBlockedMatmul } from './wasmMatmul' import type { MatmulMethod } from './types' const METHODS: Record = { js: jsMatmul, 'wasm-naive': wasmNaiveMatmul, 'wasm-blocked': wasmBlockedMatmul, } export interface WorkerRequest { id: number methodId: string n: number seedA: number seedB: number } export type WorkerResponse = | { id: number; ms: number; sample: number } | { id: number; error: string } self.onmessage = async (e: MessageEvent) => { const { id, methodId, n, seedA, seedB } = e.data try { const method = METHODS[methodId] if (!method?.run) throw new Error(`Unknown method: ${methodId}`) const a = generateMatrix(n, seedA) const b = generateMatrix(n, seedB) const { ms, sample } = await method.run(n, a, b) self.postMessage({ id, ms, sample } satisfies WorkerResponse) } catch (err) { self.postMessage({ id, error: err instanceof Error ? err.message : String(err) } satisfies WorkerResponse) } }