Commit | Line | Data |
---|---|---|
62c15a68 | 1 | import type { EventLoopUtilization } from 'node:perf_hooks' |
f06e48d8 | 2 | import type { CircularArray } from '../circular-array' |
29ee7e9a | 3 | import type { Queue } from '../queue' |
f06e48d8 | 4 | |
bdaf31cd JB |
5 | /** |
6 | * Callback invoked if the worker has received a message. | |
7 | */ | |
50e66724 JB |
8 | export type MessageHandler<Worker extends IWorker> = ( |
9 | this: Worker, | |
10 | m: unknown | |
11 | ) => void | |
bdaf31cd JB |
12 | |
13 | /** | |
14 | * Callback invoked if the worker raised an error. | |
15 | */ | |
50e66724 JB |
16 | export type ErrorHandler<Worker extends IWorker> = ( |
17 | this: Worker, | |
18 | e: Error | |
19 | ) => void | |
bdaf31cd JB |
20 | |
21 | /** | |
22 | * Callback invoked when the worker has started successfully. | |
23 | */ | |
50e66724 | 24 | export type OnlineHandler<Worker extends IWorker> = (this: Worker) => void |
bdaf31cd JB |
25 | |
26 | /** | |
27 | * Callback invoked when the worker exits successfully. | |
28 | */ | |
50e66724 JB |
29 | export type ExitHandler<Worker extends IWorker> = ( |
30 | this: Worker, | |
31 | code: number | |
32 | ) => void | |
bdaf31cd JB |
33 | |
34 | /** | |
02706357 | 35 | * Message object that is passed as a task between main worker and worker. |
c319c66b JB |
36 | * |
37 | * @typeParam Data - Type of data sent to the worker. This can only be serializable data. | |
38 | * @internal | |
bdaf31cd | 39 | */ |
f06e48d8 | 40 | export interface Task<Data = unknown> { |
a86b6df1 JB |
41 | /** |
42 | * Task name. | |
43 | */ | |
44 | readonly name?: string | |
0274ce2d | 45 | /** |
d29bce7c | 46 | * Task input data that will be passed to the worker. |
0274ce2d | 47 | */ |
02706357 | 48 | readonly data?: Data |
0567595a | 49 | /** |
b6b32453 | 50 | * Timestamp. |
0567595a | 51 | */ |
b6b32453 | 52 | readonly timestamp?: number |
0274ce2d | 53 | /** |
70a4f5ea | 54 | * Message UUID. |
0274ce2d | 55 | */ |
02706357 | 56 | readonly id?: string |
f06e48d8 JB |
57 | } |
58 | ||
59 | /** | |
a4e07f72 | 60 | * Measure statistics. |
f9b4bbf8 JB |
61 | * |
62 | * @internal | |
f06e48d8 | 63 | */ |
a4e07f72 | 64 | export interface MeasureStatistics { |
02706357 | 65 | /** |
a4e07f72 | 66 | * Measure aggregation. |
02706357 | 67 | */ |
a4e07f72 | 68 | aggregation: number |
02706357 | 69 | /** |
a4e07f72 | 70 | * Measure average. |
02706357 | 71 | */ |
a4e07f72 | 72 | average: number |
02706357 | 73 | /** |
a4e07f72 | 74 | * Measure median. |
02706357 | 75 | */ |
a4e07f72 | 76 | median: number |
02706357 | 77 | /** |
a4e07f72 | 78 | * Measure history. |
02706357 | 79 | */ |
a4e07f72 JB |
80 | history: CircularArray<number> |
81 | } | |
82 | ||
83 | /** | |
84 | * Task statistics. | |
85 | * | |
86 | * @internal | |
87 | */ | |
88 | ||
89 | export interface TaskStatistics { | |
02706357 | 90 | /** |
a4e07f72 | 91 | * Number of tasks executed. |
02706357 | 92 | */ |
a4e07f72 | 93 | executed: number |
02706357 | 94 | /** |
a4e07f72 | 95 | * Number of tasks executing. |
02706357 | 96 | */ |
a4e07f72 | 97 | executing: number |
0567595a | 98 | /** |
a4e07f72 | 99 | * Number of tasks queued. |
0567595a | 100 | */ |
a4e07f72 | 101 | queued: number |
0567595a | 102 | /** |
a4e07f72 | 103 | * Number of tasks failed. |
0567595a | 104 | */ |
a4e07f72 JB |
105 | failed: number |
106 | } | |
107 | ||
108 | /** | |
109 | * Worker usage statistics. | |
110 | * | |
111 | * @internal | |
112 | */ | |
113 | export interface WorkerUsage { | |
0567595a | 114 | /** |
a4e07f72 | 115 | * Tasks statistics. |
0567595a | 116 | */ |
a4e07f72 | 117 | tasks: TaskStatistics |
0567595a | 118 | /** |
a4e07f72 | 119 | * Tasks runtime statistics. |
0567595a | 120 | */ |
a4e07f72 | 121 | runTime: MeasureStatistics |
02706357 | 122 | /** |
a4e07f72 | 123 | * Tasks wait time statistics. |
02706357 | 124 | */ |
a4e07f72 | 125 | waitTime: MeasureStatistics |
62c15a68 JB |
126 | /** |
127 | * Event loop utilization. | |
128 | */ | |
129 | elu: EventLoopUtilization | undefined | |
f06e48d8 JB |
130 | } |
131 | ||
132 | /** | |
133 | * Worker interface. | |
134 | */ | |
135 | export interface IWorker { | |
bdaf31cd | 136 | /** |
78cea37e | 137 | * Register an event listener. |
bdaf31cd | 138 | * |
38e795c1 | 139 | * @param event - The event. |
48ef9107 | 140 | * @param handler - The event handler. |
bdaf31cd | 141 | */ |
78cea37e JB |
142 | on: ((event: 'message', handler: MessageHandler<this>) => void) & |
143 | ((event: 'error', handler: ErrorHandler<this>) => void) & | |
144 | ((event: 'online', handler: OnlineHandler<this>) => void) & | |
145 | ((event: 'exit', handler: ExitHandler<this>) => void) | |
bdaf31cd | 146 | /** |
7d6b5ad2 | 147 | * Register a listener to the exit event that will only be performed once. |
bdaf31cd | 148 | * |
38e795c1 JB |
149 | * @param event - `'exit'`. |
150 | * @param handler - The exit handler. | |
bdaf31cd | 151 | */ |
78cea37e | 152 | once: (event: 'exit', handler: ExitHandler<this>) => void |
bdaf31cd | 153 | } |
f06e48d8 JB |
154 | |
155 | /** | |
156 | * Worker node interface. | |
c319c66b JB |
157 | * |
158 | * @typeParam Worker - Type of worker. | |
159 | * @typeParam Data - Type of data sent to the worker. This can only be serializable data. | |
160 | * @internal | |
f06e48d8 JB |
161 | */ |
162 | export interface WorkerNode<Worker extends IWorker, Data = unknown> { | |
c319c66b JB |
163 | /** |
164 | * Worker node worker. | |
165 | */ | |
02706357 | 166 | readonly worker: Worker |
c319c66b | 167 | /** |
a4e07f72 | 168 | * Worker node worker usage statistics. |
c319c66b | 169 | */ |
a4e07f72 | 170 | workerUsage: WorkerUsage |
c319c66b JB |
171 | /** |
172 | * Worker node tasks queue. | |
173 | */ | |
29ee7e9a | 174 | readonly tasksQueue: Queue<Task<Data>> |
f06e48d8 | 175 | } |