-import type { MessageChannel } from 'node:worker_threads'
import type { EventEmitter } from 'node:events'
-import type { CircularArray } from '../circular-array'
-import type { Task } from '../utility-types'
+import type { MessageChannel, WorkerOptions } from 'node:worker_threads'
+
+import type { CircularArray } from '../circular-array.js'
+import type { Task, TaskFunctionProperties } from '../utility-types.js'
/**
* Callback invoked when the worker has started successfully.
exitCode: number
) => void
+/**
+ * Worker event handler.
+ *
+ * @typeParam Worker - Type of worker.
+ */
+export type EventHandler<Worker extends IWorker> =
+ | OnlineHandler<Worker>
+ | MessageHandler<Worker>
+ | ErrorHandler<Worker>
+ | ExitHandler<Worker>
+
/**
* Measurement statistics.
*
/**
* Enumeration of worker types.
*/
-export const WorkerTypes = Object.freeze({
- thread: 'thread',
- cluster: 'cluster'
-} as const)
+export const WorkerTypes: Readonly<{ thread: 'thread', cluster: 'cluster' }> =
+ Object.freeze({
+ thread: 'thread',
+ cluster: 'cluster'
+ } as const)
/**
* Worker type.
*/
ready: boolean
/**
- * Task function names.
+ * Stealing flag.
+ * This flag is set to `true` when worker node is stealing tasks from another worker node.
*/
- taskFunctionNames?: string[]
+ stealing: boolean
+ /**
+ * Back pressure flag.
+ * This flag is set to `true` when worker node tasks queue has back pressure.
+ */
+ backPressure: boolean
+ /**
+ * Task functions properties.
+ */
+ taskFunctionsProperties?: TaskFunctionProperties[]
}
/**
/**
* Worker interface.
*/
-export interface IWorker {
+export interface IWorker extends EventEmitter {
/**
* Cluster worker id.
*/
*/
readonly threadId?: number
/**
- * Registers an event listener.
+ * Registers an event handler.
*
* @param event - The event.
* @param handler - The event handler.
*/
- readonly on: (
- event: string,
- handler:
- | OnlineHandler<this>
- | MessageHandler<this>
- | ErrorHandler<this>
- | ExitHandler<this>
- ) => void
+ readonly on: (event: string, handler: EventHandler<this>) => this
/**
- * Registers once an event listener.
+ * Registers once an event handler.
*
* @param event - The event.
* @param handler - The event handler.
*/
- readonly once: (
- event: string,
- handler:
- | OnlineHandler<this>
- | MessageHandler<this>
- | ErrorHandler<this>
- | ExitHandler<this>
- ) => void
+ readonly once: (event: string, handler: EventHandler<this>) => this
+ /**
+ * Calling `unref()` on a worker allows the thread to exit if this is the only
+ * active handle in the event system. If the worker is already `unref()`ed calling`unref()` again has no effect.
+ * @since v10.5.0
+ */
+ readonly unref?: () => void
/**
* Stop all JavaScript execution in the worker thread as soon as possible.
* Returns a Promise for the exit code that is fulfilled when the `'exit' event` is emitted.
export interface WorkerNodeOptions {
workerOptions?: WorkerOptions
env?: Record<string, unknown>
- tasksQueueBackPressureSize: number
+ tasksQueueBackPressureSize: number | undefined
+ tasksQueueBucketSize: number | undefined
}
/**
* @returns The tasks queue size.
*/
readonly enqueueTask: (task: Task<Data>) => number
- /**
- * Prepends a task to the tasks queue.
- *
- * @param task - The task to prepend.
- * @returns The tasks queue size.
- */
- readonly unshiftTask: (task: Task<Data>) => number
/**
* Dequeue task.
*
+ * @param bucket - The prioritized bucket to dequeue from. @defaultValue 0
* @returns The dequeued task.
*/
- readonly dequeueTask: () => Task<Data> | undefined
+ readonly dequeueTask: (bucket?: number) => Task<Data> | undefined
/**
- * Pops a task from the tasks queue.
+ * Dequeue last prioritized task.
*
- * @returns The popped task.
+ * @returns The dequeued task.
*/
- readonly popTask: () => Task<Data> | undefined
+ readonly dequeueLastPrioritizedTask: () => Task<Data> | undefined
/**
* Clears tasks queue.
*/
* @returns `true` if the worker node has back pressure, `false` otherwise.
*/
readonly hasBackPressure: () => boolean
- /**
- * Resets usage statistics.
- */
- readonly resetUsage: () => void
/**
* Terminates the worker node.
*/
* Registers a worker event handler.
*
* @param event - The event.
- * @param listener - The event listener.
+ * @param handler - The event handler.
*/
readonly registerWorkerEventHandler: (
event: string,
- listener:
- | OnlineHandler<Worker>
- | MessageHandler<Worker>
- | ErrorHandler<Worker>
- | ExitHandler<Worker>
+ handler: EventHandler<Worker>
) => void
/**
* Registers once a worker event handler.
*
* @param event - The event.
- * @param listener - The event listener.
+ * @param handler - The event handler.
*/
readonly registerOnceWorkerEventHandler: (
event: string,
- listener:
- | OnlineHandler<Worker>
- | MessageHandler<Worker>
- | ErrorHandler<Worker>
- | ExitHandler<Worker>
+ handler: EventHandler<Worker>
) => void
/**
* Gets task function worker usage statistics.
* @internal
*/
export interface WorkerNodeEventDetail {
- workerId: number
+ workerId?: number
workerNodeKey?: number
}