Fix incoming message error handling
authorJérôme Benoit <jerome.benoit@sap.com>
Fri, 4 Mar 2022 19:37:33 +0000 (20:37 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Fri, 4 Mar 2022 19:37:33 +0000 (20:37 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/charging-station/Bootstrap.ts
src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts
src/charging-station/ocpp/OCPPIncomingRequestService.ts
src/performance/storage/Storage.ts
src/types/Error.ts
src/utils/Configuration.ts
src/utils/FileUtils.ts

index 3aab9416ee4555e62f7e268d55d192f9607e95d2..fa8f73ebda6b40e238fd8e09ab8d77e8d558ef7b 100644 (file)
@@ -3,6 +3,7 @@
 import { ChargingStationWorkerData, ChargingStationWorkerMessage, ChargingStationWorkerMessageEvents } from '../types/ChargingStationWorker';
 
 import Configuration from '../utils/Configuration';
+import { StationTemplateUrl } from '../types/ConfigurationData';
 import Statistics from '../types/Statistics';
 import { Storage } from '../performance/storage/Storage';
 import { StorageFactory } from '../performance/storage/StorageFactory';
@@ -62,12 +63,7 @@ export default class Bootstrap {
             try {
               const nbStations = stationTemplateUrl.numberOfStations ?? 0;
               for (let index = 1; index <= nbStations; index++) {
-                const workerData: ChargingStationWorkerData = {
-                  index,
-                  templateFile: path.join(path.resolve(__dirname, '../'), 'assets', 'station-templates', path.basename(stationTemplateUrl.file))
-                };
-                await this.workerImplementation.addElement(workerData);
-                this.numberOfChargingStations++;
+                await this.startChargingStation(index, stationTemplateUrl);
               }
             } catch (error) {
               console.error(chalk.red('Charging station start with template file ' + stationTemplateUrl.file + ' error '), error);
@@ -130,6 +126,15 @@ export default class Bootstrap {
       });
   }
 
+  private async startChargingStation(index: number, stationTemplateUrl: StationTemplateUrl): Promise<void> {
+    const workerData: ChargingStationWorkerData = {
+      index,
+      templateFile: path.join(path.resolve(__dirname, '../'), 'assets', 'station-templates', path.basename(stationTemplateUrl.file))
+    };
+    await this.workerImplementation.addElement(workerData);
+    this.numberOfChargingStations++;
+  }
+
   private logPrefix(): string {
     return Utils.logPrefix(' Bootstrap |');
   }
index 5c7f7bf696465c33a7f4852d71b61e3a6df16b6a..a9b79c134af9999f7dd64de9d5eec96e140de7c3 100644 (file)
@@ -423,7 +423,7 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer
         if (ftpClient) {
           ftpClient.close();
         }
-        return this.handleIncomingRequestError(OCPP16IncomingRequestCommand.GET_DIAGNOSTICS, error as Error, Constants.OCPP_RESPONSE_EMPTY);
+        return this.handleIncomingRequestError(OCPP16IncomingRequestCommand.GET_DIAGNOSTICS, error as Error, { errorResponse: Constants.OCPP_RESPONSE_EMPTY });
       }
     } else {
       logger.error(`${this.chargingStation.logPrefix()} Unsupported protocol ${uri.protocol} to transfer the diagnostic logs archive`);
@@ -454,7 +454,7 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer
           return Constants.OCPP_TRIGGER_MESSAGE_RESPONSE_NOT_IMPLEMENTED;
       }
     } catch (error) {
-      return this.handleIncomingRequestError(OCPP16IncomingRequestCommand.TRIGGER_MESSAGE, error as Error, Constants.OCPP_TRIGGER_MESSAGE_RESPONSE_REJECTED);
+      return this.handleIncomingRequestError(OCPP16IncomingRequestCommand.TRIGGER_MESSAGE, error as Error, { errorResponse: Constants.OCPP_TRIGGER_MESSAGE_RESPONSE_REJECTED });
     }
   }
 }
index a56437f951e7a9999683584a0c4eaed6df7a230b..5fadfb95d5ee5227327fe8fc0304a1aee2998f9b 100644 (file)
@@ -19,14 +19,17 @@ export default abstract class OCPPIncomingRequestService {
     return OCPPIncomingRequestService.instances.get(chargingStation.id) as T;
   }
 
