refactor: uniform namespace for task function(s)
authorJérôme Benoit <jerome.benoit@sap.com>
Wed, 2 Aug 2023 00:54:55 +0000 (02:54 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Wed, 2 Aug 2023 00:54:55 +0000 (02:54 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
.github/ISSUE_TEMPLATE/bug_report.yml
CHANGELOG.md
README.md
src/index.ts
src/pools/pool.ts
src/worker/abstract-worker.ts
src/worker/cluster-worker.ts
src/worker/task-functions.ts [moved from src/worker/worker-functions.ts with 70% similarity]
src/worker/thread-worker.ts

index d930d75e9e4a967d52d4bbc51e7cbfe97fc8770e..e2122b8e3ff603214d468f5e050f9035b32ada54 100644 (file)
@@ -36,7 +36,7 @@ body:
       label: Steps to reproduce
       description: Steps to reproduce the bug.
       placeholder: |
-        - If you can please specify at least a draft of your worker (if it is an async function or not is also important)
+        - If you can please specify at least a draft of your worker (if it is an async task function or not is also important)
         - Indicate which pool type are you using (i.e. FixedThreadPool) and with which options (number of threads, and so on)
   - type: input
     attributes:
index 1ae2e31b5ae37386745b4c088156e6a57f8dfc3f..5ac36cccf365c49ac064ffc70e9885711509cf3f 100644 (file)
@@ -298,7 +298,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Fixed
 
-- Fix typescript type definition for worker function: ensure the input data is optional.
+- Fix typescript type definition for task function: ensure the input data is optional.
 - Fix typescript type definition for pool execute(): ensure the input data is optional.
 
 ## [2.4.9] - 2023-04-15
@@ -315,7 +315,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Fixed
 
-- Fix worker function type definition and validation.
+- Fix task function type definition and validation.
 - Fix worker choice strategy options handling.
 
 ## [2.4.8] - 2023-04-12
index 238002bce713c3752dc13442304bad70a7c20530..7ae15e10302b842d43fe4c8c42fa3de08e243cc1 100644 (file)
--- a/README.md
+++ b/README.md
@@ -42,8 +42,8 @@ Please consult our [general guidelines](#general-guidance).
 - Proper integration with node [async_hooks](https://nodejs.org/api/async_hooks.html) :white_check_mark:
 - Support CommonJS, ESM, and TypeScript :white_check_mark:
 - Support for [worker_threads](https://nodejs.org/api/worker_threads.html) and [cluster](https://nodejs.org/api/cluster.html) Node.js modules :white_check_mark:
-- Support multiple worker functions :white_check_mark:
-- Support sync and async tasks :white_check_mark:
+- Support multiple task functions :white_check_mark:
+- Support sync and async task functions :white_check_mark:
 - Tasks distribution strategies :white_check_mark:
 - General guidance on pool choice :white_check_mark:
 - Error handling out of the box :white_check_mark:
@@ -150,7 +150,7 @@ pool
 
 You can do the same with the classes _ClusterWorker_, _FixedClusterPool_ and _DynamicClusterPool_.
 
-**See [examples](./examples/) folder for more details (in particular if you want to use a pool with [multiple worker functions](./examples/multiFunctionExample.js))**.
+**See [examples](./examples/) folder for more details (in particular if you want to use a pool with [multiple task functions](./examples/multiFunctionExample.js))**.
 
 Remember that workers can only send and receive structured-cloneable data.
 
index 8a3cb9b1e2ef2521a83bfed53267980d61d8e786..c9ee4c6376774d73edf2d9328ab33a9880c1ebf1 100644 (file)
@@ -52,11 +52,11 @@ export { ThreadWorker } from './worker/thread-worker'
 export { KillBehaviors } from './worker/worker-options'
 export type { KillBehavior, WorkerOptions } from './worker/worker-options'
 export type {
+  TaskAsyncFunction,
+  TaskFunction,
   TaskFunctions,
-  WorkerAsyncFunction,
-  WorkerFunction,
-  WorkerSyncFunction
-} from './worker/worker-functions'
+  TaskSyncFunction
+} from './worker/task-functions'
 export type {
   MessageValue,
   PromiseResponseWrapper,
index 4b9f40f473550f90597ec8b6670f422dbed5c666..45915e5581085b6cced9f5d51635205ee9da4556 100644 (file)
@@ -192,8 +192,8 @@ export interface IPool<
   /**
    * Executes the specified function in the worker constructor with the task data input parameter.
    *
-   * @param data - The task input data for the specified worker function. This can only be structured-cloneable data.
-   * @param name - The name of the worker function to execute. If not specified, the default worker function will be executed.
+   * @param data - The task input data for the specified task function. This can only be structured-cloneable data.
+   * @param name - The name of the task function to execute. If not specified, the default task function will be executed.
    * @returns Promise that will be fulfilled when the task is completed.
    */
   readonly execute: (data?: Data, name?: string) => Promise<Response>
index 428f63134f5666a13087ca564a22336236f00db2..1b34fb139dd7d0d6513a298be184c5c342d8bcef 100644 (file)
@@ -20,11 +20,11 @@ import {
   type WorkerOptions
 } from './worker-options'
 import type {
+  TaskAsyncFunction,
+  TaskFunction,
   TaskFunctions,
-  WorkerAsyncFunction,
-  WorkerFunction,
-  WorkerSyncFunction
-} from './worker-functions'
+  TaskSyncFunction
+} from './task-functions'
 
 const DEFAULT_MAX_INACTIVE_TIME = 60000
 const DEFAULT_KILL_BEHAVIOR: KillBehavior = KillBehaviors.SOFT
@@ -48,7 +48,7 @@ export abstract class AbstractWorker<
   /**
    * Task function(s) processed by the worker when the pool's `execution` function is invoked.
    */
-  protected taskFunctions!: Map<string, WorkerFunction<Data, Response>>
+  protected taskFunctions!: Map<string, TaskFunction<Data, Response>>
   /**
    * Timestamp of the last task processed by this worker.
    */
@@ -74,9 +74,7 @@ export abstract class AbstractWorker<
     type: string,
     protected readonly isMain: boolean,
     private readonly mainWorker: MainWorker,
-    taskFunctions:
-    | WorkerFunction<Data, Response>
-    | TaskFunctions<Data, Response>,
+    taskFunctions: TaskFunction<Data, Response> | TaskFunctions<Data, Response>,
     protected readonly opts: WorkerOptions = {
       /**
        * The kill behavior option on this worker or its default value.
@@ -110,14 +108,12 @@ export abstract class AbstractWorker<
    * @param taskFunctions - The task function(s) parameter that should be checked.
    */
   private checkTaskFunctions (
-    taskFunctions:
-    | WorkerFunction<Data, Response>
-    | TaskFunctions<Data, Response>
+    taskFunctions: TaskFunction<Data, Response> | TaskFunctions<Data, Response>
   ): void {
     if (taskFunctions == null) {
       throw new Error('taskFunctions parameter is mandatory')
     }
-    this.taskFunctions = new Map<string, WorkerFunction<Data, Response>>()
+    this.taskFunctions = new Map<string, TaskFunction<Data, Response>>()
     if (typeof taskFunctions === 'function') {
       const boundFn = taskFunctions.bind(this)
       this.taskFunctions.set(DEFAULT_TASK_NAME, boundFn)
@@ -185,7 +181,7 @@ export abstract class AbstractWorker<
    */
   public addTaskFunction (
     name: string,
-    fn: WorkerFunction<Data, Response>
+    fn: TaskFunction<Data, Response>
   ): boolean {
     if (typeof name !== 'string') {
       throw new TypeError('name parameter is not a string')
@@ -276,7 +272,7 @@ export abstract class AbstractWorker<
     try {
       this.taskFunctions.set(
         DEFAULT_TASK_NAME,
-        this.taskFunctions.get(name) as WorkerFunction<Data, Response>
+        this.taskFunctions.get(name) as TaskFunction<Data, Response>
       )
       return true
     } catch {
@@ -415,7 +411,7 @@ export abstract class AbstractWorker<
    * @param task - Input data for the task function.
    */
   protected runSync (
-    fn: WorkerSyncFunction<Data, Response>,
+    fn: TaskSyncFunction<Data, Response>,
     task: Task<Data>
   ): void {
     try {
@@ -451,7 +447,7 @@ export abstract class AbstractWorker<
    * @param task - Input data for the task function.
    */
   protected runAsync (
-    fn: WorkerAsyncFunction<Data, Response>,
+    fn: TaskAsyncFunction<Data, Response>,
     task: Task<Data>
   ): void {
     let taskPerformance = this.beginTaskPerformance(task.name)
@@ -491,7 +487,7 @@ export abstract class AbstractWorker<
    * @returns The task function.
    * @throws {@link https://nodejs.org/api/errors.html#class-error} If the task function is not found.
    */
-  private getTaskFunction (name?: string): WorkerFunction<Data, Response> {
+  private getTaskFunction (name?: string): TaskFunction<Data, Response> {
     name = name ?? DEFAULT_TASK_NAME
     const fn = this.taskFunctions.get(name)
     if (fn == null) {
index 4c1e118789d53f7228e51a5b974b80575985705f..0ccc0013e9d0314425919bc86c3ea51c8da8e29d 100644 (file)
@@ -2,7 +2,7 @@ import cluster, { type Worker } from 'node:cluster'
 import type { MessageValue } from '../utility-types'
 import { AbstractWorker } from './abstract-worker'
 import type { WorkerOptions } from './worker-options'
-import type { TaskFunctions, WorkerFunction } from './worker-functions'
+import type { TaskFunction, TaskFunctions } from './task-functions'
 
 /**
  * A cluster worker used by a poolifier `ClusterPool`.
@@ -29,9 +29,7 @@ export class ClusterWorker<
    * @param opts - Options for the worker.
    */
   public constructor (
-    taskFunctions:
-    | WorkerFunction<Data, Response>
-    | TaskFunctions<Data, Response>,
+    taskFunctions: TaskFunction<Data, Response> | TaskFunctions<Data, Response>,
     opts: WorkerOptions = {}
   ) {
     super(
similarity index 70%
rename from src/worker/worker-functions.ts
rename to src/worker/task-functions.ts
index 9232e58f9e9b4b9000124621e16f083af07c154d..a61d69627ce6eeebd36e462f5801c36e94cc8e06 100644 (file)
@@ -1,37 +1,37 @@
 /**
- * Worker synchronous function that can be executed.
+ * Task synchronous function that can be executed.
  *
  * @typeParam Data - Type of data sent to the worker. This can only be structured-cloneable data.
  * @typeParam Response - Type of execution response. This can only be structured-cloneable data.
  */
-export type WorkerSyncFunction<Data = unknown, Response = unknown> = (
+export type TaskSyncFunction<Data = unknown, Response = unknown> = (
   data?: Data
 ) => Response
 
 /**
- * Worker asynchronous function that can be executed.
+ * Task asynchronous function that can be executed.
  * This function must return a promise.
  *
  * @typeParam Data - Type of data sent to the worker. This can only be structured-cloneable data.
  * @typeParam Response - Type of execution response. This can only be structured-cloneable data.
  */
-export type WorkerAsyncFunction<Data = unknown, Response = unknown> = (
+export type TaskAsyncFunction<Data = unknown, Response = unknown> = (
   data?: Data
 ) => Promise<Response>
 
 /**
- * Worker function that can be executed.
+ * Task function that can be executed.
  * This function can be synchronous or asynchronous.
  *
  * @typeParam Data - Type of data sent to the worker. This can only be structured-cloneable data.
  * @typeParam Response - Type of execution response. This can only be structured-cloneable data.
  */
-export type WorkerFunction<Data = unknown, Response = unknown> =
-  | WorkerSyncFunction<Data, Response>
-  | WorkerAsyncFunction<Data, Response>
+export type TaskFunction<Data = unknown, Response = unknown> =
+  | TaskSyncFunction<Data, Response>
+  | TaskAsyncFunction<Data, Response>
 
 /**
- * Worker functions that can be executed.
+ * Tasks functions that can be executed.
  * This object can contain synchronous or asynchronous functions.
  * The key is the name of the function.
  * The value is the function itself.
@@ -41,5 +41,5 @@ export type WorkerFunction<Data = unknown, Response = unknown> =
  */
 export type TaskFunctions<Data = unknown, Response = unknown> = Record<
 string,
-WorkerFunction<Data, Response>
+TaskFunction<Data, Response>
 >
index dc628bed08fa4b23f29724f88f41484b0097afef..4666fbc7590dda3974df88770b874703c0189e17 100644 (file)
@@ -7,7 +7,7 @@ import {
 import type { MessageValue } from '../utility-types'
 import { AbstractWorker } from './abstract-worker'
 import type { WorkerOptions } from './worker-options'
-import type { TaskFunctions, WorkerFunction } from './worker-functions'
+import type { TaskFunction, TaskFunctions } from './task-functions'
 
 /**
  * A thread worker used by a poolifier `ThreadPool`.
@@ -38,9 +38,7 @@ export class ThreadWorker<
    * @param opts - Options for the worker.
    */
   public constructor (
-    taskFunctions:
-    | WorkerFunction<Data, Response>
-    | TaskFunctions<Data, Response>,
+    taskFunctions: TaskFunction<Data, Response> | TaskFunctions<Data, Response>,
     opts: WorkerOptions = {}
   ) {
     super(