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