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