X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Futils%2FUtils.ts;h=366ccf98a96d182f55c67b9c2448d076be94e674;hb=6a4032b5d8f3cbaa18d3beddcdfe9d335c1cba90;hp=808ef380d170b2a5a11acfeaa96e7d23b49e1040;hpb=8664faa4267611c6f15a5e0d7cd77c6ba72eb7ce;p=e-mobility-charging-stations-simulator.git diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts index 808ef380..366ccf98 100644 --- a/src/utils/Utils.ts +++ b/src/utils/Utils.ts @@ -1,5 +1,5 @@ -import { randomBytes, randomInt, randomUUID, webcrypto } from 'node:crypto'; -import { inspect } from 'node:util'; +import { getRandomValues, randomBytes, randomInt, randomUUID } from 'node:crypto'; +import { env, nextTick } from 'node:process'; import { formatDuration, @@ -36,6 +36,9 @@ export const sleep = async (milliSeconds: number): Promise => { export const formatDurationMilliSeconds = (duration: number): string => { duration = convertToInt(duration); + if (duration < 0) { + throw new RangeError('Duration cannot be negative'); + } const days = Math.floor(duration / (24 * 3600 * 1000)); const hours = Math.floor(millisecondsToHours(duration) - days * 24); const minutes = Math.floor( @@ -47,6 +50,9 @@ export const formatDurationMilliSeconds = (duration: number): string => { hoursToSeconds(hours) - minutesToSeconds(minutes), ); + if (days === 0 && hours === 0 && minutes === 0 && seconds === 0) { + return formatDuration({ seconds }, { zero: true }); + } return formatDuration({ days, hours, @@ -64,22 +70,24 @@ export const isValidTime = (date: unknown): boolean => { if (typeof date === 'number') { return !isNaN(date); } else if (isDate(date)) { - return !isNaN((date as Date).getTime()); + return !isNaN(date.getTime()); } return false; }; -export const convertToDate = (value: Date | string | number | undefined): Date | undefined => { +export const convertToDate = ( + value: Date | string | number | null | undefined, +): Date | null | undefined => { if (isNullOrUndefined(value)) { - return value as undefined; + return value as null | undefined; } if (isDate(value)) { - return value as Date; + return value; } if (isString(value) || typeof value === 'number') { - const valueToDate = new Date(value as string | number); + const valueToDate = new Date(value!); if (isNaN(valueToDate.getTime())) { - throw new Error(`Cannot convert to date: '${value as string | number}'`); + throw new Error(`Cannot convert to date: '${value!}'`); } return valueToDate; } @@ -121,7 +129,7 @@ export const convertToFloat = (value: unknown): number => { export const convertToBoolean = (value: unknown): boolean => { let result = false; - if (value) { + if (value != null) { // Check the type if (typeof value === 'boolean') { return value; @@ -260,7 +268,7 @@ export const hasOwnProp = (object: unknown, property: PropertyKey): boolean => { }; export const isCFEnvironment = (): boolean => { - return !isNullOrUndefined(process.env.VCAP_APPLICATION); + return !isNullOrUndefined(env.VCAP_APPLICATION); }; export const isIterable = (obj: T): boolean => { @@ -284,7 +292,6 @@ export const isUndefined = (value: unknown): boolean => { }; export const isNullOrUndefined = (value: unknown): boolean => { - // eslint-disable-next-line eqeqeq, no-eq-null return value == null; }; @@ -324,40 +331,13 @@ export const exponentialDelay = (retryNumber = 0, delayFactor = 100): number => return delay + randomSum; }; -const isPromisePending = (promise: Promise): boolean => { - return inspect(promise).includes('pending'); -}; - -export const promiseWithTimeout = async ( - promise: Promise, - timeoutMs: number, - timeoutError: Error, - timeoutCallback: () => void = () => { - /* This is intentional */ - }, -): Promise => { - // Creates a timeout promise that rejects in timeout milliseconds - const timeoutPromise = new Promise((_, reject) => { - setTimeout(() => { - if (isPromisePending(promise)) { - timeoutCallback(); - // FIXME: The original promise shall be canceled - } - reject(timeoutError); - }, timeoutMs); - }); - - // Returns a race between timeout promise and the passed promise - return Promise.race([promise, timeoutPromise]); -}; - /** * Generates a cryptographically secure random number in the [0,1[ range * * @returns A number in the [0,1[ range */ export const secureRandom = (): number => { - return webcrypto.getRandomValues(new Uint32Array(1))[0] / 0x100000000; + return getRandomValues(new Uint32Array(1))[0] / 0x100000000; }; export const JSONStringifyWithMapSupport = ( @@ -438,3 +418,9 @@ export const min = (...args: number[]): number => export const max = (...args: number[]): number => args.reduce((maximum, num) => (maximum > num ? maximum : num), -Infinity); + +export const throwErrorInNextTick = (error: Error): void => { + nextTick(() => { + throw error; + }); +};