feat: add a basic authentication scheme for UI WebSocket server
[e-mobility-charging-stations-simulator.git] / src / charging-station / ui-server / UIServerFactory.ts
1 import chalk from 'chalk'
2
3 import type { AbstractUIServer } from './AbstractUIServer.js'
4 import { UIHttpServer } from './UIHttpServer.js'
5 import { UIServerUtils } from './UIServerUtils.js'
6 import { UIWebSocketServer } from './UIWebSocketServer.js'
7 import { BaseError } from '../../exception/BaseError.js'
8 import {
9 ApplicationProtocol,
10 ApplicationProtocolVersion,
11 AuthenticationType,
12 type UIServerConfiguration
13 } from '../../types/index.js'
14
15 // eslint-disable-next-line @typescript-eslint/no-extraneous-class
16 export class UIServerFactory {
17 private constructor () {
18 // This is intentional
19 }
20
21 public static getUIServerImplementation (
22 uiServerConfiguration: UIServerConfiguration
23 ): AbstractUIServer | undefined {
24 if (
25 uiServerConfiguration.authentication?.enabled === true &&
26 !Object.values(AuthenticationType).includes(uiServerConfiguration.authentication.type)
27 ) {
28 throw new BaseError(
29 `Unknown authentication type '${uiServerConfiguration.authentication.type}' for UI server`
30 )
31 }
32 if (
33 uiServerConfiguration.type === ApplicationProtocol.HTTP &&
34 uiServerConfiguration.authentication?.enabled === true &&
35 uiServerConfiguration.authentication.type === AuthenticationType.PROTOCOL_BASIC_AUTH
36 ) {
37 throw new BaseError('Protocol basic authentication is not supported for HTTP UI server')
38 }
39 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
40 if (!UIServerUtils.isLoopback(uiServerConfiguration.options!.host!)) {
41 console.warn(
42 chalk.yellow(
43 'Loopback address not detected in UI server configuration. This is not recommended'
44 )
45 )
46 }
47 if (
48 uiServerConfiguration.type === ApplicationProtocol.WS &&
49 uiServerConfiguration.version !== ApplicationProtocolVersion.VERSION_11
50 ) {
51 console.warn(
52 chalk.yellow(
53 `Only version ${ApplicationProtocolVersion.VERSION_11} is supported for WebSocket UI server. Falling back to version ${ApplicationProtocolVersion.VERSION_11}`
54 )
55 )
56 uiServerConfiguration.version = ApplicationProtocolVersion.VERSION_11
57 }
58 switch (uiServerConfiguration.type) {
59 case ApplicationProtocol.WS:
60 return new UIWebSocketServer(uiServerConfiguration)
61 case ApplicationProtocol.HTTP:
62 return new UIHttpServer(uiServerConfiguration)
63 }
64 }
65 }