Convert OCPP message buffer to a Set
authorJérôme Benoit <jerome.benoit@sap.com>
Sun, 3 Oct 2021 02:40:54 +0000 (04:40 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Sun, 3 Oct 2021 02:40:54 +0000 (04:40 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
src/charging-station/AutomaticTransactionGenerator.ts
src/charging-station/ChargingStation.ts
src/charging-station/ocpp/OCPPRequestService.ts

index f444018a2e36418254fe927e553d1eab7ce31372..ccc30d0c88dd9a0058b8d22a54948c6dab009db3 100644 (file)
@@ -40,7 +40,7 @@ export default class AutomaticTransactionGenerator {
   }
 
   private startConnectors(): void {
-    if (this.connectorsStatus?.size !== 0 && this.connectorsStatus.size !== this.chargingStation.getNumberOfConnectors()) {
+    if (this.connectorsStatus?.size > 0 && this.connectorsStatus.size !== this.chargingStation.getNumberOfConnectors()) {
       this.connectorsStatus.clear();
     }
     for (const connectorId of this.chargingStation.connectors.keys()) {
index edcd312da8dcb06db37b8d68f37249707ca3779f..dde845621781534c7d48ed366fd75b06ec9d1490 100644 (file)
@@ -52,7 +52,7 @@ export default class ChargingStation {
   private bootNotificationResponse!: BootNotificationResponse | null;
   private connectorsConfigurationHash!: string;
   private ocppIncomingRequestService!: OCPPIncomingRequestService;
-  private readonly messageQueue: string[];
+  private readonly messageBuffer: Set<string>;
   private wsConnectionUrl!: URL;
   private wsConnectionRestarted: boolean;
   private stopped: boolean;
@@ -71,7 +71,7 @@ export default class ChargingStation {
     this.autoReconnectRetryCount = 0;
 
     this.requests = new Map<string, CachedRequest>();
-    this.messageQueue = new Array<string>();
+    this.messageBuffer = new Set<string>();
 
     this.authorizedTags = this.getAuthorizedTags();
   }
@@ -411,28 +411,16 @@ export default class ChargingStation {
     this.stopMeterValues(connectorId);
   }
 
-  public addToMessageQueue(message: string): void {
-    let dups = false;
-    // Handle dups in message queue
-    for (const bufferedMessage of this.messageQueue) {
-      // Message already in the queue
-      if (message === bufferedMessage) {
-        dups = true;
-        break;
-      }
-    }
-    if (!dups) {
-      // Queue message
-      this.messageQueue.push(message);
-    }
+  public bufferMessage(message: string): void {
+    this.messageBuffer.add(message);
   }
 
-  private flushMessageQueue() {
-    if (!Utils.isEmptyArray(this.messageQueue)) {
-      this.messageQueue.forEach((message, index) => {
-        this.messageQueue.splice(index, 1);
+  private flushMessageBuffer() {
+    if (this.messageBuffer.size > 0) {
+      this.messageBuffer.forEach((message) => {
         // TODO: evaluate the need to track performance
         this.wsConnection.send(message);
+        this.messageBuffer.delete(message);
       });
     }
   }
@@ -627,7 +615,7 @@ export default class ChargingStation {
       await this.startMessageSequence();
       this.stopped && (this.stopped = false);
       if (this.wsConnectionRestarted && this.isWebSocketConnectionOpened()) {
-        this.flushMessageQueue();
+        this.flushMessageBuffer();
       }
     } else {
       logger.error(`${this.logPrefix()} Registration failure: max retries reached (${this.getRegistrationMaxRetries()}) or retry disabled (${this.getRegistrationMaxRetries()})`);
index b72b596c7d11c8db8228115e5940e0ce73c381e4..4996b9e7aa89beb9f075cc7063898b0045757be5 100644 (file)
@@ -42,7 +42,7 @@ export default abstract class OCPPRequestService {
         PerformanceStatistics.endMeasure(commandName, beginId);
       } else if (!skipBufferingOnError) {
         // Buffer it
-        this.chargingStation.addToMessageQueue(messageToSend);
+        this.chargingStation.bufferMessage(messageToSend);
         const ocppError = new OCPPError(ErrorType.GENERIC_ERROR, `WebSocket closed for buffered message id '${messageId}' with content '${messageToSend}'`, commandParams?.details ?? {});
         if (messageType === MessageType.CALL_MESSAGE) {
           // Reject it but keep the request in the cache