(worker: Worker, pred: (m: Msg) => boolean)
| 75 | } |
| 76 | |
| 77 | function waitFor(worker: Worker, pred: (m: Msg) => boolean): Promise<Msg> { |
| 78 | return new Promise((resolve, reject) => { |
| 79 | const onMsg = (m: unknown) => { |
| 80 | if (typeof m !== "object" || m === null) return; |
| 81 | const type = (m as { type?: unknown }).type; |
| 82 | if (typeof type !== "string") return; |
| 83 | const msg = m as Msg; |
| 84 | if (msg.type === "fatal") { |
| 85 | cleanup(); |
| 86 | reject(new Error(`worker fatal: ${msg.where} (${msg.code}): ${msg.detail}`)); |
| 87 | return; |
| 88 | } |
| 89 | if (pred(msg)) { |
| 90 | cleanup(); |
| 91 | resolve(msg); |
| 92 | } |
| 93 | }; |
| 94 | |
| 95 | const onExit = (code: number) => { |
| 96 | cleanup(); |
| 97 | reject(new Error(`worker exited before expected message: code=${String(code)}`)); |
| 98 | }; |
| 99 | |
| 100 | const cleanup = () => { |
| 101 | worker.off("message", onMsg); |
| 102 | worker.off("exit", onExit); |
| 103 | }; |
| 104 | |
| 105 | worker.on("message", onMsg); |
| 106 | worker.on("exit", onExit); |
| 107 | }); |
| 108 | } |
| 109 | |
| 110 | function post(worker: Worker, msg: MainToWorkerMessage, transfer?: readonly ArrayBuffer[]): void { |
| 111 | if (transfer !== undefined) { |
no test coverage detected