From c8d9ecb59e3d3188a665080ea413249f2d1665a5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Mon, 30 Mar 2026 22:33:31 +0200 Subject: [PATCH] refactor(ocpp): remove static alias forwarding from OCPPServiceUtils class Replace OCPPServiceUtils static property aliases with direct function imports. All 7 aliases (buildTransactionEndMeterValue, mapStopReasonToOCPP20, restoreConnectorStatus, sendAndSetConnectorStatus, stopRunningTransactions, buildSampledValue, getSampledValueTemplate) were trivial forwarding to standalone functions already defined in the same file. Consumers now import these functions directly, reducing indirection and moving toward dissolving the extraneous utility class. --- .../ocpp/1.6/OCPP16IncomingRequestService.ts | 10 +++++----- .../ocpp/1.6/OCPP16RequestService.ts | 10 +++++++--- .../ocpp/1.6/OCPP16ResponseService.ts | 15 ++++++++++----- .../ocpp/1.6/OCPP16ServiceUtils.ts | 14 +++++++------- src/charging-station/ocpp/OCPPServiceUtils.ts | 13 ++----------- .../ocpp/1.6/OCPP16ServiceUtils.test.ts | 6 +++--- 6 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts index a71f4f1c..bbb9840e 100644 --- a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts @@ -119,7 +119,7 @@ import { AuthContext } from '../auth/index.js' import { isIdTagAuthorized } from '../IdTagAuthorization.js' import { OCPPConstants } from '../OCPPConstants.js' import { OCPPIncomingRequestService } from '../OCPPIncomingRequestService.js' -import { buildMeterValue } from '../OCPPServiceUtils.js' +import { buildMeterValue, sendAndSetConnectorStatus } from '../OCPPServiceUtils.js' import { OCPP16Constants } from './OCPP16Constants.js' import { OCPP16ServiceUtils } from './OCPP16ServiceUtils.js' @@ -724,7 +724,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { if (connectorStatus != null) { connectorStatus.availability = type } - await OCPP16ServiceUtils.sendAndSetConnectorStatus(chargingStation, { + await sendAndSetConnectorStatus(chargingStation, { connectorId, status: chargePointStatus, } as OCPP16StatusNotificationRequest) @@ -1549,7 +1549,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { } return OCPP16Constants.OCPP_RESPONSE_UNLOCK_FAILED } - await OCPP16ServiceUtils.sendAndSetConnectorStatus(chargingStation, { + await sendAndSetConnectorStatus(chargingStation, { connectorId, status: OCPP16ChargePointStatus.Available, } as OCPP16StatusNotificationRequest) @@ -1643,7 +1643,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { } for (const { connectorId, connectorStatus } of chargingStation.iterateConnectors(true)) { if (connectorStatus.transactionStarted === false) { - await OCPP16ServiceUtils.sendAndSetConnectorStatus(chargingStation, { + await sendAndSetConnectorStatus(chargingStation, { connectorId, status: OCPP16ChargePointStatus.Unavailable, } as OCPP16StatusNotificationRequest) @@ -1700,7 +1700,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { } else { for (const { connectorId, connectorStatus } of chargingStation.iterateConnectors(true)) { if (connectorStatus.status !== OCPP16ChargePointStatus.Unavailable) { - await OCPP16ServiceUtils.sendAndSetConnectorStatus(chargingStation, { + await sendAndSetConnectorStatus(chargingStation, { connectorId, status: OCPP16ChargePointStatus.Unavailable, } as OCPP16StatusNotificationRequest) diff --git a/src/charging-station/ocpp/1.6/OCPP16RequestService.ts b/src/charging-station/ocpp/1.6/OCPP16RequestService.ts index 75b15f13..f57d7d62 100644 --- a/src/charging-station/ocpp/1.6/OCPP16RequestService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16RequestService.ts @@ -18,7 +18,11 @@ import { } from '../../../types/index.js' import { Constants, generateUUID, logger } from '../../../utils/index.js' import { OCPPRequestService } from '../OCPPRequestService.js' -import { buildStatusNotificationRequest } from '../OCPPServiceUtils.js' +import { + buildStatusNotificationRequest, + buildTransactionEndMeterValue, + sendAndSetConnectorStatus, +} from '../OCPPServiceUtils.js' import { OCPP16Constants } from './OCPP16Constants.js' import { OCPP16ServiceUtils } from './OCPP16ServiceUtils.js' @@ -110,7 +114,7 @@ export class OCPP16RequestService extends OCPPRequestService { // Pre request actions hook switch (commandName) { case OCPP16RequestCommand.START_TRANSACTION: - await OCPP16ServiceUtils.sendAndSetConnectorStatus(chargingStation, { + await sendAndSetConnectorStatus(chargingStation, { connectorId: (commandParams as OCPP16StartTransactionRequest).connectorId, status: OCPP16ChargePointStatus.Preparing, } as OCPP16StatusNotificationRequest) @@ -231,7 +235,7 @@ export class OCPP16RequestService extends OCPPRequestService { transactionData: OCPP16ServiceUtils.buildTransactionDataMeterValues( chargingStation.getConnectorStatus(connectorId) ?.transactionBeginMeterValue as OCPP16MeterValue, - OCPP16ServiceUtils.buildTransactionEndMeterValue( + buildTransactionEndMeterValue( chargingStation, connectorId, energyActiveImportRegister diff --git a/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts b/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts index 85e1e7e8..2b8eb41c 100644 --- a/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts @@ -37,6 +37,11 @@ import { } from '../../../types/index.js' import { Constants, convertToInt, logger, truncateId } from '../../../utils/index.js' import { OCPPResponseService } from '../OCPPResponseService.js' +import { + buildTransactionEndMeterValue, + restoreConnectorStatus, + sendAndSetConnectorStatus, +} from '../OCPPServiceUtils.js' import { OCPP16ServiceUtils } from './OCPP16ServiceUtils.js' const moduleName = 'OCPP16ResponseService' @@ -414,7 +419,7 @@ export class OCPP16ResponseService extends OCPPResponseService { meterValue: [connectorStatus.transactionBeginMeterValue], transactionId: payload.transactionId, } satisfies OCPP16MeterValuesRequest)) - await OCPP16ServiceUtils.sendAndSetConnectorStatus(chargingStation, { + await sendAndSetConnectorStatus(chargingStation, { connectorId, status: OCPP16ChargePointStatus.Charging, } as OCPP16StatusNotificationRequest) @@ -485,7 +490,7 @@ export class OCPP16ResponseService extends OCPPResponseService { >(chargingStation, OCPP16RequestCommand.METER_VALUES, { connectorId: transactionConnectorId, meterValue: [ - OCPP16ServiceUtils.buildTransactionEndMeterValue( + buildTransactionEndMeterValue( chargingStation, transactionConnectorId, requestPayload.meterStop @@ -497,12 +502,12 @@ export class OCPP16ResponseService extends OCPPResponseService { !chargingStation.isChargingStationAvailable() || !chargingStation.isConnectorAvailable(transactionConnectorId) ) { - await OCPP16ServiceUtils.sendAndSetConnectorStatus(chargingStation, { + await sendAndSetConnectorStatus(chargingStation, { connectorId: transactionConnectorId, status: OCPP16ChargePointStatus.Unavailable, } as OCPP16StatusNotificationRequest) } else { - await OCPP16ServiceUtils.sendAndSetConnectorStatus(chargingStation, { + await sendAndSetConnectorStatus(chargingStation, { connectorId: transactionConnectorId, status: OCPP16ChargePointStatus.Available, } as OCPP16StatusNotificationRequest) @@ -549,6 +554,6 @@ export class OCPP16ResponseService extends OCPPResponseService { OCPP16ServiceUtils.stopUpdatedMeterValues(chargingStation, connectorId) const connectorStatus = chargingStation.getConnectorStatus(connectorId) resetConnectorStatus(connectorStatus) - await OCPP16ServiceUtils.restoreConnectorStatus(chargingStation, connectorId, connectorStatus) + await restoreConnectorStatus(chargingStation, connectorId, connectorStatus) } } diff --git a/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts b/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts index 4b739cd0..7807a54a 100644 --- a/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts +++ b/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts @@ -54,8 +54,11 @@ import { import { buildEmptyMeterValue, buildMeterValue, + buildSampledValue, buildTransactionEndMeterValue, + getSampledValueTemplate, OCPPServiceUtils, + sendAndSetConnectorStatus, } from '../OCPPServiceUtils.js' import { OCPP16Constants } from './OCPP16Constants.js' @@ -105,15 +108,12 @@ export class OCPP16ServiceUtils extends OCPPServiceUtils { ): OCPP16MeterValue { const meterValue = buildEmptyMeterValue() as OCPP16MeterValue // Energy.Active.Import.Register measurand (default) - const sampledValueTemplate = OCPP16ServiceUtils.getSampledValueTemplate( - chargingStation, - connectorId - ) + const sampledValueTemplate = getSampledValueTemplate(chargingStation, connectorId) if (sampledValueTemplate != null) { const unitDivider = sampledValueTemplate.unit === OCPP16MeterValueUnit.KILO_WATT_HOUR ? 1000 : 1 meterValue.sampledValue.push( - OCPP16ServiceUtils.buildSampledValue( + buildSampledValue( chargingStation.stationInfo?.ocppVersion, sampledValueTemplate, roundTo((meterStart ?? 0) / unitDivider, 4), @@ -153,7 +153,7 @@ export class OCPP16ServiceUtils extends OCPPServiceUtils { } connectorStatus.availability = availabilityType if (response === OCPP16Constants.OCPP_AVAILABILITY_RESPONSE_ACCEPTED) { - await OCPP16ServiceUtils.sendAndSetConnectorStatus(chargingStation, { + await sendAndSetConnectorStatus(chargingStation, { connectorId, status: chargePointStatus, } as OCPP16StatusNotificationRequest) @@ -529,7 +529,7 @@ export class OCPP16ServiceUtils extends OCPPServiceUtils { chargingStation: ChargingStation, connectorId: number ): Promise => { - await OCPP16ServiceUtils.sendAndSetConnectorStatus(chargingStation, { + await sendAndSetConnectorStatus(chargingStation, { connectorId, status: OCPP16ChargePointStatus.Finishing, } as OCPP16StatusNotificationRequest) diff --git a/src/charging-station/ocpp/OCPPServiceUtils.ts b/src/charging-station/ocpp/OCPPServiceUtils.ts index 5ed47166..5c3857fc 100644 --- a/src/charging-station/ocpp/OCPPServiceUtils.ts +++ b/src/charging-station/ocpp/OCPPServiceUtils.ts @@ -1900,7 +1900,7 @@ const isMeasurandSupported = (measurand: MeterValueMeasurand): boolean => { return supportedMeasurands.includes(measurand as string) } -const getSampledValueTemplate = ( +export const getSampledValueTemplate = ( chargingStation: ChargingStation, connectorId: number, measurandsKey: ConfigurationKeyType = StandardParametersKey.MeterValuesSampledData, @@ -1997,7 +1997,7 @@ const getSampledValueTemplate = ( * @param phase - Optional phase information for multi-phase electrical measurements * @returns A sampled value object formatted according to the specified OCPP version */ -function buildSampledValue ( +export function buildSampledValue ( ocppVersion: OCPPVersion | undefined, sampledValueTemplate: SampledValueTemplate, value: number, @@ -2237,15 +2237,6 @@ const getMeasurandDefaultUnit = ( // eslint-disable-next-line @typescript-eslint/no-extraneous-class export class OCPPServiceUtils { - public static readonly buildTransactionEndMeterValue = buildTransactionEndMeterValue - public static readonly mapStopReasonToOCPP20 = mapStopReasonToOCPP20 - public static readonly restoreConnectorStatus = restoreConnectorStatus - public static readonly sendAndSetConnectorStatus = sendAndSetConnectorStatus - public static readonly stopRunningTransactions = stopRunningTransactions - - protected static buildSampledValue = buildSampledValue - protected static getSampledValueTemplate = getSampledValueTemplate - protected constructor () { // This is intentional } diff --git a/tests/charging-station/ocpp/1.6/OCPP16ServiceUtils.test.ts b/tests/charging-station/ocpp/1.6/OCPP16ServiceUtils.test.ts index 45d0a4be..6036e547 100644 --- a/tests/charging-station/ocpp/1.6/OCPP16ServiceUtils.test.ts +++ b/tests/charging-station/ocpp/1.6/OCPP16ServiceUtils.test.ts @@ -10,7 +10,7 @@ import assert from 'node:assert/strict' import { afterEach, describe, it } from 'node:test' import { OCPP16ServiceUtils } from '../../../../src/charging-station/ocpp/1.6/OCPP16ServiceUtils.js' -import { OCPPServiceUtils } from '../../../../src/charging-station/ocpp/OCPPServiceUtils.js' +import { buildTransactionEndMeterValue } from '../../../../src/charging-station/ocpp/OCPPServiceUtils.js' import { type OCPP16ChargingProfile, OCPP16ChargingProfileKindType, @@ -229,7 +229,7 @@ await describe('OCPP16ServiceUtils — pure functions', async () => { } // Act - const meterValue = OCPPServiceUtils.buildTransactionEndMeterValue(station, 1, 10000) + const meterValue = buildTransactionEndMeterValue(station, 1, 10000) // Assert assert.notStrictEqual(meterValue, undefined) @@ -259,7 +259,7 @@ await describe('OCPP16ServiceUtils — pure functions', async () => { } // Act - const meterValue = OCPPServiceUtils.buildTransactionEndMeterValue(station, 1, 3000) + const meterValue = buildTransactionEndMeterValue(station, 1, 3000) // Assert — kWh divider: 3000 / 1000 = 3 assert.strictEqual(meterValue.sampledValue[0].value, '3') -- 2.53.0