fix: fix type namespace collision
[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/**
cd4d348a 60 * Measurement statistics.
f9b4bbf8
JB
61 *
62 * @internal
f06e48d8 63 */
cd4d348a 64export interface MeasurementStatistics {
02706357 65 /**
cd4d348a 66 * Measurement aggregation.
02706357 67 */
a4e07f72 68 aggregation: number
02706357 69 /**
cd4d348a 70 * Measurement average.
02706357 71 */
a4e07f72 72 average: number
02706357 73 /**
cd4d348a 74 * Measurement median.
02706357 75 */
a4e07f72 76 median: number
02706357 77 /**
cd4d348a 78 * Measurement history.
02706357 79 */
a4e07f72
JB
80 history: CircularArray<number>
81}
82
83/**
84 * Task statistics.
85 *
86 * @internal
87 */
a4e07f72 88export interface TaskStatistics {
02706357 89 /**
a4e07f72 90 * Number of tasks executed.
02706357 91 */
a4e07f72 92 executed: number
02706357 93 /**
a4e07f72 94 * Number of tasks executing.
02706357 95 */
a4e07f72 96 executing: number
0567595a 97 /**
a4e07f72 98 * Number of tasks queued.
0567595a 99 */
a4e07f72 100 queued: number
0567595a 101 /**
a4e07f72 102 * Number of tasks failed.
0567595a 103 */
a4e07f72
JB
104 failed: number
105}
106
107/**
108 * Worker usage statistics.
109 *
110 * @internal
111 */
112export interface WorkerUsage {
0567595a 113 /**
a4e07f72 114 * Tasks statistics.
0567595a 115 */
a4e07f72 116 tasks: TaskStatistics
0567595a 117 /**
a4e07f72 118 * Tasks runtime statistics.
0567595a 119 */
cd4d348a 120 runTime: MeasurementStatistics
02706357 121 /**
a4e07f72 122 * Tasks wait time statistics.
02706357 123 */
cd4d348a 124 waitTime: MeasurementStatistics
62c15a68
JB
125 /**
126 * Event loop utilization.
127 */
128 elu: EventLoopUtilization | undefined
f06e48d8
JB
129}
130
131/**
132 * Worker interface.
133 */
134export interface IWorker {
bdaf31cd 135 /**
78cea37e 136 * Register an event listener.
bdaf31cd 137 *
38e795c1 138 * @param event - The event.
48ef9107 139 * @param handler - The event handler.
bdaf31cd 140 */
78cea37e
JB
141 on: ((event: 'message', handler: MessageHandler<this>) => void) &
142 ((event: 'error', handler: ErrorHandler<this>) => void) &
143 ((event: 'online', handler: OnlineHandler<this>) => void) &
144 ((event: 'exit', handler: ExitHandler<this>) => void)
bdaf31cd 145 /**
7d6b5ad2 146 * Register a listener to the exit event that will only be performed once.
bdaf31cd 147 *
38e795c1
JB
148 * @param event - `'exit'`.
149 * @param handler - The exit handler.
bdaf31cd 150 */
78cea37e 151 once: (event: 'exit', handler: ExitHandler<this>) => void
bdaf31cd 152}
f06e48d8
JB
153
154/**
155 * Worker node interface.
c319c66b
JB
156 *
157 * @typeParam Worker - Type of worker.
158 * @typeParam Data - Type of data sent to the worker. This can only be serializable data.
159 * @internal
f06e48d8
JB
160 */
161export interface WorkerNode<Worker extends IWorker, Data = unknown> {
c319c66b
JB
162 /**
163 * Worker node worker.
164 */
02706357 165 readonly worker: Worker
c319c66b 166 /**
a4e07f72 167 * Worker node worker usage statistics.
c319c66b 168 */
a4e07f72 169 workerUsage: WorkerUsage
c319c66b
JB
170 /**
171 * Worker node tasks queue.
172 */
29ee7e9a 173 readonly tasksQueue: Queue<Task<Data>>
f06e48d8 174}