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