refactor(ui): cleanup CSS styling
[e-mobility-charging-stations-simulator.git] / src / charging-station / ui-server / UIServerFactory.ts
index d3c34b58aedaaa48f25289d011d84a4ba3cec942..d7de7ddd93b152a6bd26b75007dd72b1d31f05e9 100644 (file)
@@ -1,50 +1,69 @@
-import chalk from 'chalk';
+import chalk from 'chalk'
 
-import type { AbstractUIServer } from './AbstractUIServer';
-import { UIHttpServer } from './UIHttpServer';
-import { UIServerUtils } from './UIServerUtils';
-import { UIWebSocketServer } from './UIWebSocketServer';
+import type { AbstractUIServer } from './AbstractUIServer.js'
+import { UIHttpServer } from './UIHttpServer.js'
+import { isLoopback } from './UIServerUtils.js'
+import { UIWebSocketServer } from './UIWebSocketServer.js'
+import { BaseError } from '../../exception/index.js'
 import {
   ApplicationProtocol,
   ApplicationProtocolVersion,
-  type UIServerConfiguration,
-} from '../../types';
+  AuthenticationType,
+  type UIServerConfiguration
+} from '../../types/index.js'
 
+// eslint-disable-next-line @typescript-eslint/no-extraneous-class
 export class UIServerFactory {
-  private constructor() {
+  private constructor () {
     // This is intentional
   }
 
-  public static getUIServerImplementation(
-    uiServerConfiguration: UIServerConfiguration,
-  ): AbstractUIServer | undefined {
-    if (UIServerUtils.isLoopback(uiServerConfiguration.options!.host!) === false) {
+  public static getUIServerImplementation (
+    uiServerConfiguration: UIServerConfiguration
+  ): 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`
+      )
+    }
+    if (
+      uiServerConfiguration.type === ApplicationProtocol.HTTP &&
+      uiServerConfiguration.authentication?.enabled === true &&
+      uiServerConfiguration.authentication.type === AuthenticationType.PROTOCOL_BASIC_AUTH
+    ) {
+      throw new BaseError('Protocol basic authentication is not supported for HTTP UI server')
+    }
+    if (
+      uiServerConfiguration.authentication?.enabled !== true &&
+      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+      !isLoopback(uiServerConfiguration.options!.host!)
+    ) {
       console.warn(
         chalk.yellow(
-          'Loopback address not detected in UI server configuration. This is not recommended.',
-        ),
-      );
+          'Non loopback address in UI server configuration without authentication enabled. This is not recommended'
+        )
+      )
     }
-    uiServerConfiguration = {
-      version: ApplicationProtocolVersion.VERSION_11,
-      ...uiServerConfiguration,
-    };
     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}.`,
-        ),
-      );
-      uiServerConfiguration.version = ApplicationProtocolVersion.VERSION_11;
+          `Only version ${ApplicationProtocolVersion.VERSION_11} is supported for WebSocket UI server. Falling back to version ${ApplicationProtocolVersion.VERSION_11}`
+        )
+      )
+      uiServerConfiguration.version = ApplicationProtocolVersion.VERSION_11
     }
     switch (uiServerConfiguration.type) {
-      case ApplicationProtocol.WS:
-        return new UIWebSocketServer(uiServerConfiguration);
       case ApplicationProtocol.HTTP:
-        return new UIHttpServer(uiServerConfiguration);
+        return new UIHttpServer(uiServerConfiguration)
+      case ApplicationProtocol.WS:
+      default:
+        return new UIWebSocketServer(uiServerConfiguration)
     }
   }
 }