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