Commit | Line | Data |
---|---|---|
66a7748d | 1 | import chalk from 'chalk' |
8114d10e | 2 | |
0749233f JB |
3 | import type { AbstractUIServer } from './AbstractUIServer.js' |
4 | ||
53a9f111 | 5 | import { BaseError } from '../../exception/index.js' |
a6080904 JB |
6 | import { |
7 | ApplicationProtocol, | |
8 | ApplicationProtocolVersion, | |
329eab0e | 9 | AuthenticationType, |
ae61fa2f | 10 | ConfigurationSection, |
d1f5bfd8 | 11 | type UIServerConfiguration, |
66a7748d | 12 | } from '../../types/index.js' |
ae61fa2f | 13 | import { logger, logPrefix } from '../../utils/index.js' |
4c3f6c20 JB |
14 | import { UIHttpServer } from './UIHttpServer.js' |
15 | import { isLoopback } from './UIServerUtils.js' | |
16 | import { UIWebSocketServer } from './UIWebSocketServer.js' | |
fe94fce0 | 17 | |
66a7748d | 18 | // eslint-disable-next-line @typescript-eslint/no-extraneous-class |
268a74bb | 19 | export 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 | } |