X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Futils%2FConfiguration.ts;h=cd3e0e8af807453cf6ef25b61f6539b5534c26e3;hb=3024d5b2497e97bdd355243a5d236fa3f7a4d874;hp=021bce021bfd661becfc99dabc85c0d9b3dbd815;hpb=66a7748ddeda8c94d7562a1ce58d440319654a4c;p=e-mobility-charging-stations-simulator.git diff --git a/src/utils/Configuration.ts b/src/utils/Configuration.ts index 021bce02..cd3e0e8a 100644 --- a/src/utils/Configuration.ts +++ b/src/utils/Configuration.ts @@ -4,20 +4,11 @@ import { env } from 'node:process' import { fileURLToPath } from 'node:url' import chalk from 'chalk' -import merge from 'just-merge' +import { mergeDeepRight, once } from 'rambda' -import { - buildPerformanceUriFilePath, - checkWorkerElementsPerWorker, - checkWorkerProcessType, - getDefaultPerformanceStorageUri, - handleFileException, - logPrefix -} from './ConfigurationUtils.js' -import { Constants } from './Constants.js' -import { hasOwnProp, isCFEnvironment, isUndefined, once } from './Utils.js' import { ApplicationProtocol, + ApplicationProtocolVersion, type ConfigurationData, ConfigurationSection, FileType, @@ -30,12 +21,22 @@ import { type WorkerConfiguration } from '../types/index.js' import { - DEFAULT_ELEMENT_START_DELAY, + DEFAULT_ELEMENT_ADD_DELAY, DEFAULT_POOL_MAX_SIZE, DEFAULT_POOL_MIN_SIZE, DEFAULT_WORKER_START_DELAY, WorkerProcessType } from '../worker/index.js' +import { + buildPerformanceUriFilePath, + checkWorkerElementsPerWorker, + checkWorkerProcessType, + getDefaultPerformanceStorageUri, + handleFileException, + logPrefix +} from './ConfigurationUtils.js' +import { Constants } from './Constants.js' +import { hasOwnProp, isCFEnvironment } from './Utils.js' type ConfigurationSectionType = | LogConfiguration @@ -45,7 +46,7 @@ type ConfigurationSectionType = // eslint-disable-next-line @typescript-eslint/no-extraneous-class export class Configuration { - public static configurationChangeCallback: () => Promise + public static configurationChangeCallback?: () => Promise private static readonly configurationFile = join( dirname(fileURLToPath(import.meta.url)), @@ -81,8 +82,7 @@ export class Configuration { public static getStationTemplateUrls (): StationTemplateUrl[] | undefined { const checkDeprecatedConfigurationKeysOnce = once( - Configuration.checkDeprecatedConfigurationKeys.bind(Configuration), - Configuration + Configuration.checkDeprecatedConfigurationKeys.bind(Configuration) ) checkDeprecatedConfigurationKeysOnce() return Configuration.getConfigurationData()?.stationTemplateUrls @@ -90,9 +90,7 @@ export class Configuration { public static getSupervisionUrls (): string | string[] | undefined { if ( - !isUndefined( - Configuration.getConfigurationData()?.['supervisionURLs' as keyof ConfigurationData] - ) + Configuration.getConfigurationData()?.['supervisionURLs' as keyof ConfigurationData] != null ) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion Configuration.getConfigurationData()!.supervisionUrls = Configuration.getConfigurationData()![ @@ -157,13 +155,14 @@ export class Configuration { let uiServerConfiguration: UIServerConfiguration = { enabled: false, type: ApplicationProtocol.WS, + version: ApplicationProtocolVersion.VERSION_11, options: { host: Constants.DEFAULT_UI_SERVER_HOST, port: Constants.DEFAULT_UI_SERVER_PORT } } if (hasOwnProp(Configuration.getConfigurationData(), ConfigurationSection.uiServer)) { - uiServerConfiguration = merge( + uiServerConfiguration = mergeDeepRight( uiServerConfiguration, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion Configuration.getConfigurationData()!.uiServer! @@ -172,23 +171,43 @@ export class Configuration { if (isCFEnvironment()) { delete uiServerConfiguration.options?.host // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - uiServerConfiguration.options!.port = parseInt(env.PORT!) + uiServerConfiguration.options!.port = Number.parseInt(env.PORT!) } return uiServerConfiguration } private static buildPerformanceStorageSection (): StorageConfiguration { - let storageConfiguration: StorageConfiguration = { - enabled: false, - type: StorageType.JSON_FILE, - uri: getDefaultPerformanceStorageUri(StorageType.JSON_FILE) + let storageConfiguration: StorageConfiguration + switch (Configuration.getConfigurationData()?.performanceStorage?.type) { + case StorageType.SQLITE: + storageConfiguration = { + enabled: false, + type: StorageType.SQLITE, + uri: getDefaultPerformanceStorageUri(StorageType.SQLITE) + } + break + case StorageType.JSON_FILE: + storageConfiguration = { + enabled: false, + type: StorageType.JSON_FILE, + uri: getDefaultPerformanceStorageUri(StorageType.JSON_FILE) + } + break + case StorageType.NONE: + default: + storageConfiguration = { + enabled: true, + type: StorageType.NONE + } + break } if (hasOwnProp(Configuration.getConfigurationData(), ConfigurationSection.performanceStorage)) { storageConfiguration = { ...storageConfiguration, ...Configuration.getConfigurationData()?.performanceStorage, - ...(Configuration.getConfigurationData()?.performanceStorage?.type === - StorageType.JSON_FILE && + ...((Configuration.getConfigurationData()?.performanceStorage?.type === + StorageType.JSON_FILE || + Configuration.getConfigurationData()?.performanceStorage?.type === StorageType.SQLITE) && Configuration.getConfigurationData()?.performanceStorage?.uri != null && { uri: buildPerformanceUriFilePath( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -256,10 +275,11 @@ export class Configuration { processType: WorkerProcessType.workerSet, startDelay: DEFAULT_WORKER_START_DELAY, elementsPerWorker: 'auto', - elementStartDelay: DEFAULT_ELEMENT_START_DELAY, + elementAddDelay: DEFAULT_ELEMENT_ADD_DELAY, poolMinSize: DEFAULT_POOL_MIN_SIZE, poolMaxSize: DEFAULT_POOL_MAX_SIZE } + const deprecatedWorkerConfiguration: WorkerConfiguration = { ...(hasOwnProp(Configuration.getConfigurationData(), 'workerProcess') && { processType: Configuration.getConfigurationData()?.workerProcess @@ -270,8 +290,11 @@ export class Configuration { ...(hasOwnProp(Configuration.getConfigurationData(), 'chargingStationsPerWorker') && { elementsPerWorker: Configuration.getConfigurationData()?.chargingStationsPerWorker }), - ...(hasOwnProp(Configuration.getConfigurationData(), 'elementStartDelay') && { - elementStartDelay: Configuration.getConfigurationData()?.elementStartDelay + ...(hasOwnProp(Configuration.getConfigurationData(), 'elementAddDelay') && { + elementAddDelay: Configuration.getConfigurationData()?.elementAddDelay + }), + ...(hasOwnProp(Configuration.getConfigurationData()?.worker, 'elementStartDelay') && { + elementAddDelay: Configuration.getConfigurationData()?.worker?.elementStartDelay }), ...(hasOwnProp(Configuration.getConfigurationData(), 'workerPoolMinSize') && { poolMinSize: Configuration.getConfigurationData()?.workerPoolMinSize @@ -318,9 +341,8 @@ export class Configuration { undefined, "Use 'stationTemplateUrls' instead" ) - !isUndefined( - Configuration.getConfigurationData()?.['stationTemplateURLs' as keyof ConfigurationData] - ) && + Configuration.getConfigurationData()?.['stationTemplateURLs' as keyof ConfigurationData] != + null && // eslint-disable-next-line @typescript-eslint/no-non-null-assertion (Configuration.getConfigurationData()!.stationTemplateUrls = // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -329,7 +351,8 @@ export class Configuration { ] as StationTemplateUrl[]) Configuration.getConfigurationData()?.stationTemplateUrls.forEach( (stationTemplateUrl: StationTemplateUrl) => { - if (!isUndefined(stationTemplateUrl?.['numberOfStation' as keyof StationTemplateUrl])) { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (stationTemplateUrl['numberOfStation' as keyof StationTemplateUrl] != null) { console.error( `${chalk.green(logPrefix())} ${chalk.red( `Deprecated configuration key 'numberOfStation' usage for template file '${stationTemplateUrl.file}' in 'stationTemplateUrls'. Use 'numberOfStations' instead` @@ -377,9 +400,9 @@ export class Configuration { `Use '${ConfigurationSection.worker}' section to define the number of element(s) per worker instead` ) Configuration.warnDeprecatedConfigurationKey( - 'elementStartDelay', + 'elementAddDelay', undefined, - `Use '${ConfigurationSection.worker}' section to define the worker's element start delay instead` + `Use '${ConfigurationSection.worker}' section to define the worker's element add delay instead` ) Configuration.warnDeprecatedConfigurationKey( 'workerPoolMinSize', @@ -406,6 +429,11 @@ export class Configuration { ConfigurationSection.worker, 'Not publicly exposed to end users' ) + Configuration.warnDeprecatedConfigurationKey( + 'elementStartDelay', + ConfigurationSection.worker, + "Use 'elementAddDelay' instead" + ) if ( Configuration.getConfigurationData()?.worker?.processType === ('staticPool' as WorkerProcessType) @@ -485,33 +513,27 @@ export class Configuration { private static warnDeprecatedConfigurationKey ( key: string, - sectionName?: string, + configurationSection?: ConfigurationSection, logMsgToAppend = '' ): void { if ( - sectionName != null && - !isUndefined( - Configuration.getConfigurationData()?.[sectionName as keyof ConfigurationData] - ) && - !isUndefined( - ( - Configuration.getConfigurationData()?.[sectionName as keyof ConfigurationData] as Record< - string, - unknown - > - )?.[key] - ) + configurationSection != null && + Configuration.getConfigurationData()?.[configurationSection as keyof ConfigurationData] != + null && + ( + Configuration.getConfigurationData()?.[ + configurationSection as keyof ConfigurationData + ] as Record + )[key] != null ) { console.error( `${chalk.green(logPrefix())} ${chalk.red( - `Deprecated configuration key '${key}' usage in section '${sectionName}'${ + `Deprecated configuration key '${key}' usage in section '${configurationSection}'${ logMsgToAppend.trim().length > 0 ? `. ${logMsgToAppend}` : '' }` )}` ) - } else if ( - !isUndefined(Configuration.getConfigurationData()?.[key as keyof ConfigurationData]) - ) { + } else if (Configuration.getConfigurationData()?.[key as keyof ConfigurationData] != null) { console.error( `${chalk.green(logPrefix())} ${chalk.red( `Deprecated configuration key '${key}' usage${ @@ -522,7 +544,7 @@ export class Configuration { } } - private static getConfigurationData (): ConfigurationData | undefined { + public static getConfigurationData (): ConfigurationData | undefined { if (Configuration.configurationData == null) { try { Configuration.configurationData = JSON.parse( @@ -549,11 +571,11 @@ export class Configuration { if ( !Configuration.configurationFileReloading && // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - filename!.trim()!.length > 0 && + filename!.trim().length > 0 && event === 'change' ) { Configuration.configurationFileReloading = true - const consoleWarnOnce = once(console.warn, this) + const consoleWarnOnce = once(console.warn) consoleWarnOnce( `${chalk.green(logPrefix())} ${chalk.yellow( `${FileType.Configuration} ${this.configurationFile} file have changed, reload` @@ -561,9 +583,9 @@ export class Configuration { ) delete Configuration.configurationData Configuration.configurationSectionCache.clear() - if (!isUndefined(Configuration.configurationChangeCallback)) { + if (Configuration.configurationChangeCallback != null) { Configuration.configurationChangeCallback() - .catch((error) => { + .catch((error: unknown) => { throw typeof error === 'string' ? new Error(error) : error }) .finally(() => {