X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Fui-server%2FAbstractUIServer.ts;h=99dbc657e2708cbf92b9b4aa80244c2de4d7a769;hb=55ae7b758f478a2beb4557bbc96363fb913dcc73;hp=c6cc741b041b63d6a250f21ebcd7b58a9bfca0e6;hpb=a6ef1ece74c0d08e86a905571f4f6045c28131cb;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ui-server/AbstractUIServer.ts b/src/charging-station/ui-server/AbstractUIServer.ts index c6cc741b..99dbc657 100644 --- a/src/charging-station/ui-server/AbstractUIServer.ts +++ b/src/charging-station/ui-server/AbstractUIServer.ts @@ -1,11 +1,11 @@ -import { type IncomingMessage, Server, type ServerResponse } from 'node:http'; -import { type Http2Server, createServer } from 'node:http2'; +import { type IncomingMessage, Server, type ServerResponse } from 'node:http' +import { type Http2Server, createServer } from 'node:http2' -import type { WebSocket } from 'ws'; +import type { WebSocket } from 'ws' -import type { AbstractUIService } from './ui-services/AbstractUIService.js'; -import { UIServiceFactory } from './ui-services/UIServiceFactory.js'; -import { BaseError } from '../../exception/index.js'; +import type { AbstractUIService } from './ui-services/AbstractUIService.js' +import { UIServiceFactory } from './ui-services/UIServiceFactory.js' +import { BaseError } from '../../exception/index.js' import { ApplicationProtocolVersion, AuthenticationType, @@ -16,116 +16,116 @@ import { ProtocolVersion, type RequestPayload, type ResponsePayload, - type UIServerConfiguration, -} from '../../types/index.js'; + type UIServerConfiguration +} from '../../types/index.js' export abstract class AbstractUIServer { - public readonly chargingStations: Map; - protected readonly httpServer: Server | Http2Server; - protected readonly responseHandlers: Map; - protected readonly uiServices: Map; - - public constructor(protected readonly uiServerConfiguration: UIServerConfiguration) { - this.chargingStations = new Map(); + public readonly chargingStations: Map + public readonly chargingStationTemplates: Set + protected readonly httpServer: Server | Http2Server + protected readonly responseHandlers: Map + protected readonly uiServices: Map + + public constructor (protected readonly uiServerConfiguration: UIServerConfiguration) { + this.chargingStations = new Map() + this.chargingStationTemplates = new Set() switch (this.uiServerConfiguration.version) { case ApplicationProtocolVersion.VERSION_11: - this.httpServer = new Server(); - break; + this.httpServer = new Server() + break case ApplicationProtocolVersion.VERSION_20: - this.httpServer = createServer(); - break; + this.httpServer = createServer() + break default: throw new BaseError( - `Unsupported application protocol version ${this.uiServerConfiguration.version}`, - ); + `Unsupported application protocol version ${this.uiServerConfiguration.version}` + ) } - this.responseHandlers = new Map(); - this.uiServices = new Map(); + this.responseHandlers = new Map() + this.uiServices = new Map() } - public buildProtocolRequest( + public buildProtocolRequest ( id: string, procedureName: ProcedureName, - requestPayload: RequestPayload, + requestPayload: RequestPayload ): ProtocolRequest { - return [id, procedureName, requestPayload]; + return [id, procedureName, requestPayload] } - public buildProtocolResponse(id: string, responsePayload: ResponsePayload): ProtocolResponse { - return [id, responsePayload]; + public buildProtocolResponse (id: string, responsePayload: ResponsePayload): ProtocolResponse { + return [id, responsePayload] } - public stop(): void { - this.stopHttpServer(); - this.chargingStations.clear(); + public stop (): void { + this.stopHttpServer() + this.chargingStations.clear() + this.chargingStationTemplates.clear() } - public async sendInternalRequest(request: ProtocolRequest): Promise { - const protocolVersion = ProtocolVersion['0.0.1']; - this.registerProtocolVersionUIService(protocolVersion); - return this.uiServices + public async sendInternalRequest (request: ProtocolRequest): Promise { + const protocolVersion = ProtocolVersion['0.0.1'] + this.registerProtocolVersionUIService(protocolVersion) + return await (this.uiServices .get(protocolVersion) - ?.requestHandler(request) as Promise; + ?.requestHandler(request) as Promise) } - public hasResponseHandler(id: string): boolean { - return this.responseHandlers.has(id); + public hasResponseHandler (id: string): boolean { + return this.responseHandlers.has(id) } - protected startHttpServer(): void { - if (this.httpServer.listening === false) { - this.httpServer.listen(this.uiServerConfiguration.options); + protected startHttpServer (): void { + if (!this.httpServer.listening) { + this.httpServer.listen(this.uiServerConfiguration.options) } } - protected registerProtocolVersionUIService(version: ProtocolVersion): void { - if (this.uiServices.has(version) === false) { - this.uiServices.set(version, UIServiceFactory.getUIServiceImplementation(version, this)); + protected registerProtocolVersionUIService (version: ProtocolVersion): void { + if (!this.uiServices.has(version)) { + this.uiServices.set(version, UIServiceFactory.getUIServiceImplementation(version, this)) } } - protected authenticate(req: IncomingMessage, next: (err?: Error) => void): void { - if (this.isBasicAuthEnabled() === true) { - if (this.isValidBasicAuth(req) === false) { - next(new BaseError('Unauthorized')); + protected authenticate (req: IncomingMessage, next: (err?: Error) => void): void { + if (this.isBasicAuthEnabled()) { + if (!this.isValidBasicAuth(req)) { + next(new BaseError('Unauthorized')) } - next(); + next() } - next(); + next() } - private stopHttpServer(): void { - if (this.httpServer.listening === true) { - this.httpServer.close(); + private stopHttpServer (): void { + if (this.httpServer.listening) { + this.httpServer.close() } } - private isBasicAuthEnabled(): boolean { + private isBasicAuthEnabled (): boolean { return ( this.uiServerConfiguration.authentication?.enabled === true && - this.uiServerConfiguration.authentication?.type === AuthenticationType.BASIC_AUTH - ); + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + this.uiServerConfiguration.authentication.type === AuthenticationType.BASIC_AUTH + ) } - private isValidBasicAuth(req: IncomingMessage): boolean { - const authorizationHeader = req.headers.authorization ?? ''; - const authorizationToken = authorizationHeader.split(/\s+/).pop() ?? ''; - const authentication = Buffer.from(authorizationToken, 'base64').toString(); - const authenticationParts = authentication.split(/:/); - const username = authenticationParts.shift(); - const password = authenticationParts.join(':'); + private isValidBasicAuth (req: IncomingMessage): boolean { + const authorizationHeader = req.headers.authorization ?? '' + const authorizationToken = authorizationHeader.split(/\s+/).pop() ?? '' + const authentication = Buffer.from(authorizationToken, 'base64').toString() + const authenticationParts = authentication.split(/:/) + const username = authenticationParts.shift() + const password = authenticationParts.join(':') return ( this.uiServerConfiguration.authentication?.username === username && this.uiServerConfiguration.authentication?.password === password - ); + ) } - public abstract start(): void; - public abstract sendRequest(request: ProtocolRequest): void; - public abstract sendResponse(response: ProtocolResponse): void; - public abstract logPrefix( - moduleName?: string, - methodName?: string, - prefixSuffix?: string, - ): string; + public abstract start (): void + public abstract sendRequest (request: ProtocolRequest): void + public abstract sendResponse (response: ProtocolResponse): void + public abstract logPrefix (moduleName?: string, methodName?: string, prefixSuffix?: string): string }