Fixlet to comment
[e-mobility-charging-stations-simulator.git] / src / charging-station / WebSocketServer.ts
index b0660bd8318b9947a69dabef1d00d28266257608..426c80721598cdeb247ba35f0cce47aa6e2d578c 100644 (file)
@@ -1,19 +1,20 @@
+import { ProtocolCommand, ProtocolRequest, ProtocolVersion } from '../types/UIProtocol';
+
+import AbstractUIService from './WebSocketServices/ui/AbstractUIService';
 import { IncomingMessage } from 'http';
+import UIService from './WebSocketServices/ui/0.0.1/UIService';
+import Utils from '../utils/Utils';
 import WebSocket from 'ws';
 import logger from '../utils/Logger';
 
-enum WebSocketServerCommand {
-  START_TRANSACTION = 'startTransaction',
-  STOP_TRANSACTION = 'stopTransaction',
-  UNKNOWN = 'unknown',
-}
-
-type WebSocketServerRequest = [WebSocketServerCommand, Record<string, unknown>];
-
 export default class WebSocketServer extends WebSocket.Server {
+  private webSocketServerService: AbstractUIService;
+
   public constructor(options?: WebSocket.ServerOptions, callback?: () => void) {
     // Create the WebSocket Server
     super(options, callback);
+    // FIXME: version the instantiation
+    this.webSocketServerService = new UIService(this);
   }
 
   public broadcastToClients(message: Record<string, unknown>): void {
@@ -25,21 +26,33 @@ export default class WebSocketServer extends WebSocket.Server {
   }
 
   public start(): void {
-    // this.on('connection', (socket: WebSocket, request: IncomingMessage): void => {
-    //   // Check connection validity
-    // });
-    this.on('message', (messageData) => {
-      let [command, payload]: WebSocketServerRequest = [WebSocketServerCommand.UNKNOWN, {}];
-      // FIXME: check for iterable object
-      [command, payload] = JSON.parse(messageData.toString()) as WebSocketServerRequest;
-      switch (command) {
-        case WebSocketServerCommand.START_TRANSACTION:
-          break;
-        case WebSocketServerCommand.STOP_TRANSACTION:
-          break;
-        default:
-          logger.warn(`Unknown command: ${command}`);
-      }
+    this.on('connection', (socket: WebSocket, request: IncomingMessage): void => {
+      // FIXME: check connection validity
+      socket.on('message', (messageData) => {
+        let [version, command, payload]: ProtocolRequest = [ProtocolVersion['0.0.1'], ProtocolCommand.UNKNOWN, {}];
+        // FIXME: check for iterable object
+        [version, command, payload] = JSON.parse(messageData.toString()) as ProtocolRequest;
+        switch (version) {
+          case ProtocolVersion['0.0.1']:
+            this.webSocketServerService.handleMessage(command, payload).catch(() => {
+              logger.error(`${this.logPrefix()} Error while handling command %s message: %j`, command, payload);
+            });
+            break;
+          default:
+            logger.error(`${this.logPrefix()} Unknown protocol version: ${version}`);
+        }
+      });
+      socket.on('error', (error) => {
+        logger.error(`${this.logPrefix()} Error on WebSocket: %j`, error);
+      });
     });
   }
+
+  public stop(): void {
+    this.close();
+  }
+
+  public logPrefix(): string {
+    return Utils.logPrefix('WebSocket Server:');
+  }
 }