Merge branch 'master' of github.com:poolifier/poolifier
[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 * Worker task interface.
34 */
35 export interface Task<Data = unknown> {
36 /**
37 * Worker task data.
38 */
39 data: Data
40 /**
41 * Task UUID.
42 */
43 id: string
44 }
45
46 /**
47 * Worker tasks usage statistics.
48 */
49 export interface TasksUsage {
50 run: number
51 running: number
52 runTime: number
53 runTimeHistory: CircularArray<number>
54 avgRunTime: number
55 medRunTime: number
56 error: number
57 }
58
59 /**
60 * Worker interface.
61 */
62 export interface IWorker {
63 /**
64 * Register an event listener.
65 *
66 * @param event - The event.
67 * @param handler - The event listener.
68 */
69 on: ((event: 'message', handler: MessageHandler<this>) => void) &
70 ((event: 'error', handler: ErrorHandler<this>) => void) &
71 ((event: 'online', handler: OnlineHandler<this>) => void) &
72 ((event: 'exit', handler: ExitHandler<this>) => void)
73 /**
74 * Register a listener to the exit event that will only performed once.
75 *
76 * @param event - `'exit'`.
77 * @param handler - The exit handler.
78 */
79 once: (event: 'exit', handler: ExitHandler<this>) => void
80 }
81
82 /**
83 * Worker node interface.
84 */
85 export interface WorkerNode<Worker extends IWorker, Data = unknown> {
86 worker: Worker
87 tasksUsage: TasksUsage
88 tasksQueue: Array<Task<Data>>
89 }