basin / files / src / model / puzzle.worker.ts
puzzle.worker.ts
| 1 | import { generatePuzzle } from './puzzle'; |
| 2 | import type { Config, Puzzle } from './puzzle'; |
| 3 | |
| 4 | export type WorkerRequest = { type: 'generate'; seq: number; config: Config }; |
| 5 | export type WorkerResponse = |
| 6 | | { type: 'progress'; seq: number; value: number } |
| 7 | | { type: 'done'; seq: number; puzzle: Puzzle }; |
| 8 | |
| 9 | self.addEventListener('message', (e: MessageEvent<WorkerRequest>) => { |
| 10 | const { type, seq, config } = e.data; |
| 11 | if (type !== 'generate') return; |
| 12 | |
| 13 | const puzzle = generatePuzzle(config, (value) => { |
| 14 | (self as unknown as Worker).postMessage({ type: 'progress', seq, value } satisfies WorkerResponse); |
| 15 | }); |
| 16 | |
| 17 | (self as unknown as Worker).postMessage( |
| 18 | { type: 'done', seq, puzzle } satisfies WorkerResponse, |
| 19 | [puzzle.hm.data.buffer, puzzle.target.buffer], |
| 20 | ); |
| 21 | }); |