build(deps-dev): bump @types/node
[poolifier.git] / src / pools / abstract-pool.ts
index c56beaa6d801843c043f091963cea385b72eccee..08a955a93846ec406ee8a57053722549c56e476d 100644 (file)
@@ -1,7 +1,7 @@
 import { randomUUID } from 'node:crypto'
 import { performance } from 'node:perf_hooks'
 import type { TransferListItem } from 'node:worker_threads'
-import { type EventEmitter, EventEmitterAsyncResource } from 'node:events'
+import { EventEmitterAsyncResource } from 'node:events'
 import type {
   MessageValue,
   PromiseResponseWrapper,
@@ -70,7 +70,12 @@ export abstract class AbstractPool<
   public readonly workerNodes: Array<IWorkerNode<Worker, Data>> = []
 
   /** @inheritDoc */
-  public emitter?: EventEmitter | EventEmitterAsyncResource
+  public emitter?: EventEmitterAsyncResource
+
+  /**
+   * Dynamic pool maximum size property placeholder.
+   */
+  protected readonly max?: number
 
   /**
    * The task execution response promise map:
@@ -91,11 +96,6 @@ export abstract class AbstractPool<
   Response
   >
 
-  /**
-   * Dynamic pool maximum size property placeholder.
-   */
-  protected readonly max?: number
-
   /**
    * The task functions added at runtime map:
    * - `key`: The task function name.
@@ -944,9 +944,7 @@ export abstract class AbstractPool<
       })
     )
     this.emitter?.emit(PoolEvents.destroy, this.info)
-    if (this.emitter instanceof EventEmitterAsyncResource) {
-      this.emitter?.emitDestroy()
-    }
+    this.emitter?.emitDestroy()
     this.started = false
   }
 
@@ -1215,8 +1213,8 @@ export abstract class AbstractPool<
       const workerNodeKey = this.getWorkerNodeKeyByWorker(worker)
       const workerInfo = this.getWorkerInfo(workerNodeKey)
       workerInfo.ready = false
-      this.workerNodes[workerNodeKey].closeChannel()
       this.emitter?.emit(PoolEvents.error, error)
+      this.workerNodes[workerNodeKey].closeChannel()
       if (
         this.started &&
         !this.starting &&
@@ -1345,7 +1343,10 @@ export abstract class AbstractPool<
    */
   protected afterWorkerNodeSetup (workerNodeKey: number): void {
     // Listen to worker messages.
-    this.registerWorkerMessageListener(workerNodeKey, this.workerListener())
+    this.registerWorkerMessageListener(
+      workerNodeKey,
+      this.workerMessageListener.bind(this)
+    )
     // Send the startup message to worker.
     this.sendStartupMessageToWorker(workerNodeKey)
     // Send the statistics message to worker.
@@ -1490,25 +1491,21 @@ export abstract class AbstractPool<
   }
 
   /**
-   * This method is the listener registered for each worker message.
-   *
-   * @returns The listener function to execute when a message is received from a worker.
+   * This method is the message listener registered on each worker.
    */
-  protected workerListener (): (message: MessageValue<Response>) => void {
-    return message => {
-      this.checkMessageWorkerId(message)
-      if (message.ready != null && message.taskFunctionNames != null) {
-        // Worker ready response received from worker
-        this.handleWorkerReadyResponse(message)
-      } else if (message.taskId != null) {
-        // Task execution response received from worker
-        this.handleTaskExecutionResponse(message)
-      } else if (message.taskFunctionNames != null) {
-        // Task function names message received from worker
-        this.getWorkerInfo(
-          this.getWorkerNodeKeyByWorkerId(message.workerId)
-        ).taskFunctionNames = message.taskFunctionNames
-      }
+  protected workerMessageListener (message: MessageValue<Response>): void {
+    this.checkMessageWorkerId(message)
+    if (message.ready != null && message.taskFunctionNames != null) {
+      // Worker ready response received from worker
+      this.handleWorkerReadyResponse(message)
+    } else if (message.taskId != null) {
+      // Task execution response received from worker
+      this.handleTaskExecutionResponse(message)
+    } else if (message.taskFunctionNames != null) {
+      // Task function names message received from worker
+      this.getWorkerInfo(
+        this.getWorkerNodeKeyByWorkerId(message.workerId)
+      ).taskFunctionNames = message.taskFunctionNames
     }
   }