X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fperformance%2Fstorage%2FJsonFileStorage.ts;h=f44d9f2b35adc56ca0d9d503e927ccfac6eae760;hb=41f18326bd0c915a2390208ab1c1973cc6c82a6e;hp=e1a9a44ed796e66e5639c45660850cb7b54fdbf9;hpb=d972af76b6d7d1d2a099d254eacf45245b5316ac;p=e-mobility-charging-stations-simulator.git diff --git a/src/performance/storage/JsonFileStorage.ts b/src/performance/storage/JsonFileStorage.ts index e1a9a44e..f44d9f2b 100644 --- a/src/performance/storage/JsonFileStorage.ts +++ b/src/performance/storage/JsonFileStorage.ts @@ -1,56 +1,57 @@ // Copyright Jerome Benoit. 2021-2023. All Rights Reserved. -import { closeSync, existsSync, mkdirSync, openSync, readFileSync, writeFileSync } from 'node:fs'; -import { dirname } from 'node:path'; +import { closeSync, existsSync, mkdirSync, openSync, writeSync } from 'node:fs' +import { dirname } from 'node:path' -import { Storage } from './Storage'; -import { BaseError } from '../../exception'; -import { FileType, type Statistics } from '../../types'; -import { AsyncLock, AsyncLockType, Constants, Utils, handleFileException } from '../../utils'; +import { Storage } from './Storage.js' +import { BaseError } from '../../exception/index.js' +import { FileType, type Statistics } from '../../types/index.js' +import { + AsyncLock, + AsyncLockType, + JSONStringifyWithMapSupport, + handleFileException +} from '../../utils/index.js' export class JsonFileStorage extends Storage { - private fd: number | null = null; + private static performanceRecords: Map - constructor(storageUri: string, logPrefix: string) { - super(storageUri, logPrefix); - this.dbName = this.storageUri.pathname; + private fd?: number + + constructor (storageUri: string, logPrefix: string) { + super(storageUri, logPrefix) + this.dbName = this.storageUri.pathname } - public storePerformanceStatistics(performanceStatistics: Statistics): void { - this.checkPerformanceRecordsFile(); - 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, - Utils.JSONStringifyWithMapSupport(performanceRecords, 2), - 'utf8' - ); - }) - .catch((error) => { - handleFileException( - this.dbName, - FileType.PerformanceRecords, - error as NodeJS.ErrnoException, - this.logPrefix - ); - }) - .finally(() => { - AsyncLock.release(AsyncLockType.performance).catch(Constants.EMPTY_FUNCTION); - }); + public storePerformanceStatistics (performanceStatistics: Statistics): void { + this.checkPerformanceRecordsFile() + JsonFileStorage.performanceRecords.set(performanceStatistics.id, performanceStatistics) + AsyncLock.runExclusive(AsyncLockType.performance, () => { + writeSync( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.fd!, + JSONStringifyWithMapSupport([...JsonFileStorage.performanceRecords.values()], 2), + 0, + 'utf8' + ) + }).catch((error) => { + handleFileException( + this.dbName, + FileType.PerformanceRecords, + error as NodeJS.ErrnoException, + this.logPrefix + ) + }) } - public open(): void { + public open (): void { + JsonFileStorage.performanceRecords = new Map() try { - if (Utils.isNullOrUndefined(this?.fd)) { + if (this.fd == null) { if (!existsSync(dirname(this.dbName))) { - mkdirSync(dirname(this.dbName), { recursive: true }); + mkdirSync(dirname(this.dbName), { recursive: true }) } - this.fd = openSync(this.dbName, 'a+'); + this.fd = openSync(this.dbName, 'w') } } catch (error) { handleFileException( @@ -58,15 +59,16 @@ export class JsonFileStorage extends Storage { FileType.PerformanceRecords, error as NodeJS.ErrnoException, this.logPrefix - ); + ) } } - public close(): void { + public close (): void { + JsonFileStorage.performanceRecords.clear() try { - if (this?.fd) { - closeSync(this.fd); - this.fd = null; + if (this.fd != null) { + closeSync(this.fd) + delete this.fd } } catch (error) { handleFileException( @@ -74,15 +76,15 @@ export class JsonFileStorage extends Storage { FileType.PerformanceRecords, error as NodeJS.ErrnoException, this.logPrefix - ); + ) } } - private checkPerformanceRecordsFile(): void { - if (!this?.fd) { + private checkPerformanceRecordsFile (): void { + if (this.fd == null) { throw new BaseError( `${this.logPrefix} Performance records '${this.dbName}' file descriptor not found` - ); + ) } } }