X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Futils%2FUtils.ts;h=58e9094c7a601bcd587cf59e6fd79b32a8823b95;hb=5f742aac345f2eb8897c24651d00c7fb43dabbf8;hp=73bb0ba927d2edce72ddf493635915a461d85051;hpb=0bd926c1e06a31ac2afd1f932857eddce54f1e91;p=e-mobility-charging-stations-simulator.git diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts index 73bb0ba9..58e9094c 100644 --- a/src/utils/Utils.ts +++ b/src/utils/Utils.ts @@ -12,7 +12,7 @@ import { minutesToSeconds, secondsToMilliseconds, } from 'date-fns'; -import clone from 'just-clone'; +import deepClone from 'deep-clone'; import { Constants } from './Constants'; import { type TimestampedData, WebSocketCloseEventStatusString } from '../types'; @@ -70,19 +70,20 @@ export const isValidTime = (date: unknown): boolean => { return false; }; -export const convertToDate = ( - value: Date | string | number | null | undefined, -): Date | null | undefined => { +export const convertToDate = (value: Date | string | number | undefined): Date | undefined => { if (isNullOrUndefined(value)) { - return value as null | undefined; + return value as undefined; } if (isDate(value)) { return value as Date; } if (isString(value) || typeof value === 'number') { - return new Date(value!); + const valueToDate = new Date(value as string | number); + if (isNaN(valueToDate.getTime())) { + throw new Error(`Cannot convert to date: '${value as string | number}'`); + } + return valueToDate; } - return null; }; export const convertToInt = (value: unknown): number => { @@ -100,8 +101,7 @@ export const convertToInt = (value: unknown): number => { changedValue = parseInt(value as string); } if (isNaN(changedValue)) { - // eslint-disable-next-line @typescript-eslint/no-base-to-string - throw new Error(`Cannot convert to integer: ${value.toString()}`); + throw new Error(`Cannot convert to integer: '${String(value)}'`); } return changedValue; }; @@ -115,8 +115,7 @@ export const convertToFloat = (value: unknown): number => { changedValue = parseFloat(value as string); } if (isNaN(changedValue)) { - // eslint-disable-next-line @typescript-eslint/no-base-to-string - throw new Error(`Cannot convert to float: ${value.toString()}`); + throw new Error(`Cannot convert to float: '${String(value)}'`); } return changedValue; }; @@ -206,8 +205,19 @@ export const isObject = (item: unknown): boolean => { ); }; -export const cloneObject = (object: T): T => { - return clone(object); +type CloneableData = + | number + | string + | boolean + | null + | undefined + | Date + | CloneableData[] + | { [key: string]: CloneableData }; + +export const cloneObject = (object: T): T => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + return deepClone(object as CloneableData) as T; }; export const hasOwnProp = (object: unknown, property: PropertyKey): boolean => { @@ -270,12 +280,12 @@ export const insertAt = (str: string, subStr: string, pos: number): string => * Computes the retry delay in milliseconds using an exponential backoff algorithm. * * @param retryNumber - the number of retries that have already been attempted - * @param maxDelayRatio - the maximum ratio of the delay that can be randomized + * @param delayFactor - the base delay factor in milliseconds * @returns delay in milliseconds */ -export const exponentialDelay = (retryNumber = 0, maxDelayRatio = 0.2): number => { - const delay = Math.pow(2, retryNumber) * 100; - const randomSum = delay * maxDelayRatio * secureRandom(); // 0-(maxDelayRatio*100)% of the delay +export const exponentialDelay = (retryNumber = 0, delayFactor = 100): number => { + const delay = Math.pow(2, retryNumber) * delayFactor; + const randomSum = delay * 0.2 * secureRandom(); // 0-20% of the delay return delay + randomSum; }; @@ -372,3 +382,18 @@ export const isArraySorted = (array: T[], compareFn: (a: T, b: T) => number): } return true; }; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const once = ( + fn: (...args: A) => R, + context: T, +): ((...args: A) => R) => { + let result: R; + return (...args: A) => { + if (fn) { + result = fn.apply(context, args); + (fn as unknown as undefined) = (context as unknown as undefined) = undefined; + } + return result; + }; +};