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