X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fworker%2Fabstract-worker.ts;h=e2b16e25495eafb6a70a8e50ac2fa0e208583d0e;hb=b1bbc3658b183a5c7a10c76daa4a775b64bf15ee;hp=22e65bad63d213aa6b1bda6f0adc6a2a76401873;hpb=0cb6edc22251c1cc8a742a99a696144ecc60061f;p=poolifier.git diff --git a/src/worker/abstract-worker.ts b/src/worker/abstract-worker.ts index 22e65bad..e2b16e25 100644 --- a/src/worker/abstract-worker.ts +++ b/src/worker/abstract-worker.ts @@ -1,4 +1,3 @@ -import { AsyncResource } from 'node:async_hooks' import type { Worker } from 'node:cluster' import type { MessagePort } from 'node:worker_threads' import { performance } from 'node:perf_hooks' @@ -56,7 +55,7 @@ export abstract class AbstractWorker< MainWorker extends Worker | MessagePort, Data = unknown, Response = unknown -> extends AsyncResource { +> { /** * Worker id. */ @@ -77,23 +76,21 @@ export abstract class AbstractWorker< * Handler id of the `activeInterval` worker activity check. */ protected activeInterval?: NodeJS.Timeout + /** * Constructs a new poolifier worker. * - * @param type - The type of async event. * @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. * @param opts - Options for the worker. */ public constructor ( - type: string, protected readonly isMain: boolean, private readonly mainWorker: MainWorker, taskFunctions: TaskFunction | TaskFunctions, protected opts: WorkerOptions = DEFAULT_WORKER_OPTIONS ) { - super(type) if (this.isMain == null) { throw new Error('isMain parameter is mandatory') } @@ -368,21 +365,17 @@ export abstract class AbstractWorker< * * @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) .then(() => { this.sendToMainWorker({ kill: 'success' }) - return null + return undefined }) .catch(() => { this.sendToMainWorker({ kill: 'failure' }) }) - .finally(() => { - this.emitDestroy() - }) - .catch(EMPTY_FUNCTION) } else { try { // eslint-disable-next-line @typescript-eslint/no-invalid-void-type @@ -390,8 +383,6 @@ export abstract class AbstractWorker< this.sendToMainWorker({ kill: 'success' }) } catch { this.sendToMainWorker({ kill: 'failure' }) - } finally { - this.emitDestroy() } } } @@ -405,7 +396,7 @@ export abstract class AbstractWorker< private checkMessageWorkerId (message: MessageValue): void { if (message.workerId == null) { throw new Error('Message worker id is not set') - } else if (message.workerId != null && message.workerId !== this.id) { + } else if (message.workerId !== this.id) { throw new Error( `Message worker id ${message.workerId} does not match the worker id ${this.id}` ) @@ -491,10 +482,10 @@ export abstract class AbstractWorker< * * @param task - The task to execute. */ - protected run (task: Task): void { + protected readonly run = (task: Task): void => { const { name, taskId, data } = task - const fn = this.taskFunctions.get(name ?? DEFAULT_TASK_NAME) - if (fn == null) { + const taskFunctionName = name ?? DEFAULT_TASK_NAME + if (!this.taskFunctions.has(taskFunctionName)) { this.sendToMainWorker({ workerError: { name: name as string, @@ -505,10 +496,11 @@ export abstract class AbstractWorker< }) return } + const fn = this.taskFunctions.get(taskFunctionName) if (isAsyncFunction(fn)) { - this.runInAsyncScope(this.runAsync.bind(this), this, fn, task) + this.runAsync(fn as TaskAsyncFunction, task) } else { - this.runInAsyncScope(this.runSync.bind(this), this, fn, task) + this.runSync(fn as TaskSyncFunction, task) } } @@ -518,10 +510,10 @@ export abstract class AbstractWorker< * @param fn - Task function that will be executed. * @param task - Input data for the task function. */ - protected runSync ( + protected readonly runSync = ( fn: TaskSyncFunction, task: Task - ): void { + ): void => { const { name, taskId, data } = task try { let taskPerformance = this.beginTaskPerformance(name) @@ -552,10 +544,10 @@ export abstract class AbstractWorker< * @param fn - Task function that will be executed. * @param task - Input data for the task function. */ - protected runAsync ( + protected readonly runAsync = ( fn: TaskAsyncFunction, task: Task - ): void { + ): void => { const { name, taskId, data } = task let taskPerformance = this.beginTaskPerformance(name) fn(data)