diff --git a/modules/worker-utils/src/lib/worker-api/process-on-worker.ts b/modules/worker-utils/src/lib/worker-api/process-on-worker.ts index 54326dfcba..36485c8ca8 100644 --- a/modules/worker-utils/src/lib/worker-api/process-on-worker.ts +++ b/modules/worker-utils/src/lib/worker-api/process-on-worker.ts @@ -9,6 +9,13 @@ import WorkerFarm from '../worker-farm/worker-farm'; import {removeNontransferableOptions} from '../worker-utils/remove-nontransferable-options'; import {getWorkerURL, getWorkerName} from './get-worker-url'; +type ProcessOnWorkerOptions = WorkerOptions & { + jobName?: string; + [key: string]: any; +}; + +type ProcessOnMainThread = (data: any, options?: {[key: string]: any}) => any; + /** * Determines if we can parse with worker * @param loader @@ -31,8 +38,8 @@ export function canProcessWithWorker(worker: WorkerObject, options?: WorkerOptio export async function processOnWorker( worker: WorkerObject, data: any, - options: WorkerOptions = {}, - processOnMainThread?: Function + options: ProcessOnWorkerOptions, + processOnMainThread?: ProcessOnMainThread ): Promise { const name = getWorkerName(worker); const url = getWorkerURL(worker, options); @@ -40,7 +47,8 @@ export async function processOnWorker( const workerFarm = WorkerFarm.getWorkerFarm(options); const workerPool = workerFarm.getWorkerPool({name, url}); - const job = await workerPool.startJob(worker.name, onMessage.bind(null, processOnMainThread)); + const jobName = options.jobName || worker.name; + const job = await workerPool.startJob(jobName, onMessage.bind(null, processOnMainThread)); // Kick off the processing in the worker const transferableOptions = removeNontransferableOptions(options); @@ -56,7 +64,7 @@ export async function processOnWorker( * @param message */ async function onMessage( - processOnMainThread, + processOnMainThread: ProcessOnMainThread | undefined, job: WorkerJob, type: WorkerMessageType, payload: WorkerMessagePayload @@ -65,11 +73,29 @@ async function onMessage( case 'done': job.done(payload); break; + case 'error': job.error(payload.error); break; - default: - job.error(type); + + case 'process': + // Worker is asking for main thread to parse + const {id, input, options} = payload; + try { + if (!processOnMainThread) { + job.postMessage('error', {id, error: 'Worker not set up to process on main thread'}); + return; + } + const result = await processOnMainThread(input, options); + job.postMessage('done', {id, result}); + } catch (error) { + const message = error instanceof Error ? error.message : 'unknown error'; + job.postMessage('error', {id, error: message}); + } break; + + default: + // eslint-disable-next-line + console.warn(`process-on-worker: unknown message ${type}`); } } diff --git a/modules/worker-utils/src/types.ts b/modules/worker-utils/src/types.ts index 3b5a652e37..1281e4a1f5 100644 --- a/modules/worker-utils/src/types.ts +++ b/modules/worker-utils/src/types.ts @@ -9,7 +9,7 @@ export type WorkerOptions = { maxMobileConcurrency?: number; reuseWorkers?: boolean; _workerType?: string; - [key: string]: any; + [key: string]: any; // TODO }; /** @@ -59,7 +59,7 @@ export type WorkerMessageType = export type WorkerMessagePayload = { id?: number; - options?: object; + options?: {[key: string]: any}; input?: any; // Transferable; result?: any; // Transferable error?: string;