X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Fui-server%2FUIHttpServer.ts;h=ee12b3f4de996ed3a8f86b2a4db97949e9ebaf4e;hb=4a3807d16c54137840a60af41877f3b21de12950;hp=223c5bbbff1664dc111b0e62508436c726168673;hpb=ed3d28080b6597ba2f728d625e34ce05aea49d06;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ui-server/UIHttpServer.ts b/src/charging-station/ui-server/UIHttpServer.ts index 223c5bbb..ee12b3f4 100644 --- a/src/charging-station/ui-server/UIHttpServer.ts +++ b/src/charging-station/ui-server/UIHttpServer.ts @@ -1,26 +1,39 @@ -import type { IncomingMessage, RequestListener, ServerResponse } from 'http'; +import type { IncomingMessage, RequestListener, ServerResponse } from 'node:http'; import { StatusCodes } from 'http-status-codes'; -import BaseError from '../../exception/BaseError'; -import type { UIServerConfiguration } from '../../types/ConfigurationData'; -import { - ProcedureName, - Protocol, - ProtocolRequest, - ProtocolResponse, - ProtocolVersion, - RequestPayload, - ResponseStatus, -} from '../../types/UIProtocol'; -import logger from '../../utils/Logger'; -import Utils from '../../utils/Utils'; import { AbstractUIServer } from './AbstractUIServer'; import { UIServerUtils } from './UIServerUtils'; +import { BaseError } from '../../exception'; +import { + type ProcedureName, + type Protocol, + type ProtocolRequest, + type ProtocolResponse, + type ProtocolVersion, + type RequestPayload, + ResponseStatus, + type UIServerConfiguration, +} from '../../types'; +import { + Constants, + generateUUID, + isNotEmptyString, + isNullOrUndefined, + logPrefix, + logger, +} from '../../utils'; const moduleName = 'UIHttpServer'; -export default class UIHttpServer extends AbstractUIServer { +enum HttpMethods { + GET = 'GET', + PUT = 'PUT', + POST = 'POST', + PATCH = 'PATCH', +} + +export class UIHttpServer extends AbstractUIServer { public constructor(protected readonly uiServerConfiguration: UIServerConfiguration) { super(uiServerConfiguration); } @@ -38,7 +51,7 @@ export default class UIHttpServer extends AbstractUIServer { public sendResponse(response: ProtocolResponse): void { const [uuid, payload] = response; try { - if (this.responseHandlers.has(uuid) === true) { + if (this.hasResponseHandler(uuid) === true) { const res = this.responseHandlers.get(uuid) as ServerResponse; res .writeHead(this.responseStatusToStatusCode(payload.status), { @@ -47,25 +60,27 @@ export default class UIHttpServer extends AbstractUIServer { .end(JSON.stringify(payload)); } else { logger.error( - `${this.logPrefix(moduleName, 'sendResponse')} Response for unknown request id: ${uuid}` + `${this.logPrefix(moduleName, 'sendResponse')} Response for unknown request id: ${uuid}`, ); } } catch (error) { logger.error( `${this.logPrefix(moduleName, 'sendResponse')} Error at sending response id '${uuid}':`, - error + error, ); } finally { this.responseHandlers.delete(uuid); } } - public logPrefix(modName?: string, methodName?: string, prefixSuffix?: string): string { + public logPrefix = (modName?: string, methodName?: string, prefixSuffix?: string): string => { const logMsgPrefix = prefixSuffix ? `UI HTTP Server ${prefixSuffix}` : 'UI HTTP Server'; const logMsg = - modName && methodName ? ` ${logMsgPrefix} | ${modName}.${methodName}:` : ` ${logMsgPrefix} |`; - return Utils.logPrefix(logMsg); - } + isNotEmptyString(modName) && isNotEmptyString(methodName) + ? ` ${logMsgPrefix} | ${modName}.${methodName}:` + : ` ${logMsgPrefix} |`; + return logPrefix(logMsg); + }; private requestListener(req: IncomingMessage, res: ServerResponse): void { this.authenticate(req, (err) => { @@ -84,9 +99,9 @@ export default class UIHttpServer extends AbstractUIServer { const [protocol, version, procedureName] = req.url?.split('/').slice(1) as [ Protocol, ProtocolVersion, - ProcedureName + ProcedureName, ]; - const uuid = Utils.generateUUID(); + const uuid = generateUUID(); this.responseHandlers.set(uuid, res); try { const fullProtocol = `${protocol}${version}`; @@ -97,23 +112,32 @@ export default class UIHttpServer extends AbstractUIServer { req.on('error', (error) => { logger.error( `${this.logPrefix(moduleName, 'requestListener.req.onerror')} Error on HTTP request:`, - error + error, ); }); - if (req.method === 'POST') { - const bodyBuffer = []; + if (req.method === HttpMethods.POST) { + const bodyBuffer: Uint8Array[] = []; req - .on('data', (chunk) => { + .on('data', (chunk: Uint8Array) => { bodyBuffer.push(chunk); }) .on('end', () => { const body = JSON.parse(Buffer.concat(bodyBuffer).toString()) as RequestPayload; this.uiServices .get(version) - .requestHandler(this.buildProtocolRequest(uuid, procedureName, body ?? {})) - .catch(() => { - /* Error caught by AbstractUIService */ - }); + ?.requestHandler( + this.buildProtocolRequest( + uuid, + procedureName, + body ?? Constants.EMPTY_FREEZED_OBJECT, + ), + ) + .then((protocolResponse?: ProtocolResponse) => { + if (!isNullOrUndefined(protocolResponse)) { + this.sendResponse(protocolResponse!); + } + }) + .catch(Constants.EMPTY_FUNCTION); }); } else { throw new BaseError(`Unsupported HTTP method: '${req.method}'`); @@ -121,7 +145,7 @@ export default class UIHttpServer extends AbstractUIServer { } catch (error) { logger.error( `${this.logPrefix(moduleName, 'requestListener')} Handle HTTP request error:`, - error + error, ); this.sendResponse(this.buildProtocolResponse(uuid, { status: ResponseStatus.FAILURE })); }