import fs from 'node:fs';
-import { type ChargingStation, ChargingStationUtils } from './internal';
+import type { ChargingStation } from './ChargingStation';
+import { ChargingStationUtils } from './ChargingStationUtils';
import { FileType, IdTagDistribution } from '../types';
-import { FileUtils, Utils, logger } from '../utils';
+import { ErrorUtils, FileUtils, Utils, logger } from '../utils';
type IdTagsCacheValueType = {
idTags: string[];
return IdTagsCache.instance;
}
+ /**
+ * Get one idtag from the cache given the distribution
+ * Must be called after checking the cache is not an empty array
+ *
+ * @param distribution
+ * @param chargingStation
+ * @param connectorId
+ * @returns
+ */
public getIdTag(
distribution: IdTagDistribution,
chargingStation: ChargingStation,
}
}
+ /**
+ * Get all idtags from the cache
+ * Must be called after checking the cache is not an empty array
+ *
+ * @param file
+ * @returns
+ */
public getIdTags(file: string): string[] | undefined {
if (this.hasIdTagsCache(file) === false) {
this.setIdTagsCache(file, this.getIdTagsFromFile(file));
private getRandomIdTag(hashId: string, file: string): string {
const idTags = this.getIdTags(file);
- const addressableKey = file + hashId;
+ const addressableKey = this.getIdTagsCacheIndexesAddressableKey(file, hashId);
this.idTagsCachesAddressableIndexes.set(
addressableKey,
Math.floor(Utils.secureRandom() * idTags.length)
private getRoundRobinIdTag(hashId: string, file: string): string {
const idTags = this.getIdTags(file);
- const addressableKey = file + hashId;
+ const addressableKey = this.getIdTagsCacheIndexesAddressableKey(file, hashId);
const idTagIndex = this.idTagsCachesAddressableIndexes.get(addressableKey) ?? 0;
const idTag = idTags[idTagIndex];
this.idTagsCachesAddressableIndexes.set(
private getConnectorAffinityIdTag(chargingStation: ChargingStation, connectorId: number): string {
const file = ChargingStationUtils.getIdTagsFile(chargingStation.stationInfo);
const idTags = this.getIdTags(file);
- const hashId = chargingStation.stationInfo.hashId;
- const addressableKey = file + hashId;
+ const addressableKey = this.getIdTagsCacheIndexesAddressableKey(
+ file,
+ chargingStation.stationInfo.hashId
+ );
this.idTagsCachesAddressableIndexes.set(
addressableKey,
(chargingStation.index - 1 + (connectorId - 1)) % idTags.length
this.deleteIdTagsCache(file);
this.deleteIdTagsCacheIndexes(file);
} catch (error) {
- FileUtils.handleFileException(
+ ErrorUtils.handleFileException(
file,
FileType.Authorization,
error as NodeJS.ErrnoException,
}
}
+ private getIdTagsCacheIndexesAddressableKey(prefix: string, uid: string): string {
+ return `${prefix}${uid}`;
+ }
+
private getIdTagsFromFile(file: string): string[] {
- let idTags: string[] = [];
- if (file) {
+ if (Utils.isNotEmptyString(file)) {
try {
- // Load id tags file
- idTags = JSON.parse(fs.readFileSync(file, 'utf8')) as string[];
+ return JSON.parse(fs.readFileSync(file, 'utf8')) as string[];
} catch (error) {
- FileUtils.handleFileException(
+ ErrorUtils.handleFileException(
file,
FileType.Authorization,
error as NodeJS.ErrnoException,
this.logPrefix(file)
);
}
- } else {
- logger.info(`${this.logPrefix(file)} No id tags file given`);
}
- return idTags;
+ return [];
}
private logPrefix = (file: string): string => {