X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2FBootstrap.ts;h=ddf8ee7016c7ab5bf82f09d9f80ca1bec32ee68b;hb=1feac591544c625c56086abe1f14dbdc706280fb;hp=f238d9515e1ba989d09176963323787b193c4cd7;hpb=e1a3f3c1528a82673d616a96b7b14ba96a664dab;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/Bootstrap.ts b/src/charging-station/Bootstrap.ts index f238d951..ddf8ee70 100644 --- a/src/charging-station/Bootstrap.ts +++ b/src/charging-station/Bootstrap.ts @@ -18,6 +18,7 @@ import { BaseError } from '../exception/index.js' import { type Storage, StorageFactory } from '../performance/index.js' import { type ChargingStationData, + type ChargingStationOptions, type ChargingStationWorkerData, type ChargingStationWorkerEventError, type ChargingStationWorkerMessage, @@ -120,6 +121,10 @@ export class Bootstrap extends EventEmitter { return this.chargingStationsByTemplate.get(templateName)?.lastIndex ?? 0 } + public getPerformanceStatistics (): IterableIterator | undefined { + return this.storage?.getPerformanceStatistics() + } + private get numberOfAddedChargingStations (): number { return [...this.chargingStationsByTemplate.values()].reduce( (accumulator, value) => accumulator + value.added, @@ -146,6 +151,15 @@ export class Bootstrap extends EventEmitter { ChargingStationWorkerMessageEvents.performanceStatistics, this.workerEventPerformanceStatistics ) + this.on( + ChargingStationWorkerMessageEvents.workerElementError, + (eventError: ChargingStationWorkerEventError) => { + logger.error( + `${this.logPrefix()} ${moduleName}.start: Error occurred while handling '${eventError.event}' event on worker:`, + eventError + ) + } + ) this.initializeCounters() const workerConfiguration = Configuration.getConfigurationSection( ConfigurationSection.worker @@ -286,17 +300,18 @@ export class Bootstrap extends EventEmitter { if (!isMainThread) { return } - let elementsPerWorker: number | undefined + let elementsPerWorker: number switch (workerConfiguration.elementsPerWorker) { + case 'all': + elementsPerWorker = this.numberOfConfiguredChargingStations + break case 'auto': + default: elementsPerWorker = this.numberOfConfiguredChargingStations > availableParallelism() ? Math.round(this.numberOfConfiguredChargingStations / (availableParallelism() * 1.5)) : 1 break - case 'all': - elementsPerWorker = this.numberOfConfiguredChargingStations - break } this.workerImplementation = WorkerFactory.getWorkerImplementation( join( @@ -312,7 +327,7 @@ export class Bootstrap extends EventEmitter { poolMaxSize: workerConfiguration.poolMaxSize!, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion poolMinSize: workerConfiguration.poolMinSize!, - elementsPerWorker: elementsPerWorker ?? (workerConfiguration.elementsPerWorker as number), + elementsPerWorker, poolOptions: { messageHandler: this.messageHandler.bind(this) as MessageHandler, workerOptions: { resourceLimits: workerConfiguration.resourceLimits } @@ -334,30 +349,24 @@ export class Bootstrap extends EventEmitter { try { switch (msg.event) { case ChargingStationWorkerMessageEvents.added: - this.emit(ChargingStationWorkerMessageEvents.added, msg.data as ChargingStationData) + this.emit(ChargingStationWorkerMessageEvents.added, msg.data) break case ChargingStationWorkerMessageEvents.started: - this.emit(ChargingStationWorkerMessageEvents.started, msg.data as ChargingStationData) + this.emit(ChargingStationWorkerMessageEvents.started, msg.data) break case ChargingStationWorkerMessageEvents.stopped: - this.emit(ChargingStationWorkerMessageEvents.stopped, msg.data as ChargingStationData) + this.emit(ChargingStationWorkerMessageEvents.stopped, msg.data) break case ChargingStationWorkerMessageEvents.updated: - this.emit(ChargingStationWorkerMessageEvents.updated, msg.data as ChargingStationData) + this.emit(ChargingStationWorkerMessageEvents.updated, msg.data) break case ChargingStationWorkerMessageEvents.performanceStatistics: - this.emit( - ChargingStationWorkerMessageEvents.performanceStatistics, - msg.data as Statistics - ) + this.emit(ChargingStationWorkerMessageEvents.performanceStatistics, msg.data) break case ChargingStationWorkerMessageEvents.addedWorkerElement: + this.emit(ChargingStationWorkerMessageEvents.addWorkerElement, msg.data) break case ChargingStationWorkerMessageEvents.workerElementError: - logger.error( - `${this.logPrefix()} ${moduleName}.messageHandler: Error occurred while handling '${(msg.data as ChargingStationWorkerEventError).event}' event on worker:`, - msg.data - ) this.emit(ChargingStationWorkerMessageEvents.workerElementError, msg.data) break default: @@ -480,7 +489,11 @@ export class Bootstrap extends EventEmitter { } } - public async addChargingStation (index: number, stationTemplateFile: string): Promise { + public async addChargingStation ( + index: number, + stationTemplateFile: string, + options?: ChargingStationOptions + ): Promise { await this.workerImplementation?.addElement({ index, templateFile: join( @@ -488,7 +501,8 @@ export class Bootstrap extends EventEmitter { 'assets', 'station-templates', stationTemplateFile - ) + ), + options }) // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this.chargingStationsByTemplate.get(parse(stationTemplateFile).name)!.lastIndex = max(