From: Jérôme Benoit Date: Thu, 16 Apr 2026 00:59:20 +0000 (+0200) Subject: refactor(common): portable btoa, eliminate UIClient duplication, fix Docker deps X-Git-Tag: v4.5~73 X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=d63dd0933f9c3a96ca2ba613e904980dbca3f8bd;p=e-mobility-charging-stations-simulator.git refactor(common): portable btoa, eliminate UIClient duplication, fix Docker deps --- diff --git a/ui/common/src/client/WebSocketClient.ts b/ui/common/src/client/WebSocketClient.ts index 18b5dcd3..273d568b 100644 --- a/ui/common/src/client/WebSocketClient.ts +++ b/ui/common/src/client/WebSocketClient.ts @@ -1,5 +1,3 @@ -import { Buffer } from 'node:buffer' - import type { ProcedureName, RequestPayload, ResponsePayload } from '../types/UIProtocol.js' import type { UUIDv4 } from '../types/UUID.js' import type { ClientConfig, ResponseHandler, WebSocketFactory, WebSocketLike } from './types.js' @@ -135,9 +133,7 @@ export class WebSocketClient { auth.username != null && auth.password != null ) { - const encoded = Buffer.from(`${auth.username}:${auth.password}`) - .toString('base64') - .replace(/={1,2}$/, '') + const encoded = btoa(`${auth.username}:${auth.password}`).replace(/={1,2}$/, '') return [primary, `authorization.basic.${encoded}`] } return primary diff --git a/ui/web/docker/Dockerfile b/ui/web/docker/Dockerfile index 054ec3d4..07b9db90 100644 --- a/ui/web/docker/Dockerfile +++ b/ui/web/docker/Dockerfile @@ -16,7 +16,10 @@ RUN set -ex \ FROM node:lts-alpine WORKDIR /usr/app -COPY --from=builder /usr/builder/ui/web ./ +COPY --from=builder /usr/builder/ui/web/dist ./dist +COPY --from=builder /usr/builder/ui/web/start.js ./ +COPY --from=builder /usr/builder/ui/web/package.json ./ +COPY --from=builder /usr/builder/node_modules ./node_modules COPY ui/web/docker/run.sh /run.sh COPY ui/web/docker/autoconfig.sh /autoconfig.sh RUN set -ex \ diff --git a/ui/web/src/composables/UIClient.ts b/ui/web/src/composables/UIClient.ts index 60e1d83a..f0d5093b 100644 --- a/ui/web/src/composables/UIClient.ts +++ b/ui/web/src/composables/UIClient.ts @@ -1,5 +1,4 @@ import { - AuthenticationType, createBrowserWsAdapter, ProcedureName, type RequestPayload, @@ -20,7 +19,6 @@ import { type OCPP20TransactionEventRequest, OCPPVersion, } from '@/types/ChargingStationType' -import { ApplicationProtocol } from '@/types/UIProtocol' export class UIClient { private static instance: null | UIClient = null @@ -258,28 +256,11 @@ export class UIClient { private createClientWithAbort (): { abort: () => void; client: WebSocketClient } { let aborted = false const config = this.uiServerConfiguration - const uiUrl = `${config.secure === true ? ApplicationProtocol.WSS : ApplicationProtocol.WS}://${config.host}:${config.port.toString()}` - const uiProtocols = - config.authentication?.enabled === true && - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - config.authentication.type === AuthenticationType.PROTOCOL_BASIC_AUTH - ? [ - `${config.protocol}${config.version}`, - `authorization.basic.${btoa( - // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - `${config.authentication.username}:${config.authentication.password}` - ).replace(/={1,2}$/, '')}`, - ] - : `${config.protocol}${config.version}` - const eventTarget = this.wsEventTarget - // Factory builds its own URL/protocols because WebSocketClient.buildProtocols() - // uses Node.js Buffer for base64 encoding, which isn't available in the browser. - // Browser uses btoa() instead. Both produce identical output. - const factory: WebSocketFactory = (_url, _protocols) => { + const factory: WebSocketFactory = (url, protocols) => { const adapter = createBrowserWsAdapter( - new WebSocket(uiUrl, uiProtocols) as unknown as Parameters[0] + new WebSocket(url, protocols) as unknown as Parameters[0] ) return {