X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fworker%2Fabstract-worker.ts;h=176a5893caeeec7cb9d82095840b97498b3822b0;hb=c93c0a1bcdf41b33f90a654e55d71f4cc14ab963;hp=8b461f7d3bad7d462c0f4bcea900f0a3bff295dd;hpb=630f0acfda6a1b894102504c9d5316b99c0a188d;p=poolifier.git diff --git a/src/worker/abstract-worker.ts b/src/worker/abstract-worker.ts index 8b461f7d..176a5893 100644 --- a/src/worker/abstract-worker.ts +++ b/src/worker/abstract-worker.ts @@ -8,7 +8,7 @@ import type { WorkerFunction, WorkerSyncFunction } from '../utility-types' -import { EMPTY_FUNCTION } from '../utils' +import { EMPTY_FUNCTION, isPlainObject } from '../utils' import type { KillBehavior, WorkerOptions } from './worker-options' import { KillBehaviors } from './worker-options' @@ -87,7 +87,7 @@ export abstract class AbstractWorker< this.opts.killBehavior = opts.killBehavior ?? DEFAULT_KILL_BEHAVIOR this.opts.maxInactiveTime = opts.maxInactiveTime ?? DEFAULT_MAX_INACTIVE_TIME - this.opts.async = opts.async ?? false + delete this.opts.async } /** @@ -103,25 +103,14 @@ export abstract class AbstractWorker< if (taskFunctions == null) { throw new Error('taskFunctions parameter is mandatory') } - if ( - typeof taskFunctions !== 'function' && - typeof taskFunctions !== 'object' - ) { - throw new Error('taskFunctions parameter is not a function or an object') - } - if ( - typeof taskFunctions === 'object' && - taskFunctions.constructor !== Object && - Object.prototype.toString.call(taskFunctions) !== '[object Object]' - ) { - throw new Error('taskFunctions parameter is not an object literal') - } this.taskFunctions = new Map>() - if (typeof taskFunctions !== 'function') { + if (typeof taskFunctions === 'function') { + this.taskFunctions.set(DEFAULT_FUNCTION_NAME, taskFunctions.bind(this)) + } else if (isPlainObject(taskFunctions)) { let firstEntry = true for (const [name, fn] of Object.entries(taskFunctions)) { if (typeof fn !== 'function') { - throw new Error( + throw new TypeError( 'A taskFunctions parameter object value is not a function' ) } @@ -135,7 +124,9 @@ export abstract class AbstractWorker< throw new Error('taskFunctions parameter object is empty') } } else { - this.taskFunctions.set(DEFAULT_FUNCTION_NAME, taskFunctions.bind(this)) + throw new TypeError( + 'taskFunctions parameter is not a function or a plain object' + ) } } @@ -216,12 +207,14 @@ export abstract class AbstractWorker< ): void { try { const startTimestamp = performance.now() + const waitTime = startTimestamp - (message.submissionTimestamp ?? 0) const res = fn(message.data) const runTime = performance.now() - startTimestamp this.sendToMainWorker({ data: res, id: message.id, - runTime + runTime, + waitTime }) } catch (e) { const err = this.handleError(e as Error) @@ -242,13 +235,15 @@ export abstract class AbstractWorker< message: MessageValue ): void { const startTimestamp = performance.now() + const waitTime = startTimestamp - (message.submissionTimestamp ?? 0) fn(message.data) .then(res => { const runTime = performance.now() - startTimestamp this.sendToMainWorker({ data: res, id: message.id, - runTime + runTime, + waitTime }) return null })