// Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
-import { AsyncResource } from 'async_hooks';
+import { AsyncResource } from 'node:async_hooks';
-import type ChargingStation from './ChargingStation';
-import { ChargingStationUtils } from './ChargingStationUtils';
-import BaseError from '../exception/BaseError';
-import PerformanceStatistics from '../performance/PerformanceStatistics';
-import {
- type AutomaticTransactionGeneratorConfiguration,
- IdTagDistribution,
- type Status,
-} from '../types/AutomaticTransactionGenerator';
-import { RequestCommand } from '../types/ocpp/Requests';
+import { type ChargingStation, ChargingStationUtils } from './internal';
+import { BaseError } from '../exception';
+// import { PerformanceStatistics } from '../performance';
+import { PerformanceStatistics } from '../performance/PerformanceStatistics';
import {
AuthorizationStatus,
type AuthorizeRequest,
type AuthorizeResponse,
+ type AutomaticTransactionGeneratorConfiguration,
+ IdTagDistribution,
+ RequestCommand,
type StartTransactionRequest,
type StartTransactionResponse,
+ type Status,
StopTransactionReason,
type StopTransactionResponse,
-} from '../types/ocpp/Transaction';
-import Constants from '../utils/Constants';
-import logger from '../utils/Logger';
-import Utils from '../utils/Utils';
+} from '../types';
+import { Constants, Utils, logger } from '../utils';
const moduleName = 'AutomaticTransactionGenerator';
-export default class AutomaticTransactionGenerator extends AsyncResource {
+export class AutomaticTransactionGenerator extends AsyncResource {
private static readonly instances: Map<string, AutomaticTransactionGenerator> = new Map<
string,
AutomaticTransactionGenerator
public static getInstance(
automaticTransactionGeneratorConfiguration: AutomaticTransactionGeneratorConfiguration,
chargingStation: ChargingStation
- ): AutomaticTransactionGenerator {
+ ): AutomaticTransactionGenerator | undefined {
if (AutomaticTransactionGenerator.instances.has(chargingStation.stationInfo.hashId) === false) {
AutomaticTransactionGenerator.instances.set(
chargingStation.stationInfo.hashId,
) => Promise<void>,
this,
connectorId
- ).catch(() => {
- /* This is intentional */
- });
+ ).catch(Constants.EMPTY_FUNCTION);
} else if (this.connectorsStatus.get(connectorId)?.start === true) {
logger.warn(`${this.logPrefix(connectorId)} is already started on connector`);
}
this.connectorsStatus.get(connectorId).startDate.getTime()
)}`
);
- while (this.connectorsStatus.get(connectorId).start === true) {
+ while (this.connectorsStatus.get(connectorId)?.start === true) {
if (new Date() > this.connectorsStatus.get(connectorId).stopDate) {
this.stopConnector(connectorId);
break;
logger.info(
`${this.logPrefix(connectorId)} transaction ${this.chargingStation
.getConnectorStatus(connectorId)
- .transactionId.toString()} started and will stop in ${Utils.formatDurationMilliSeconds(
+ ?.transactionId?.toString()} started and will stop in ${Utils.formatDurationMilliSeconds(
waitTrxEnd
)}`
);
logger.info(
`${this.logPrefix(connectorId)} stop transaction ${this.chargingStation
.getConnectorStatus(connectorId)
- .transactionId.toString()}`
+ ?.transactionId?.toString()}`
);
await this.stopTransaction(connectorId);
}
logger.info(
`${this.logPrefix(connectorId)} skipped consecutively ${this.connectorsStatus
.get(connectorId)
- .skippedConsecutiveTransactions.toString()}/${this.connectorsStatus
+ ?.skippedConsecutiveTransactions?.toString()}/${this.connectorsStatus
.get(connectorId)
- .skippedTransactions.toString()} transaction(s)`
+ ?.skippedTransactions?.toString()} transaction(s)`
);
}
this.connectorsStatus.get(connectorId).lastRunDate = new Date();
private setStartConnectorStatus(connectorId: number): void {
this.connectorsStatus.get(connectorId).skippedConsecutiveTransactions = 0;
const previousRunDuration =
- this?.connectorsStatus.get(connectorId)?.startDate &&
- this?.connectorsStatus.get(connectorId)?.lastRunDate
+ this.connectorsStatus.get(connectorId)?.startDate &&
+ this.connectorsStatus.get(connectorId)?.lastRunDate
? this.connectorsStatus.get(connectorId).lastRunDate.getTime() -
this.connectorsStatus.get(connectorId).startDate.getTime()
: 0;
this.connectorsStatus.get(connectorId).rejectedStopTransactionRequests++;
}
} else {
- const transactionId = this.chargingStation.getConnectorStatus(connectorId).transactionId;
+ const transactionId = this.chargingStation.getConnectorStatus(connectorId)?.transactionId;
logger.warn(
`${this.logPrefix(connectorId)} stopping a not started transaction${
- transactionId ? ` ${transactionId.toString()}` : ''
+ !Utils.isNullOrUndefined(transactionId) ? ` ${transactionId?.toString()}` : ''
}`
);
}
}
}
- private logPrefix(connectorId?: number): string {
+ private logPrefix = (connectorId?: number): string => {
return Utils.logPrefix(
` ${this.chargingStation.stationInfo.chargingStationId} | ATG${
connectorId !== undefined ? ` on connector #${connectorId.toString()}` : ''
}:`
);
- }
+ };
private handleStartTransactionResponse(
connectorId: number,