Forward UI request UUID to broadcast channel request
authorJérôme Benoit <jerome.benoit@sap.com>
Tue, 23 Aug 2022 14:03:49 +0000 (16:03 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Tue, 23 Aug 2022 14:03:49 +0000 (16:03 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
README.md
src/charging-station/ChargingStationWorkerBroadcastChannel.ts
src/charging-station/WorkerBroadcastChannel.ts
src/charging-station/ui-server/ui-services/AbstractUIService.ts
src/charging-station/ui-server/ui-services/UIService001.ts
src/types/UIProtocol.ts
src/types/WorkerBroadcastChannel.ts
src/ui/web/src/type/UIProtocol.ts

index 9b18fed95d7df25bed80c712f6f87f09b9adff22..0e02383d54bd6374f7f14ef3174a3e14339539d3 100644 (file)
--- a/README.md
+++ b/README.md
@@ -49,8 +49,7 @@ Tweak them to your needs by following the section [configuration files syntax](R
 
 To start the program, run: `npm start`.
 
-To start the program with a UI controller, run: `npm run start:server`.
-Then, start/stop the simulator by going to `https://<hostname:port>` in a browser. Localhost port will default to 8080. For Cloud Foundry, the port is assigned based on the `process.env.PORT` environment variable.
+## Start Web UI
 
 ## Configuration files syntax
 
@@ -383,20 +382,18 @@ All kind of OCPP parameters are supported in a charging station configuration or
 
 ## UI protocol
 
-Protocol to control the simulator via a Websocket protocol
+Protocol to control the simulator via a Websocket
 
-### Version 0.0.1
-
-Set the HTTP header Sec-Websocket-Protocol to `ui0.0.1`
+### Protocol
 
-#### Protocol
+PDU stands for Protocol Data Unit
 
 Request:
 [`uuid`, `ProcedureName`, `PDU`]
 
 `uuid`: String uniquely representing this request
 `ProcedureName`: The procedure to run on the simulator
-`PDU (for Protocol Data Unit)`: The parameters (if any) for said procedure
+`PDU`: The parameters (if any) for said procedure
 
 Response:
 [`uuid`, `PDU`]
@@ -404,18 +401,22 @@ Response:
 `uuid`: String uniquely linking the response to the request
 `PDU`: Response data to requested procedure
 
+### Version 0.0.1
+
+Set the HTTP header _Sec-Websocket-Protocol_ to `ui0.0.1`
+
 #### Procedures
 
 ##### List Charging stations
 
 Request:
-`ProcedureName`: 'listChargingStation'
+`ProcedureName`: 'listChargingStations'
 `PDU`: {}
 
 Response:
 `PDU`: {
 `status`,
-An array of ChargingStationData as described in `ChargingStationWorker.ts` file
+`Indexed ChargingStationData as described in ChargingStationWorker.ts file`
 }
 
 ##### Start Transaction
@@ -423,15 +424,14 @@ An array of ChargingStationData as described in `ChargingStationWorker.ts` file
 Request:
 `ProcedureName`: 'startTransaction'
 `PDU`: {
-`hashId`: the unique identifier of a chargingStation
+`hashId`: the unique identifier of a charging station
 `connectorId`: the id of the connector (start at 1)
 `idTag`: An allowed badge authetification ID
 }
 
 Response:
 `PDU`: {
-`status`,
-**null**
+`status`
 }
 
 ##### Stop Transaction
@@ -439,14 +439,13 @@ Response:
 Request:
 `ProcedureName`: 'stopTransaction'
 `PDU`: {
-`hashId`: the unique identifier of a chargingStation
+`hashId`: the unique identifier of a charging station
 `transactionId`: the id of the transaction
 }
 
 Response:
 `PDU`: {
-`status`,
-**null**
+`status`
 }
 
 ## Support, Feedback, Contributing
index edb7475a097c522f4f76a1038a7a69342959cd42..7212f09d0cf7b6832f494ddf0fb0925a47bac440 100644 (file)
@@ -13,6 +13,8 @@ import {
 import ChargingStation from './ChargingStation';
 import WorkerBroadcastChannel from './WorkerBroadcastChannel';
 
+const moduleName = 'ChargingStationWorkerBroadcastChannel';
+
 type MessageEvent = { data: unknown };
 
 export default class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChannel {
index 563da4588b564210ab65992ee084e3a7430231fe..d1d430c3a0c39230aef0c00dd5de5660b25e42a0 100644 (file)
@@ -1,7 +1,13 @@
 import { BroadcastChannel } from 'worker_threads';
 
+import { BroadcastChannelRequest } from '../types/WorkerBroadcastChannel';
+
 export default class WorkerBroadcastChannel extends BroadcastChannel {
   constructor() {
     super('worker');
   }
+
+  public sendRequest(request: BroadcastChannelRequest): void {
+    this.postMessage(request);
+  }
 }
index 070119bb2642f4c0658c7d4e163ac48ea8c0e7f6..2e35299cace8ca77d8bf5c04ec102a155e84343d 100644 (file)
@@ -56,7 +56,7 @@ export default abstract class AbstractUIService {
       }
 
       // Call the message handler to build the response payload
-      responsePayload = await this.messageHandlers.get(command)(requestPayload);
+      responsePayload = await this.messageHandlers.get(command)(messageId, requestPayload);
     } catch (error) {
       // Log
       logger.error(
@@ -87,12 +87,13 @@ export default abstract class AbstractUIService {
   // Validate the raw data received from the WebSocket
   // TODO: should probably be moved to the ws verify clients callback
   private dataValidation(rawData: RawData): ProtocolRequest {
-    logger.debug(
-      `${this.uiServer.logPrefix(
-        moduleName,
-        'dataValidation'
-      )} Raw data received: ${rawData.toString()}`
-    );
+    // logger.debug(
+    //   `${this.uiServer.logPrefix(
+    //     moduleName,
+    //     'dataValidation'
+    //   )} Raw data received: ${rawData.toString()}`
+    // );
+
     const data = JSON.parse(rawData.toString()) as JsonType[];
 
     if (Utils.isIterable(data) === false) {
index 94060b5e9b1efeac4fbbd63095fc28bfa444394c..1f926c939f7ce2703e58388d6117ebd210844a93 100644 (file)
@@ -6,8 +6,10 @@ import {
   ResponsePayload,
   ResponseStatus,
 } from '../../../types/UIProtocol';
-import { BroadcastChannelProcedureName } from '../../../types/WorkerBroadcastChannel';
-import Utils from '../../../utils/Utils';
+import {
+  BroadcastChannelProcedureName,
+  BroadcastChannelRequestPayload,
+} from '../../../types/WorkerBroadcastChannel';
 import { AbstractUIServer } from '../AbstractUIServer';
 import AbstractUIService from './AbstractUIService';
 
@@ -32,38 +34,38 @@ export default class UIService001 extends AbstractUIService {
     );
   }
 
-  private handleStartTransaction(payload: RequestPayload): ResponsePayload {
-    this.workerBroadcastChannel.postMessage([
-      Utils.generateUUID(),
+  private handleStartTransaction(uuid: string, payload: RequestPayload): ResponsePayload {
+    this.workerBroadcastChannel.sendRequest([
+      uuid,
       BroadcastChannelProcedureName.START_TRANSACTION,
-      payload,
+      payload as BroadcastChannelRequestPayload,
     ]);
     return { status: ResponseStatus.SUCCESS };
   }
 
-  private handleStopTransaction(payload: RequestPayload): ResponsePayload {
-    this.workerBroadcastChannel.postMessage([
-      Utils.generateUUID(),
+  private handleStopTransaction(uuid: string, payload: RequestPayload): ResponsePayload {
+    this.workerBroadcastChannel.sendRequest([
+      uuid,
       BroadcastChannelProcedureName.STOP_TRANSACTION,
-      payload,
+      payload as BroadcastChannelRequestPayload,
     ]);
     return { status: ResponseStatus.SUCCESS };
   }
 
-  private handleStartChargingStation(payload: RequestPayload): ResponsePayload {
-    this.workerBroadcastChannel.postMessage([
-      Utils.generateUUID(),
+  private handleStartChargingStation(uuid: string, payload: RequestPayload): ResponsePayload {
+    this.workerBroadcastChannel.sendRequest([
+      uuid,
       BroadcastChannelProcedureName.START_CHARGING_STATION,
-      payload,
+      payload as BroadcastChannelRequestPayload,
     ]);
     return { status: ResponseStatus.SUCCESS };
   }
 
-  private handleStopChargingStation(payload: RequestPayload): ResponsePayload {
-    this.workerBroadcastChannel.postMessage([
-      Utils.generateUUID(),
+  private handleStopChargingStation(uuid: string, payload: RequestPayload): ResponsePayload {
+    this.workerBroadcastChannel.sendRequest([
+      uuid,
       BroadcastChannelProcedureName.STOP_CHARGING_STATION,
-      payload,
+      payload as BroadcastChannelRequestPayload,
     ]);
     return { status: ResponseStatus.SUCCESS };
   }
index 4c25c58e921175b7f41535012591228d9feb24ff..2c5914953b2768bd94bdf836bb15c50fd40d1457 100644 (file)
@@ -17,7 +17,8 @@ export type ProtocolRequest = [string, ProcedureName, RequestPayload];
 export type ProtocolResponse = [string, ResponsePayload];
 
 export type ProtocolRequestHandler = (
-  payload: RequestPayload
+  uuid?: string,
+  payload?: RequestPayload
 ) => ResponsePayload | Promise<ResponsePayload>;
 
 export enum ProcedureName {
index 381f57e41b03e2f9d0bba89aeb3e09662b211729..9d1133d0941d7dcc692797a8cb2528682b28ab8f 100644 (file)
@@ -1,7 +1,12 @@
 import { JsonObject } from './JsonType';
+import { RequestPayload, ResponsePayload } from './UIProtocol';
 
-export type BroadcastChannelRequest = [string, BroadcastChannelProcedureName, RequestPayload];
-export type BroadcastChannelResponse = [string, ResponsePayload];
+export type BroadcastChannelRequest = [
+  string,
+  BroadcastChannelProcedureName,
+  BroadcastChannelRequestPayload
+];
+export type BroadcastChannelResponse = [string, BroadcastChannelResponsePayload];
 
 export enum BroadcastChannelProcedureName {
   START_CHARGING_STATION = 'startChargingStation',
@@ -10,14 +15,16 @@ export enum BroadcastChannelProcedureName {
   STOP_TRANSACTION = 'stopTransaction',
 }
 
-interface BasePayload extends JsonObject {
+interface BroadcastChannelBasePayload extends JsonObject {
   hashId: string;
 }
 
-export interface RequestPayload extends BasePayload {
+export interface BroadcastChannelRequestPayload
+  extends BroadcastChannelBasePayload,
+    Omit<RequestPayload, 'hashId'> {
   connectorId?: number;
   transactionId?: number;
   idTag?: string;
 }
 
-export type ResponsePayload = BasePayload;
+export type BroadcastChannelResponsePayload = ResponsePayload;
index f7a4ac0c9fa286b2908bbec3ae8c38ab1aa48113..4c25c58e921175b7f41535012591228d9feb24ff 100644 (file)
@@ -1,4 +1,4 @@
-import { JsonObject, JsonType } from './JsonType';
+import { JsonObject } from './JsonType';
 
 export enum Protocol {
   UI = 'ui',
@@ -13,13 +13,25 @@ export enum ProtocolVersion {
   '0.0.1' = '0.0.1',
 }
 
+export type ProtocolRequest = [string, ProcedureName, RequestPayload];
+export type ProtocolResponse = [string, ResponsePayload];
+
+export type ProtocolRequestHandler = (
+  payload: RequestPayload
+) => ResponsePayload | Promise<ResponsePayload>;
+
 export enum ProcedureName {
   LIST_CHARGING_STATIONS = 'listChargingStations',
+  START_CHARGING_STATION = 'startChargingStation',
+  STOP_CHARGING_STATION = 'stopChargingStation',
   START_TRANSACTION = 'startTransaction',
   STOP_TRANSACTION = 'stopTransaction',
   START_SIMULATOR = 'startSimulator',
   STOP_SIMULATOR = 'stopSimulator',
 }
+export interface RequestPayload extends JsonObject {
+  hashId?: string;
+}
 
 export enum ResponseStatus {
   SUCCESS = 'success',
@@ -29,10 +41,3 @@ export enum ResponseStatus {
 export interface ResponsePayload extends JsonObject {
   status: ResponseStatus;
 }
-
-export type ProtocolRequest = [string, ProcedureName, JsonType];
-export type ProtocolResponse = [string, ResponsePayload];
-
-export type ProtocolRequestHandler = (
-  payload: JsonType
-) => void | Promise<void> | ResponsePayload | Promise<ResponsePayload>;