refactor: add task function name to task performance
[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> {
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 66export 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 */
98export 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 109export 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 */
135export const WorkerTypes = Object.freeze({
136 cluster: 'cluster',
137 thread: 'thread'
138} as const)
139
140/**
141 * Worker type.
142 */
143export type WorkerType = keyof typeof WorkerTypes
144
f59e1027
JB
145/**
146 * Worker information.
147 *
148 * @internal
149 */
150export 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 */
174export 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 */
196export 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 228export 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
f06e48d8 268}