X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2FBootstrap.ts;h=80e14d151bef4897d4f4ec541e967529572d2003;hb=e4cb2c14d14e95090cca15518594af1c3f369d2b;hp=0fa2c88d35c868650e76fa059a86f75d96c54b7e;hpb=1ca780f9d385bcf96a016ab5ba57ca0f19c94b74;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/Bootstrap.ts b/src/charging-station/Bootstrap.ts index 0fa2c88d..80e14d15 100644 --- a/src/charging-station/Bootstrap.ts +++ b/src/charging-station/Bootstrap.ts @@ -7,17 +7,21 @@ import { isMainThread } from 'worker_threads'; import chalk from 'chalk'; import { version } from '../../package.json'; +import BaseError from '../exception/BaseError'; import { Storage } from '../performance/storage/Storage'; import { StorageFactory } from '../performance/storage/StorageFactory'; import { + ChargingStationData, ChargingStationWorkerData, ChargingStationWorkerMessage, + ChargingStationWorkerMessageData, ChargingStationWorkerMessageEvents, } from '../types/ChargingStationWorker'; import { StationTemplateUrl } from '../types/ConfigurationData'; import Statistics from '../types/Statistics'; import { ApplicationProtocol } from '../types/UIProtocol'; import Configuration from '../utils/Configuration'; +import logger from '../utils/Logger'; import Utils from '../utils/Utils'; import WorkerAbstract from '../worker/WorkerAbstract'; import WorkerFactory from '../worker/WorkerFactory'; @@ -26,6 +30,11 @@ import { AbstractUIServer } from './ui-server/AbstractUIServer'; import { UIServiceUtils } from './ui-server/ui-services/UIServiceUtils'; import UIServerFactory from './ui-server/UIServerFactory'; +const moduleName = 'Bootstrap'; + +const missingChargingStationsConfigurationExitCode = 1; +const noChargingStationTemplatesExitCode = 2; + export default class Bootstrap { private static instance: Bootstrap | null = null; private workerImplementation: WorkerAbstract | null = null; @@ -33,6 +42,7 @@ export default class Bootstrap { private readonly storage!: Storage; private numberOfChargingStationTemplates!: number; private numberOfChargingStations!: number; + private numberOfStartedChargingStations!: number; private readonly version: string = version; private started: boolean; private readonly workerScript: string; @@ -98,13 +108,15 @@ export default class Bootstrap { console.warn( chalk.yellow("'stationTemplateUrls' not defined or empty in configuration, exiting") ); + process.exit(missingChargingStationsConfigurationExitCode); } if (this.numberOfChargingStations === 0) { console.warn( chalk.yellow('No charging station template enabled in configuration, exiting') ); + process.exit(noChargingStationTemplatesExitCode); } else { - console.log( + console.info( chalk.green( `Charging stations simulator ${ this.version @@ -165,22 +177,74 @@ export default class Bootstrap { poolOptions: { workerChoiceStrategy: Configuration.getWorker().poolStrategy, }, - messageHandler: async (msg: ChargingStationWorkerMessage) => { - if (msg.id === ChargingStationWorkerMessageEvents.STARTED) { - this.uiServer.chargingStations.add(msg.data.id as string); - } else if (msg.id === ChargingStationWorkerMessageEvents.STOPPED) { - this.uiServer.chargingStations.delete(msg.data.id as string); - } else if (msg.id === ChargingStationWorkerMessageEvents.PERFORMANCE_STATISTICS) { - await this.storage.storePerformanceStatistics(msg.data as unknown as Statistics); - } - }, + messageHandler: this.messageHandler.bind(this) as ( + msg: ChargingStationWorkerMessage + ) => void, } )); } + private messageHandler( + msg: ChargingStationWorkerMessage + ): void { + // logger.debug( + // `${this.logPrefix()} ${moduleName}.messageHandler: Worker channel message received: ${JSON.stringify( + // msg, + // null, + // 2 + // )}` + // ); + try { + switch (msg.id) { + case ChargingStationWorkerMessageEvents.STARTED: + this.workerEventStarted(msg.data as ChargingStationData); + break; + case ChargingStationWorkerMessageEvents.STOPPED: + this.workerEventStopped(msg.data as ChargingStationData); + break; + case ChargingStationWorkerMessageEvents.UPDATED: + this.workerEventUpdated(msg.data as ChargingStationData); + break; + case ChargingStationWorkerMessageEvents.PERFORMANCE_STATISTICS: + this.workerEventPerformanceStatistics(msg.data as Statistics); + break; + default: + throw new BaseError( + `Unknown event type: '${msg.id}' for data: ${JSON.stringify(msg.data, null, 2)}` + ); + } + } catch (error) { + logger.error( + `${this.logPrefix()} ${moduleName}.messageHandler: Error occurred while handling '${ + msg.id + }' event:`, + error + ); + } + } + + private workerEventStarted(data: ChargingStationData) { + this.uiServer?.chargingStations.set(data.hashId, data); + ++this.numberOfStartedChargingStations; + } + + private workerEventStopped(data: ChargingStationData) { + this.uiServer?.chargingStations.set(data.hashId, data); + --this.numberOfStartedChargingStations; + } + + private workerEventUpdated(data: ChargingStationData) { + this.uiServer?.chargingStations.set(data.hashId, data); + } + + private workerEventPerformanceStatistics = (data: Statistics) => { + this.storage.storePerformanceStatistics(data) as void; + }; + private initialize() { - this.numberOfChargingStations = 0; this.numberOfChargingStationTemplates = 0; + this.numberOfChargingStations = 0; + this.numberOfStartedChargingStations = 0; this.initializeWorkerImplementation(); } @@ -198,7 +262,7 @@ export default class Bootstrap { ), }; await this.workerImplementation.addElement(workerData); - this.numberOfChargingStations++; + ++this.numberOfChargingStations; } private logPrefix(): string {