chore(deps-dev): apply updates
[e-mobility-charging-stations-simulator.git] / src / charging-station / ui-server / UIServerFactory.ts
CommitLineData
66a7748d 1import chalk from 'chalk'
8114d10e 2
0749233f
JB
3import type { AbstractUIServer } from './AbstractUIServer.js'
4
53a9f111 5import { BaseError } from '../../exception/index.js'
a6080904
JB
6import {
7 ApplicationProtocol,
8 ApplicationProtocolVersion,
329eab0e 9 AuthenticationType,
ae61fa2f 10 ConfigurationSection,
d1f5bfd8 11 type UIServerConfiguration,
66a7748d 12} from '../../types/index.js'
ae61fa2f 13import { logger, logPrefix } from '../../utils/index.js'
4c3f6c20
JB
14import { UIHttpServer } from './UIHttpServer.js'
15import { isLoopback } from './UIServerUtils.js'
16import { UIWebSocketServer } from './UIWebSocketServer.js'
fe94fce0 17
66a7748d 18// eslint-disable-next-line @typescript-eslint/no-extraneous-class
268a74bb 19export class UIServerFactory {
0749233f
JB
20 private static readonly logPrefix = (modName?: string, methodName?: string): string => {
21 const logMsgPrefix = 'UI Server'
22 const logMsg =
23 modName != null && methodName != null
24 ? ` ${logMsgPrefix} | ${modName}.${methodName}:`
25 : ` ${logMsgPrefix} |`
26 return logPrefix(logMsg)
27 }
28
66a7748d 29 private constructor () {
fe94fce0
JB
30 // This is intentional
31 }
32
66a7748d
JB
33 public static getUIServerImplementation (
34 uiServerConfiguration: UIServerConfiguration
a1cfaa16 35 ): AbstractUIServer {
329eab0e
JB
36 if (
37 uiServerConfiguration.authentication?.enabled === true &&
38 !Object.values(AuthenticationType).includes(uiServerConfiguration.authentication.type)
39 ) {
40 throw new BaseError(
ae61fa2f 41 `Unknown authentication type '${uiServerConfiguration.authentication.type}' in '${ConfigurationSection.uiServer}' configuration section`
329eab0e
JB
42 )
43 }
44 if (
45 uiServerConfiguration.type === ApplicationProtocol.HTTP &&
46 uiServerConfiguration.authentication?.enabled === true &&
47 uiServerConfiguration.authentication.type === AuthenticationType.PROTOCOL_BASIC_AUTH
48 ) {
ae61fa2f
JB
49 throw new BaseError(
50 `'${uiServerConfiguration.authentication.type}' authentication type with application protocol type '${uiServerConfiguration.type}' is not supported in '${ConfigurationSection.uiServer}' configuration section`
51 )
329eab0e 52 }
b35a06e0
JB
53 if (
54 uiServerConfiguration.authentication?.enabled !== true &&
55 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
75adc3d8 56 !isLoopback(uiServerConfiguration.options!.host!)
b35a06e0 57 ) {
ae61fa2f
JB
58 const logMsg = `Non loopback address in '${ConfigurationSection.uiServer}' configuration section without authentication enabled. This is not recommended`
59 logger.warn(`${UIServerFactory.logPrefix()} ${logMsg}`)
60 console.warn(chalk.yellow(logMsg))
d5bd1c00 61 }
7aba23e1
JB
62 if (
63 uiServerConfiguration.type === ApplicationProtocol.WS &&
64 uiServerConfiguration.version !== ApplicationProtocolVersion.VERSION_11
65 ) {
81c74884 66 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}`
ae61fa2f
JB
67 logger.warn(`${UIServerFactory.logPrefix()} ${logMsg}`)
68 console.warn(chalk.yellow(logMsg))
66a7748d 69 uiServerConfiguration.version = ApplicationProtocolVersion.VERSION_11
7aba23e1 70 }
864e5f8d 71 switch (uiServerConfiguration.type) {
1f7fa4de 72 case ApplicationProtocol.HTTP:
66a7748d 73 return new UIHttpServer(uiServerConfiguration)
a1cfaa16
JB
74 case ApplicationProtocol.WS:
75 default:
ae61fa2f
JB
76 if (
77 !Object.values(ApplicationProtocol).includes(
78 uiServerConfiguration.type as ApplicationProtocol
79 )
80 ) {
d1f5bfd8 81 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
48847bc0
JB
82 const logMsg = `Unknown application protocol type '${uiServerConfiguration.type}' in '${
83 ConfigurationSection.uiServer
d712a9a3 84 // eslint-disable-next-line @typescript-eslint/no-base-to-string
48847bc0 85 }' configuration section from values '${ApplicationProtocol.toString()}', defaulting to '${
ae61fa2f 86 ApplicationProtocol.WS
81c74884 87 }'`
ae61fa2f
JB
88 logger.warn(`${UIServerFactory.logPrefix()} ${logMsg}`)
89 console.warn(logMsg)
90 }
a1cfaa16 91 return new UIWebSocketServer(uiServerConfiguration)
fe94fce0
JB
92 }
93 }
94}