X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fworker%2Fabstract-worker.ts;h=22e65bad63d213aa6b1bda6f0adc6a2a76401873;hb=222e961327beb03ab327a93dd4ff6ca47b0c51f2;hp=dc1f6adc02ba8a7b433f08ae8e4d3f4d9abe7b3d;hpb=4e38fd2175c62f93f766733a1feff14a4a9e9958;p=poolifier.git diff --git a/src/worker/abstract-worker.ts b/src/worker/abstract-worker.ts index dc1f6adc..22e65bad 100644 --- a/src/worker/abstract-worker.ts +++ b/src/worker/abstract-worker.ts @@ -22,6 +22,11 @@ import type { TaskFunctions, TaskSyncFunction } from './task-functions' +import { + checkTaskFunctionName, + checkValidTaskFunctionEntry, + checkValidWorkerOptions +} from './utils' const DEFAULT_MAX_INACTIVE_TIME = 60000 const DEFAULT_WORKER_OPTIONS: WorkerOptions = { @@ -95,63 +100,16 @@ export abstract class AbstractWorker< this.checkTaskFunctions(taskFunctions) this.checkWorkerOptions(this.opts) if (!this.isMain) { + // Should be once() but Node.js on windows has a bug that prevents it from working this.getMainWorker().on('message', this.handleReadyMessage.bind(this)) } } private checkWorkerOptions (opts: WorkerOptions): void { - if (opts != null && !isPlainObject(opts)) { - throw new TypeError('opts worker options parameter is not a plain object') - } - if ( - opts?.killBehavior != null && - !Object.values(KillBehaviors).includes(opts.killBehavior) - ) { - throw new TypeError( - `killBehavior option '${opts.killBehavior}' is not valid` - ) - } - if ( - opts?.maxInactiveTime != null && - !Number.isSafeInteger(opts.maxInactiveTime) - ) { - throw new TypeError('maxInactiveTime option is not an integer') - } - if (opts?.maxInactiveTime != null && opts.maxInactiveTime < 5) { - throw new TypeError( - 'maxInactiveTime option is not a positive integer greater or equal than 5' - ) - } - if (opts?.killHandler != null && typeof opts.killHandler !== 'function') { - throw new TypeError('killHandler option is not a function') - } - if (opts?.async != null) { - throw new Error('async option is deprecated') - } + checkValidWorkerOptions(opts) this.opts = { ...DEFAULT_WORKER_OPTIONS, ...opts } } - private checkValidTaskFunctionEntry ( - name: string, - fn: TaskFunction - ): void { - if (typeof name !== 'string') { - throw new TypeError( - 'A taskFunctions parameter object key is not a string' - ) - } - if (typeof name === 'string' && name.trim().length === 0) { - throw new TypeError( - 'A taskFunctions parameter object key is an empty string' - ) - } - if (typeof fn !== 'function') { - throw new TypeError( - 'A taskFunctions parameter object value is not a function' - ) - } - } - /** * Checks if the `taskFunctions` parameter is passed to the constructor and valid. * @@ -177,7 +135,7 @@ export abstract class AbstractWorker< } else if (isPlainObject(taskFunctions)) { let firstEntry = true for (const [name, fn] of Object.entries(taskFunctions)) { - this.checkValidTaskFunctionEntry(name, fn) + checkValidTaskFunctionEntry(name, fn) const boundFn = fn.bind(this) if (firstEntry) { this.taskFunctions.set(DEFAULT_TASK_NAME, boundFn) @@ -203,7 +161,7 @@ export abstract class AbstractWorker< */ public hasTaskFunction (name: string): TaskFunctionOperationResult { try { - this.checkTaskFunctionName(name) + checkTaskFunctionName(name) } catch (error) { return { status: false, error: error as Error } } @@ -223,7 +181,7 @@ export abstract class AbstractWorker< fn: TaskFunction ): TaskFunctionOperationResult { try { - this.checkTaskFunctionName(name) + checkTaskFunctionName(name) if (name === DEFAULT_TASK_NAME) { throw new Error( 'Cannot add a task function with the default reserved name' @@ -255,7 +213,7 @@ export abstract class AbstractWorker< */ public removeTaskFunction (name: string): TaskFunctionOperationResult { try { - this.checkTaskFunctionName(name) + checkTaskFunctionName(name) if (name === DEFAULT_TASK_NAME) { throw new Error( 'Cannot remove the task function with the default reserved name' @@ -311,7 +269,7 @@ export abstract class AbstractWorker< */ public setDefaultTaskFunction (name: string): TaskFunctionOperationResult { try { - this.checkTaskFunctionName(name) + checkTaskFunctionName(name) if (name === DEFAULT_TASK_NAME) { throw new Error( 'Cannot set the default task function reserved name as the default task function' @@ -333,15 +291,6 @@ export abstract class AbstractWorker< } } - private checkTaskFunctionName (name: string): void { - if (typeof name !== 'string') { - throw new TypeError('name parameter is not a string') - } - if (typeof name === 'string' && name.trim().length === 0) { - throw new TypeError('name parameter is an empty string') - } - } - /** * Handles the ready message sent by the main worker. * @@ -379,19 +328,26 @@ export abstract class AbstractWorker< ): void { const { taskFunctionOperation, taskFunctionName, taskFunction } = message let response!: TaskFunctionOperationResult - if (taskFunctionOperation === 'add') { - response = this.addTaskFunction( - taskFunctionName as string, - // eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func - new Function(`return ${taskFunction as string}`)() as TaskFunction< - Data, - Response - > - ) - } else if (taskFunctionOperation === 'remove') { - response = this.removeTaskFunction(taskFunctionName as string) - } else if (taskFunctionOperation === 'default') { - response = this.setDefaultTaskFunction(taskFunctionName as string) + switch (taskFunctionOperation) { + case 'add': + response = this.addTaskFunction( + taskFunctionName as string, + // eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func + new Function(`return ${taskFunction as string}`)() as TaskFunction< + Data, + Response + > + ) + break + case 'remove': + response = this.removeTaskFunction(taskFunctionName as string) + break + case 'default': + response = this.setDefaultTaskFunction(taskFunctionName as string) + break + default: + response = { status: false, error: new Error('Unknown task operation') } + break } this.sendToMainWorker({ taskFunctionOperation, @@ -534,7 +490,6 @@ export abstract class AbstractWorker< * Runs the given task. * * @param task - The task to execute. - * @throws {@link https://nodejs.org/api/errors.html#class-error} If the task function is not found. */ protected run (task: Task): void { const { name, taskId, data } = task