Commit | Line | Data |
---|---|---|
f06e48d8 JB |
1 | import type { CircularArray } from '../circular-array' |
2 | ||
bdaf31cd JB |
3 | /** |
4 | * Callback invoked if the worker has received a message. | |
5 | */ | |
50e66724 JB |
6 | export type MessageHandler<Worker extends IWorker> = ( |
7 | this: Worker, | |
e102732c | 8 | message: unknown |
50e66724 | 9 | ) => void |
bdaf31cd JB |
10 | |
11 | /** | |
12 | * Callback invoked if the worker raised an error. | |
13 | */ | |
50e66724 JB |
14 | export type ErrorHandler<Worker extends IWorker> = ( |
15 | this: Worker, | |
e102732c | 16 | error: Error |
50e66724 | 17 | ) => void |
bdaf31cd JB |
18 | |
19 | /** | |
20 | * Callback invoked when the worker has started successfully. | |
21 | */ | |
50e66724 | 22 | export type OnlineHandler<Worker extends IWorker> = (this: Worker) => void |
bdaf31cd JB |
23 | |
24 | /** | |
25 | * Callback invoked when the worker exits successfully. | |
26 | */ | |
50e66724 JB |
27 | export type ExitHandler<Worker extends IWorker> = ( |
28 | this: Worker, | |
e102732c | 29 | exitCode: number |
50e66724 | 30 | ) => void |
bdaf31cd JB |
31 | |
32 | /** | |
02706357 | 33 | * Message object that is passed as a task between main worker and worker. |
c319c66b | 34 | * |
e102732c | 35 | * @typeParam Data - Type of data sent to the worker. This can only be structured-cloneable data. |
c319c66b | 36 | * @internal |
bdaf31cd | 37 | */ |
f06e48d8 | 38 | export interface Task<Data = unknown> { |
21f710aa JB |
39 | /** |
40 | * Worker id. | |
41 | */ | |
42 | readonly workerId: number | |
a86b6df1 JB |
43 | /** |
44 | * Task name. | |
45 | */ | |
46 | readonly name?: string | |
0274ce2d | 47 | /** |
d29bce7c | 48 | * Task input data that will be passed to the worker. |
0274ce2d | 49 | */ |
02706357 | 50 | readonly data?: Data |
0567595a | 51 | /** |
b6b32453 | 52 | * Timestamp. |
0567595a | 53 | */ |
b6b32453 | 54 | readonly timestamp?: number |
0274ce2d | 55 | /** |
70a4f5ea | 56 | * Message UUID. |
0274ce2d | 57 | */ |
02706357 | 58 | readonly id?: string |
f06e48d8 JB |
59 | } |
60 | ||
61 | /** | |
cd4d348a | 62 | * Measurement statistics. |
f9b4bbf8 JB |
63 | * |
64 | * @internal | |
f06e48d8 | 65 | */ |
cd4d348a | 66 | export interface MeasurementStatistics { |
02706357 | 67 | /** |
932fc8be | 68 | * Measurement aggregate. |
02706357 | 69 | */ |
71514351 | 70 | aggregate?: number |
f7510105 JB |
71 | /** |
72 | * Measurement minimum. | |
73 | */ | |
71514351 | 74 | minimum?: number |
f7510105 JB |
75 | /** |
76 | * Measurement maximum. | |
77 | */ | |
71514351 | 78 | maximum?: number |
02706357 | 79 | /** |
cd4d348a | 80 | * Measurement average. |
02706357 | 81 | */ |
71514351 | 82 | average?: number |
02706357 | 83 | /** |
cd4d348a | 84 | * Measurement median. |
02706357 | 85 | */ |
71514351 | 86 | median?: number |
02706357 | 87 | /** |
cd4d348a | 88 | * Measurement history. |
02706357 | 89 | */ |
eb7bf744 | 90 | readonly history: CircularArray<number> |
a4e07f72 JB |
91 | } |
92 | ||
5df69fab JB |
93 | /** |
94 | * Event loop utilization measurement statistics. | |
95 | * | |
96 | * @internal | |
97 | */ | |
98 | export interface EventLoopUtilizationMeasurementStatistics { | |
eb7bf744 JB |
99 | readonly idle: MeasurementStatistics |
100 | readonly active: MeasurementStatistics | |
f7510105 | 101 | utilization?: number |
5df69fab JB |
102 | } |
103 | ||
a4e07f72 JB |
104 | /** |
105 | * Task statistics. | |
106 | * | |
107 | * @internal | |
108 | */ | |
a4e07f72 | 109 | export interface TaskStatistics { |
02706357 | 110 | /** |
9a0613e9 | 111 | * Number of executed tasks. |
02706357 | 112 | */ |
a4e07f72 | 113 | executed: number |
02706357 | 114 | /** |
9a0613e9 | 115 | * Number of executing tasks. |
02706357 | 116 | */ |
a4e07f72 | 117 | executing: number |
0567595a | 118 | /** |
9a0613e9 | 119 | * Number of queued tasks. |
0567595a | 120 | */ |
8604aaab | 121 | readonly queued: number |
df593701 JB |
122 | /** |
123 | * Maximum number of queued tasks. | |
124 | */ | |
125 | readonly maxQueued: number | |
0567595a | 126 | /** |
9a0613e9 | 127 | * Number of failed tasks. |
0567595a | 128 | */ |
a4e07f72 JB |
129 | failed: number |
130 | } | |
131 | ||
4b628b48 JB |
132 | /** |
133 | * Enumeration of worker types. | |
134 | */ | |
135 | export const WorkerTypes = Object.freeze({ | |
136 | cluster: 'cluster', | |
137 | thread: 'thread' | |
138 | } as const) | |
139 | ||
140 | /** | |
141 | * Worker type. | |
142 | */ | |
143 | export type WorkerType = keyof typeof WorkerTypes | |
144 | ||
f59e1027 JB |
145 | /** |
146 | * Worker information. | |
147 | * | |
148 | * @internal | |
149 | */ | |
150 | export interface WorkerInfo { | |
151 | /** | |
83fa0a36 | 152 | * Worker id. |
f59e1027 | 153 | */ |
eb7bf744 | 154 | readonly id: number | undefined |
4b628b48 JB |
155 | /** |
156 | * Worker type. | |
157 | */ | |
158 | type: WorkerType | |
8a1260a3 JB |
159 | /** |
160 | * Dynamic flag. | |
161 | */ | |
162 | dynamic: boolean | |
f59e1027 | 163 | /** |
7c8381eb | 164 | * Ready flag. |
f59e1027 | 165 | */ |
7c8381eb | 166 | ready: boolean |
f59e1027 JB |
167 | } |
168 | ||
a4e07f72 JB |
169 | /** |
170 | * Worker usage statistics. | |
171 | * | |
172 | * @internal | |
173 | */ | |
174 | export interface WorkerUsage { | |
0567595a | 175 | /** |
a4e07f72 | 176 | * Tasks statistics. |
0567595a | 177 | */ |
eb7bf744 | 178 | readonly tasks: TaskStatistics |
0567595a | 179 | /** |
a4e07f72 | 180 | * Tasks runtime statistics. |
0567595a | 181 | */ |
eb7bf744 | 182 | readonly runTime: MeasurementStatistics |
02706357 | 183 | /** |
a4e07f72 | 184 | * Tasks wait time statistics. |
02706357 | 185 | */ |
eb7bf744 | 186 | readonly waitTime: MeasurementStatistics |
62c15a68 | 187 | /** |
5df69fab | 188 | * Tasks event loop utilization statistics. |
62c15a68 | 189 | */ |
eb7bf744 | 190 | readonly elu: EventLoopUtilizationMeasurementStatistics |
f06e48d8 JB |
191 | } |
192 | ||
193 | /** | |
194 | * Worker interface. | |
195 | */ | |
196 | export interface IWorker { | |
f59e1027 | 197 | /** |
83fa0a36 | 198 | * Worker id. |
f59e1027 | 199 | */ |
aecc6e48 JB |
200 | readonly id?: number |
201 | readonly threadId?: number | |
bdaf31cd | 202 | /** |
64383951 | 203 | * Registers an event listener. |
bdaf31cd | 204 | * |
38e795c1 | 205 | * @param event - The event. |
48ef9107 | 206 | * @param handler - The event handler. |
bdaf31cd | 207 | */ |
4b628b48 | 208 | readonly on: ((event: 'message', handler: MessageHandler<this>) => void) & |
78cea37e JB |
209 | ((event: 'error', handler: ErrorHandler<this>) => void) & |
210 | ((event: 'online', handler: OnlineHandler<this>) => void) & | |
211 | ((event: 'exit', handler: ExitHandler<this>) => void) | |
bdaf31cd | 212 | /** |
64383951 | 213 | * Registers a listener to the exit event that will only be performed once. |
bdaf31cd | 214 | * |
38e795c1 JB |
215 | * @param event - `'exit'`. |
216 | * @param handler - The exit handler. | |
bdaf31cd | 217 | */ |
4b628b48 | 218 | readonly once: (event: 'exit', handler: ExitHandler<this>) => void |
bdaf31cd | 219 | } |
f06e48d8 JB |
220 | |
221 | /** | |
222 | * Worker node interface. | |
c319c66b JB |
223 | * |
224 | * @typeParam Worker - Type of worker. | |
e102732c | 225 | * @typeParam Data - Type of data sent to the worker. This can only be structured-cloneable data. |
c319c66b | 226 | * @internal |
f06e48d8 | 227 | */ |
4b628b48 | 228 | export interface IWorkerNode<Worker extends IWorker, Data = unknown> { |
c319c66b JB |
229 | /** |
230 | * Worker node worker. | |
231 | */ | |
02706357 | 232 | readonly worker: Worker |
f59e1027 JB |
233 | /** |
234 | * Worker node worker info. | |
235 | */ | |
eb7bf744 | 236 | readonly info: WorkerInfo |
c319c66b | 237 | /** |
a4e07f72 | 238 | * Worker node worker usage statistics. |
c319c66b | 239 | */ |
f59e1027 | 240 | usage: WorkerUsage |
c319c66b | 241 | /** |
4b628b48 JB |
242 | * Worker node tasks queue size. |
243 | * | |
244 | * @returns The tasks queue size. | |
245 | */ | |
246 | readonly tasksQueueSize: () => number | |
247 | /** | |
248 | * Worker node enqueue task. | |
249 | * | |
250 | * @param task - The task to queue. | |
251 | * @returns The task queue size. | |
252 | */ | |
253 | readonly enqueueTask: (task: Task<Data>) => number | |
254 | /** | |
255 | * Worker node dequeue task. | |
256 | * | |
257 | * @returns The dequeued task. | |
258 | */ | |
259 | readonly dequeueTask: () => Task<Data> | undefined | |
260 | /** | |
261 | * Worker node clear tasks queue. | |
262 | */ | |
263 | readonly clearTasksQueue: () => void | |
264 | /** | |
265 | * Worker node reset usage statistics . | |
c319c66b | 266 | */ |
4b628b48 | 267 | readonly resetUsage: () => void |
ff128cc9 JB |
268 | /** |
269 | * Worker node get tasks usage statistics. | |
270 | */ | |
271 | readonly getTasksWorkerUsage: (name: string) => WorkerUsage | undefined | |
f06e48d8 | 272 | } |