-import fs from 'node:fs';
+import { type FSWatcher, readFileSync } from 'node:fs';
import type { ChargingStation } from './ChargingStation';
-import { ChargingStationUtils } from './ChargingStationUtils';
+import { getIdTagsFile } from './ChargingStationUtils';
import { FileType, IdTagDistribution } from '../types';
-import { ErrorUtils, FileUtils, Utils, logger } from '../utils';
-
-type IdTagsCacheValueType = {
+import {
+ handleFileException,
+ isNotEmptyString,
+ logPrefix,
+ logger,
+ secureRandom,
+ watchJsonFile,
+} from '../utils';
+
+interface IdTagsCacheValueType {
idTags: string[];
- idTagsFileWatcher: fs.FSWatcher | undefined;
-};
+ idTagsFileWatcher: FSWatcher | undefined;
+}
export class IdTagsCache {
private static instance: IdTagsCache | null = null;
}
/**
- * Get one idtag from the cache given the distribution
+ * Gets 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
+ * @param distribution -
+ * @param chargingStation -
+ * @param connectorId -
* @returns
*/
public getIdTag(
distribution: IdTagDistribution,
chargingStation: ChargingStation,
- connectorId: number
+ connectorId: number,
): string {
const hashId = chargingStation.stationInfo.hashId;
- const idTagsFile = ChargingStationUtils.getIdTagsFile(chargingStation.stationInfo);
+ const idTagsFile = getIdTagsFile(chargingStation.stationInfo)!;
switch (distribution) {
case IdTagDistribution.RANDOM:
return this.getRandomIdTag(hashId, idTagsFile);
}
/**
- * Get all idtags from the cache
+ * Gets all idtags from the cache
* Must be called after checking the cache is not an empty array
*
- * @param file
+ * @param file -
* @returns
*/
public getIdTags(file: string): string[] | undefined {
if (this.hasIdTagsCache(file) === false) {
- this.setIdTagsCache(
- Utils.isNotEmptyString(file) ? file : 'empty',
- this.getIdTagsFromFile(file)
- );
+ this.setIdTagsCache(file, this.getIdTagsFromFile(file));
}
return this.getIdTagsCache(file);
}
public deleteIdTags(file: string): boolean {
- return this.deleteIdTagsCache(file);
+ return this.deleteIdTagsCache(file) && this.deleteIdTagsCacheIndexes(file);
}
private getRandomIdTag(hashId: string, file: string): string {
- const idTags = this.getIdTags(file);
+ const idTags = this.getIdTags(file)!;
const addressableKey = this.getIdTagsCacheIndexesAddressableKey(file, hashId);
this.idTagsCachesAddressableIndexes.set(
addressableKey,
- Math.floor(Utils.secureRandom() * idTags.length)
+ Math.floor(secureRandom() * idTags.length),
);
- return idTags[this.idTagsCachesAddressableIndexes.get(addressableKey)];
+ return idTags[this.idTagsCachesAddressableIndexes.get(addressableKey)!];
}
private getRoundRobinIdTag(hashId: string, file: string): string {
- const idTags = this.getIdTags(file);
+ const idTags = this.getIdTags(file)!;
const addressableKey = this.getIdTagsCacheIndexesAddressableKey(file, hashId);
const idTagIndex = this.idTagsCachesAddressableIndexes.get(addressableKey) ?? 0;
const idTag = idTags[idTagIndex];
this.idTagsCachesAddressableIndexes.set(
addressableKey,
- idTagIndex === idTags.length - 1 ? 0 : idTagIndex + 1
+ idTagIndex === idTags.length - 1 ? 0 : idTagIndex + 1,
);
return idTag;
}
private getConnectorAffinityIdTag(chargingStation: ChargingStation, connectorId: number): string {
- const file = ChargingStationUtils.getIdTagsFile(chargingStation.stationInfo);
- const idTags = this.getIdTags(file);
+ const file = getIdTagsFile(chargingStation.stationInfo)!;
+ const idTags = this.getIdTags(file)!;
const addressableKey = this.getIdTagsCacheIndexesAddressableKey(
file,
- chargingStation.stationInfo.hashId
+ chargingStation.stationInfo.hashId,
);
this.idTagsCachesAddressableIndexes.set(
addressableKey,
- (chargingStation.index - 1 + (connectorId - 1)) % idTags.length
+ (chargingStation.index - 1 + (connectorId - 1)) % idTags.length,
);
- return idTags[this.idTagsCachesAddressableIndexes.get(addressableKey)];
+ return idTags[this.idTagsCachesAddressableIndexes.get(addressableKey)!];
}
private hasIdTagsCache(file: string): boolean {
private setIdTagsCache(file: string, idTags: string[]) {
return this.idTagsCaches.set(file, {
idTags,
- idTagsFileWatcher: FileUtils.watchJsonFile(
+ idTagsFileWatcher: watchJsonFile(
file,
FileType.Authorization,
this.logPrefix(file),
undefined,
(event, filename) => {
- if (Utils.isNotEmptyString(filename) && event === 'change') {
+ if (isNotEmptyString(filename) && event === 'change') {
try {
logger.debug(
- `${this.logPrefix(file)} ${FileType.Authorization} file have changed, reload`
+ `${this.logPrefix(file)} ${FileType.Authorization} file have changed, reload`,
);
this.deleteIdTagsCache(file);
this.deleteIdTagsCacheIndexes(file);
} catch (error) {
- ErrorUtils.handleFileException(
+ handleFileException(
file,
FileType.Authorization,
error as NodeJS.ErrnoException,
this.logPrefix(file),
{
throwError: false,
- }
+ },
);
}
}
- }
+ },
),
});
}
return this.idTagsCaches.delete(file);
}
- private deleteIdTagsCacheIndexes(file: string): void {
+ private deleteIdTagsCacheIndexes(file: string): boolean {
+ const deleted: boolean[] = [];
for (const [key] of this.idTagsCachesAddressableIndexes) {
if (key.startsWith(file)) {
- this.idTagsCachesAddressableIndexes.delete(key);
+ deleted.push(this.idTagsCachesAddressableIndexes.delete(key));
}
}
+ return !deleted.some((value) => value === false);
}
private getIdTagsCacheIndexesAddressableKey(prefix: string, uid: string): string {
}
private getIdTagsFromFile(file: string): string[] {
- if (Utils.isNotEmptyString(file)) {
+ if (isNotEmptyString(file)) {
try {
- return JSON.parse(fs.readFileSync(file, 'utf8')) as string[];
+ return JSON.parse(readFileSync(file, 'utf8')) as string[];
} catch (error) {
- ErrorUtils.handleFileException(
+ handleFileException(
file,
FileType.Authorization,
error as NodeJS.ErrnoException,
- this.logPrefix(file)
+ this.logPrefix(file),
);
}
}
- logger.info(`${this.logPrefix(file)} No id tags file given in configuration`);
return [];
}
private logPrefix = (file: string): string => {
- return Utils.logPrefix(` Id tags cache for id tags file '${file}' |`);
+ return logPrefix(` Id tags cache for id tags file '${file}' |`);
};
}