X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fperformance%2Fstorage%2FJsonFileStorage.ts;h=e94d79b97d337826bcc4c7bc74d698d5211b1e04;hb=c1565026eb14b8bf6aa494c89ccbfcea1ff1dc67;hp=480583402656f94fed6864196953a79b4d356634;hpb=d812bdcbd13b39bf895bb3e01c0556d87c35a6d1;p=e-mobility-charging-stations-simulator.git diff --git a/src/performance/storage/JsonFileStorage.ts b/src/performance/storage/JsonFileStorage.ts index 48058340..e94d79b9 100644 --- a/src/performance/storage/JsonFileStorage.ts +++ b/src/performance/storage/JsonFileStorage.ts @@ -1,14 +1,11 @@ // Copyright Jerome Benoit. 2021-2023. All Rights Reserved. -import fs from 'fs'; - -import lockfile from 'proper-lockfile'; +import fs from 'node:fs'; +import path from 'node:path'; import { Storage } from './Storage'; -import { FileType } from '../../types/FileType'; -import type { Statistics } from '../../types/Statistics'; -import FileUtils from '../../utils/FileUtils'; -import Utils from '../../utils/Utils'; +import { FileType, type Statistics } from '../../types'; +import { AsyncLock, AsyncLockType, Constants, FileUtils, Utils } from '../../utils'; export class JsonFileStorage extends Storage { private fd: number | null = null; @@ -20,46 +17,46 @@ export class JsonFileStorage extends Storage { public storePerformanceStatistics(performanceStatistics: Statistics): void { this.checkPerformanceRecordsFile(); - lockfile - .lock(this.dbName, { stale: 5000, retries: 3 }) - .then(async (release) => { - try { - const fileData = fs.readFileSync(this.dbName, 'utf8'); - const performanceRecords: Statistics[] = fileData - ? (JSON.parse(fileData) as Statistics[]) - : []; - performanceRecords.push(performanceStatistics); - fs.writeFileSync( - this.dbName, - Utils.JSONStringifyWithMapSupport(performanceRecords, 2), - 'utf8' - ); - } catch (error) { - FileUtils.handleFileException( - this.logPrefix, - FileType.PerformanceRecords, - this.dbName, - error as NodeJS.ErrnoException - ); - } - await release(); + AsyncLock.acquire(AsyncLockType.performance) + .then(() => { + const fileData = fs.readFileSync(this.dbName, 'utf8'); + const performanceRecords: Statistics[] = fileData + ? (JSON.parse(fileData) as Statistics[]) + : []; + performanceRecords.push(performanceStatistics); + fs.writeFileSync( + this.dbName, + Utils.JSONStringifyWithMapSupport(performanceRecords, 2), + 'utf8' + ); }) - .catch(() => { - /* This is intentional */ + .catch((error) => { + FileUtils.handleFileException( + this.dbName, + FileType.PerformanceRecords, + error as NodeJS.ErrnoException, + this.logPrefix + ); + }) + .finally(() => { + AsyncLock.release(AsyncLockType.performance).catch(Constants.EMPTY_FUNCTION); }); } public open(): void { try { - if (this?.fd === undefined && this?.fd === null) { + if (Utils.isNullOrUndefined(this?.fd)) { + if (!fs.existsSync(path.dirname(this.dbName))) { + fs.mkdirSync(path.dirname(this.dbName), { recursive: true }); + } this.fd = fs.openSync(this.dbName, 'a+'); } } catch (error) { FileUtils.handleFileException( - this.logPrefix, - FileType.PerformanceRecords, this.dbName, - error as NodeJS.ErrnoException + FileType.PerformanceRecords, + error as NodeJS.ErrnoException, + this.logPrefix ); } } @@ -72,10 +69,10 @@ export class JsonFileStorage extends Storage { } } catch (error) { FileUtils.handleFileException( - this.logPrefix, - FileType.PerformanceRecords, this.dbName, - error as NodeJS.ErrnoException + FileType.PerformanceRecords, + error as NodeJS.ErrnoException, + this.logPrefix ); } }