refactor: abstract out measurement statistics
[poolifier.git] / src / pools / worker.ts
CommitLineData
62c15a68 1import type { EventLoopUtilization } from 'node:perf_hooks'
f06e48d8 2import type { CircularArray } from '../circular-array'
29ee7e9a 3import type { Queue } from '../queue'
f06e48d8 4
bdaf31cd
JB
5/**
6 * Callback invoked if the worker has received a message.
7 */
50e66724
JB
8export 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
16export 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 24export type OnlineHandler<Worker extends IWorker> = (this: Worker) => void
bdaf31cd
JB
25
26/**
27 * Callback invoked when the worker exits successfully.
28 */
50e66724
JB
29export 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 40export 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 64export 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
89export 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 */
113export 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 */
135export 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 */
162export 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}