Spaces:
Sleeping
Sleeping
| import { isMainThread, parentPort, workerData } from 'worker_threads'; | |
| import { hasOwnProperty, isObject } from 'smob'; | |
| import { minify } from 'terser'; | |
| import { workerPoolWorkerFlag } from './constants'; | |
| import type { WorkerContextSerialized, WorkerOutput } from './type'; | |
| /** | |
| * Duck typing worker context. | |
| * | |
| * @param input | |
| */ | |
| function isWorkerContextSerialized(input: unknown): input is WorkerContextSerialized { | |
| return ( | |
| isObject(input) && | |
| hasOwnProperty(input, 'code') && | |
| typeof input.code === 'string' && | |
| hasOwnProperty(input, 'options') && | |
| typeof input.options === 'string' | |
| ); | |
| } | |
| export function runWorker() { | |
| if (isMainThread || !parentPort || workerData !== workerPoolWorkerFlag) { | |
| return; | |
| } | |
| // eslint-disable-next-line no-eval | |
| const eval2 = eval; | |
| parentPort.on('message', async (data: WorkerContextSerialized) => { | |
| if (!isWorkerContextSerialized(data)) { | |
| return; | |
| } | |
| const options = eval2(`(${data.options})`); | |
| const result = await minify(data.code, options); | |
| const output: WorkerOutput = { | |
| code: result.code || data.code, | |
| nameCache: options.nameCache | |
| }; | |
| if (typeof result.map === 'string') { | |
| output.sourceMap = JSON.parse(result.map); | |
| } | |
| if (isObject(result.map)) { | |
| output.sourceMap = result.map; | |
| } | |
| parentPort?.postMessage(output); | |
| }); | |
| } | |