f52a4df7ef3ee5f45f2eeb10c40e1f2b900c9e9b
[e-mobility-charging-stations-simulator.git] / src / utils / FileUtils.ts
1 import { type FSWatcher, readFileSync, watch, type WatchListener } from 'node:fs'
2
3 import type { FileType, JsonType } from '../types/index.js'
4
5 import { handleFileException } from './ErrorUtils.js'
6 import { logger } from './Logger.js'
7 import { isNotEmptyString } from './Utils.js'
8
9 export const watchJsonFile = <T extends JsonType>(
10 file: string,
11 fileType: FileType,
12 logPrefix: string,
13 refreshedVariable?: T,
14 listener: WatchListener<string> = (event, filename) => {
15 if (isNotEmptyString(filename) && event === 'change') {
16 try {
17 logger.debug(`${logPrefix} ${fileType} file ${file} have changed, reload`)
18 refreshedVariable != null &&
19 (refreshedVariable = JSON.parse(readFileSync(file, 'utf8')) as T)
20 } catch (error) {
21 handleFileException(file, fileType, error as NodeJS.ErrnoException, logPrefix, {
22 throwError: false,
23 })
24 }
25 }
26 }
27 ): FSWatcher | undefined => {
28 if (isNotEmptyString(file)) {
29 try {
30 return watch(file, listener)
31 } catch (error) {
32 handleFileException(file, fileType, error as NodeJS.ErrnoException, logPrefix, {
33 throwError: false,
34 })
35 }
36 } else {
37 logger.info(`${logPrefix} No ${fileType} file to watch given. Not monitoring its changes`)
38 }
39 }