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); }); }