`${this.logPrefix(connectorId)} stopped with connector status: %j`,
this.connectorsStatus.get(connectorId)
)
- this.chargingStation.emit(ChargingStationEvents.updated)
+ this.chargingStation.emitChargingStationEvent(ChargingStationEvents.updated)
}
private readonly logPrefix = (connectorId?: number): string => {
this.connectorsStatus.get(connectorId)!.skippedConsecutiveTransactions = 0
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
this.connectorsStatus.get(connectorId)!.start = true
- this.chargingStation.emit(ChargingStationEvents.updated)
+ this.chargingStation.emitChargingStationEvent(ChargingStationEvents.updated)
}
private startConnectors (stopAbsoluteDuration?: boolean): void {
const { data, event } = msg
try {
switch (event) {
+ case ChargingStationWorkerMessageEvents.accepted:
+ if (this.listenerCount(ChargingStationWorkerMessageEvents.accepted) > 0) {
+ this.emit(ChargingStationWorkerMessageEvents.accepted, data)
+ }
+ break
case ChargingStationWorkerMessageEvents.added:
- this.emit(ChargingStationWorkerMessageEvents.added, data)
+ if (this.listenerCount(ChargingStationWorkerMessageEvents.added) > 0) {
+ this.emit(ChargingStationWorkerMessageEvents.added, data)
+ }
+ break
+ case ChargingStationWorkerMessageEvents.connected:
+ if (this.listenerCount(ChargingStationWorkerMessageEvents.connected) > 0) {
+ this.emit(ChargingStationWorkerMessageEvents.connected, data)
+ }
+ break
+ case ChargingStationWorkerMessageEvents.connectorStatusChanged:
+ if (this.listenerCount(ChargingStationWorkerMessageEvents.connectorStatusChanged) > 0) {
+ this.emit(ChargingStationWorkerMessageEvents.connectorStatusChanged, data)
+ }
break
case ChargingStationWorkerMessageEvents.deleted:
- this.emit(ChargingStationWorkerMessageEvents.deleted, data)
+ if (this.listenerCount(ChargingStationWorkerMessageEvents.deleted) > 0) {
+ this.emit(ChargingStationWorkerMessageEvents.deleted, data)
+ }
+ break
+ case ChargingStationWorkerMessageEvents.disconnected:
+ if (this.listenerCount(ChargingStationWorkerMessageEvents.disconnected) > 0) {
+ this.emit(ChargingStationWorkerMessageEvents.disconnected, data)
+ }
+ break
+ case ChargingStationWorkerMessageEvents.pending:
+ if (this.listenerCount(ChargingStationWorkerMessageEvents.pending) > 0) {
+ this.emit(ChargingStationWorkerMessageEvents.pending, data)
+ }
break
case ChargingStationWorkerMessageEvents.performanceStatistics:
- this.emit(ChargingStationWorkerMessageEvents.performanceStatistics, data)
+ if (this.listenerCount(ChargingStationWorkerMessageEvents.performanceStatistics) > 0) {
+ this.emit(ChargingStationWorkerMessageEvents.performanceStatistics, data)
+ }
+ break
+ case ChargingStationWorkerMessageEvents.rejected:
+ if (this.listenerCount(ChargingStationWorkerMessageEvents.rejected) > 0) {
+ this.emit(ChargingStationWorkerMessageEvents.rejected, data)
+ }
break
case ChargingStationWorkerMessageEvents.started:
- this.emit(ChargingStationWorkerMessageEvents.started, data)
+ if (this.listenerCount(ChargingStationWorkerMessageEvents.started) > 0) {
+ this.emit(ChargingStationWorkerMessageEvents.started, data)
+ }
break
case ChargingStationWorkerMessageEvents.stopped:
- this.emit(ChargingStationWorkerMessageEvents.stopped, data)
+ if (this.listenerCount(ChargingStationWorkerMessageEvents.stopped) > 0) {
+ this.emit(ChargingStationWorkerMessageEvents.stopped, data)
+ }
break
case ChargingStationWorkerMessageEvents.updated:
- this.emit(ChargingStationWorkerMessageEvents.updated, data)
+ if (this.listenerCount(ChargingStationWorkerMessageEvents.updated) > 0) {
+ this.emit(ChargingStationWorkerMessageEvents.updated, data)
+ }
break
default:
throw new BaseError(
- `Unknown charging station worker message event: '${event}' received with data: ${JSON.stringify(
+ `Unknown charging station worker message event: '${event as string}' received with data: ${JSON.stringify(
data,
undefined,
2
this.templateFileWatcher?.unref()
deleteConfiguration && rmSync(this.configurationFile, { force: true })
this.chargingStationWorkerBroadcastChannel.unref()
- this.emit(ChargingStationEvents.deleted)
+ this.emitChargingStationEvent(ChargingStationEvents.deleted)
this.removeAllListeners()
}
+ /**
+ * Emit a ChargingStation event only if there are listeners registered for it.
+ * This optimizes performance by avoiding unnecessary event emission.
+ * @param event - The ChargingStation event to emit
+ * @param args - Arguments to pass to the event listeners
+ */
+ public emitChargingStationEvent (event: ChargingStationEvents, ...args: unknown[]): void {
+ if (this.listenerCount(event) > 0) {
+ this.emit(event, ...args)
+ }
+ }
+
public getAuthorizeRemoteTxRequests (): boolean {
const authorizeRemoteTxRequests = getConfigurationKey(
this,
}
)
this.started = true
- this.emit(ChargingStationEvents.started)
+ this.emitChargingStationEvent(ChargingStationEvents.started)
this.starting = false
} else {
logger.warn(`${this.logPrefix()} Charging station is already starting...`)
this.automaticTransactionGenerator?.start(stopAbsoluteDuration)
}
this.saveAutomaticTransactionGeneratorConfiguration()
- this.emit(ChargingStationEvents.updated)
+ this.emitChargingStationEvent(ChargingStationEvents.updated)
}
public startHeartbeat (): void {
this.started = false
this.saveConfiguration()
this.sharedLRUCache.deleteChargingStationConfiguration(this.configurationFileHash)
- this.emit(ChargingStationEvents.stopped)
+ this.emitChargingStationEvent(ChargingStationEvents.stopped)
this.stopping = false
} else {
logger.warn(`${this.logPrefix()} Charging station is already stopping...`)
this.automaticTransactionGenerator?.stop()
}
this.saveAutomaticTransactionGeneratorConfiguration()
- this.emit(ChargingStationEvents.updated)
+ this.emitChargingStationEvent(ChargingStationEvents.updated)
}
public stopMeterValues (connectorId: number): void {
}
private add (): void {
- this.emit(ChargingStationEvents.added)
+ this.emitChargingStationEvent(ChargingStationEvents.added)
}
private clearIntervalFlushMessageBuffer (): void {
commandName,
commandPayload
)
- this.emit(ChargingStationEvents.updated)
+ this.emitChargingStationEvent(ChargingStationEvents.updated)
}
private handleResponseMessage (response: Response): void {
}
private onClose (code: WebSocketCloseEventStatusCode, reason: Buffer): void {
- this.emit(ChargingStationEvents.disconnected)
- this.emit(ChargingStationEvents.updated)
+ this.emitChargingStationEvent(ChargingStationEvents.disconnected)
+ this.emitChargingStationEvent(ChargingStationEvents.updated)
switch (code) {
// Normal close
case WebSocketCloseEventStatusCode.CLOSE_NO_STATUS:
this.started &&
this.reconnect()
.then(() => {
- this.emit(ChargingStationEvents.updated)
+ this.emitChargingStationEvent(ChargingStationEvents.updated)
return undefined
})
.catch((error: unknown) =>
private async onOpen (): Promise<void> {
if (this.isWebSocketConnectionOpened()) {
- this.emit(ChargingStationEvents.connected)
- this.emit(ChargingStationEvents.updated)
+ this.emitChargingStationEvent(ChargingStationEvents.connected)
+ this.emitChargingStationEvent(ChargingStationEvents.updated)
logger.info(
`${this.logPrefix()} Connection to OCPP server through ${
this.wsConnectionUrl.href
`${this.logPrefix()} Registration failure: maximum retries reached (${registrationRetryCount.toString()}) or retry disabled (${this.stationInfo?.registrationMaxRetries?.toString()})`
)
}
- this.emit(ChargingStationEvents.updated)
+ this.emitChargingStationEvent(ChargingStationEvents.updated)
} else {
logger.warn(
`${this.logPrefix()} Connection to OCPP server through ${this.wsConnectionUrl.href} failed`
response,
commandName
)
- // Emit command name event to allow delayed handling
- this.emit(commandName, chargingStation, commandPayload, response)
+ // Emit command name event to allow delayed handling only if there are listeners
+ if (this.listenerCount(commandName) > 0) {
+ this.emit(commandName, chargingStation, commandPayload, response)
+ }
}
private async handleRequestCancelReservation (
)
}
if (chargingStation.inAcceptedState()) {
- chargingStation.emit(ChargingStationEvents.accepted)
+ chargingStation.emitChargingStationEvent(ChargingStationEvents.accepted)
} else if (chargingStation.inPendingState()) {
- chargingStation.emit(ChargingStationEvents.pending)
+ chargingStation.emitChargingStationEvent(ChargingStationEvents.pending)
} else if (chargingStation.inRejectedState()) {
- chargingStation.emit(ChargingStationEvents.rejected)
+ chargingStation.emitChargingStationEvent(ChargingStationEvents.rejected)
}
const logMsg = `${chargingStation.logPrefix()} Charging station in '${
payload.status
response,
commandName
)
- // Emit command name event to allow delayed handling
- this.emit(commandName, chargingStation, commandPayload, response)
+ // Emit command name event to allow delayed handling only if there are listeners
+ if (this.listenerCount(commandName) > 0) {
+ this.emit(commandName, chargingStation, commandPayload, response)
+ }
}
private buildReportData (
)
}
if (chargingStation.inAcceptedState()) {
- chargingStation.emit(ChargingStationEvents.accepted)
+ chargingStation.emitChargingStationEvent(ChargingStationEvents.accepted)
} else if (chargingStation.inPendingState()) {
- chargingStation.emit(ChargingStationEvents.pending)
+ chargingStation.emitChargingStationEvent(ChargingStationEvents.pending)
} else if (chargingStation.inRejectedState()) {
- chargingStation.emit(ChargingStationEvents.rejected)
+ chargingStation.emitChargingStationEvent(ChargingStationEvents.rejected)
}
const logMsg = `${chargingStation.logPrefix()} Charging station in '${
payload.status
})
.finally(() => {
chargingStation.requests.delete(messageId)
- chargingStation.emit(ChargingStationEvents.updated)
+ chargingStation.emitChargingStationEvent(ChargingStationEvents.updated)
})
.catch(reject)
}
ocppError
)
chargingStation.requests.delete(messageId)
- chargingStation.emit(ChargingStationEvents.updated)
+ chargingStation.emitChargingStationEvent(ChargingStationEvents.updated)
reject(ocppError)
}
)
}
connectorStatus.status = status
- chargingStation.emit(ChargingStationEvents.connectorStatusChanged, {
+ chargingStation.emitChargingStationEvent(ChargingStationEvents.connectorStatusChanged, {
connectorId,
...connectorStatus,
})