UNPKG

web-worker-helper

Version:

Utilities for running tasks on worker threads

60 lines (53 loc) 1.72 kB
import type { WorkerMessageType, WorkerMessagePayload } from '../types'; import WorkerThread from './worker-thread'; import { assert } from '../utils/env-utils/assert'; /** * Represents one Job handled by a WorkerPool or WorkerFarm */ export default class WorkerJob { public readonly name: string; public readonly workerThread: WorkerThread; public isRunning: boolean; /** Promise that resolves when Job is done */ public readonly result: Promise<any>; private resolve: (value: any) => void; private reject: (reason?: any) => void; constructor(jobName: string, workerThread: WorkerThread) { this.name = jobName; this.workerThread = workerThread; this.isRunning = true; this.resolve = () => {}; this.reject = () => {}; this.result = new Promise((resolve, reject) => { this.resolve = resolve; this.reject = reject; }); } /** * Send a message to the job's worker thread * @param data any data structure, ideally consisting mostly of transferrable objects */ public postMessage(type: WorkerMessageType, payload: WorkerMessagePayload): void { this.workerThread.postMessage({ source: 'Main thread', // Lets worker ignore unrelated messages type, payload, }); } /** * Call to resolve the `result` Promise with the supplied value */ public done(value: any): void { assert(this.isRunning, 'WorkerJob isRunning false.'); this.isRunning = false; this.resolve(value); } /** * Call to reject the `result` Promise with the supplied error */ public error(error: Error): void { assert(this.isRunning, 'WorkerJob isRunning false.'); this.isRunning = false; this.reject(error); } }