X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fperformance%2Fstorage%2FJsonFileStorage.ts;h=8bbbd42cea06563d91d7e6d360bf38cc06f92563;hb=c4ab56bac3353a08b0b7e058e9edfcfc0e629c94;hp=3128c862211f4df4866a1426aa53f7208c4219a2;hpb=268a74bb051fcbbad532fd833f0d8fd2b33b6c64;p=e-mobility-charging-stations-simulator.git diff --git a/src/performance/storage/JsonFileStorage.ts b/src/performance/storage/JsonFileStorage.ts index 3128c862..8bbbd42c 100644 --- a/src/performance/storage/JsonFileStorage.ts +++ b/src/performance/storage/JsonFileStorage.ts @@ -1,13 +1,19 @@ // Copyright Jerome Benoit. 2021-2023. All Rights Reserved. -import fs from 'node:fs'; - -import lockfile from 'proper-lockfile'; +import { closeSync, existsSync, mkdirSync, openSync, readFileSync, writeFileSync } from 'node:fs'; +import { dirname } from 'node:path'; import { Storage } from './Storage'; +import { BaseError } from '../../exception'; import { FileType, type Statistics } from '../../types'; -import { FileUtils } from '../../utils/FileUtils'; -import { Utils } from '../../utils/Utils'; +import { + AsyncLock, + AsyncLockType, + Constants, + JSONStringifyWithMapSupport, + handleFileException, + isNullOrUndefined, +} from '../../utils'; export class JsonFileStorage extends Storage { private fd: number | null = null; @@ -19,46 +25,42 @@ 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.dbName, - FileType.PerformanceRecords, - error as NodeJS.ErrnoException, - this.logPrefix - ); - } - await release(); + AsyncLock.acquire(AsyncLockType.performance) + .then(() => { + const fileData = readFileSync(this.dbName, 'utf8'); + const performanceRecords: Statistics[] = fileData + ? (JSON.parse(fileData) as Statistics[]) + : []; + performanceRecords.push(performanceStatistics); + writeFileSync(this.dbName, JSONStringifyWithMapSupport(performanceRecords, 2), 'utf8'); }) - .catch(() => { - /* This is intentional */ + .catch((error) => { + 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) { - this.fd = fs.openSync(this.dbName, 'a+'); + if (isNullOrUndefined(this?.fd)) { + if (!existsSync(dirname(this.dbName))) { + mkdirSync(dirname(this.dbName), { recursive: true }); + } + this.fd = openSync(this.dbName, 'a+'); } } catch (error) { - FileUtils.handleFileException( + handleFileException( this.dbName, FileType.PerformanceRecords, error as NodeJS.ErrnoException, - this.logPrefix + this.logPrefix, ); } } @@ -66,23 +68,23 @@ export class JsonFileStorage extends Storage { public close(): void { try { if (this?.fd) { - fs.closeSync(this.fd); + closeSync(this.fd); this.fd = null; } } catch (error) { - FileUtils.handleFileException( + handleFileException( this.dbName, FileType.PerformanceRecords, error as NodeJS.ErrnoException, - this.logPrefix + this.logPrefix, ); } } private checkPerformanceRecordsFile(): void { if (!this?.fd) { - throw new Error( - `${this.logPrefix} Performance records '${this.dbName}' file descriptor not found` + throw new BaseError( + `${this.logPrefix} Performance records '${this.dbName}' file descriptor not found`, ); } }