+ private async handleAddChargingStations (
+ _uuid?: `${string}-${string}-${string}-${string}-${string}`,
+ _procedureName?: ProcedureName,
+ requestPayload?: RequestPayload
+ ): Promise<ResponsePayload> {
+ const { template, numberOfStations, options } =
+ requestPayload as AddChargingStationsRequestPayload
+ if (!Bootstrap.getInstance().getState().started) {
+ return {
+ status: ResponseStatus.FAILURE,
+ errorMessage:
+ 'Cannot add charging station(s) while the charging stations simulator is not started'
+ } satisfies ResponsePayload
+ }
+ if (typeof template !== 'string' || typeof numberOfStations !== 'number') {
+ return {
+ status: ResponseStatus.FAILURE,
+ errorMessage: 'Invalid request payload'
+ } satisfies ResponsePayload
+ }
+ if (!this.uiServer.chargingStationTemplates.has(template)) {
+ return {
+ status: ResponseStatus.FAILURE,
+ errorMessage: `Template '${template}' not found`
+ } satisfies ResponsePayload
+ }
+ const succeededStationInfos: ChargingStationInfo[] = []
+ const failedStationInfos: ChargingStationInfo[] = []
+ let err: Error | undefined
+ for (let i = 0; i < numberOfStations; i++) {
+ let stationInfo: ChargingStationInfo | undefined
+ try {
+ stationInfo = await Bootstrap.getInstance().addChargingStation(
+ Bootstrap.getInstance().getLastIndex(template) + 1,
+ `${template}.json`,
+ options
+ )
+ if (stationInfo != null) {
+ succeededStationInfos.push(stationInfo)
+ }
+ } catch (error) {
+ err = error as Error
+ if (stationInfo != null) {
+ failedStationInfos.push(stationInfo)
+ }
+ }
+ }
+ return {
+ status: err != null ? ResponseStatus.FAILURE : ResponseStatus.SUCCESS,
+ ...(succeededStationInfos.length > 0 && {
+ hashIdsSucceeded: succeededStationInfos.map(stationInfo => stationInfo.hashId)
+ }),
+ ...(failedStationInfos.length > 0 && {
+ hashIdsFailed: failedStationInfos.map(stationInfo => stationInfo.hashId)
+ }),
+ ...(err != null && { errorMessage: err.message, errorStack: err.stack })
+ } satisfies ResponsePayload
+ }
+
+ private handlePerformanceStatistics (): ResponsePayload {
+ if (
+ Configuration.getConfigurationSection<StorageConfiguration>(
+ ConfigurationSection.performanceStorage
+ ).enabled !== true
+ ) {
+ return {
+ status: ResponseStatus.FAILURE,
+ errorMessage: 'Performance statistics storage is not enabled'
+ } satisfies ResponsePayload
+ }
+ try {
+ return {
+ status: ResponseStatus.SUCCESS,
+ performanceStatistics: [
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ ...Bootstrap.getInstance().getPerformanceStatistics()!
+ ] as JsonType[]
+ } satisfies ResponsePayload
+ } catch (error) {
+ return {
+ status: ResponseStatus.FAILURE,
+ errorMessage: (error as Error).message,
+ errorStack: (error as Error).stack
+ } satisfies ResponsePayload
+ }
+ }
+
+ private handleSimulatorState (): ResponsePayload {
+ try {
+ return {
+ status: ResponseStatus.SUCCESS,
+ state: Bootstrap.getInstance().getState() as unknown as JsonObject
+ } satisfies ResponsePayload
+ } catch (error) {
+ return {
+ status: ResponseStatus.FAILURE,
+ errorMessage: (error as Error).message,
+ errorStack: (error as Error).stack
+ } satisfies ResponsePayload
+ }
+ }
+
+ private async handleStartSimulator (): Promise<ResponsePayload> {
+ try {
+ await Bootstrap.getInstance().start()
+ return { status: ResponseStatus.SUCCESS }
+ } catch (error) {
+ return {
+ status: ResponseStatus.FAILURE,
+ errorMessage: (error as Error).message,
+ errorStack: (error as Error).stack
+ } satisfies ResponsePayload
+ }
+ }
+
+ private async handleStopSimulator (): Promise<ResponsePayload> {
+ try {
+ await Bootstrap.getInstance().stop()
+ return { status: ResponseStatus.SUCCESS }
+ } catch (error) {
+ return {
+ status: ResponseStatus.FAILURE,
+ errorMessage: (error as Error).message,
+ errorStack: (error as Error).stack
+ } satisfies ResponsePayload
+ }