build(deps-dev): apply updates
[e-mobility-charging-stations-simulator.git] / src / charging-station / ui-server / UIServerFactory.ts
index 3df4566356cee97e6c33893aa6fe7d36003d6aac..cf176bdc0403d2be85890204ba7b67e06f9b6c4a 100644 (file)
@@ -1,16 +1,18 @@
 import chalk from 'chalk'
 
-import type { AbstractUIServer } from './AbstractUIServer.js'
-import { UIHttpServer } from './UIHttpServer.js'
-import { UIServerUtils } from './UIServerUtils.js'
-import { UIWebSocketServer } from './UIWebSocketServer.js'
-import { BaseError } from '../../exception/BaseError.js'
+import { BaseError } from '../../exception/index.js'
 import {
   ApplicationProtocol,
   ApplicationProtocolVersion,
   AuthenticationType,
+  ConfigurationSection,
   type UIServerConfiguration
 } from '../../types/index.js'
+import { logger, logPrefix } from '../../utils/index.js'
+import type { AbstractUIServer } from './AbstractUIServer.js'
+import { UIHttpServer } from './UIHttpServer.js'
+import { isLoopback } from './UIServerUtils.js'
+import { UIWebSocketServer } from './UIWebSocketServer.js'
 
 // eslint-disable-next-line @typescript-eslint/no-extraneous-class
 export class UIServerFactory {
@@ -20,13 +22,13 @@ export class UIServerFactory {
 
   public static getUIServerImplementation (
     uiServerConfiguration: UIServerConfiguration
-  ): AbstractUIServer | undefined {
+  ): AbstractUIServer {
     if (
       uiServerConfiguration.authentication?.enabled === true &&
       !Object.values(AuthenticationType).includes(uiServerConfiguration.authentication.type)
     ) {
       throw new BaseError(
-        `Unknown authentication type '${uiServerConfiguration.authentication.type}' for UI server`
+        `Unknown authentication type '${uiServerConfiguration.authentication.type}' in '${ConfigurationSection.uiServer}' configuration section`
       )
     }
     if (
@@ -34,32 +36,57 @@ export class UIServerFactory {
       uiServerConfiguration.authentication?.enabled === true &&
       uiServerConfiguration.authentication.type === AuthenticationType.PROTOCOL_BASIC_AUTH
     ) {
-      throw new BaseError('Protocol basic authentication is not supported for HTTP UI server')
-    }
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    if (!UIServerUtils.isLoopback(uiServerConfiguration.options!.host!)) {
-      console.warn(
-        chalk.yellow(
-          'Loopback address not detected in UI server configuration. This is not recommended'
-        )
+      throw new BaseError(
+        `'${uiServerConfiguration.authentication.type}' authentication type with application protocol type '${uiServerConfiguration.type}' is not supported in '${ConfigurationSection.uiServer}' configuration section`
       )
     }
+    if (
+      uiServerConfiguration.authentication?.enabled !== true &&
+      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+      !isLoopback(uiServerConfiguration.options!.host!)
+    ) {
+      const logMsg = `Non loopback address in '${ConfigurationSection.uiServer}' configuration section without authentication enabled. This is not recommended`
+      logger.warn(`${UIServerFactory.logPrefix()} ${logMsg}`)
+      console.warn(chalk.yellow(logMsg))
+    }
     if (
       uiServerConfiguration.type === ApplicationProtocol.WS &&
       uiServerConfiguration.version !== ApplicationProtocolVersion.VERSION_11
     ) {
-      console.warn(
-        chalk.yellow(
-          `Only version ${ApplicationProtocolVersion.VERSION_11} is supported for WebSocket UI server. Falling back to version ${ApplicationProtocolVersion.VERSION_11}`
-        )
-      )
+      const logMsg = `Only version ${ApplicationProtocolVersion.VERSION_11} with application protocol type '${uiServerConfiguration.type}' is supported in '${ConfigurationSection.uiServer}' configuration section. Falling back to version ${ApplicationProtocolVersion.VERSION_11}`
+      logger.warn(`${UIServerFactory.logPrefix()} ${logMsg}`)
+      console.warn(chalk.yellow(logMsg))
       uiServerConfiguration.version = ApplicationProtocolVersion.VERSION_11
     }
     switch (uiServerConfiguration.type) {
-      case ApplicationProtocol.WS:
-        return new UIWebSocketServer(uiServerConfiguration)
       case ApplicationProtocol.HTTP:
         return new UIHttpServer(uiServerConfiguration)
+      case ApplicationProtocol.WS:
+      default:
+        if (
+          !Object.values(ApplicationProtocol).includes(
+            uiServerConfiguration.type as ApplicationProtocol
+          )
+        ) {
+          const logMsg = `Unknown application protocol type '${uiServerConfiguration.type}' in '${
+            ConfigurationSection.uiServer
+            // eslint-disable-next-line @typescript-eslint/no-base-to-string
+          }' configuration section from values '${ApplicationProtocol.toString()}', defaulting to '${
+            ApplicationProtocol.WS
+          }'`
+          logger.warn(`${UIServerFactory.logPrefix()} ${logMsg}`)
+          console.warn(logMsg)
+        }
+        return new UIWebSocketServer(uiServerConfiguration)
     }
   }
+
+  private static readonly logPrefix = (modName?: string, methodName?: string): string => {
+    const logMsgPrefix = 'UI Server'
+    const logMsg =
+      modName != null && methodName != null
+        ? ` ${logMsgPrefix} | ${modName}.${methodName}:`
+        : ` ${logMsgPrefix} |`
+    return logPrefix(logMsg)
+  }
 }