X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fworker%2Fabstract-worker.ts;h=dc1f6adc02ba8a7b433f08ae8e4d3f4d9abe7b3d;hb=4e38fd2175c62f93f766733a1feff14a4a9e9958;hp=11a2263a5b5238ac4f728daa8ed97f6ca013c86f;hpb=0a80186676a91b336bef90ba44d937bd85717576;p=poolifier.git diff --git a/src/worker/abstract-worker.ts b/src/worker/abstract-worker.ts index 11a2263a..dc1f6adc 100644 --- a/src/worker/abstract-worker.ts +++ b/src/worker/abstract-worker.ts @@ -18,7 +18,7 @@ import { KillBehaviors, type WorkerOptions } from './worker-options' import type { TaskAsyncFunction, TaskFunction, - TaskFunctionOperationReturnType, + TaskFunctionOperationResult, TaskFunctions, TaskSyncFunction } from './task-functions' @@ -100,11 +100,38 @@ export abstract class AbstractWorker< } 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') + } this.opts = { ...DEFAULT_WORKER_OPTIONS, ...opts } - delete this.opts.async } - private checkValidTaskFunction ( + private checkValidTaskFunctionEntry ( name: string, fn: TaskFunction ): void { @@ -126,7 +153,7 @@ export abstract class AbstractWorker< } /** - * Checks if the `taskFunctions` parameter is passed to the constructor. + * Checks if the `taskFunctions` parameter is passed to the constructor and valid. * * @param taskFunctions - The task function(s) parameter that should be checked. */ @@ -150,7 +177,7 @@ export abstract class AbstractWorker< } else if (isPlainObject(taskFunctions)) { let firstEntry = true for (const [name, fn] of Object.entries(taskFunctions)) { - this.checkValidTaskFunction(name, fn) + this.checkValidTaskFunctionEntry(name, fn) const boundFn = fn.bind(this) if (firstEntry) { this.taskFunctions.set(DEFAULT_TASK_NAME, boundFn) @@ -174,7 +201,7 @@ export abstract class AbstractWorker< * @param name - The name of the task function to check. * @returns Whether the worker has a task function with the given name or not. */ - public hasTaskFunction (name: string): TaskFunctionOperationReturnType { + public hasTaskFunction (name: string): TaskFunctionOperationResult { try { this.checkTaskFunctionName(name) } catch (error) { @@ -194,7 +221,7 @@ export abstract class AbstractWorker< public addTaskFunction ( name: string, fn: TaskFunction - ): TaskFunctionOperationReturnType { + ): TaskFunctionOperationResult { try { this.checkTaskFunctionName(name) if (name === DEFAULT_TASK_NAME) { @@ -226,7 +253,7 @@ export abstract class AbstractWorker< * @param name - The name of the task function to remove. * @returns Whether the task function existed and was removed or not. */ - public removeTaskFunction (name: string): TaskFunctionOperationReturnType { + public removeTaskFunction (name: string): TaskFunctionOperationResult { try { this.checkTaskFunctionName(name) if (name === DEFAULT_TASK_NAME) { @@ -282,7 +309,7 @@ export abstract class AbstractWorker< * @param name - The name of the task function to use as default task function. * @returns Whether the default task function was set or not. */ - public setDefaultTaskFunction (name: string): TaskFunctionOperationReturnType { + public setDefaultTaskFunction (name: string): TaskFunctionOperationResult { try { this.checkTaskFunctionName(name) if (name === DEFAULT_TASK_NAME) { @@ -299,6 +326,7 @@ export abstract class AbstractWorker< DEFAULT_TASK_NAME, this.taskFunctions.get(name) as TaskFunction ) + this.sendTaskFunctionNamesToMainWorker() return { status: true } } catch (error) { return { status: false, error: error as Error } @@ -349,8 +377,8 @@ export abstract class AbstractWorker< protected handleTaskFunctionOperationMessage ( message: MessageValue ): void { - const { taskFunctionOperation, taskFunction, taskFunctionName } = message - let response!: TaskFunctionOperationReturnType + const { taskFunctionOperation, taskFunctionName, taskFunction } = message + let response!: TaskFunctionOperationResult if (taskFunctionOperation === 'add') { response = this.addTaskFunction( taskFunctionName as string, @@ -368,10 +396,14 @@ export abstract class AbstractWorker< this.sendToMainWorker({ taskFunctionOperation, taskFunctionOperationStatus: response.status, - workerError: { - name: taskFunctionName as string, - message: this.handleError(response.error as Error | string) - } + taskFunctionName, + ...(!response.status && + response?.error != null && { + workerError: { + name: taskFunctionName as string, + message: this.handleError(response.error as Error | string) + } + }) }) } @@ -579,7 +611,7 @@ export abstract class AbstractWorker< taskPerformance, taskId }) - return null + return undefined }) .catch(error => { this.sendToMainWorker({