-  protected handleIncomingRequestError<T>(commandName: IncomingRequestCommand, error: Error, errorOcppResponse?: T, params: HandleErrorParams = { throwError: true }): T {
+  protected handleIncomingRequestError<T>(commandName: IncomingRequestCommand, error: Error, params: HandleErrorParams<T> = { throwError: true }): T {
     logger.error(this.chargingStation.logPrefix() + ' Incoming request command %s error: %j', commandName, error);
-    if (errorOcppResponse) {
-      return errorOcppResponse;
+    if (!params?.throwError && params?.errorResponse) {
+      return params?.errorResponse;
     }
-    if (params?.throwError) {
+    if (params?.throwError && !params?.errorResponse) {
       throw error;
     }
+    if (params?.throwError && params?.errorResponse) {
+      return params?.errorResponse;
+    }
   }
 
   public abstract handleRequest(messageId: string, commandName: IncomingRequestCommand, commandPayload: JsonType): Promise<void>;
index 2f5feccee9a2e2b888e1a9bfef353ab4ff7d002d..c4a0ce9c5669d2516554d161b11f8234a8e08c09 100644 (file)
@@ -2,6 +2,7 @@
 
 import { DBName, StorageType } from '../../types/Storage';
 
+import { EmptyObject } from '../../types/EmptyObject';
 import { HandleErrorParams } from '../../types/Error';
 import Statistics from '../../types/Statistics';
 import { URL } from 'url';
@@ -18,7 +19,7 @@ export abstract class Storage {
     this.logPrefix = logPrefix;
   }
 
-  protected handleDBError(type: StorageType, error: Error, table?: string, params: HandleErrorParams = { throwError: false }): void {
+  protected handleDBError(type: StorageType, error: Error, table?: string, params: HandleErrorParams<EmptyObject> = { throwError: false }): void {
     logger.error(`${this.logPrefix} ${this.getDBNameFromStorageType(type)} error '${error.message}'${(!Utils.isNullOrUndefined(table) || !table) && ` in table or collection '${table}'`}: %j`, error);
     if (params?.throwError) {
       throw error;
index c599438ce3554f6c4858d11e14508b0d48ff3199..b27f24578fa4829dc27e9eb7468f7217c3c6090b 100644 (file)
@@ -1,4 +1,5 @@
-export interface HandleErrorParams {
+export interface HandleErrorParams<T> {
   throwError?: boolean;
   consoleOut?: boolean;
+  errorResponse?: T;
 }
index 86c9335802bfc1a19eb4c11e10ab074a4ab22dbc..57d17c8fa349feca795e97ebec538baac1815c30 100644 (file)
@@ -1,6 +1,7 @@
 import ConfigurationData, { StationTemplateUrl, StorageConfiguration, SupervisionUrlDistribution, UIWebSocketServerConfiguration } from '../types/ConfigurationData';
 
 import Constants from './Constants';
+import { EmptyObject } from '../types/EmptyObject';
 import { HandleErrorParams } from '../types/Error';
 import { ServerOptions } from 'ws';
 import { StorageType } from '../types/Storage';
@@ -233,7 +234,8 @@ export default class Configuration {
     return typeof obj === 'undefined';
   }
 
-  private static handleFileException(logPrefix: string, fileType: string, filePath: string, error: NodeJS.ErrnoException, params: HandleErrorParams = { throwError: true }): void {
+  private static handleFileException(logPrefix: string, fileType: string, filePath: string, error: NodeJS.ErrnoException,
+      params: HandleErrorParams<EmptyObject> = { throwError: true }): void {
     const prefix = logPrefix.length !== 0 ? logPrefix + ' ' : '';
     if (error.code === 'ENOENT') {
       console.error(chalk.green(prefix) + chalk.red(fileType + ' file ' + filePath + ' not found: '), error);
index a0d495a6b79104c92fbfd7fae2030fb365288064..014ebbdece21cf9a3c9b512573faf95c741693f1 100644 (file)
@@ -1,10 +1,11 @@
+import { EmptyObject } from '../types/EmptyObject';
 import { HandleErrorParams } from '../types/Error';
 import chalk from 'chalk';
 import logger from './Logger';
 
 export default class FileUtils {
   static handleFileException(logPrefix: string, fileType: string, filePath: string, error: NodeJS.ErrnoException,
-      params: HandleErrorParams = { throwError: true, consoleOut: false }): void {
+      params: HandleErrorParams<EmptyObject> = { throwError: true, consoleOut: false }): void {
     const prefix = logPrefix.length !== 0 ? logPrefix + ' ' : '';
     if (error.code === 'ENOENT') {
       if (params?.consoleOut) {