X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Fui-server%2FAbstractUIServer.ts;h=d27ea616bfe98591e9afbc8a3dff65c8f7a412df;hb=6a4032b5d8f3cbaa18d3beddcdfe9d335c1cba90;hp=840d558ce52e958a448488f6018d9896ba16da1c;hpb=17bc43d765c22c8d8c132484f8dc9c3edd370d91;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 840d558c..d27ea616 100644 --- a/src/charging-station/ui-server/AbstractUIServer.ts +++ b/src/charging-station/ui-server/AbstractUIServer.ts @@ -1,29 +1,44 @@ -import { type IncomingMessage, Server, type ServerResponse } from 'http'; +import { type IncomingMessage, Server, type ServerResponse } from 'node:http'; +import { type Http2Server, createServer } from 'node:http2'; import type { WebSocket } from 'ws'; +import type { AbstractUIService } from './ui-services/AbstractUIService'; +import { UIServiceFactory } from './ui-services/UIServiceFactory'; +import { BaseError } from '../../exception'; import { + ApplicationProtocolVersion, AuthenticationType, type ChargingStationData, type ProcedureName, type ProtocolRequest, type ProtocolResponse, - type ProtocolVersion, + ProtocolVersion, type RequestPayload, type ResponsePayload, type UIServerConfiguration, } from '../../types'; -import { type AbstractUIService, UIServiceFactory } from '../internal'; export abstract class AbstractUIServer { public readonly chargingStations: Map; - protected readonly httpServer: Server; + protected readonly httpServer: Server | Http2Server; protected readonly responseHandlers: Map; protected readonly uiServices: Map; public constructor(protected readonly uiServerConfiguration: UIServerConfiguration) { this.chargingStations = new Map(); - this.httpServer = new Server(); + switch (this.uiServerConfiguration.version) { + case ApplicationProtocolVersion.VERSION_11: + this.httpServer = new Server(); + break; + case ApplicationProtocolVersion.VERSION_20: + this.httpServer = createServer(); + break; + default: + throw new BaseError( + `Unsupported application protocol version ${this.uiServerConfiguration.version}`, + ); + } this.responseHandlers = new Map(); this.uiServices = new Map(); } @@ -31,7 +46,7 @@ export abstract class AbstractUIServer { public buildProtocolRequest( id: string, procedureName: ProcedureName, - requestPayload: RequestPayload + requestPayload: RequestPayload, ): ProtocolRequest { return [id, procedureName, requestPayload]; } @@ -41,9 +56,22 @@ export abstract class AbstractUIServer { } public stop(): void { + this.stopHttpServer(); 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) as Promise; + } + + public hasResponseHandler(id: string): boolean { + return this.responseHandlers.has(id); + } + protected startHttpServer(): void { if (this.httpServer.listening === false) { this.httpServer.listen(this.uiServerConfiguration.options); @@ -59,13 +87,19 @@ 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(new BaseError('Unauthorized')); } next(); } next(); } + private stopHttpServer(): void { + if (this.httpServer.listening === true) { + this.httpServer.close(); + } + } + private isBasicAuthEnabled(): boolean { return ( this.uiServerConfiguration.authentication?.enabled === true && @@ -92,6 +126,6 @@ export abstract class AbstractUIServer { public abstract logPrefix( moduleName?: string, methodName?: string, - prefixSuffix?: string + prefixSuffix?: string, ): string; }