X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fworker%2Fabstract-worker.ts;h=ebbefc75ba4cc8c4e09bcc3073e372085466c181;hb=refs%2Fheads%2Fmaster;hp=bb6ac5666e0252195b4f1cafbda38471ec7fcf07;hpb=43805f1db04b0d52ec9a43b569ce68b759f5fa53;p=poolifier.git diff --git a/src/worker/abstract-worker.ts b/src/worker/abstract-worker.ts index bb6ac566..ebbefc75 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. @@ -83,7 +82,6 @@ export abstract class AbstractWorker< /** * 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 +111,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 +138,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 +162,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 +177,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 +213,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 +242,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 +271,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,14 +304,12 @@ 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 { @@ -330,7 +320,7 @@ export abstract class AbstractWorker< taskFunctionOperation, taskId, data, - kill + kill, } = message if (statistics != null) { // Statistics message received @@ -366,14 +356,15 @@ export abstract class AbstractWorker< response = this.addTaskFunction(taskFunctionProperties.name, { // eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func taskFunction: new Function( - `return ${taskFunction}` + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + `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,29 +377,29 @@ export abstract class AbstractWorker< response = { status: false, error: new Error('Unknown task operation') } break } + const { status, error } = response this.sendToMainWorker({ taskFunctionOperation, - taskFunctionOperationStatus: response.status, + taskFunctionOperationStatus: status, taskFunctionProperties, - ...(!response.status && - response.error != null && { + ...(!status && + error != null && { workerError: { name: taskFunctionProperties.name, - message: this.handleError(response.error as Error | string) - } - }) + message: this.handleError(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 @@ -418,8 +409,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 as (() => void) | undefined)?.() this.sendToMainWorker({ kill: 'success' }) } catch { this.sendToMainWorker({ kill: 'failure' }) @@ -429,7 +419,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. */ @@ -438,7 +427,7 @@ export abstract class AbstractWorker< throw new Error('Message worker id is not set') } else if (message.workerId !== this.id) { throw new Error( - `Message worker id ${message.workerId} does not match the worker id ${this.id}` + `Message worker id ${message.workerId.toString()} does not match the worker id ${this.id.toString()}` ) } } @@ -478,7 +467,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. */ @@ -491,7 +479,6 @@ export abstract class AbstractWorker< /** * Sends a message to main worker. - * * @param message - The response message. */ protected abstract sendToMainWorker ( @@ -503,13 +490,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. */ @@ -519,7 +505,6 @@ export abstract class AbstractWorker< /** * Runs the given task. - * * @param task - The task to execute. */ protected readonly run = (task: Task): void => { @@ -530,10 +515,11 @@ export abstract class AbstractWorker< workerError: { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion name: name!, - message: `Task function '${name}' not found`, - data + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + message: `Task function '${name!}' not found`, + data, }, - taskId + taskId, }) return } @@ -547,7 +533,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. */ @@ -563,7 +548,7 @@ export abstract class AbstractWorker< this.sendToMainWorker({ data: res, taskPerformance, - taskId + taskId, }) } catch (error) { this.sendToMainWorker({ @@ -571,9 +556,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() @@ -582,7 +567,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. */ @@ -598,7 +582,7 @@ export abstract class AbstractWorker< this.sendToMainWorker({ data: res, taskPerformance, - taskId + taskId, }) return undefined }) @@ -608,9 +592,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(() => { @@ -627,8 +611,8 @@ export abstract class AbstractWorker< name: name ?? DEFAULT_TASK_NAME, timestamp: performance.now(), ...(this.statistics.elu && { - elu: performance.eventLoopUtilization() - }) + elu: performance.eventLoopUtilization(), + }), } } @@ -641,11 +625,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), + }), } }