build(deps): apply updates
[e-mobility-charging-stations-simulator.git] / src / worker / WorkerUtils.ts
index 7c72ff3e57fcac90ed51150f7780727a754df808..776d7174c664f24a8d1e8bcb8ab59b5d3ee5706b 100644 (file)
@@ -1,21 +1,38 @@
+import { getRandomValues } from 'node:crypto';
+
 import chalk from 'chalk';
 
-export class WorkerUtils {
-  private constructor() {
-    // This is intentional
-  }
+export const sleep = async (milliSeconds: number): Promise<NodeJS.Timeout> => {
+  return new Promise<NodeJS.Timeout>((resolve) => setTimeout(resolve as () => void, milliSeconds));
+};
 
-  public static async sleep(milliSeconds: number): Promise<NodeJS.Timeout> {
-    return new Promise((resolve) => setTimeout(resolve as () => void, milliSeconds));
+export const defaultExitHandler = (code: number): void => {
+  if (code === 0) {
+    console.info(chalk.green('Worker exited successfully'));
+  } else if (code === 1) {
+    console.info(chalk.green('Worker terminated successfully'));
+  } else if (code > 1) {
+    console.error(chalk.red(`Worker exited with exit code: ${code.toString()}`));
   }
+};
+
+export const defaultErrorHandler = (error: Error): void => {
+  console.error(chalk.red('Worker errored: '), error);
+};
 
-  public static defaultExitHandler = (code: number): void => {
-    if (code !== 0) {
-      console.error(chalk.red(`Worker exited with error exit code: ${code.toString()}`));
-    }
-  };
+export const randomizeDelay = (delay: number): number => {
+  const random = secureRandom();
+  const sign = random < 0.5 ? -1 : 1;
+  const randomSum = delay * 0.2 * random; // 0-20% of the delay
+  return delay + sign * randomSum;
+};
 
-  public static defaultErrorHandler = (error: Error): void => {
-    console.error(chalk.red('Worker errored: ', error));
-  };
-}
+/**
+ * Generates a cryptographically secure random number in the [0,1[ range
+ *
+ * @returns A number in the [0,1[ range
+ * @internal
+ */
+const secureRandom = (): number => {
+  return getRandomValues(new Uint32Array(1))[0] / 0x100000000;
+};