1 import chalk from
'chalk'
3 import { BaseError
} from
'../../exception/index.js'
6 ApplicationProtocolVersion
,
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'
17 // eslint-disable-next-line @typescript-eslint/no-extraneous-class
18 export class UIServerFactory
{
19 private constructor () {
20 // This is intentional
23 public static getUIServerImplementation (
24 uiServerConfiguration
: UIServerConfiguration
27 uiServerConfiguration
.authentication
?.enabled
=== true &&
28 !Object.values(AuthenticationType
).includes(uiServerConfiguration
.authentication
.type)
31 `Unknown authentication type '${uiServerConfiguration.authentication.type}' in '${ConfigurationSection.uiServer}' configuration section`
35 uiServerConfiguration
.type === ApplicationProtocol
.HTTP
&&
36 uiServerConfiguration
.authentication
?.enabled
=== true &&
37 uiServerConfiguration
.authentication
.type === AuthenticationType
.PROTOCOL_BASIC_AUTH
40 `'${uiServerConfiguration.authentication.type}' authentication type with application protocol type '${uiServerConfiguration.type}' is not supported in '${ConfigurationSection.uiServer}' configuration section`
44 uiServerConfiguration
.authentication
?.enabled
!== true &&
45 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
46 !isLoopback(uiServerConfiguration
.options
!.host
!)
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
))
53 uiServerConfiguration
.type === ApplicationProtocol
.WS
&&
54 uiServerConfiguration
.version
!== ApplicationProtocolVersion
.VERSION_11
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
61 switch (uiServerConfiguration
.type) {
62 case ApplicationProtocol
.HTTP
:
63 return new UIHttpServer(uiServerConfiguration
)
64 case ApplicationProtocol
.WS
:
67 !Object.values(ApplicationProtocol
).includes(
68 uiServerConfiguration
.type as ApplicationProtocol
71 const logMsg
= `Unknown application protocol type '${uiServerConfiguration.type}' in '${
72 ConfigurationSection.uiServer
73 // eslint-disable-next-line @typescript-eslint/no-base-to-string
74 }' configuration section from values '${ApplicationProtocol.toString()}', defaulting to '${
75 ApplicationProtocol.WS
77 logger
.warn(`${UIServerFactory.logPrefix()} ${logMsg}`)
80 return new UIWebSocketServer(uiServerConfiguration
)
84 private static readonly logPrefix
= (modName
?: string, methodName
?: string): string => {
85 const logMsgPrefix
= 'UI Server'
87 modName
!= null && methodName
!= null
88 ? ` ${logMsgPrefix} | ${modName}.${methodName}:`
89 : ` ${logMsgPrefix} |`
90 return logPrefix(logMsg
)