1 import type { EventEmitter
} from
'node:events'
2 import type { MessageChannel
, WorkerOptions
} from
'node:worker_threads'
4 import type { CircularBuffer
} from
'../circular-buffer.js'
5 import type { PriorityQueue
} from
'../queues/priority-queue.js'
6 import type { Task
, TaskFunctionProperties
} from
'../utility-types.js'
9 * Callback invoked if the worker raised an error.
10 * @typeParam Worker - Type of worker.
12 export type ErrorHandler
<Worker
extends IWorker
> = (
18 * Worker event handler.
19 * @typeParam Worker - Type of worker.
21 export type EventHandler
<Worker
extends IWorker
> =
22 | ErrorHandler
<Worker
>
24 | MessageHandler
<Worker
>
25 | OnlineHandler
<Worker
>
28 * Callback invoked when the worker exits successfully.
29 * @typeParam Worker - Type of worker.
31 export type ExitHandler
<Worker
extends IWorker
> = (
37 * Callback invoked if the worker has received a message.
38 * @typeParam Worker - Type of worker.
40 export type MessageHandler
<Worker
extends IWorker
> = (
46 * Callback invoked when the worker has started successfully.
47 * @typeParam Worker - Type of worker.
49 export type OnlineHandler
<Worker
extends IWorker
> = (this: Worker
) => void
52 * Measurement history size.
54 export const MeasurementHistorySize
= 386
57 * Event loop utilization measurement statistics.
60 export interface EventLoopUtilizationMeasurementStatistics
{
61 readonly active
: MeasurementStatistics
62 readonly idle
: MeasurementStatistics
67 * Measurement statistics.
70 export interface MeasurementStatistics
{
72 * Measurement aggregate.
76 * Measurement average.
80 * Measurement history.
82 readonly history
: CircularBuffer
84 * Measurement maximum.
92 * Measurement minimum.
101 export interface TaskStatistics
{
103 * Number of executed tasks.
107 * Number of executing tasks.
111 * Number of failed tasks.
115 * Maximum number of queued tasks.
117 readonly maxQueued
?: number
119 * Number of queued tasks.
121 readonly queued
: number
123 * Number of sequentially stolen tasks.
125 sequentiallyStolen
: number
127 * Number of stolen tasks.
133 * Enumeration of worker types.
135 export const WorkerTypes
: Readonly
<{ cluster
: 'cluster'; thread
: 'thread' }> =
144 export interface IWorker
extends EventEmitter
{
146 * Cluster worker disconnect.
148 readonly disconnect
?: () => void
154 * Cluster worker kill.
156 readonly kill
?: (signal
?: string) => void
158 * Registers an event handler.
159 * @param event - The event.
160 * @param handler - The event handler.
162 readonly on
: (event
: string, handler
: EventHandler
<this>) => this
164 * Registers once an event handler.
165 * @param event - The event.
166 * @param handler - The event handler.
168 readonly once
: (event
: string, handler
: EventHandler
<this>) => this
170 * Stop all JavaScript execution in the worker thread as soon as possible.
171 * Returns a Promise for the exit code that is fulfilled when the `'exit' event` is emitted.
173 readonly terminate
?: () => Promise
<number>
175 * Worker thread worker id.
177 readonly threadId
?: number
179 * Calling `unref()` on a worker allows the thread to exit if this is the only
180 * active handle in the event system. If the worker is already `unref()`ed calling`unref()` again has no effect.
183 readonly unref
?: () => void
187 * Worker node interface.
188 * @typeParam Worker - Type of worker.
189 * @typeParam Data - Type of data sent to the worker. This can only be structured-cloneable data.
192 export interface IWorkerNode
<Worker
extends IWorker
, Data
= unknown
>
193 extends EventEmitter
{
195 * Clears tasks queue.
197 readonly clearTasksQueue
: () => void
199 * Deletes a task from the tasks queue.
200 * @param task - The task to delete.
201 * @returns `true` if the task was deleted, `false` otherwise.
203 readonly deleteTask
: (task
: Task
<Data
>) => boolean
205 * Deletes task function worker usage statistics.
206 * @param name - The task function name.
207 * @returns `true` if the task function worker usage statistics were deleted, `false` otherwise.
209 readonly deleteTaskFunctionWorkerUsage
: (name
: string) => boolean
211 * Dequeue last prioritized task.
212 * @returns The dequeued task.
214 readonly dequeueLastPrioritizedTask
: () => Task
<Data
> | undefined
217 * @param bucket - The prioritized bucket to dequeue from. @defaultValue 0
218 * @returns The dequeued task.
220 readonly dequeueTask
: (bucket
?: number) => Task
<Data
> | undefined
223 * @param task - The task to queue.
224 * @returns The tasks queue size.
226 readonly enqueueTask
: (task
: Task
<Data
>) => number
228 * Gets task function worker usage statistics.
229 * @param name - The task function name.
230 * @returns The task function worker usage statistics if the task function worker usage statistics are initialized, `undefined` otherwise.
232 readonly getTaskFunctionWorkerUsage
: (name
: string) => undefined | WorkerUsage
236 readonly info
: WorkerInfo
238 * Message channel (worker thread only).
240 readonly messageChannel
?: MessageChannel
242 * Registers once a worker event handler.
243 * @param event - The event.
244 * @param handler - The event handler.
246 readonly registerOnceWorkerEventHandler
: (
248 handler
: EventHandler
<Worker
>
251 * Registers a worker event handler.
252 * @param event - The event.
253 * @param handler - The event handler.
255 readonly registerWorkerEventHandler
: (
257 handler
: EventHandler
<Worker
>
260 * Sets tasks queue priority.
261 * @param enablePriority - Whether to enable tasks queue priority.
263 readonly setTasksQueuePriority
: (enablePriority
: boolean) => void
265 * Worker choice strategy data.
266 * This is used to store data that are specific to the worker choice strategy.
268 strategyData
?: StrategyData
272 readonly tasksQueue
: PriorityQueue
<Task
<Data
>>
274 * Tasks queue back pressure size.
275 * This is the number of tasks that can be enqueued before the worker node has back pressure.
277 tasksQueueBackPressureSize
: number
280 * @returns The tasks queue size.
282 readonly tasksQueueSize
: () => number
284 * Terminates the worker node.
286 readonly terminate
: () => Promise
<void>
288 * Worker usage statistics.
290 readonly usage
: WorkerUsage
294 readonly worker
: Worker
298 * Worker choice strategy data.
301 export interface StrategyData
{
302 virtualTaskEndTimestamp
?: number
306 * Worker information.
309 export interface WorkerInfo
{
311 * Back pressure flag.
312 * This flag is set to `true` when worker node tasks queue is back pressured.
314 backPressure
: boolean
316 * Back pressure stealing flag.
317 * This flag is set to `true` when worker node is stealing one task from another back pressured worker node.
319 backPressureStealing
: boolean
321 * Continuous stealing flag.
322 * This flag is set to `true` when worker node is continuously stealing tasks from other worker nodes.
324 continuousStealing
: boolean
332 readonly id
: number | undefined
334 * Queued task abortion flag.
335 * This flag is set to `true` when worker node is aborting a queued task.
337 queuedTaskAbortion
: boolean
344 * This flag is set to `true` when worker node is stealing one task from another worker node.
349 * This flag is set to `true` when worker node has one task stolen from another worker node.
353 * Task functions properties.
355 taskFunctionsProperties
?: TaskFunctionProperties
[]
359 readonly type: WorkerType
363 * Worker node event detail.
366 export interface WorkerNodeEventDetail
{
367 taskId
?: `${string}-${string}-${string}-${string}-${string}`
369 workerNodeKey
?: number
373 * Worker node options.
376 export interface WorkerNodeOptions
{
377 env
?: Record
<string, unknown
>
378 tasksQueueBackPressureSize
: number | undefined
379 tasksQueueBucketSize
: number | undefined
380 tasksQueuePriority
: boolean | undefined
381 workerOptions
?: WorkerOptions
387 export type WorkerType
= keyof
typeof WorkerTypes
390 * Worker usage statistics.
393 export interface WorkerUsage
{
395 * Tasks event loop utilization statistics.
397 readonly elu
: EventLoopUtilizationMeasurementStatistics
399 * Tasks runtime statistics.
401 readonly runTime
: MeasurementStatistics
405 readonly tasks
: TaskStatistics
407 * Tasks wait time statistics.
409 readonly waitTime
: MeasurementStatistics