feat: add task tunctions handling on the pool side
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Mon, 11 Sep 2023 10:41:50 +0000 (12:41 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Mon, 11 Sep 2023 10:41:50 +0000 (12:41 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
docs/api.md
src/index.ts
src/pools/abstract-pool.ts
src/pools/pool.ts
src/pools/worker-node.ts
src/pools/worker.ts
src/utility-types.ts
src/worker/abstract-worker.ts
src/worker/cluster-worker.ts
src/worker/thread-worker.ts

index 0713392631eda5f48a37719c1b07b055c6ce6db2..ad8ede83926db63389c9f8640d3036bc99815703 100644 (file)
@@ -7,7 +7,7 @@
   - [`pool = new DynamicThreadPool/DynamicClusterPool(min, max, filePath, opts)`](#pool--new-dynamicthreadpooldynamicclusterpoolmin-max-filepath-opts)
   - [`pool.execute(data, name, transferList)`](#poolexecutedata-name-transferlist)
   - [`pool.destroy()`](#pooldestroy)
-  - [`pool.listTaskFunctions()`](#poollisttaskfunctions)
+  - [`pool.listTaskFunctionNames()`](#poollisttaskfunctionnames)
   - [`PoolOptions`](#pooloptions)
     - [`ThreadPoolOptions extends PoolOptions`](#threadpooloptions-extends-pooloptions)
     - [`ClusterPoolOptions extends PoolOptions`](#clusterpooloptions-extends-pooloptions)
@@ -16,7 +16,7 @@
     - [`YourWorker.hasTaskFunction(name)`](#yourworkerhastaskfunctionname)
     - [`YourWorker.addTaskFunction(name, fn)`](#yourworkeraddtaskfunctionname-fn)
     - [`YourWorker.removeTaskFunction(name)`](#yourworkerremovetaskfunctionname)
-    - [`YourWorker.listTaskFunctions()`](#yourworkerlisttaskfunctions)
+    - [`YourWorker.listTaskFunctionNames()`](#yourworkerlisttaskfunctionnames)
     - [`YourWorker.setDefaultTaskFunction(name)`](#yourworkersetdefaulttaskfunctionname)
 
 ## Pool
@@ -46,7 +46,7 @@ This method is available on both pool implementations and returns a promise with
 
 This method is available on both pool implementations and will call the terminate method on each worker.
 
-### `pool.listTaskFunctions()`
+### `pool.listTaskFunctionNames()`
 
 This method is available on both pool implementations and returns an array of the task function names.
 
@@ -149,7 +149,7 @@ This method is available on both worker implementations and returns a boolean.
 
 This method is available on both worker implementations and returns a boolean.
 
-#### `YourWorker.listTaskFunctions()`
+#### `YourWorker.listTaskFunctionNames()`
 
 This method is available on both worker implementations and returns an array of the task function names.
 
index 08943274da27c8176bcf4b6cebe3d8d408cc2656..d16109532be4620adc94e436e2941be6b6a282cd 100644 (file)
@@ -67,7 +67,7 @@ export type {
   MessageValue,
   PromiseResponseWrapper,
   Task,
-  TaskError,
+  WorkerError,
   TaskPerformance,
   WorkerStatistics,
   Writable
index 6457b1554ddbf5bfeb0156a0d40e9bb108dd02dc..90cede3a8227f7e21cd7a0f32ec84e4f8e6bdbf6 100644 (file)
@@ -21,6 +21,7 @@ import {
   updateMeasurementStatistics
 } from '../utils'
 import { KillBehaviors } from '../worker/worker-options'
+import type { TaskFunction } from '../worker/task-functions'
 import {
   type IPool,
   PoolEmitter,
@@ -722,19 +723,68 @@ export abstract class AbstractPool<
     }
   }
 
+  private sendToWorkers (message: Omit<MessageValue<Data>, 'workerId'>): number {
+    let messagesCount = 0
+    for (const [workerNodeKey] of this.workerNodes.entries()) {
+      this.sendToWorker(workerNodeKey, {
+        ...message,
+        workerId: this.getWorkerInfo(workerNodeKey).id as number
+      })
+      ++messagesCount
+    }
+    return messagesCount
+  }
+
   /** @inheritDoc */
-  public listTaskFunctions (): string[] {
+  public hasTaskFunction (name: string): boolean {
+    this.sendToWorkers({
+      taskFunctionOperation: 'has',
+      taskFunctionName: name
+    })
+    return true
+  }
+
+  /** @inheritDoc */
+  public addTaskFunction (name: string, taskFunction: TaskFunction): boolean {
+    this.sendToWorkers({
+      taskFunctionOperation: 'add',
+      taskFunctionName: name,
+      taskFunction: taskFunction.toString()
+    })
+    return true
+  }
+
+  /** @inheritDoc */
+  public removeTaskFunction (name: string): boolean {
+    this.sendToWorkers({
+      taskFunctionOperation: 'remove',
+      taskFunctionName: name
+    })
+    return true
+  }
+
+  /** @inheritDoc */
+  public listTaskFunctionNames (): string[] {
     for (const workerNode of this.workerNodes) {
       if (
-        Array.isArray(workerNode.info.taskFunctions) &&
-        workerNode.info.taskFunctions.length > 0
+        Array.isArray(workerNode.info.taskFunctionNames) &&
+        workerNode.info.taskFunctionNames.length > 0
       ) {
-        return workerNode.info.taskFunctions
+        return workerNode.info.taskFunctionNames
       }
     }
     return []
   }
 
+  /** @inheritDoc */
+  public setDefaultTaskFunction (name: string): boolean {
+    this.sendToWorkers({
+      taskFunctionOperation: 'default',
+      taskFunctionName: name
+    })
+    return true
+  }
+
   private shallExecuteTask (workerNodeKey: number): boolean {
     return (
       this.tasksQueueSize(workerNodeKey) === 0 &&
@@ -921,8 +971,8 @@ export abstract class AbstractPool<
     const workerInfo = this.getWorkerInfo(workerNodeKey)
     return (
       workerInfo != null &&
-      Array.isArray(workerInfo.taskFunctions) &&
-      workerInfo.taskFunctions.length > 2
+      Array.isArray(workerInfo.taskFunctionNames) &&
+      workerInfo.taskFunctionNames.length > 2
     )
   }
 
@@ -937,7 +987,7 @@ export abstract class AbstractPool<
     ) {
       --workerTaskStatistics.executing
     }
-    if (message.taskError == null) {
+    if (message.workerError == null) {
       ++workerTaskStatistics.executed
     } else {
       ++workerTaskStatistics.failed
@@ -948,7 +998,7 @@ export abstract class AbstractPool<
     workerUsage: WorkerUsage,
     message: MessageValue<Response>
   ): void {
-    if (message.taskError != null) {
+    if (message.workerError != null) {
       return
     }
     updateMeasurementStatistics(
@@ -975,7 +1025,7 @@ export abstract class AbstractPool<
     workerUsage: WorkerUsage,
     message: MessageValue<Response>
   ): void {
-    if (message.taskError != null) {
+    if (message.workerError != null) {
       return
     }
     const eluTaskStatisticsRequirements: MeasurementStatisticsRequirements =
@@ -1320,17 +1370,19 @@ export abstract class AbstractPool<
   protected workerListener (): (message: MessageValue<Response>) => void {
     return message => {
       this.checkMessageWorkerId(message)
-      if (message.ready != null && message.taskFunctions != null) {
+      if (message.ready != null && message.taskFunctionNames != null) {
         // Worker ready response received from worker
         this.handleWorkerReadyResponse(message)
       } else if (message.taskId != null) {
         // Task execution response received from worker
         this.handleTaskExecutionResponse(message)
-      } else if (message.taskFunctions != null) {
-        // Task functions message received from worker
+      } else if (message.taskFunctionNames != null) {
+        // Task function names message received from worker
         this.getWorkerInfo(
           this.getWorkerNodeKeyByWorkerId(message.workerId)
-        ).taskFunctions = message.taskFunctions
+        ).taskFunctionNames = message.taskFunctionNames
+      } else if (message.taskFunctionOperation != null) {
+        // Task function operation response received from worker
       }
     }
   }
@@ -1343,19 +1395,19 @@ export abstract class AbstractPool<
       this.getWorkerNodeKeyByWorkerId(message.workerId)
     )
     workerInfo.ready = message.ready as boolean
-    workerInfo.taskFunctions = message.taskFunctions
+    workerInfo.taskFunctionNames = message.taskFunctionNames
     if (this.emitter != null && this.ready) {
       this.emitter.emit(PoolEvents.ready, this.info)
     }
   }
 
   private handleTaskExecutionResponse (message: MessageValue<Response>): void {
-    const { taskId, taskError, data } = message
+    const { taskId, workerError, data } = message
     const promiseResponse = this.promiseResponseMap.get(taskId as string)
     if (promiseResponse != null) {
-      if (taskError != null) {
-        this.emitter?.emit(PoolEvents.taskError, taskError)
-        promiseResponse.reject(taskError.message)
+      if (workerError != null) {
+        this.emitter?.emit(PoolEvents.taskError, workerError)
+        promiseResponse.reject(workerError.message)
       } else {
         promiseResponse.resolve(data as Response)
       }
index 7a10373393786ac56c0e7f9a98b69f81639cbbe1..6156a0421170e6baa8ad7c2071b755da554a03ed 100644 (file)
@@ -1,5 +1,6 @@
 import { EventEmitter } from 'node:events'
 import { type TransferListItem } from 'node:worker_threads'
+import type { TaskFunction } from '../worker/task-functions'
 import type {
   ErrorHandler,
   ExitHandler,
@@ -233,12 +234,45 @@ export interface IPool<
    * Terminates all workers in this pool.
    */
   readonly destroy: () => Promise<void>
+  /**
+   * Whether the specified task function exists in this pool.
+   *
+   * @param name - The name of the task function.
+   * @returns `true` if the task function exists, `false` otherwise.
+   */
+  readonly hasTaskFunction: (name: string) => boolean
+  /**
+   * Adds a task function to this pool.
+   * If a task function with the same name already exists, it will be overwritten.
+   *
+   * @param name - The name of the task function.
+   * @param taskFunction - The task function.
+   * @returns `true` if the task function was added, `false` otherwise.
+   */
+  readonly addTaskFunction: (
+    name: string,
+    taskFunction: TaskFunction
+  ) => boolean
+  /**
+   * Removes a task function from this pool.
+   *
+   * @param name - The name of the task function.
+   * @returns `true` if the task function was removed, `false` otherwise.
+   */
+  readonly removeTaskFunction: (name: string) => boolean
   /**
    * Lists the names of task function available in this pool.
    *
    * @returns The names of task function available in this pool.
    */
-  readonly listTaskFunctions: () => string[]
+  readonly listTaskFunctionNames: () => string[]
+  /**
+   * Sets the default task function in this pool.
+   *
+   * @param name - The name of the task function.
+   * @returns `true` if the default task function was set, `false` otherwise.
+   */
+  readonly setDefaultTaskFunction: (name: string) => boolean
   /**
    * Sets the worker choice strategy in this pool.
    *
index ca275dedab806b9a4cc2c9c6aee5d3cf550b99f5..78756560c0fbaa78fedb96aad7153a21d14e61ff 100644 (file)
@@ -139,21 +139,21 @@ implements IWorkerNode<Worker, Data> {
 
   /** @inheritdoc */
   public getTaskFunctionWorkerUsage (name: string): WorkerUsage | undefined {
-    if (!Array.isArray(this.info.taskFunctions)) {
+    if (!Array.isArray(this.info.taskFunctionNames)) {
       throw new Error(
         `Cannot get task function worker usage for task function name '${name}' when task function names list is not yet defined`
       )
     }
     if (
-      Array.isArray(this.info.taskFunctions) &&
-      this.info.taskFunctions.length < 3
+      Array.isArray(this.info.taskFunctionNames) &&
+      this.info.taskFunctionNames.length < 3
     ) {
       throw new Error(
         `Cannot get task function worker usage for task function name '${name}' when task function names list has less than 3 elements`
       )
     }
     if (name === DEFAULT_TASK_NAME) {
-      name = this.info.taskFunctions[1]
+      name = this.info.taskFunctionNames[1]
     }
     if (!this.taskFunctionsUsage.has(name)) {
       this.taskFunctionsUsage.set(name, this.initTaskFunctionWorkerUsage(name))
@@ -227,7 +227,7 @@ implements IWorkerNode<Worker, Data> {
       for (const task of this.tasksQueue) {
         if (
           (task.name === DEFAULT_TASK_NAME &&
-            name === (this.info.taskFunctions as string[])[1]) ||
+            name === (this.info.taskFunctionNames as string[])[1]) ||
           (task.name !== DEFAULT_TASK_NAME && name === task.name)
         ) {
           ++taskFunctionQueueSize
index 29050455088c6efd49d8147aed07c41f2a5a004e..37d6308507669dd1f0ebcc295b790a1857c16a3e 100644 (file)
@@ -144,7 +144,7 @@ export interface WorkerInfo {
   /**
    * Task function names.
    */
-  taskFunctions?: string[]
+  taskFunctionNames?: string[]
 }
 
 /**
index e1fb311e45b4eb8ed0e5d33cda3b3806d7526f5b..b2470bea17df1e283ee492a4346f46bf6944a13f 100644 (file)
@@ -3,13 +3,13 @@ import type { MessagePort, TransferListItem } from 'node:worker_threads'
 import type { KillBehavior } from './worker/worker-options'
 
 /**
- * Task error.
+ * Worker error.
  *
  * @typeParam Data - Type of data sent to the worker triggering an error. This can only be structured-cloneable data.
  */
-export interface TaskError<Data = unknown> {
+export interface WorkerError<Data = unknown> {
   /**
-   * Task name triggering the error.
+   * Task function name triggering the error.
    */
   readonly name: string
   /**
@@ -109,17 +109,34 @@ export interface MessageValue<Data = unknown, ErrorData = unknown>
    */
   readonly kill?: KillBehavior | true | 'success' | 'failure'
   /**
-   * Task error.
+   * Worker error.
    */
-  readonly taskError?: TaskError<ErrorData>
+  readonly workerError?: WorkerError<ErrorData>
   /**
    * Task performance.
    */
   readonly taskPerformance?: TaskPerformance
+  /**
+   * Task function operation:
+   * - `'has'` - Check if a task function exists.
+   * - `'add'` - Add a task function.
+   * - `'delete'` - Delete a task function.
+   * - `'default'` - Set a task function as default.
+   */
+  readonly taskFunctionOperation?: 'has' | 'add' | 'remove' | 'default'
+  readonly taskFunctionOperationStatus?: boolean
+  /**
+   * Task function serialized to string.
+   */
+  readonly taskFunction?: string
+  /**
+   * Task function name.
+   */
+  readonly taskFunctionName?: string
   /**
    * Task function names.
    */
-  readonly taskFunctions?: string[]
+  readonly taskFunctionNames?: string[]
   /**
    * Whether the worker computes the given statistics or not.
    */
index 5b3c3a3f06596b00fad84e691875b438325bc600..1b64dc4f4cfff7c769ade8ef2bbd100efa1885ab 100644 (file)
@@ -22,6 +22,11 @@ import type {
   TaskSyncFunction
 } from './task-functions'
 
+interface TaskFunctionOperationReturnType {
+  status: boolean
+  error?: Error
+}
+
 const DEFAULT_MAX_INACTIVE_TIME = 60000
 const DEFAULT_WORKER_OPTIONS: WorkerOptions = {
   /**
@@ -172,11 +177,14 @@ export abstract class AbstractWorker<
    *
    * @param name - The name of the task function to check.
    * @returns Whether the worker has a task function with the given name or not.
-   * @throws {@link https://nodejs.org/api/errors.html#class-typeerror} If the `name` parameter is not a string or an empty string.
    */
-  public hasTaskFunction (name: string): boolean {
-    this.checkTaskFunctionName(name)
-    return this.taskFunctions.has(name)
+  public hasTaskFunction (name: string): TaskFunctionOperationReturnType {
+    try {
+      this.checkTaskFunctionName(name)
+    } catch (error) {
+      return { status: false, error: error as Error }
+    }
+    return { status: this.taskFunctions.has(name) }
   }
 
   /**
@@ -186,24 +194,21 @@ export abstract class AbstractWorker<
    * @param name - The name of the task function to add.
    * @param fn - The task function to add.
    * @returns Whether the task function was added or not.
-   * @throws {@link https://nodejs.org/api/errors.html#class-typeerror} If the `name` parameter is not a string or an empty string.
-   * @throws {@link https://nodejs.org/api/errors.html#class-error} If the `name` parameter is the default task function reserved name.
-   * @throws {@link https://nodejs.org/api/errors.html#class-typeerror} If the `fn` parameter is not a function.
    */
   public addTaskFunction (
     name: string,
     fn: TaskFunction<Data, Response>
-  ): boolean {
-    this.checkTaskFunctionName(name)
-    if (name === DEFAULT_TASK_NAME) {
-      throw new Error(
-        'Cannot add a task function with the default reserved name'
-      )
-    }
-    if (typeof fn !== 'function') {
-      throw new TypeError('fn parameter is not a function')
-    }
+  ): TaskFunctionOperationReturnType {
     try {
+      this.checkTaskFunctionName(name)
+      if (name === DEFAULT_TASK_NAME) {
+        throw new Error(
+          'Cannot add a task function with the default reserved name'
+        )
+      }
+      if (typeof fn !== 'function') {
+        throw new TypeError('fn parameter is not a function')
+      }
       const boundFn = fn.bind(this)
       if (
         this.taskFunctions.get(name) ===
@@ -213,9 +218,9 @@ export abstract class AbstractWorker<
       }
       this.taskFunctions.set(name, boundFn)
       this.sendTaskFunctionsListToMainWorker()
-      return true
-    } catch {
-      return false
+      return { status: true }
+    } catch (error) {
+      return { status: false, error: error as Error }
     }
   }
 
@@ -224,27 +229,29 @@ export abstract class AbstractWorker<
    *
    * @param name - The name of the task function to remove.
    * @returns Whether the task function existed and was removed or not.
-   * @throws {@link https://nodejs.org/api/errors.html#class-typeerror} If the `name` parameter is not a string or an empty string.
-   * @throws {@link https://nodejs.org/api/errors.html#class-error} If the `name` parameter is the default task function reserved name.
-   * @throws {@link https://nodejs.org/api/errors.html#class-error} If the `name` parameter is the task function used as default task function.
    */
-  public removeTaskFunction (name: string): boolean {
-    this.checkTaskFunctionName(name)
-    if (name === DEFAULT_TASK_NAME) {
-      throw new Error(
-        'Cannot remove the task function with the default reserved name'
-      )
-    }
-    if (
-      this.taskFunctions.get(name) === this.taskFunctions.get(DEFAULT_TASK_NAME)
-    ) {
-      throw new Error(
-        'Cannot remove the task function used as the default task function'
-      )
+  public removeTaskFunction (name: string): TaskFunctionOperationReturnType {
+    try {
+      this.checkTaskFunctionName(name)
+      if (name === DEFAULT_TASK_NAME) {
+        throw new Error(
+          'Cannot remove the task function with the default reserved name'
+        )
+      }
+      if (
+        this.taskFunctions.get(name) ===
+        this.taskFunctions.get(DEFAULT_TASK_NAME)
+      ) {
+        throw new Error(
+          'Cannot remove the task function used as the default task function'
+        )
+      }
+      const deleteStatus = this.taskFunctions.delete(name)
+      this.sendTaskFunctionsListToMainWorker()
+      return { status: deleteStatus }
+    } catch (error) {
+      return { status: false, error: error as Error }
     }
-    const deleteStatus = this.taskFunctions.delete(name)
-    this.sendTaskFunctionsListToMainWorker()
-    return deleteStatus
   }
 
   /**
@@ -252,7 +259,7 @@ export abstract class AbstractWorker<
    *
    * @returns The names of the worker's task functions.
    */
-  public listTaskFunctions (): string[] {
+  public listTaskFunctionNames (): string[] {
     const names: string[] = [...this.taskFunctions.keys()]
     let defaultTaskFunctionName: string = DEFAULT_TASK_NAME
     for (const [name, fn] of this.taskFunctions) {
@@ -278,30 +285,27 @@ export abstract class AbstractWorker<
    *
    * @param name - The name of the task function to use as default task function.
    * @returns Whether the default task function was set or not.
-   * @throws {@link https://nodejs.org/api/errors.html#class-typeerror} If the `name` parameter is not a string or an empty string.
-   * @throws {@link https://nodejs.org/api/errors.html#class-error} If the `name` parameter is the default task function reserved name.
-   * @throws {@link https://nodejs.org/api/errors.html#class-error} If the `name` parameter is a non-existing task function.
    */
-  public setDefaultTaskFunction (name: string): boolean {
-    this.checkTaskFunctionName(name)
-    if (name === DEFAULT_TASK_NAME) {
-      throw new Error(
-        'Cannot set the default task function reserved name as the default task function'
-      )
-    }
-    if (!this.taskFunctions.has(name)) {
-      throw new Error(
-        'Cannot set the default task function to a non-existing task function'
-      )
-    }
+  public setDefaultTaskFunction (name: string): TaskFunctionOperationReturnType {
     try {
+      this.checkTaskFunctionName(name)
+      if (name === DEFAULT_TASK_NAME) {
+        throw new Error(
+          'Cannot set the default task function reserved name as the default task function'
+        )
+      }
+      if (!this.taskFunctions.has(name)) {
+        throw new Error(
+          'Cannot set the default task function to a non-existing task function'
+        )
+      }
       this.taskFunctions.set(
         DEFAULT_TASK_NAME,
         this.taskFunctions.get(name) as TaskFunction<Data, Response>
       )
-      return true
-    } catch {
-      return false
+      return { status: true }
+    } catch (error) {
+      return { status: false, error: error as Error }
     }
   }
 
@@ -334,6 +338,9 @@ export abstract class AbstractWorker<
     } else if (message.checkActive != null) {
       // Check active message received
       message.checkActive ? this.startCheckActive() : this.stopCheckActive()
+    } else if (message.taskFunctionOperation != null) {
+      // Task function operation message received
+      this.handleTaskFunctionOperationMessage(message)
     } else if (message.taskId != null && message.data != null) {
       // Task message received
       this.run(message)
@@ -343,6 +350,38 @@ export abstract class AbstractWorker<
     }
   }
 
+  protected handleTaskFunctionOperationMessage (
+    message: MessageValue<Data>
+  ): void {
+    const { taskFunctionOperation, taskFunction, taskFunctionName } = message
+    let response!: TaskFunctionOperationReturnType
+    if (taskFunctionOperation === 'has') {
+      response = this.hasTaskFunction(taskFunctionName as string)
+    } else if (taskFunctionOperation === 'add') {
+      response = this.addTaskFunction(
+        taskFunctionName as string,
+        // eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func
+        new Function(`return ${taskFunction as string}`)() as TaskFunction<
+        Data,
+        Response
+        >
+      )
+    } else if (taskFunctionOperation === 'remove') {
+      response = this.removeTaskFunction(taskFunctionName as string)
+    } else if (taskFunctionOperation === 'default') {
+      response = this.setDefaultTaskFunction(taskFunctionName as string)
+    }
+    this.sendToMainWorker({
+      taskFunctionOperation,
+      taskFunctionOperationStatus: response.status,
+      workerError: {
+        name: taskFunctionName as string,
+        message: this.handleError(response.error as Error | string)
+      },
+      workerId: this.id
+    })
+  }
+
   /**
    * Handles a kill message sent by the main worker.
    *
@@ -452,7 +491,7 @@ export abstract class AbstractWorker<
    */
   protected sendTaskFunctionsListToMainWorker (): void {
     this.sendToMainWorker({
-      taskFunctions: this.listTaskFunctions(),
+      taskFunctionNames: this.listTaskFunctionNames(),
       workerId: this.id
     })
   }
@@ -460,11 +499,11 @@ export abstract class AbstractWorker<
   /**
    * Handles an error and convert it to a string so it can be sent back to the main worker.
    *
-   * @param e - The error raised by the worker.
+   * @param error - The error raised by the worker.
    * @returns The error message.
    */
-  protected handleError (e: Error | string): string {
-    return e instanceof Error ? e.message : e
+  protected handleError (error: Error | string): string {
+    return error instanceof Error ? error.message : error
   }
 
   /**
@@ -478,7 +517,7 @@ export abstract class AbstractWorker<
     const fn = this.taskFunctions.get(name ?? DEFAULT_TASK_NAME)
     if (fn == null) {
       this.sendToMainWorker({
-        taskError: {
+        workerError: {
           name: name as string,
           message: `Task function '${name as string}' not found`,
           data
@@ -516,12 +555,11 @@ export abstract class AbstractWorker<
         workerId: this.id,
         taskId
       })
-    } catch (e) {
-      const errorMessage = this.handleError(e as Error | string)
+    } catch (error) {
       this.sendToMainWorker({
-        taskError: {
+        workerError: {
           name: name as string,
-          message: errorMessage,
+          message: this.handleError(error as Error | string),
           data
         },
         workerId: this.id,
@@ -555,12 +593,11 @@ export abstract class AbstractWorker<
         })
         return null
       })
-      .catch(e => {
-        const errorMessage = this.handleError(e as Error | string)
+      .catch(error => {
         this.sendToMainWorker({
-          taskError: {
+          workerError: {
             name: name as string,
-            message: errorMessage,
+            message: this.handleError(error as Error | string),
             data
           },
           workerId: this.id,
index 26964aa489f83fff90f8e4306c3dc1bbafc36f23..1f9895d6e37b25a73911cd84f1c1f6f7404a98b8 100644 (file)
@@ -48,13 +48,13 @@ export class ClusterWorker<
         this.getMainWorker().on('message', this.messageListener.bind(this))
         this.sendToMainWorker({
           ready: true,
-          taskFunctions: this.listTaskFunctions(),
+          taskFunctionNames: this.listTaskFunctionNames(),
           workerId: this.id
         })
       } catch {
         this.sendToMainWorker({
           ready: false,
-          taskFunctions: this.listTaskFunctions(),
+          taskFunctionNames: this.listTaskFunctionNames(),
           workerId: this.id
         })
       }
index 8d30ef21a8874dcfb6802e2436a7d6033a4fa8ec..ede0b3b5602f6335e2fc0c3409a719fd5edbf5b6 100644 (file)
@@ -62,13 +62,13 @@ export class ThreadWorker<
         this.port.on('message', this.messageListener.bind(this))
         this.sendToMainWorker({
           ready: true,
-          taskFunctions: this.listTaskFunctions(),
+          taskFunctionNames: this.listTaskFunctionNames(),
           workerId: this.id
         })
       } catch {
         this.sendToMainWorker({
           ready: false,
-          taskFunctions: this.listTaskFunctions(),
+          taskFunctionNames: this.listTaskFunctionNames(),
           workerId: this.id
         })
       }