-import { WebSocketCloseEventStatusString } from '../types';
-
-export class Utils {
- private constructor() {
- // This is intentional
- }
-
- public static logPrefix = (prefixString = ''): string => {
- return `${new Date().toLocaleString()}${prefixString}`;
- };
-
- public static generateUUID(): string {
- return crypto.randomUUID();
- }
-
- public static validateUUID(uuid: string): boolean {
- return /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(
- uuid
- );
- }
-
- public static async sleep(milliSeconds: number): Promise<NodeJS.Timeout> {
- return new Promise((resolve) => setTimeout(resolve as () => void, milliSeconds));
- }
-
- public static formatDurationMilliSeconds(duration: number): string {
- duration = Utils.convertToInt(duration);
- const hours = Math.floor(duration / (3600 * 1000));
- const minutes = Math.floor((duration / 1000 - hours * 3600) / 60);
- const seconds = duration / 1000 - hours * 3600 - minutes * 60;
- let hoursStr = hours.toString();
- let minutesStr = minutes.toString();
- let secondsStr = seconds.toString();
-
- if (hours < 10) {
- hoursStr = `0${hours.toString()}`;
- }
- if (minutes < 10) {
- minutesStr = `0${minutes.toString()}`;
- }
- if (seconds < 10) {
- secondsStr = `0${seconds.toString()}`;
- }
- return `${hoursStr}:${minutesStr}:${secondsStr.substring(0, 6)}`;
- }
-
- public static formatDurationSeconds(duration: number): string {
- return Utils.formatDurationMilliSeconds(duration * 1000);
- }
-
- public static convertToDate(
- value: Date | string | number | null | undefined
- ): Date | null | undefined {
- if (Utils.isNullOrUndefined(value)) {
- return value as null | undefined;
- }
- if (value instanceof Date) {
+import { type TimestampedData, WebSocketCloseEventStatusString } from '../types';
+
+export const logPrefix = (prefixString = ''): string => {
+ return `${new Date().toLocaleString()}${prefixString}`;
+};
+
+export const generateUUID = (): string => {
+ return randomUUID();
+};
+
+export const validateUUID = (uuid: string): boolean => {
+ return /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(
+ uuid,
+ );
+};
+
+export const sleep = async (milliSeconds: number): Promise<NodeJS.Timeout> => {
+ return new Promise<NodeJS.Timeout>((resolve) => setTimeout(resolve as () => void, milliSeconds));
+};
+
+export const formatDurationMilliSeconds = (duration: number): string => {
+ duration = convertToInt(duration);
+ const days = Math.floor(duration / (24 * 3600 * 1000));
+ const hours = Math.floor(millisecondsToHours(duration) - days * 24);
+ const minutes = Math.floor(millisecondsToMinutes(duration) - days * 24 * 60 - hours * 60);
+ const seconds = Math.floor(
+ millisecondsToSeconds(duration) - days * 24 * 3600 - hours * 3600 - minutes * 60,
+ );
+ return formatDuration({
+ days,
+ hours,
+ minutes,
+ seconds,
+ });
+};
+
+export const formatDurationSeconds = (duration: number): string => {
+ return formatDurationMilliSeconds(secondsToMilliseconds(duration));
+};
+
+// More efficient date validation function than the one provided by date-fns
+export const isValidDate = (date: unknown): boolean => {
+ if (typeof date === 'number') {
+ return !isNaN(date);
+ } else if (isDate(date)) {
+ return !isNaN((date as Date).getTime());
+ }
+ return false;
+};
+
+export const convertToDate = (
+ value: Date | string | number | null | undefined,
+): Date | null | undefined => {
+ if (isNullOrUndefined(value)) {
+ return value as null | undefined;
+ }
+ if (value instanceof Date) {
+ return value;
+ }
+ if (isString(value) || typeof value === 'number') {
+ return new Date(value!);
+ }
+ return null;
+};
+
+export const convertToInt = (value: unknown): number => {
+ if (!value) {
+ return 0;
+ }
+ let changedValue: number = value as number;
+ if (Number.isSafeInteger(value)) {
+ return value as number;
+ }
+ if (typeof value === 'number') {
+ return Math.trunc(value);
+ }
+ if (isString(value)) {
+ 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()}`);
+ }
+ return changedValue;
+};
+
+export const convertToFloat = (value: unknown): number => {
+ if (!value) {
+ return 0;
+ }
+ let changedValue: number = value as number;
+ if (isString(value)) {
+ 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()}`);
+ }
+ return changedValue;
+};
+
+export const convertToBoolean = (value: unknown): boolean => {
+ let result = false;
+ if (value) {
+ // Check the type
+ if (typeof value === 'boolean') {