Skip to content

Commit

Permalink
chore(loader-utils): Use processOnWorker
Browse files Browse the repository at this point in the history
  • Loading branch information
ibgreen committed Jun 25, 2021
1 parent b895ad2 commit d6e5c29
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 8 deletions.
38 changes: 32 additions & 6 deletions modules/worker-utils/src/lib/worker-api/process-on-worker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -31,16 +38,17 @@ export function canProcessWithWorker(worker: WorkerObject, options?: WorkerOptio
export async function processOnWorker(
worker: WorkerObject,
data: any,
options: WorkerOptions = {},
processOnMainThread?: Function
options: ProcessOnWorkerOptions,
processOnMainThread?: ProcessOnMainThread
): Promise<any> {
const name = getWorkerName(worker);
const url = getWorkerURL(worker, options);

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);
Expand All @@ -56,7 +64,7 @@ export async function processOnWorker(
* @param message
*/
async function onMessage(
processOnMainThread,
processOnMainThread: ProcessOnMainThread | undefined,
job: WorkerJob,
type: WorkerMessageType,
payload: WorkerMessagePayload
Expand All @@ -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}`);
}
}
4 changes: 2 additions & 2 deletions modules/worker-utils/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export type WorkerOptions = {
maxMobileConcurrency?: number;
reuseWorkers?: boolean;
_workerType?: string;
[key: string]: any;
[key: string]: any; // TODO
};

/**
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit d6e5c29

Please sign in to comment.