// Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
-import { EventEmitter } from 'node:events';
+import { EventEmitterAsyncResource } from 'node:events';
import { SHARE_ENV, Worker } from 'node:worker_threads';
import { WorkerAbstract } from './WorkerAbstract';
import { randomizeDelay, sleep } from './WorkerUtils';
export class WorkerSet extends WorkerAbstract<WorkerData> {
- public readonly emitter!: EventEmitter;
+ public readonly emitter: EventEmitterAsyncResource | undefined;
private readonly workerSet: Set<WorkerSetElement>;
private started: boolean;
private workerStartup: boolean;
}
this.workerSet = new Set<WorkerSetElement>();
if (this.workerOptions.poolOptions?.enableEvents) {
- this.emitter = new EventEmitter();
+ this.emitter = new EventEmitterAsyncResource({ name: 'workerset' });
}
this.started = false;
this.workerStartup = false;
// Add worker set element sequentially to optimize memory at startup
this.workerOptions.workerStartDelay! > 0 &&
(await sleep(randomizeDelay(this.workerOptions.workerStartDelay!)));
+ this.emitter?.emit(WorkerSetEvents.started, this.info);
this.started = true;
}
});
await worker.terminate();
await waitWorkerExit;
+ this.emitter?.emit(WorkerSetEvents.stopped, this.info);
+ this.emitter?.emitDestroy();
+ this.emitter?.removeAllListeners();
this.started = false;
}
}
if (!this.started) {
throw new Error('Cannot add a WorkerSet element: not started');
}
- if (!this.workerSet) {
+ if (this.workerSet == null) {
throw new Error("Cannot add a WorkerSet element: 'workerSet' property does not exist");
}
const workerSetElement = await this.getWorkerSetElement();