refactor: cleanup variables namespace
[e-mobility-charging-stations-simulator.git] / src / charging-station / ui-server / UIHttpServer.ts
index 27b9e8458fbe19bd1e3822f60f57fea7d9c84645..eafea59ad3ec2398be9f1e4c2c526e829c7e98d2 100644 (file)
@@ -1,4 +1,4 @@
-import type { IncomingMessage, RequestListener, ServerResponse } from 'node:http'
+import type { IncomingMessage, ServerResponse } from 'node:http'
 
 import { StatusCodes } from 'http-status-codes'
 
@@ -16,7 +16,14 @@ import {
   ResponseStatus,
   type UIServerConfiguration
 } from '../../types/index.js'
-import { Constants, generateUUID, isNotEmptyString, logPrefix, logger } from '../../utils/index.js'
+import {
+  Constants,
+  JSONStringifyWithMapSupport,
+  generateUUID,
+  isNotEmptyString,
+  logPrefix,
+  logger
+} from '../../utils/index.js'
 
 const moduleName = 'UIHttpServer'
 
@@ -24,7 +31,7 @@ enum HttpMethods {
   GET = 'GET',
   PUT = 'PUT',
   POST = 'POST',
-  PATCH = 'PATCH',
+  PATCH = 'PATCH'
 }
 
 export class UIHttpServer extends AbstractUIServer {
@@ -33,7 +40,7 @@ export class UIHttpServer extends AbstractUIServer {
   }
 
   public start (): void {
-    this.httpServer.on('request', this.requestListener.bind(this) as RequestListener)
+    this.httpServer.on('request', this.requestListener.bind(this))
     this.startHttpServer()
   }
 
@@ -54,7 +61,7 @@ export class UIHttpServer extends AbstractUIServer {
           .writeHead(this.responseStatusToStatusCode(payload.status), {
             'Content-Type': 'application/json'
           })
-          .end(JSON.stringify(payload))
+          .end(JSONStringifyWithMapSupport(payload))
       } else {
         logger.error(
           `${this.logPrefix(moduleName, 'sendResponse')} Response for unknown request id: ${uuid}`
@@ -80,7 +87,7 @@ export class UIHttpServer extends AbstractUIServer {
   }
 
   private requestListener (req: IncomingMessage, res: ServerResponse): void {
-    this.authenticate(req, (err) => {
+    this.authenticate(req, err => {
       if (err != null) {
         res
           .writeHead(StatusCodes.UNAUTHORIZED, {
@@ -96,7 +103,7 @@ export class UIHttpServer extends AbstractUIServer {
     const [protocol, version, procedureName] = req.url?.split('/').slice(1) as [
       Protocol,
       ProtocolVersion,
-      ProcedureName,
+      ProcedureName
     ]
     const uuid = generateUUID()
     this.responseHandlers.set(uuid, res)
@@ -106,7 +113,7 @@ export class UIHttpServer extends AbstractUIServer {
         throw new BaseError(`Unsupported UI protocol version: '${fullProtocol}'`)
       }
       this.registerProtocolVersionUIService(version)
-      req.on('error', (error) => {
+      req.on('error', error => {
         logger.error(
           `${this.logPrefix(moduleName, 'requestListener.req.onerror')} Error on HTTP request:`,
           error
@@ -119,10 +126,22 @@ export class UIHttpServer extends AbstractUIServer {
             bodyBuffer.push(chunk)
           })
           .on('end', () => {
-            const body = JSON.parse(Buffer.concat(bodyBuffer).toString()) as RequestPayload
+            let requestPayload: RequestPayload | undefined
+            try {
+              requestPayload = JSON.parse(Buffer.concat(bodyBuffer).toString()) as RequestPayload
+            } catch (error) {
+              this.sendResponse(
+                this.buildProtocolResponse(uuid, {
+                  status: ResponseStatus.FAILURE,
+                  errorMessage: (error as Error).message,
+                  errorStack: (error as Error).stack
+                })
+              )
+              return
+            }
             this.uiServices
               .get(version)
-              ?.requestHandler(this.buildProtocolRequest(uuid, procedureName, body))
+              ?.requestHandler(this.buildProtocolRequest(uuid, procedureName, requestPayload))
               .then((protocolResponse?: ProtocolResponse) => {
                 if (protocolResponse != null) {
                   this.sendResponse(protocolResponse)