X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fworker%2Fabstract-worker.ts;h=2afd6f3486a1103347a258c575cece7773e3c4d3;hb=0e05c4dc968e27cf71ef2ab266feb57d9d1bade9;hp=8b461f7d3bad7d462c0f4bcea900f0a3bff295dd;hpb=630f0acfda6a1b894102504c9d5316b99c0a188d;p=poolifier.git diff --git a/src/worker/abstract-worker.ts b/src/worker/abstract-worker.ts index 8b461f7d..2afd6f34 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' @@ -71,7 +71,10 @@ export abstract class AbstractWorker< super(type) this.checkWorkerOptions(this.opts) this.checkTaskFunctions(taskFunctions) - if (!this.isMain) { + if ( + !this.isMain && + (this.opts.maxInactiveTime ?? DEFAULT_MAX_INACTIVE_TIME) > 0 + ) { this.lastTaskTimestamp = performance.now() this.aliveInterval = setInterval( this.checkAlive.bind(this), @@ -87,7 +90,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 +106,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 +127,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 +210,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 +238,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 }) @@ -271,7 +269,7 @@ export abstract class AbstractWorker< name = name ?? DEFAULT_FUNCTION_NAME const fn = this.taskFunctions.get(name) if (fn == null) { - throw new Error(`Task function "${name}" not found`) + throw new Error(`Task function '${name}' not found`) } return fn }