-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'
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
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 \
import {
- AuthenticationType,
createBrowserWsAdapter,
ProcedureName,
type RequestPayload,
type OCPP20TransactionEventRequest,
OCPPVersion,
} from '@/types/ChargingStationType'
-import { ApplicationProtocol } from '@/types/UIProtocol'
export class UIClient {
private static instance: null | UIClient = null
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 {