X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fworker%2FWorkerSet.ts;h=ba2b10add0706b4c43d3a0010544ba06cc41276e;hb=3b09e788c6dab8e5a8b3314e8e69ede16ff82fcc;hp=d0f80b6ed59a54342430991ff4d318d86e0a5402;hpb=8ae4dcf159bf29835de7fd1edd7978aa8a3ee76b;p=e-mobility-charging-stations-simulator.git diff --git a/src/worker/WorkerSet.ts b/src/worker/WorkerSet.ts index d0f80b6e..ba2b10ad 100644 --- a/src/worker/WorkerSet.ts +++ b/src/worker/WorkerSet.ts @@ -16,7 +16,7 @@ import { } from './WorkerTypes.js' import { randomizeDelay, sleep } from './WorkerUtils.js' -export class WorkerSet extends WorkerAbstract { +export class WorkerSet extends WorkerAbstract { public readonly emitter: EventEmitterAsyncResource | undefined private readonly workerSet: Set private started: boolean @@ -102,22 +102,37 @@ export class WorkerSet extends WorkerAbstract { } /** @inheritDoc */ - public async addElement (elementData: WorkerData): Promise { + public async addElement (elementData: D): Promise { if (!this.started) { throw new Error('Cannot add a WorkerSet element: not started') } const workerSetElement = await this.getWorkerSetElement() + const waitForAddedWorkerElement = new Promise((resolve, reject) => { + const messageHandler = (message: WorkerMessage): void => { + if (message.event === WorkerMessageEvents.addedWorkerElement) { + ++workerSetElement.numberOfWorkerElements + resolve(message.data) + workerSetElement.worker.off('message', messageHandler) + } else if (message.event === WorkerMessageEvents.workerElementError) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors + reject(message.data) + workerSetElement.worker.off('message', messageHandler) + } + } + workerSetElement.worker.on('message', messageHandler) + }) workerSetElement.worker.postMessage({ event: WorkerMessageEvents.addWorkerElement, data: elementData }) - ++workerSetElement.numberOfWorkerElements + const response = await waitForAddedWorkerElement // Add element sequentially to optimize memory at startup // eslint-disable-next-line @typescript-eslint/no-non-null-assertion if (this.workerOptions.elementAddDelay! > 0) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion await sleep(randomizeDelay(this.workerOptions.elementAddDelay!)) } + return response } /** @@ -130,7 +145,7 @@ export class WorkerSet extends WorkerAbstract { ...this.workerOptions.poolOptions?.workerOptions }) worker.on('message', this.workerOptions.poolOptions?.messageHandler ?? EMPTY_FUNCTION) - worker.on('message', (message: WorkerMessage) => { + worker.on('message', (message: WorkerMessage) => { if (message.event === WorkerMessageEvents.addedWorkerElement) { this.emitter?.emit(WorkerSetEvents.elementAdded, this.info) } else if (message.event === WorkerMessageEvents.workerElementError) {