refactor: cleanup import path
[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/index.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 if (
40 uiServerConfiguration.authentication?.enabled !== true &&
41 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
42 !UIServerUtils.isLoopback(uiServerConfiguration.options!.host!)
43 ) {
44 console.warn(
45 chalk.yellow(
46 'Non loopback address in UI server configuration without authentication enabled. This is not recommended'
47 )
48 )
49 }
50 if (
51 uiServerConfiguration.type === ApplicationProtocol.WS &&
52 uiServerConfiguration.version !== ApplicationProtocolVersion.VERSION_11
53 ) {
54 console.warn(
55 chalk.yellow(
56 `Only version ${ApplicationProtocolVersion.VERSION_11} is supported for WebSocket UI server. Falling back to version ${ApplicationProtocolVersion.VERSION_11}`
57 )
58 )
59 uiServerConfiguration.version = ApplicationProtocolVersion.VERSION_11
60 }
61 switch (uiServerConfiguration.type) {
62 case ApplicationProtocol.WS:
63 return new UIWebSocketServer(uiServerConfiguration)
64 case ApplicationProtocol.HTTP:
65 return new UIHttpServer(uiServerConfiguration)
66 }
67 }
68 }