basin / files / src / model / puzzle.worker.ts
puzzle.worker.ts
b9acd697 2026-07-01 Pavel Safronov | 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 | }); |