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,
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
// eslint-disable-next-line @typescript-eslint/no-extraneous-class
export class Configuration {
- public static configurationChangeCallback: () => Promise<void>
+ public static configurationChangeCallback?: () => Promise<void>
private static readonly configurationFile = join(
dirname(fileURLToPath(import.meta.url)),
public static getStationTemplateUrls (): StationTemplateUrl[] | undefined {
const checkDeprecatedConfigurationKeysOnce = once(
- Configuration.checkDeprecatedConfigurationKeys.bind(Configuration),
- Configuration
+ Configuration.checkDeprecatedConfigurationKeys.bind(Configuration)
)
checkDeprecatedConfigurationKeysOnce()
return Configuration.getConfigurationData()?.stationTemplateUrls
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()![
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>(
+ uiServerConfiguration = mergeDeepRight(
uiServerConfiguration,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
Configuration.getConfigurationData()!.uiServer!
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
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
...(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
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
] 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`
`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',
ConfigurationSection.worker,
'Not publicly exposed to end users'
)
+ Configuration.warnDeprecatedConfigurationKey(
+ 'elementStartDelay',
+ ConfigurationSection.worker,
+ "Use 'elementAddDelay' instead"
+ )
if (
Configuration.getConfigurationData()?.worker?.processType ===
('staticPool' as WorkerProcessType)
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<string, unknown>
+ )[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${
}
}
- private static getConfigurationData (): ConfigurationData | undefined {
+ public static getConfigurationData (): ConfigurationData | undefined {
if (Configuration.configurationData == null) {
try {
Configuration.configurationData = JSON.parse(
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`
)
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(() => {