-
- /**
- * Convert websocket error code to human readable string message
- *
- * @param code - websocket error code
- * @returns human readable string message
- */
- public 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)';
+ return true;
+};
+
+export const insertAt = (str: string, subStr: string, pos: number): string =>
+ `${str.slice(0, pos)}${subStr}${str.slice(pos)}`;
+
+/**
+ * Computes the retry delay in milliseconds using an exponential backoff algorithm.
+ *
+ * @param retryNumber - the number of retries that have already been attempted
+ * @param delayFactor - the base delay factor in milliseconds
+ * @returns delay in milliseconds
+ */
+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;
+};
+
+/**
+ * Generates a cryptographically secure random number in the [0,1[ range
+ *
+ * @returns A number in the [0,1[ range
+ */
+export const secureRandom = (): number => {
+ return getRandomValues(new Uint32Array(1))[0] / 0x100000000;
+};
+
+export const JSONStringifyWithMapSupport = (
+ obj: Record<string, unknown> | Record<string, unknown>[] | Map<unknown, unknown>,
+ space?: number,
+): string => {
+ return JSON.stringify(
+ obj,
+ (_, value: Record<string, unknown>) => {
+ if (value instanceof Map) {
+ return {
+ dataType: 'Map',
+ value: [...value],
+ };