feat: add ELU tasks accounting
[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
JB
49 /**
50 * Submission timestamp.
51 */
52 readonly submissionTimestamp?: number
0274ce2d 53 /**
70a4f5ea 54 * Message UUID.
0274ce2d 55 */
02706357 56 readonly id?: string
f06e48d8
JB
57}
58
59/**
60 * Worker tasks usage statistics.
f9b4bbf8
JB
61 *
62 * @internal
f06e48d8
JB
63 */
64export interface TasksUsage {
02706357
JB
65 /**
66 * Number of tasks executed.
67 */
1ab50fe5 68 ran: number
02706357
JB
69 /**
70 * Number of tasks running.
71 */
f06e48d8 72 running: number
02706357
JB
73 /**
74 * Tasks runtime.
75 */
f06e48d8 76 runTime: number
02706357
JB
77 /**
78 * Tasks runtime history.
79 */
f06e48d8 80 runTimeHistory: CircularArray<number>
02706357
JB
81 /**
82 * Average tasks runtime.
83 */
f06e48d8 84 avgRunTime: number
02706357
JB
85 /**
86 * Median tasks runtime.
87 */
f06e48d8 88 medRunTime: number
0567595a
JB
89 /**
90 * Tasks wait time.
91 */
92 waitTime: number
93 /**
94 * Tasks wait time history.
95 */
96 waitTimeHistory: CircularArray<number>
97 /**
98 * Average tasks wait time.
99 */
100 avgWaitTime: number
101 /**
102 * Median tasks wait time.
103 */
104 medWaitTime: number
02706357
JB
105 /**
106 * Number of tasks errored.
107 */
f06e48d8 108 error: number
62c15a68
JB
109 /**
110 * Event loop utilization.
111 */
112 elu: EventLoopUtilization | undefined
f06e48d8
JB
113}
114
115/**
116 * Worker interface.
117 */
118export interface IWorker {
bdaf31cd 119 /**
78cea37e 120 * Register an event listener.
bdaf31cd 121 *
38e795c1 122 * @param event - The event.
48ef9107 123 * @param handler - The event handler.
bdaf31cd 124 */
78cea37e
JB
125 on: ((event: 'message', handler: MessageHandler<this>) => void) &
126 ((event: 'error', handler: ErrorHandler<this>) => void) &
127 ((event: 'online', handler: OnlineHandler<this>) => void) &
128 ((event: 'exit', handler: ExitHandler<this>) => void)
bdaf31cd 129 /**
7d6b5ad2 130 * Register a listener to the exit event that will only be performed once.
bdaf31cd 131 *
38e795c1
JB
132 * @param event - `'exit'`.
133 * @param handler - The exit handler.
bdaf31cd 134 */
78cea37e 135 once: (event: 'exit', handler: ExitHandler<this>) => void
bdaf31cd 136}
f06e48d8
JB
137
138/**
139 * Worker node interface.
c319c66b
JB
140 *
141 * @typeParam Worker - Type of worker.
142 * @typeParam Data - Type of data sent to the worker. This can only be serializable data.
143 * @internal
f06e48d8
JB
144 */
145export interface WorkerNode<Worker extends IWorker, Data = unknown> {
c319c66b
JB
146 /**
147 * Worker node worker.
148 */
02706357 149 readonly worker: Worker
c319c66b
JB
150 /**
151 * Worker node tasks usage statistics.
152 */
f06e48d8 153 tasksUsage: TasksUsage
c319c66b
JB
154 /**
155 * Worker node tasks queue.
156 */
29ee7e9a 157 readonly tasksQueue: Queue<Task<Data>>
f06e48d8 158}