-import { AuthorizationStatus, StartTransactionResponse, StopTransactionReason, StopTransactionResponse } from '../types/ocpp/1.6/Transaction';
-import { PerformanceObserver, performance } from 'perf_hooks';
-
-import ChargingStation from './ChargingStation';
-import Constants from '../utils/Constants';
-import Utils from '../utils/Utils';
-import logger from '../utils/Logger';
-
-export default class AutomaticTransactionGenerator {
- private _chargingStation: ChargingStation;
- private _timeToStop: boolean;
- private _performanceObserver: PerformanceObserver;
-
- constructor(chargingStation: ChargingStation) {
- this._chargingStation = chargingStation;
- this._timeToStop = true;
- if (this._chargingStation.getEnableStatistics()) {
- this._performanceObserver = new PerformanceObserver((list) => {
- const entry = list.getEntries()[0];
- this._chargingStation.statistics.logPerformance(entry, Constants.ENTITY_AUTOMATIC_TRANSACTION_GENERATOR);
- this._performanceObserver.disconnect();
- });
+// Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
+
+import { AsyncResource } from 'node:async_hooks';
+
+import { type ChargingStation, ChargingStationUtils, IdTagsCache } from './internal';
+import { BaseError } from '../exception';
+// import { PerformanceStatistics } from '../performance';
+import { PerformanceStatistics } from '../performance/PerformanceStatistics';
+import {
+ AuthorizationStatus,
+ type AuthorizeRequest,
+ type AuthorizeResponse,
+ type AutomaticTransactionGeneratorConfiguration,
+ ConnectorStatusEnum,
+ RequestCommand,
+ type StartTransactionRequest,
+ type StartTransactionResponse,
+ type Status,
+ StopTransactionReason,
+ type StopTransactionResponse,
+} from '../types';
+import { Constants, Utils, logger } from '../utils';
+
+const moduleName = 'AutomaticTransactionGenerator';
+
+export class AutomaticTransactionGenerator extends AsyncResource {
+ private static readonly instances: Map<string, AutomaticTransactionGenerator> = new Map<
+ string,
+ AutomaticTransactionGenerator
+ >();
+
+ public readonly connectorsStatus: Map<number, Status>;
+ public readonly configuration: AutomaticTransactionGeneratorConfiguration;
+ public started: boolean;
+ private readonly chargingStation: ChargingStation;
+
+ private constructor(
+ automaticTransactionGeneratorConfiguration: AutomaticTransactionGeneratorConfiguration,
+ chargingStation: ChargingStation
+ ) {
+ super(moduleName);
+ this.started = false;
+ this.configuration = automaticTransactionGeneratorConfiguration;
+ this.chargingStation = chargingStation;
+ this.connectorsStatus = new Map<number, Status>();
+ this.initializeConnectorsStatus();
+ }
+
+ public static getInstance(
+ automaticTransactionGeneratorConfiguration: AutomaticTransactionGeneratorConfiguration,
+ chargingStation: ChargingStation
+ ): AutomaticTransactionGenerator | undefined {
+ if (AutomaticTransactionGenerator.instances.has(chargingStation.stationInfo.hashId) === false) {
+ AutomaticTransactionGenerator.instances.set(
+ chargingStation.stationInfo.hashId,
+ new AutomaticTransactionGenerator(
+ automaticTransactionGeneratorConfiguration,
+ chargingStation
+ )
+ );
+ }
+ return AutomaticTransactionGenerator.instances.get(chargingStation.stationInfo.hashId);
+ }
+
+ public start(): void {
+ if (
+ ChargingStationUtils.checkChargingStation(this.chargingStation, this.logPrefix()) === false
+ ) {
+ return;
+ }
+ if (this.started === true) {
+ logger.warn(`${this.logPrefix()} is already started`);
+ return;