X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Fui-server%2FAbstractUIServer.ts;h=e689441633b47e0c7a6b52cd4c90fb1de58221be;hb=022a231c76e227205b0124a7aef8e16ceb86a1d9;hp=dad1e0cb9353fae919b08cc18d6006bfd6c262da;hpb=623b39b56185797f9976508571ca38619518a975;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 dad1e0cb..e6894416 100644 --- a/src/charging-station/ui-server/AbstractUIServer.ts +++ b/src/charging-station/ui-server/AbstractUIServer.ts @@ -1,25 +1,26 @@ -import { type IncomingMessage, Server, type ServerResponse } from 'http'; +import { type IncomingMessage, Server, type ServerResponse } from 'node:http'; import type { WebSocket } from 'ws'; -import type { ChargingStationData } from '../../types/ChargingStationWorker'; -import type { UIServerConfiguration } from '../../types/ConfigurationData'; +import type { AbstractUIService } from './ui-services/AbstractUIService'; +import { UIServiceFactory } from './ui-services/UIServiceFactory'; +import { BaseError } from '../../exception'; import { AuthenticationType, - ProcedureName, - ProtocolRequest, - ProtocolResponse, + type ChargingStationData, + type ProcedureName, + type ProtocolRequest, + type ProtocolResponse, ProtocolVersion, - RequestPayload, - ResponsePayload, -} from '../../types/UIProtocol'; -import type AbstractUIService from './ui-services/AbstractUIService'; -import UIServiceFactory from './ui-services/UIServiceFactory'; + type RequestPayload, + type ResponsePayload, + type UIServerConfiguration, +} from '../../types'; export abstract class AbstractUIServer { public readonly chargingStations: Map; - protected httpServer: Server; - protected responseHandlers: Map; + protected readonly httpServer: Server; + protected readonly responseHandlers: Map; protected readonly uiServices: Map; public constructor(protected readonly uiServerConfiguration: UIServerConfiguration) { @@ -45,20 +46,46 @@ export abstract class AbstractUIServer { this.chargingStations.clear(); } + public async sendInternalRequest(request: ProtocolRequest): Promise { + const protocolVersion = ProtocolVersion['0.0.1']; + this.registerProtocolVersionUIService(protocolVersion); + return this.uiServices.get(protocolVersion)?.requestHandler(request); + } + + 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 registerProtocolVersionUIService(version: ProtocolVersion): void { if (this.uiServices.has(version) === false) { this.uiServices.set(version, UIServiceFactory.getUIServiceImplementation(version, this)); } } - protected isBasicAuthEnabled(): boolean { + protected authenticate(req: IncomingMessage, next: (err?: Error) => void): void { + if (this.isBasicAuthEnabled() === true) { + if (this.isValidBasicAuth(req) === false) { + next(new BaseError('Unauthorized')); + } + next(); + } + next(); + } + + private isBasicAuthEnabled(): boolean { return ( this.uiServerConfiguration.authentication?.enabled === true && this.uiServerConfiguration.authentication?.type === AuthenticationType.BASIC_AUTH ); } - protected isValidBasicAuth(req: IncomingMessage): boolean { + private isValidBasicAuth(req: IncomingMessage): boolean { const authorizationHeader = req.headers.authorization ?? ''; const authorizationToken = authorizationHeader.split(/\s+/).pop() ?? ''; const authentication = Buffer.from(authorizationToken, 'base64').toString(); @@ -71,16 +98,6 @@ export abstract class AbstractUIServer { ); } - protected authenticate(req: IncomingMessage, next: (err?: Error) => void): void { - if (this.isBasicAuthEnabled() === true) { - if (this.isValidBasicAuth(req) === false) { - next(new Error('Unauthorized')); - } - next(); - } - next(); - } - public abstract start(): void; public abstract sendRequest(request: ProtocolRequest): void; public abstract sendResponse(response: ProtocolResponse): void;