X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=ui%2Fweb%2Fsrc%2Fcomposables%2FUIClient.ts;h=04587e2d8a98d7688eb8016a0833e01edc5b93a4;hb=HEAD;hp=64f2bc69d4e5efd2549d51d471c6f1dafa039058;hpb=84ec8d3464903cfa8259ff622bff2b19b5c47132;p=e-mobility-charging-stations-simulator.git diff --git a/ui/web/src/composables/UIClient.ts b/ui/web/src/composables/UIClient.ts index 64f2bc69..04587e2d 100644 --- a/ui/web/src/composables/UIClient.ts +++ b/ui/web/src/composables/UIClient.ts @@ -12,7 +12,7 @@ import { type UIServerConfigurationSection } from '@/types' -import { randomUUID } from './Utils' +import { randomUUID, validateUUID } from './Utils' type ResponseHandler = { procedureName: ProcedureName @@ -24,11 +24,17 @@ export class UIClient { private static instance: UIClient | null = null private ws?: WebSocket - private responseHandlers: Map + private responseHandlers: Map< + `${string}-${string}-${string}-${string}-${string}`, + ResponseHandler + > private constructor(private uiServerConfiguration: UIServerConfigurationSection) { this.openWS() - this.responseHandlers = new Map() + this.responseHandlers = new Map< + `${string}-${string}-${string}-${string}-${string}`, + ResponseHandler + >() } public static getInstance(uiServerConfiguration?: UIServerConfigurationSection): UIClient { @@ -99,7 +105,9 @@ export class UIClient { } public async deleteChargingStation(hashId: string): Promise { - return this.sendRequest(ProcedureName.DELETE_CHARGING_STATIONS, { hashIds: [hashId] }) + return this.sendRequest(ProcedureName.DELETE_CHARGING_STATIONS, { + hashIds: [hashId] + }) } public async setSupervisionUrl(hashId: string, supervisionUrl: string): Promise { @@ -110,11 +118,15 @@ export class UIClient { } public async startChargingStation(hashId: string): Promise { - return this.sendRequest(ProcedureName.START_CHARGING_STATION, { hashIds: [hashId] }) + return this.sendRequest(ProcedureName.START_CHARGING_STATION, { + hashIds: [hashId] + }) } public async stopChargingStation(hashId: string): Promise { - return this.sendRequest(ProcedureName.STOP_CHARGING_STATION, { hashIds: [hashId] }) + return this.sendRequest(ProcedureName.STOP_CHARGING_STATION, { + hashIds: [hashId] + }) } public async openConnection(hashId: string): Promise { @@ -177,11 +189,17 @@ export class UIClient { this.uiServerConfiguration.authentication?.type === AuthenticationType.PROTOCOL_BASIC_AUTH ? [ `${this.uiServerConfiguration.protocol}${this.uiServerConfiguration.version}`, - `authorization.basic.${btoa(`${this.uiServerConfiguration.authentication.username}:${this.uiServerConfiguration.authentication.password}`).replace(/={1,2}$/, '')}` + `authorization.basic.${btoa( + `${this.uiServerConfiguration.authentication.username}:${this.uiServerConfiguration.authentication.password}` + ).replace(/={1,2}$/, '')}` ] : `${this.uiServerConfiguration.protocol}${this.uiServerConfiguration.version}` this.ws = new WebSocket( - `${this.uiServerConfiguration.secure === true ? ApplicationProtocol.WSS : ApplicationProtocol.WS}://${this.uiServerConfiguration.host}:${this.uiServerConfiguration.port}`, + `${ + this.uiServerConfiguration.secure === true + ? ApplicationProtocol.WSS + : ApplicationProtocol.WS + }://${this.uiServerConfiguration.host}:${this.uiServerConfiguration.port}`, protocols ) this.ws.onopen = () => { @@ -230,15 +248,30 @@ export class UIClient { } private responseHandler(messageEvent: MessageEvent): void { - const response = JSON.parse(messageEvent.data) as ProtocolResponse + let response: ProtocolResponse + try { + response = JSON.parse(messageEvent.data) + } catch (error) { + useToast().error('Invalid response JSON format') + console.error('Invalid response JSON format', error) + return + } - if (Array.isArray(response) === false) { - throw new Error(`Response not an array: ${JSON.stringify(response, undefined, 2)}`) + if (!Array.isArray(response)) { + useToast().error('Response not an array') + console.error('Response not an array:', response) + return } const [uuid, responsePayload] = response - if (this.responseHandlers.has(uuid) === true) { + if (!validateUUID(uuid)) { + useToast().error('Response UUID field is invalid') + console.error('Response UUID field is invalid:', response) + return + } + + if (this.responseHandlers.has(uuid)) { const { procedureName, resolve, reject } = this.responseHandlers.get(uuid)! switch (responsePayload.status) { case ResponseStatus.SUCCESS: