fix: fix default task function handling with multiple task functions
authorJérôme Benoit <jerome.benoit@sap.com>
Fri, 5 May 2023 13:54:20 +0000 (15:54 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Fri, 5 May 2023 13:54:20 +0000 (15:54 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/worker/abstract-worker.ts
src/worker/thread-worker.ts
tests/pools/abstract/abstract-pool.test.js
tests/worker/abstract-worker.test.js

index 3ca52b69841c132f2f9e399f9aabc56a473c721e..df263b6d14ebba49768dbaea88a7e6e924f1a78d 100644 (file)
@@ -45,7 +45,7 @@ export abstract class AbstractWorker<
    *
    * @param type - The type of async event.
    * @param isMain - Whether this is the main worker or not.
-   * @param taskFunctions - Task function(s) processed by the worker when the pool's `execution` function is invoked.
+   * @param taskFunctions - Task function(s) processed by the worker when the pool's `execution` function is invoked. The first function is the default function.
    * @param mainWorker - Reference to main worker.
    * @param opts - Options for the worker.
    */
@@ -80,12 +80,7 @@ export abstract class AbstractWorker<
       this.checkAlive.bind(this)()
     }
 
-    this.mainWorker?.on(
-      'message',
-      (message: MessageValue<Data, MainWorker>) => {
-        this.messageListener(message)
-      }
-    )
+    this.mainWorker?.on('message', this.messageListener.bind(this))
   }
 
   private checkWorkerOptions (opts: WorkerOptions): void {
@@ -98,7 +93,7 @@ export abstract class AbstractWorker<
   /**
    * Checks if the `taskFunctions` parameter is passed to the constructor.
    *
-   * @param taskFunctions - The task function(s) that should be defined.
+   * @param taskFunctions - The task function(s) parameter that should be checked.
    */
   private checkTaskFunctions (
     taskFunctions:
@@ -123,6 +118,7 @@ export abstract class AbstractWorker<
     }
     this.taskFunctions = new Map<string, WorkerFunction<Data, Response>>()
     if (typeof taskFunctions !== 'function') {
+      let firstEntry = true
       for (const [name, fn] of Object.entries(taskFunctions)) {
         if (typeof fn !== 'function') {
           throw new Error(
@@ -130,6 +126,10 @@ export abstract class AbstractWorker<
           )
         }
         this.taskFunctions.set(name, fn.bind(this))
+        if (firstEntry) {
+          this.taskFunctions.set(DEFAULT_FUNCTION_NAME, fn.bind(this))
+          firstEntry = false
+        }
       }
     } else {
       this.taskFunctions.set(DEFAULT_FUNCTION_NAME, taskFunctions.bind(this))
@@ -259,6 +259,11 @@ export abstract class AbstractWorker<
       .catch(EMPTY_FUNCTION)
   }
 
+  /**
+   * Gets the task function in the given scope.
+   *
+   * @param name - Name of the function that will be returned.
+   */
   private getTaskFunction (name?: string): WorkerFunction<Data, Response> {
     name = name ?? DEFAULT_FUNCTION_NAME
     const fn = this.taskFunctions.get(name)
index ce17c59a19c0644f3b2eb188e712e29447c0c773..75cd9da505b709a954f188ab209145221c90bc84 100644 (file)
@@ -29,14 +29,22 @@ export class ThreadWorker<
   /**
    * Constructs a new poolifier thread worker.
    *
-   * @param fn - Function processed by the worker when the pool's `execution` function is invoked.
+   * @param taskFunctions - Task function(s) processed by the worker when the pool's `execution` function is invoked.
    * @param opts - Options for the worker.
    */
   public constructor (
-    fn: WorkerFunction<Data, Response> | TaskFunctions<Data, Response>,
+    taskFunctions:
+    | WorkerFunction<Data, Response>
+    | TaskFunctions<Data, Response>,
     opts: WorkerOptions = {}
   ) {
-    super('worker-thread-pool:poolifier', isMainThread, fn, parentPort, opts)
+    super(
+      'worker-thread-pool:poolifier',
+      isMainThread,
+      taskFunctions,
+      parentPort,
+      opts
+    )
   }
 
   /** @inheritDoc */
index 972587b5a44a6fc6f44ae86ae0b82ec6351328de..81ae3649f1fd70f71e103a818ee51a172870bd7d 100644 (file)
@@ -407,6 +407,8 @@ describe('Abstract pool test suite', () => {
       './tests/worker-files/cluster/testMultiTasksWorker.js'
     )
     const data = { n: 10 }
+    const result0 = await pool.execute(data)
+    expect(result0).toBe(false)
     const result1 = await pool.execute(data, 'jsonIntegerSerialization')
     expect(result1).toBe(false)
     const result2 = await pool.execute(data, 'factorial')
index 25e097234f439dc6ec68f18903440c21e95f1c10..5b42eb9d357088a6da6253c780da12dbb7230c00 100644 (file)
@@ -71,6 +71,7 @@ describe('Abstract worker test suite', () => {
       return 2
     }
     const worker = new ClusterWorker({ fn1, fn2 })
+    expect(typeof worker.taskFunctions.get('default') === 'function').toBe(true)
     expect(typeof worker.taskFunctions.get('fn1') === 'function').toBe(true)
     expect(typeof worker.taskFunctions.get('fn2') === 'function').toBe(true)
   })