]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/commitdiff
refactor(common): portable btoa, eliminate UIClient duplication, fix Docker deps
authorJérôme Benoit <jerome.benoit@sap.com>
Thu, 16 Apr 2026 00:59:20 +0000 (02:59 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Thu, 16 Apr 2026 00:59:20 +0000 (02:59 +0200)
ui/common/src/client/WebSocketClient.ts
ui/web/docker/Dockerfile
ui/web/src/composables/UIClient.ts

index 18b5dcd344ad4b680fe9038932ddde8eb0360e46..273d568b3f06cd8aaf7a10265cba45b0a69909c4 100644 (file)
@@ -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
index 054ec3d4d8af39ffabdbd129240786cbffdd8be0..07b9db9062040d1af18aea5d8009e9a4762d09e6 100644 (file)
@@ -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 \
index 60e1d83ab7c0d738b36aa0b4b7f1c3ae45aaedfd..f0d5093b3cc3b3c2fe65ef908a4fe5ceeab28641 100644 (file)
@@ -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<typeof createBrowserWsAdapter>[0]
+        new WebSocket(url, protocols) as unknown as Parameters<typeof createBrowserWsAdapter>[0]
       )
 
       return {