UI WS server: use a map to store UI services per protocol version
authorJérôme Benoit <jerome.benoit@sap.com>
Thu, 2 Dec 2021 07:28:05 +0000 (08:28 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Thu, 2 Dec 2021 07:28:05 +0000 (08:28 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
src/charging-station/Bootstrap.ts
src/charging-station/UIWebSocketServer.ts
src/charging-station/UIWebSocketServices/AbstractUIService.ts
src/charging-station/UIWebSocketServices/UIService001.ts
src/types/UIProtocol.ts

index ce20f0bff96c498c8be4331d90a62dd56e9ae1c1..0c398c5739e475bff92a85b4d533968b352b3661 100644 (file)
@@ -117,9 +117,9 @@ export default class Bootstrap {
         },
         messageHandler: async (msg: ChargingStationWorkerMessage) => {
           if (msg.id === ChargingStationWorkerMessageEvents.STARTED) {
-            this.uiWebSocketServer.uiService.chargingStations.add(msg.data.id);
+            this.uiWebSocketServer.chargingStations.add(msg.data.id);
           } else if (msg.id === ChargingStationWorkerMessageEvents.STOPPED) {
-            this.uiWebSocketServer.uiService.chargingStations.delete(msg.data.id);
+            this.uiWebSocketServer.chargingStations.delete(msg.data.id);
           } else if (msg.id === ChargingStationWorkerMessageEvents.PERFORMANCE_STATISTICS) {
             await this.storage.storePerformanceStatistics(msg.data);
           }
index 5903b85c48cad0112b0eacee9a64dc6f09e9ed0d..59186a5e30da2f4d6cf4a55d770fcf008cb7533c 100644 (file)
@@ -10,11 +10,17 @@ import Utils from '../utils/Utils';
 import logger from '../utils/Logger';
 
 export default class UIWebSocketServer extends Server {
-  public uiService: AbstractUIService;
+  public readonly chargingStations: Set<string>;
+  public readonly uiServices: Map<ProtocolVersion, AbstractUIService>;
 
   public constructor(options?: ServerOptions, callback?: () => void) {
     // Create the WebSocket Server
     super(options ?? Configuration.getUIWebSocketServer().options, callback);
+    this.chargingStations = new Set<string>();
+    this.uiServices = new Map<ProtocolVersion, AbstractUIService>();
+    for (const version of Object.values(ProtocolVersion)) {
+      this.uiServices.set(version, UIServiceFactory.getUIServiceImplementation(version, this));
+    }
   }
 
   public broadcastToClients(message: string | Record<string, unknown>): void {
@@ -29,8 +35,7 @@ export default class UIWebSocketServer extends Server {
     this.on('connection', (socket: WebSocket, request: IncomingMessage): void => {
       const protocolIndex = socket.protocol.indexOf(Protocol.UI);
       const version = socket.protocol.substring(protocolIndex + Protocol.UI.length) as ProtocolVersion;
-      this.uiService = UIServiceFactory.getUIServiceImplementation(version, this);
-      if (!this.uiService) {
+      if (!this.uiServices.has(version)) {
         throw new BaseError(`Could not find a UI service implementation for UI protocol version ${version}`);
       }
       // FIXME: check connection validity
@@ -42,7 +47,7 @@ export default class UIWebSocketServer extends Server {
         } else {
           throw new BaseError('UI protocol request is not iterable');
         }
-        this.uiService.handleMessage(command, payload).catch(() => {
+        this.uiServices.get(version).handleMessage(command, payload).catch(() => {
           logger.error(`${this.logPrefix()} Error while handling command %s message: %j`, command, payload);
         });
       });
index 675126989503b1e084e8e0889b10ad1e337c4280..130c8a5a0d06629897e4b576036df214d1260c27 100644 (file)
@@ -5,12 +5,10 @@ import UIWebSocketServer from '../UIWebSocketServer';
 import logger from '../../utils/Logger';
 
 export default abstract class AbstractUIService {
-  public readonly chargingStations: Set<string>;
   protected readonly uiWebSocketServer: UIWebSocketServer;
   protected readonly messageHandlers: Map<ProtocolCommand, ProtocolRequestHandler>;
 
   constructor(uiWebSocketServer: UIWebSocketServer) {
-    this.chargingStations = new Set<string>();
     this.uiWebSocketServer = uiWebSocketServer;
     this.messageHandlers = new Map<ProtocolCommand, ProtocolRequestHandler>([
       [ProtocolCommand.LIST_CHARGING_STATIONS, this.handleListChargingStations.bind(this)],
@@ -44,6 +42,6 @@ export default abstract class AbstractUIService {
   }
 
   private handleListChargingStations(): Set<string> {
-    return this.chargingStations;
+    return this.uiWebSocketServer.chargingStations;
   }
 }
index 5aba5a7b70cca0bab3ab3d440267daf4cf04d3a7..3270aaf30d7ee84bbc46438a4b478d29f8f858ae 100644 (file)
@@ -1,12 +1,13 @@
+import { ProtocolCommand, ProtocolRequestHandler } from '../../types/UIProtocol';
+
 import AbstractUIService from './AbstractUIService';
-import { ProtocolCommand } from '../../types/UIProtocol';
 import UIWebSocketServer from '../UIWebSocketServer';
 
 export default class UIService001 extends AbstractUIService {
   constructor(uiWebSocketServer: UIWebSocketServer) {
     super(uiWebSocketServer);
-    this.messageHandlers.set(ProtocolCommand.START_TRANSACTION, this.handleStartTransaction.bind(this));
-    this.messageHandlers.set(ProtocolCommand.STOP_TRANSACTION, this.handleStopTransaction.bind(this));
+    this.messageHandlers.set(ProtocolCommand.START_TRANSACTION, this.handleStartTransaction.bind(this) as ProtocolRequestHandler);
+    this.messageHandlers.set(ProtocolCommand.STOP_TRANSACTION, this.handleStopTransaction.bind(this) as ProtocolRequestHandler);
   }
 
   private handleStartTransaction(payload: Record<string, unknown>): void { }
index 2abefe258dc991de01a9723d3d5fb563de181149..05ddaa235da3e016cbdac2a1033b1419f308be62 100644 (file)
@@ -4,7 +4,6 @@ export enum Protocol {
 
 export enum ProtocolVersion {
   '0.0.1' = '0.0.1',
-  '0.0.2' = '0.0.2',
 }
 
 export enum ProtocolCommand {