X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fperformance%2Fstorage%2FJSONFileStorage.ts;h=92b4faae42702a25892cad7db5604dc2fd746db5;hb=086b340c88b70646b363e8b20f6fdb9d4bfadbc3;hp=c91a14d5756c90f8b69137d391d64348c6c78a8d;hpb=247f55f4b67f4ed161ed6b2d8f076c65b52a7038;p=e-mobility-charging-stations-simulator.git diff --git a/src/performance/storage/JSONFileStorage.ts b/src/performance/storage/JSONFileStorage.ts index c91a14d5..92b4faae 100644 --- a/src/performance/storage/JSONFileStorage.ts +++ b/src/performance/storage/JSONFileStorage.ts @@ -5,6 +5,7 @@ import FileUtils from '../../utils/FileUtils'; import Statistics from '../../types/Statistics'; import { Storage } from './Storage'; import fs from 'fs'; +import lockfile from 'proper-lockfile'; export class JSONFileStorage extends Storage { private fd: number | null = null; @@ -16,19 +17,19 @@ export class JSONFileStorage extends Storage { public storePerformanceStatistics(performanceStatistics: Statistics): void { this.checkPerformanceRecordsFile(); - fs.readFile(this.dbName, 'utf8', (error, data) => { - if (error) { - FileUtils.handleFileException(this.logPrefix, Constants.PERFORMANCE_RECORDS_FILETYPE, this.dbName, error); - } else { - const performanceRecords: Statistics[] = data ? JSON.parse(data) as Statistics[] : []; - performanceRecords.push(performanceStatistics); - fs.writeFile(this.dbName, JSON.stringify(performanceRecords, null, 2), 'utf8', (err) => { - if (err) { - FileUtils.handleFileException(this.logPrefix, Constants.PERFORMANCE_RECORDS_FILETYPE, this.dbName, err); - } - }); - } - }); + 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, JSON.stringify(performanceRecords, null, 2), 'utf8'); + } catch (error) { + FileUtils.handleFileException(this.logPrefix, Constants.PERFORMANCE_RECORDS_FILETYPE, this.dbName, error); + } + await release(); + }) + .catch(() => { /* This is intentional */ }); } public open(): void {