feat: support multiple functions per worker
[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 * Task name.
41 */
42 readonly name?: string
43 /**
44 * Task input data that will be passed to the worker.
45 */
46 readonly data?: Data
47 /**
48 * UUID of the message.
49 */
50 readonly id?: string
51 }
52
53 /**
54 * Worker tasks usage statistics.
55 *
56 * @internal
57 */
58 export interface TasksUsage {
59 /**
60 * Number of tasks executed.
61 */
62 run: number
63 /**
64 * Number of tasks running.
65 */
66 running: number
67 /**
68 * Tasks runtime.
69 */
70 runTime: number
71 /**
72 * Tasks runtime history.
73 */
74 runTimeHistory: CircularArray<number>
75 /**
76 * Average tasks runtime.
77 */
78 avgRunTime: number
79 /**
80 * Median tasks runtime.
81 */
82 medRunTime: number
83 /**
84 * Number of tasks errored.
85 */
86 error: number
87 }
88
89 /**
90 * Worker interface.
91 */
92 export interface IWorker {
93 /**
94 * Register an event listener.
95 *
96 * @param event - The event.
97 * @param handler - The event handler.
98 */
99 on: ((event: 'message', handler: MessageHandler<this>) => void) &
100 ((event: 'error', handler: ErrorHandler<this>) => void) &
101 ((event: 'online', handler: OnlineHandler<this>) => void) &
102 ((event: 'exit', handler: ExitHandler<this>) => void)
103 /**
104 * Register a listener to the exit event that will only be performed once.
105 *
106 * @param event - `'exit'`.
107 * @param handler - The exit handler.
108 */
109 once: (event: 'exit', handler: ExitHandler<this>) => void
110 }
111
112 /**
113 * Worker node interface.
114 *
115 * @typeParam Worker - Type of worker.
116 * @typeParam Data - Type of data sent to the worker. This can only be serializable data.
117 * @internal
118 */
119 export interface WorkerNode<Worker extends IWorker, Data = unknown> {
120 /**
121 * Worker node worker.
122 */
123 readonly worker: Worker
124 /**
125 * Worker node tasks usage statistics.
126 */
127 tasksUsage: TasksUsage
128 /**
129 * Worker node tasks queue.
130 */
131 readonly tasksQueue: Array<Task<Data>>
132 }