fix: use UUIDv4 for message id to avoid integer overflow
authorJérôme Benoit <jerome.benoit@sap.com>
Sun, 2 Apr 2023 13:27:54 +0000 (15:27 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Sun, 2 Apr 2023 13:27:54 +0000 (15:27 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
CHANGELOG.md
src/pools/abstract-pool.ts
src/utility-types.ts

index 36db7f829fa91065b5fda757ae6753ed32faf0a6..b21ed16fd7ff9b08229f84a1f8bcca0605446b2c 100644 (file)
@@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Fixed
 
 - Ensure trimmable characters are checked at pool initialization.
+- Fix message id integer overflow.
 
 ## [2.3.10] - 2023-03-18
 
index 1d4e7ae0d07f18ede013a5fefda5f7430302584c..d63c19ac7eb008443b6d2b80fc1f1e0bfec02092 100644 (file)
@@ -50,14 +50,9 @@ export abstract class AbstractPool<
    * When we receive a message from the worker we get a map entry and resolve/reject the promise based on the message.
    */
   protected promiseMap: Map<
-  number,
+  string,
   PromiseWorkerResponseWrapper<Worker, Response>
-  > = new Map<number, PromiseWorkerResponseWrapper<Worker, Response>>()
-
-  /**
-   * Id of the next message.
-   */
-  protected nextMessageId: number = 0
+  > = new Map<string, PromiseWorkerResponseWrapper<Worker, Response>>()
 
   /**
    * Worker choice strategy instance implementing the worker choice algorithm.
@@ -158,7 +153,7 @@ export abstract class AbstractPool<
   }
 
   /**
-   * Gets worker key.
+   * Gets the given worker key.
    *
    * @param worker - The worker.
    * @returns The worker key.
@@ -220,16 +215,15 @@ export abstract class AbstractPool<
 
   /** {@inheritDoc} */
   public async execute (data: Data): Promise<Response> {
-    // Configure worker to handle message with the specified task
     const worker = this.chooseWorker()
-    const res = this.internalExecute(worker, this.nextMessageId)
+    const messageId = crypto.randomUUID()
+    const res = this.internalExecute(worker, messageId)
     this.checkAndEmitBusy()
     this.sendToWorker(worker, {
       // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
       data: data ?? ({} as Data),
-      id: this.nextMessageId
+      id: messageId
     })
-    ++this.nextMessageId
     // eslint-disable-next-line @typescript-eslint/return-await
     return res
   }
@@ -398,7 +392,7 @@ export abstract class AbstractPool<
 
   private async internalExecute (
     worker: Worker,
-    messageId: number
+    messageId: string
   ): Promise<Response> {
     this.beforePromiseWorkerResponseHook(worker)
     return await new Promise<Response>((resolve, reject) => {
@@ -431,7 +425,7 @@ export abstract class AbstractPool<
   }
 
   /**
-   * Get tasks usage of the given worker.
+   * Gets tasks usage of the given worker.
    *
    * @param worker - Worker which tasks usage is returned.
    */
index 2d142f860e4b19893a131e7cbc872abda5f8270a..fba39012e995b24cf135d5050b7d86348b719fb3 100644 (file)
@@ -22,7 +22,7 @@ export interface MessageValue<
   /**
    * Id of the message.
    */
-  readonly id?: number
+  readonly id?: string
   /**
    * Kill code.
    */