docs: enhance documentation and update changelog entries
[poolifier.git] / src / pools / worker.ts
1 import type { CircularArray } from '../circular-array'
2
3 /**
4 * Callback invoked if the worker has received a message.
5 */
6 export type MessageHandler<Worker extends IWorker> = (
7 this: Worker,
8 m: unknown
9 ) => void
10
11 /**
12 * Callback invoked if the worker raised an error.
13 */
14 export type ErrorHandler<Worker extends IWorker> = (
15 this: Worker,
16 e: Error
17 ) => void
18
19 /**
20 * Callback invoked when the worker has started successfully.
21 */
22 export type OnlineHandler<Worker extends IWorker> = (this: Worker) => void
23
24 /**
25 * Callback invoked when the worker exits successfully.
26 */
27 export type ExitHandler<Worker extends IWorker> = (
28 this: Worker,
29 code: number
30 ) => void
31
32 /**
33 * Message object that is passed as a task between main worker and worker.
34 *
35 * @typeParam Data - Type of data sent to the worker. This can only be serializable data.
36 * @internal
37 */
38 export interface Task<Data = unknown> {
39 /**
40 * Input data that will be passed to the worker.
41 */
42 readonly data?: Data
43 /**
44 * UUID of the message.
45 */
46 readonly id?: string
47 }
48
49 /**
50 * Worker tasks usage statistics.
51 *
52 * @internal
53 */
54 export interface TasksUsage {
55 /**
56 * Number of tasks executed.
57 */
58 run: number
59 /**
60 * Number of tasks running.
61 */
62 running: number
63 /**
64 * Tasks runtime.
65 */
66 runTime: number
67 /**
68 * Tasks runtime history.
69 */
70 runTimeHistory: CircularArray<number>
71 /**
72 * Average tasks runtime.
73 */
74 avgRunTime: number
75 /**
76 * Median tasks runtime.
77 */
78 medRunTime: number
79 /**
80 * Number of tasks errored.
81 */
82 error: number
83 }
84
85 /**
86 * Worker interface.
87 */
88 export interface IWorker {
89 /**
90 * Register an event listener.
91 *
92 * @param event - The event.
93 * @param handler - The event listener.
94 */
95 on: ((event: 'message', handler: MessageHandler<this>) => void) &
96 ((event: 'error', handler: ErrorHandler<this>) => void) &
97 ((event: 'online', handler: OnlineHandler<this>) => void) &
98 ((event: 'exit', handler: ExitHandler<this>) => void)
99 /**
100 * Register a listener to the exit event that will only performed once.
101 *
102 * @param event - `'exit'`.
103 * @param handler - The exit handler.
104 */
105 once: (event: 'exit', handler: ExitHandler<this>) => void
106 }
107
108 /**
109 * Worker node interface.
110 *
111 * @typeParam Worker - Type of worker.
112 * @typeParam Data - Type of data sent to the worker. This can only be serializable data.
113 * @internal
114 */
115 export interface WorkerNode<Worker extends IWorker, Data = unknown> {
116 /**
117 * Worker node worker.
118 */
119 readonly worker: Worker
120 /**
121 * Worker node tasks usage statistics.
122 */
123 tasksUsage: TasksUsage
124 /**
125 * Worker node tasks queue.
126 */
127 readonly tasksQueue: Array<Task<Data>>
128 }