| 117 | |
| 118 | // Worker creator |
| 119 | const wc = (pkg: string, method?: string): Workerized => { |
| 120 | const str = cws(pkg, method); |
| 121 | return (workerData, transferable) => { |
| 122 | const worker = new Worker(str, { |
| 123 | eval: true, |
| 124 | workerData, |
| 125 | transferList: transferable |
| 126 | }); |
| 127 | let terminated = false; |
| 128 | return { |
| 129 | timeout(ms: number) { |
| 130 | const tm = setTimeout(() => { |
| 131 | worker.terminate(); |
| 132 | terminated = true; |
| 133 | }, ms); |
| 134 | worker.once('message', () => clearTimeout(tm)); |
| 135 | }, |
| 136 | then(res, rej) { |
| 137 | return new Promise((res, rej) => { |
| 138 | worker |
| 139 | .once('message', msg => { |
| 140 | if (msg.err) rej(msg.err); |
| 141 | res(msg); |
| 142 | }) |
| 143 | .once('error', rej) |
| 144 | .once('exit', code => { |
| 145 | if (terminated) rej(new Error('Timed out')); |
| 146 | else if (code !== 0) rej(new Error('Exited with status code ' + code)); |
| 147 | }); |
| 148 | }).then(res, rej); |
| 149 | } |
| 150 | }; |
| 151 | } |
| 152 | } |
| 153 | |
| 154 | const fflate = resolve(__dirname, '..'); |
| 155 | |