+import Configuration from './Configuration';
+import { WebSocketCloseEventStatusString } from '../types/WebSocket';
+import { WorkerProcessType } from '../types/Worker';
import { v4 as uuid } from 'uuid';
export default class Utils {
}
static secondsToHHMMSS(seconds: number): string {
- return new Date(seconds * 1000).toISOString().substr(11, 8);
+ return Utils.milliSecondsToHHMMSS(seconds * 1000);
}
static milliSecondsToHHMMSS(milliSeconds: number): string {
return new Date(milliSeconds).toISOString().substr(11, 8);
}
- static removeExtraEmptyLines(tab): void {
+ static removeExtraEmptyLines(tab: string[]): void {
// Start from the end
for (let i = tab.length - 1; i > 0; i--) {
// Two consecutive empty lines?
}
static roundTo(number: number, scale: number): number {
- return Utils.convertToFloat(number.toFixed(scale));
+ const roundPower = Math.pow(10, scale);
+ return Math.round(number * roundPower) / roundPower;
+ }
+
+ static truncTo(number: number, scale: number): number {
+ const truncPower = Math.pow(10, scale);
+ return Math.trunc(number * truncPower) / truncPower;
}
static getRandomFloatRounded(max: number, min = 0, scale = 2): number {
return date.toLocaleString() + prefixString;
}
- static objectHasOwnProperty(object, property): boolean {
- return Object.prototype.hasOwnProperty.call(object, property);
- }
-
- static cloneObject(object) {
- return JSON.parse(JSON.stringify(object));
+ static cloneObject<T>(object: T): T {
+ return JSON.parse(JSON.stringify(object)) as T;
}
static isIterable(obj): boolean {
return typeof value === 'string';
}
- static isUndefined(value) {
+ static isUndefined(value): boolean {
return typeof value === 'undefined';
}
static isNullOrUndefined(value): boolean {
- // eslint-disable-next-line no-eq-null
+ // eslint-disable-next-line no-eq-null, eqeqeq
if (value == null) {
return true;
}
}
static isEmptyArray(object): boolean {
+ if (!object) {
+ return true;
+ }
if (Array.isArray(object) && object.length > 0) {
return false;
}
static isEmptyObject(obj): boolean {
return !Object.keys(obj).length;
}
+
+ static insertAt = (str: string, subStr: string, pos: number): string => `${str.slice(0, pos)}${subStr}${str.slice(pos)}`;
+
+ /**
+ * @param {number} [retryNumber=0]
+ * @return {number} - delay in milliseconds
+ */
+ static exponentialDelay(retryNumber = 0): number {
+ const delay = Math.pow(2, retryNumber) * 100;
+ const randomSum = delay * 0.2 * Math.random(); // 0-20% of the delay
+ return delay + randomSum;
+ }
+
+ static getWebSocketCloseEventStatusString(code: number): string {
+ if (code >= 0 && code <= 999) {
+ return '(Unused)';
+ } else if (code >= 1016) {
+ if (code <= 1999) {
+ return '(For WebSocket standard)';
+ } else if (code <= 2999) {
+ return '(For WebSocket extensions)';
+ } else if (code <= 3999) {
+ return '(For libraries and frameworks)';
+ } else if (code <= 4999) {
+ return '(For applications)';
+ }
+ }
+ if (!Utils.isUndefined(WebSocketCloseEventStatusString[code])) {
+ return WebSocketCloseEventStatusString[code] as string;
+ }
+ return '(Unknown)';
+ }
+
+ static workerPoolInUse(): boolean {
+ return Configuration.getWorkerProcess() === WorkerProcessType.DYNAMIC_POOL || Configuration.getWorkerProcess() === WorkerProcessType.STATIC_POOL;
+ }
+
+ static workerDynamicPoolInUse(): boolean {
+ return Configuration.getWorkerProcess() === WorkerProcessType.DYNAMIC_POOL;
+ }
}