refactor: cleanup task usage properties namespace
[poolifier.git] / src / pools / worker.ts
... / ...
CommitLineData
1import type { CircularArray } from '../circular-array'
2import type { Queue } from '../queue'
3
4/**
5 * Callback invoked if the worker has received a message.
6 */
7export 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 */
15export 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 */
23export type OnlineHandler<Worker extends IWorker> = (this: Worker) => void
24
25/**
26 * Callback invoked when the worker exits successfully.
27 */
28export 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 */
39export 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 * Submission timestamp.
50 */
51 readonly submissionTimestamp?: number
52 /**
53 * Message UUID.
54 */
55 readonly id?: string
56}
57
58/**
59 * Worker tasks usage statistics.
60 *
61 * @internal
62 */
63export interface TasksUsage {
64 /**
65 * Number of tasks executed.
66 */
67 ran: number
68 /**
69 * Number of tasks running.
70 */
71 running: number
72 /**
73 * Tasks runtime.
74 */
75 runTime: number
76 /**
77 * Tasks runtime history.
78 */
79 runTimeHistory: CircularArray<number>
80 /**
81 * Average tasks runtime.
82 */
83 avgRunTime: number
84 /**
85 * Median tasks runtime.
86 */
87 medRunTime: number
88 /**
89 * Tasks wait time.
90 */
91 waitTime: number
92 /**
93 * Tasks wait time history.
94 */
95 waitTimeHistory: CircularArray<number>
96 /**
97 * Average tasks wait time.
98 */
99 avgWaitTime: number
100 /**
101 * Median tasks wait time.
102 */
103 medWaitTime: number
104 /**
105 * Number of tasks errored.
106 */
107 error: number
108}
109
110/**
111 * Worker interface.
112 */
113export interface IWorker {
114 /**
115 * Register an event listener.
116 *
117 * @param event - The event.
118 * @param handler - The event handler.
119 */
120 on: ((event: 'message', handler: MessageHandler<this>) => void) &
121 ((event: 'error', handler: ErrorHandler<this>) => void) &
122 ((event: 'online', handler: OnlineHandler<this>) => void) &
123 ((event: 'exit', handler: ExitHandler<this>) => void)
124 /**
125 * Register a listener to the exit event that will only be performed once.
126 *
127 * @param event - `'exit'`.
128 * @param handler - The exit handler.
129 */
130 once: (event: 'exit', handler: ExitHandler<this>) => void
131}
132
133/**
134 * Worker node interface.
135 *
136 * @typeParam Worker - Type of worker.
137 * @typeParam Data - Type of data sent to the worker. This can only be serializable data.
138 * @internal
139 */
140export interface WorkerNode<Worker extends IWorker, Data = unknown> {
141 /**
142 * Worker node worker.
143 */
144 readonly worker: Worker
145 /**
146 * Worker node tasks usage statistics.
147 */
148 tasksUsage: TasksUsage
149 /**
150 * Worker node tasks queue.
151 */
152 readonly tasksQueue: Queue<Task<Data>>
153}