X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fworker%2Fabstract-worker.ts;h=9b9ded5e9d1cc1267846fb9e0279d88de405262f;hb=3a5027122ca6401ae1d755843b20f714c61e3240;hp=2a5f1121521f15c193df29022aa755ed2aabee8f;hpb=f741236338de5af620b672d81e49677759371298;p=poolifier.git diff --git a/src/worker/abstract-worker.ts b/src/worker/abstract-worker.ts index 2a5f1121..9b9ded5e 100644 --- a/src/worker/abstract-worker.ts +++ b/src/worker/abstract-worker.ts @@ -7,14 +7,14 @@ import type { Task, TaskFunctionProperties, TaskPerformance, - WorkerStatistics + WorkerStatistics, } from '../utility-types.js' import { buildTaskFunctionProperties, DEFAULT_TASK_NAME, EMPTY_FUNCTION, isAsyncFunction, - isPlainObject + isPlainObject, } from '../utils.js' import type { TaskAsyncFunction, @@ -22,12 +22,12 @@ import type { TaskFunctionObject, TaskFunctionOperationResult, TaskFunctions, - TaskSyncFunction + TaskSyncFunction, } from './task-functions.js' import { checkTaskFunctionName, checkValidTaskFunctionObjectEntry, - checkValidWorkerOptions + checkValidWorkerOptions, } from './utils.js' import { KillBehaviors, type WorkerOptions } from './worker-options.js' @@ -45,12 +45,11 @@ const DEFAULT_WORKER_OPTIONS: WorkerOptions = { /** * The function to call when the worker is killed. */ - killHandler: EMPTY_FUNCTION + killHandler: EMPTY_FUNCTION, } /** * Base class that implements some shared logic for all poolifier workers. - * * @typeParam MainWorker - Type of main worker. * @typeParam Data - Type of data this worker receives from pool's execution. This can only be structured-cloneable data. * @typeParam Response - Type of response the worker sends back to the main worker. This can only be structured-cloneable data. @@ -79,11 +78,11 @@ export abstract class AbstractWorker< /** * Handler id of the `activeInterval` worker activity check. */ + // eslint-disable-next-line no-undef protected activeInterval?: NodeJS.Timeout /** * Constructs a new poolifier worker. - * * @param isMain - Whether this is the main worker or not. * @param mainWorker - Reference to main worker. * @param taskFunctions - Task function(s) processed by the worker when the pool's `execution` function is invoked. The first function is the default function. @@ -113,14 +112,13 @@ export abstract class AbstractWorker< /** * Checks if the `taskFunctions` parameter is passed to the constructor and valid. - * * @param taskFunctions - The task function(s) parameter that should be checked. */ private checkTaskFunctions ( taskFunctions: - | TaskFunction - | TaskFunctions - | undefined + | TaskFunction + | TaskFunctions + | undefined ): void { if (taskFunctions == null) { throw new Error('taskFunctions parameter is mandatory') @@ -141,8 +139,8 @@ export abstract class AbstractWorker< for (let [name, fnObj] of Object.entries(taskFunctions)) { if (typeof fnObj === 'function') { fnObj = { taskFunction: fnObj } satisfies TaskFunctionObject< - Data, - Response + Data, + Response > } checkValidTaskFunctionObjectEntry(name, fnObj) @@ -165,7 +163,6 @@ export abstract class AbstractWorker< /** * Checks if the worker has a task function with the given name. - * * @param name - The name of the task function to check. * @returns Whether the worker has a task function with the given name or not. */ @@ -181,7 +178,6 @@ export abstract class AbstractWorker< /** * Adds a task function to the worker. * If a task function with the same name already exists, it is replaced. - * * @param name - The name of the task function to add. * @param fn - The task function to add. * @returns Whether the task function was added or not. @@ -218,7 +214,6 @@ export abstract class AbstractWorker< /** * Removes a task function from the worker. - * * @param name - The name of the task function to remove. * @returns Whether the task function existed and was removed or not. */ @@ -248,7 +243,6 @@ export abstract class AbstractWorker< /** * Lists the properties of the worker's task functions. - * * @returns The properties of the worker's task functions. */ public listTaskFunctionsProperties (): TaskFunctionProperties[] { @@ -278,13 +272,12 @@ export abstract class AbstractWorker< defaultTaskFunctionName, this.taskFunctions.get(defaultTaskFunctionName) ), - ...taskFunctionsProperties + ...taskFunctionsProperties, ] } /** * Sets the default task function to use in the worker. - * * @param name - The name of the task function to use as default task function. * @returns Whether the default task function was set or not. */ @@ -312,31 +305,37 @@ export abstract class AbstractWorker< /** * Handles the ready message sent by the main worker. - * * @param message - The ready message. */ protected abstract handleReadyMessage (message: MessageValue): void /** * Worker message listener. - * * @param message - The received message. */ protected messageListener (message: MessageValue): void { this.checkMessageWorkerId(message) - if (message.statistics != null) { + const { + statistics, + checkActive, + taskFunctionOperation, + taskId, + data, + kill, + } = message + if (statistics != null) { // Statistics message received - this.statistics = message.statistics - } else if (message.checkActive != null) { + this.statistics = statistics + } else if (checkActive != null) { // Check active message received - message.checkActive ? this.startCheckActive() : this.stopCheckActive() - } else if (message.taskFunctionOperation != null) { + checkActive ? this.startCheckActive() : this.stopCheckActive() + } else if (taskFunctionOperation != null) { // Task function operation message received this.handleTaskFunctionOperationMessage(message) - } else if (message.taskId != null && message.data != null) { + } else if (taskId != null && data != null) { // Task message received this.run(message) - } else if (message.kill === true) { + } else if (kill === true) { // Kill message received this.handleKillMessage(message) } @@ -356,16 +355,16 @@ export abstract class AbstractWorker< switch (taskFunctionOperation) { case 'add': response = this.addTaskFunction(taskFunctionProperties.name, { - // eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func + // eslint-disable-next-line no-new-func taskFunction: new Function( `return ${taskFunction}` )() as TaskFunction, ...(taskFunctionProperties.priority != null && { - priority: taskFunctionProperties.priority + priority: taskFunctionProperties.priority, }), ...(taskFunctionProperties.strategy != null && { - strategy: taskFunctionProperties.strategy - }) + strategy: taskFunctionProperties.strategy, + }), }) break case 'remove': @@ -386,21 +385,20 @@ export abstract class AbstractWorker< response.error != null && { workerError: { name: taskFunctionProperties.name, - message: this.handleError(response.error as Error | string) - } - }) + message: this.handleError(response.error as Error | string), + }, + }), }) } /** * Handles a kill message sent by the main worker. - * * @param message - The kill message. */ - protected handleKillMessage (_message: MessageValue): void { + protected handleKillMessage (message: MessageValue): void { this.stopCheckActive() if (isAsyncFunction(this.opts.killHandler)) { - (this.opts.killHandler() as Promise) + ;(this.opts.killHandler() as Promise) .then(() => { this.sendToMainWorker({ kill: 'success' }) return undefined @@ -410,8 +408,7 @@ export abstract class AbstractWorker< }) } else { try { - // eslint-disable-next-line @typescript-eslint/no-invalid-void-type - this.opts.killHandler?.() as void + this.opts.killHandler?.() this.sendToMainWorker({ kill: 'success' }) } catch { this.sendToMainWorker({ kill: 'failure' }) @@ -421,7 +418,6 @@ export abstract class AbstractWorker< /** * Check if the message worker id is set and matches the worker id. - * * @param message - The message to check. * @throws {@link https://nodejs.org/api/errors.html#class-error} If the message worker id is not set or does not match the worker id. */ @@ -470,7 +466,6 @@ export abstract class AbstractWorker< /** * Returns the main worker. - * * @returns Reference to the main worker. * @throws {@link https://nodejs.org/api/errors.html#class-error} If the main worker is not set. */ @@ -483,7 +478,6 @@ export abstract class AbstractWorker< /** * Sends a message to main worker. - * * @param message - The response message. */ protected abstract sendToMainWorker ( @@ -495,13 +489,12 @@ export abstract class AbstractWorker< */ protected sendTaskFunctionsPropertiesToMainWorker (): void { this.sendToMainWorker({ - taskFunctionsProperties: this.listTaskFunctionsProperties() + taskFunctionsProperties: this.listTaskFunctionsProperties(), }) } /** * Handles an error and convert it to a string so it can be sent back to the main worker. - * * @param error - The error raised by the worker. * @returns The error message. */ @@ -511,7 +504,6 @@ export abstract class AbstractWorker< /** * Runs the given task. - * * @param task - The task to execute. */ protected readonly run = (task: Task): void => { @@ -523,9 +515,9 @@ export abstract class AbstractWorker< // eslint-disable-next-line @typescript-eslint/no-non-null-assertion name: name!, message: `Task function '${name}' not found`, - data + data, }, - taskId + taskId, }) return } @@ -539,7 +531,6 @@ export abstract class AbstractWorker< /** * Runs the given task function synchronously. - * * @param fn - Task function that will be executed. * @param task - Input data for the task function. */ @@ -555,7 +546,7 @@ export abstract class AbstractWorker< this.sendToMainWorker({ data: res, taskPerformance, - taskId + taskId, }) } catch (error) { this.sendToMainWorker({ @@ -563,9 +554,9 @@ export abstract class AbstractWorker< // eslint-disable-next-line @typescript-eslint/no-non-null-assertion name: name!, message: this.handleError(error as Error | string), - data + data, }, - taskId + taskId, }) } finally { this.updateLastTaskTimestamp() @@ -574,7 +565,6 @@ export abstract class AbstractWorker< /** * Runs the given task function asynchronously. - * * @param fn - Task function that will be executed. * @param task - Input data for the task function. */ @@ -590,7 +580,7 @@ export abstract class AbstractWorker< this.sendToMainWorker({ data: res, taskPerformance, - taskId + taskId, }) return undefined }) @@ -600,9 +590,9 @@ export abstract class AbstractWorker< // eslint-disable-next-line @typescript-eslint/no-non-null-assertion name: name!, message: this.handleError(error as Error | string), - data + data, }, - taskId + taskId, }) }) .finally(() => { @@ -619,8 +609,8 @@ export abstract class AbstractWorker< name: name ?? DEFAULT_TASK_NAME, timestamp: performance.now(), ...(this.statistics.elu && { - elu: performance.eventLoopUtilization() - }) + elu: performance.eventLoopUtilization(), + }), } } @@ -633,11 +623,11 @@ export abstract class AbstractWorker< return { ...taskPerformance, ...(this.statistics.runTime && { - runTime: performance.now() - taskPerformance.timestamp + runTime: performance.now() - taskPerformance.timestamp, }), ...(this.statistics.elu && { - elu: performance.eventLoopUtilization(taskPerformance.elu) - }) + elu: performance.eventLoopUtilization(taskPerformance.elu), + }), } }