fix: make the transition to EventEmitterAsyncResource transparent to TS
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 24 Sep 2023 15:51:05 +0000 (17:51 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 24 Sep 2023 15:51:05 +0000 (17:51 +0200)
@types/node does not include EventEmitterAsyncResource type definition:
https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/61365

Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
src/index.ts
src/pools/abstract-pool.ts
src/pools/pool.ts

index fab0d8ed575e72a6f37f7705b6fae64f604d2337..f3bbe5031e3d8b94e65c1e0dfb343fa6c5e6c301 100644 (file)
@@ -7,7 +7,6 @@ export {
 export { PoolEvents, PoolTypes } from './pools/pool'
 export type {
   IPool,
-  PoolEmitter,
   PoolEvent,
   PoolInfo,
   PoolOptions,
index f7e6f8d2c17b1e1ef0773f7273541c42bad55dde..c56beaa6d801843c043f091963cea385b72eccee 100644 (file)
@@ -1,6 +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 type {
   MessageValue,
   PromiseResponseWrapper,
@@ -22,7 +23,6 @@ import { KillBehaviors } from '../worker/worker-options'
 import type { TaskFunction } from '../worker/task-functions'
 import {
   type IPool,
-  PoolEmitter,
   PoolEvents,
   type PoolInfo,
   type PoolOptions,
@@ -70,7 +70,7 @@ export abstract class AbstractPool<
   public readonly workerNodes: Array<IWorkerNode<Worker, Data>> = []
 
   /** @inheritDoc */
-  public emitter?: PoolEmitter
+  public emitter?: EventEmitter | EventEmitterAsyncResource
 
   /**
    * The task execution response promise map:
@@ -262,7 +262,7 @@ export abstract class AbstractPool<
   }
 
   private initializeEventEmitter (): void {
-    this.emitter = new PoolEmitter({
+    this.emitter = new EventEmitterAsyncResource({
       name: `poolifier:${this.type}-${this.worker}-pool`
     })
   }
@@ -944,7 +944,9 @@ export abstract class AbstractPool<
       })
     )
     this.emitter?.emit(PoolEvents.destroy, this.info)
-    this.emitter?.emitDestroy()
+    if (this.emitter instanceof EventEmitterAsyncResource) {
+      this.emitter?.emitDestroy()
+    }
     this.started = false
   }
 
index a8d8849b0797f9e8a16f71058fbca0046d782c73..118b283246e8fc71691911ea816726a3b716ff01 100644 (file)
@@ -1,5 +1,5 @@
-import { EventEmitterAsyncResource } from 'node:events'
 import type { TransferListItem } from 'node:worker_threads'
+import type { EventEmitter, EventEmitterAsyncResource } from 'node:events'
 import type { TaskFunction } from '../worker/task-functions'
 import type {
   ErrorHandler,
@@ -34,11 +34,6 @@ export const PoolTypes = Object.freeze({
  */
 export type PoolType = keyof typeof PoolTypes
 
-/**
- * Pool event emitter integrated with async resource.
- */
-export class PoolEmitter extends EventEmitterAsyncResource {}
-
 /**
  * Enumeration of pool events.
  */
@@ -240,7 +235,7 @@ export interface IPool<
    * - `'taskError'`: Emitted when an error occurs while executing a task.
    * - `'backPressure'`: Emitted when all worker nodes have back pressure (i.e. their tasks queue is full: queue size \>= maximum queue size).
    */
-  readonly emitter?: PoolEmitter
+  readonly emitter?: EventEmitter | EventEmitterAsyncResource
   /**
    * Executes the specified function in the worker constructor with the task data input parameter.
    *