-import crypto from 'crypto';
+import crypto from 'node:crypto';
+import util from 'node:util';
import clone from 'just-clone';
+import Constants from './Constants';
import { WebSocketCloseEventStatusString } from '../types/WebSocket';
export default class Utils {
let secondsStr = seconds.toString();
if (hours < 10) {
- hoursStr = '0' + hours.toString();
+ hoursStr = `0${hours.toString()}`;
}
if (minutes < 10) {
- minutesStr = '0' + minutes.toString();
+ minutesStr = `0${minutes.toString()}`;
}
if (seconds < 10) {
- secondsStr = '0' + seconds.toString();
+ secondsStr = `0${seconds.toString()}`;
}
- return hoursStr + ':' + minutesStr + ':' + secondsStr.substring(0, 6);
+ return `${hoursStr}:${minutesStr}:${secondsStr.substring(0, 6)}`;
}
public static formatDurationSeconds(duration: number): string {
return sign * (randomPositiveFloat * (max - min) + min);
}
- public static getRandomInteger(max = Number.MAX_SAFE_INTEGER, min = 0): number {
- if (max < min || max < 0 || min < 0) {
- throw new RangeError('Invalid interval');
- }
+ public static getRandomInteger(max = Constants.MAX_RANDOM_INTEGER, min = 0): number {
max = Math.floor(max);
if (!Utils.isNullOrUndefined(min) && min !== 0) {
min = Math.ceil(min);
- return Math.floor(Utils.secureRandom() * (max - min + 1)) + min;
+ return Math.floor(crypto.randomInt(min, max + 1));
}
- return Math.floor(Utils.secureRandom() * (max + 1));
+ return Math.floor(crypto.randomInt(max + 1));
}
public static roundTo(numberValue: number, scale: number): number {
}
public static isObject(item: unknown): boolean {
- return item && typeof item === 'object' && Array.isArray(item) === false;
+ return (
+ Utils.isNullOrUndefined(item) === false &&
+ typeof item === 'object' &&
+ Array.isArray(item) === false
+ );
}
public static cloneObject<T extends object>(object: T): T {
return delay + randomSum;
}
+ public static isPromisePending(promise: Promise<unknown>): boolean {
+ return util.inspect(promise).includes('pending');
+ }
+
public static async promiseWithTimeout<T>(
promise: Promise<T>,
timeoutMs: number,
// Create a timeout promise that rejects in timeout milliseconds
const timeoutPromise = new Promise<never>((_, reject) => {
setTimeout(() => {
- timeoutCallback();
+ if (Utils.isPromisePending(promise)) {
+ timeoutCallback();
+ // FIXME: The original promise shall be canceled
+ }
reject(timeoutError);
}, timeoutMs);
});