Use IIFE (https://developer.mozilla.org/en-US/docs/Glossary/IIFE) for
authorJérôme Benoit <jerome.benoit@sap.com>
Sun, 29 Aug 2021 16:57:37 +0000 (18:57 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Sun, 29 Aug 2021 16:57:37 +0000 (18:57 +0200)
message sent to the main thread

It's a fire and forget semantic, so enforce it at the code level.

Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts
src/charging-station/ocpp/OCPPRequestService.ts
src/types/Worker.ts
src/worker/WorkerSet.ts

index 8f86f478c7aba1c4507b02edd6ab0ac5838edfe8..5b94ece886b900710d4085b6e075cde1871b00e2 100644 (file)
@@ -43,9 +43,9 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer
       }
     } else {
       // Throw exception
-      const errMsg = `${commandName} is not implemented to handle payload ${JSON.stringify(commandPayload, null, 2)}`;
-      await this.chargingStation.ocppRequestService.sendError(messageId, new OCPPError(ErrorType.NOT_IMPLEMENTED, errMsg), commandName);
-      throw new OCPPError(ErrorType.NOT_IMPLEMENTED, errMsg);
+      const error = new OCPPError(ErrorType.NOT_IMPLEMENTED, `${commandName} is not implemented to handle payload ${JSON.stringify(commandPayload, null, 2)}`);
+      await this.chargingStation.ocppRequestService.sendError(messageId, error, commandName);
+      throw error;
     }
     // Send the built response
     await this.chargingStation.ocppRequestService.sendMessage(messageId, response, MessageType.CALL_RESULT_MESSAGE, commandName);
index ca04745734535776c39ad0e4ae14ab3a1501c9d9..5d4883ec5a67ffc4942537aecce2a530b242a82e 100644 (file)
@@ -23,7 +23,8 @@ export default abstract class OCPPRequestService {
     this.ocppResponseService = ocppResponseService;
   }
 
-  public async sendMessage(messageId: string, commandParams: any, messageType: MessageType, commandName: RequestCommand | IncomingRequestCommand): Promise<any> {
+  public async sendMessage(messageId: string, commandParams: Record<string, unknown>, messageType: MessageType,
+      commandName: RequestCommand | IncomingRequestCommand): Promise<unknown> {
     // eslint-disable-next-line @typescript-eslint/no-this-alias
     const self = this;
     // Send a message through wsConnection
@@ -34,7 +35,7 @@ export default abstract class OCPPRequestService {
         // Request
         case MessageType.CALL_MESSAGE:
           // Build request
-          this.chargingStation.requests[messageId] = [responseCallback, rejectCallback, commandParams as Record<string, unknown>];
+          this.chargingStation.requests[messageId] = [responseCallback, rejectCallback, commandParams];
           messageToSend = JSON.stringify([messageType, messageId, commandName, commandParams]);
           break;
         // Response
@@ -61,7 +62,7 @@ export default abstract class OCPPRequestService {
         // Buffer it
         this.chargingStation.addToMessageQueue(messageToSend);
         // Reject it
-        return rejectCallback(new OCPPError(commandParams.code ? commandParams.code : ErrorType.GENERIC_ERROR, commandParams.message ? commandParams.message : `WebSocket closed for message id '${messageId}' with content '${messageToSend}', message buffered`, commandParams.details ? commandParams.details : {}));
+        return rejectCallback(new OCPPError(commandParams.code ? commandParams.code as ErrorType : ErrorType.GENERIC_ERROR, commandParams.message ? commandParams.message as string : `WebSocket closed for message id '${messageId}' with content '${messageToSend}', message buffered`, commandParams.details ? commandParams.details : {}));
       }
       // Response?
       if (messageType === MessageType.CALL_RESULT_MESSAGE) {
@@ -69,7 +70,7 @@ export default abstract class OCPPRequestService {
         resolve();
       } else if (messageType === MessageType.CALL_ERROR_MESSAGE) {
         // Send timeout
-        setTimeout(() => rejectCallback(new OCPPError(commandParams.code ? commandParams.code : ErrorType.GENERIC_ERROR, commandParams.message ? commandParams.message : `Timeout for message id '${messageId}' with content '${messageToSend}'`, commandParams.details ? commandParams.details : {})), Constants.OCPP_ERROR_TIMEOUT);
+        setTimeout(() => rejectCallback(new OCPPError(commandParams.code ? commandParams.code as ErrorType : ErrorType.GENERIC_ERROR, commandParams.message ? commandParams.message as string : `Timeout for message id '${messageId}' with content '${messageToSend}'`, commandParams.details ? commandParams.details : {})), Constants.OCPP_ERROR_TIMEOUT);
       }
 
       /**
index 0c795b2e7015a264636158ea583128292d4e8c81..66f6d15a78e9665ab359ae3baa123bd0fdfe2782 100644 (file)
@@ -13,7 +13,7 @@ export interface WorkerOptions {
   poolMinSize?: number;
   elementsPerWorker?: number;
   poolOptions?: PoolOptions<Worker>;
-  messageHandler?: (message: any) => void | Promise<void>;
+  messageHandler?: (message: unknown) => void | Promise<void>;
 }
 
 // eslint-disable-next-line @typescript-eslint/no-empty-interface
index 6ab08b92d3fbdc8ca557476ad160e25f889b7e71..ae99da5b4a319093bd4923913a173d3a2a1eb040 100644 (file)
@@ -9,7 +9,7 @@ import { WorkerUtils } from './WorkerUtils';
 
 export default class WorkerSet<T> extends WorkerAbstract {
   public readonly maxElementsPerWorker: number;
-  private readonly messageHandler: (message: any) => void | Promise<void>;
+  private readonly messageHandler: (message: unknown) => void | Promise<void>;
   private workerSet: Set<WorkerSetElement>;
 
   /**
@@ -79,7 +79,11 @@ export default class WorkerSet<T> extends WorkerAbstract {
    */
   private startWorker(): void {
     const worker = new Worker(this.workerScript);
-    worker.on('message', this.messageHandler);
+    worker.on('message', (msg) => {
+      (async () => {
+        await this.messageHandler(msg);
+      })().catch(() => {});
+    });
     worker.on('error', () => { /* This is intentional */ });
     worker.on('exit', (code) => {
       WorkerUtils.defaultExitHandler(code);