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