]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/commitdiff
refactor(ocpp): remove static alias forwarding from OCPPServiceUtils class
authorJérôme Benoit <jerome.benoit@sap.com>
Mon, 30 Mar 2026 20:33:31 +0000 (22:33 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Mon, 30 Mar 2026 20:33:31 +0000 (22:33 +0200)
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.

src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts
src/charging-station/ocpp/1.6/OCPP16RequestService.ts
src/charging-station/ocpp/1.6/OCPP16ResponseService.ts
src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts
src/charging-station/ocpp/OCPPServiceUtils.ts
tests/charging-station/ocpp/1.6/OCPP16ServiceUtils.test.ts

index a71f4f1c7166e6f8247dc64247db4a09c536b3bc..bbb9840ebf5a9fecb43fedba9956eac6a87174c5 100644 (file)
@@ -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)
index 75b15f1370a7291dbf96c1389b9355e93cab4ba0..f57d7d620d8a943b0f6d5c32ad84037aafab4764 100644 (file)
@@ -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
index 85e1e7e8a785f76083df706a57c4c1db2c61c0e2..2b8eb41cf4b614059db9a62bb2eeb6282481e29a 100644 (file)
@@ -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)
   }
 }
index 4b739cd0a89845f2bcf02728a1e32eb9f47ef2be..7807a54a94e337b797971efe88043b04af1a1857 100644 (file)
@@ -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<GenericResponse> => {
-    await OCPP16ServiceUtils.sendAndSetConnectorStatus(chargingStation, {
+    await sendAndSetConnectorStatus(chargingStation, {
       connectorId,
       status: OCPP16ChargePointStatus.Finishing,
     } as OCPP16StatusNotificationRequest)
index 5ed471666d1c9fd19b6533255291dabc191bc602..5c3857fc8f5df68587127504ab983f0d43bd0f0f 100644 (file)
@@ -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
   }
index 45d0a4bed81c9771af47aa5d836aa82ec7f56251..6036e5474438f37cc58f3e85149f7566a70ff409 100644 (file)
@@ -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')