X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Fui-server%2FUIServerFactory.ts;h=34138e02b0204636b79d5ab884fe9f6328514d8f;hb=8fa6f565c86b72f3d6f040d283da83740a51542e;hp=cdcd251a5d45e8c5c8bd7175ab7519f4b83c5a6e;hpb=fe94fce08a020e0c35e354c2282ec0587a605f4e;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ui-server/UIServerFactory.ts b/src/charging-station/ui-server/UIServerFactory.ts index cdcd251a..34138e02 100644 --- a/src/charging-station/ui-server/UIServerFactory.ts +++ b/src/charging-station/ui-server/UIServerFactory.ts @@ -1,24 +1,90 @@ -import { AbstractUIServer } from './AbstractUIServer'; -import { ApplicationProtocol } from '../../types/UIProtocol'; -import Configuration from '../../utils/Configuration'; -import { ServerOptions } from '../../types/ConfigurationData'; -import UIWebSocketServer from './UIWebSocketServer'; +import chalk from 'chalk' -export default class UIServerFactory { - private constructor() { +import { BaseError } from '../../exception/index.js' +import { + ApplicationProtocol, + ApplicationProtocolVersion, + AuthenticationType, + ConfigurationSection, + type UIServerConfiguration +} from '../../types/index.js' +import { logger, logPrefix } from '../../utils/index.js' +import type { AbstractUIServer } from './AbstractUIServer.js' +import { UIHttpServer } from './UIHttpServer.js' +import { isLoopback } from './UIServerUtils.js' +import { UIWebSocketServer } from './UIWebSocketServer.js' + +// eslint-disable-next-line @typescript-eslint/no-extraneous-class +export class UIServerFactory { + private constructor () { // This is intentional } - public static getUIServerImplementation( - applicationProtocol: ApplicationProtocol, - options?: ServerOptions, - callback?: () => void - ): AbstractUIServer | null { - switch (applicationProtocol) { + public static getUIServerImplementation ( + uiServerConfiguration: UIServerConfiguration + ): AbstractUIServer { + if ( + uiServerConfiguration.authentication?.enabled === true && + !Object.values(AuthenticationType).includes(uiServerConfiguration.authentication.type) + ) { + throw new BaseError( + `Unknown authentication type '${uiServerConfiguration.authentication.type}' in '${ConfigurationSection.uiServer}' configuration section` + ) + } + if ( + uiServerConfiguration.type === ApplicationProtocol.HTTP && + uiServerConfiguration.authentication?.enabled === true && + uiServerConfiguration.authentication.type === AuthenticationType.PROTOCOL_BASIC_AUTH + ) { + throw new BaseError( + `'${uiServerConfiguration.authentication.type}' authentication type with application protocol type '${uiServerConfiguration.type}' is not supported in '${ConfigurationSection.uiServer}' configuration section` + ) + } + if ( + uiServerConfiguration.authentication?.enabled !== true && + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + !isLoopback(uiServerConfiguration.options!.host!) + ) { + const logMsg = `Non loopback address in '${ConfigurationSection.uiServer}' configuration section without authentication enabled. This is not recommended` + logger.warn(`${UIServerFactory.logPrefix()} ${logMsg}`) + console.warn(chalk.yellow(logMsg)) + } + if ( + uiServerConfiguration.type === ApplicationProtocol.WS && + uiServerConfiguration.version !== ApplicationProtocolVersion.VERSION_11 + ) { + 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}` + logger.warn(`${UIServerFactory.logPrefix()} ${logMsg}`) + console.warn(chalk.yellow(logMsg)) + uiServerConfiguration.version = ApplicationProtocolVersion.VERSION_11 + } + switch (uiServerConfiguration.type) { + case ApplicationProtocol.HTTP: + return new UIHttpServer(uiServerConfiguration) case ApplicationProtocol.WS: - return new UIWebSocketServer(options ?? Configuration.getUIServer().options, callback); default: - return null; + if ( + !Object.values(ApplicationProtocol).includes( + uiServerConfiguration.type as ApplicationProtocol + ) + ) { + // eslint-disable-next-line @typescript-eslint/no-base-to-string + const logMsg = `Unknown application protocol type '${uiServerConfiguration.type}' in '${ConfigurationSection.uiServer}' configuration section from values '${ApplicationProtocol.toString()}', defaulting to '${ + ApplicationProtocol.WS + }'` + logger.warn(`${UIServerFactory.logPrefix()} ${logMsg}`) + console.warn(logMsg) + } + return new UIWebSocketServer(uiServerConfiguration) } } + + private static readonly logPrefix = (modName?: string, methodName?: string): string => { + const logMsgPrefix = 'UI Server' + const logMsg = + modName != null && methodName != null + ? ` ${logMsgPrefix} | ${modName}.${methodName}:` + : ` ${logMsgPrefix} |` + return logPrefix(logMsg) + } }