f5f1d1908a14d60f2e26f9d6baa75c627468e96b
[poolifier.git] / src / pools / pool-internal.ts
1 import EventEmitter from 'events'
2 import type { AbstractPoolWorker } from './abstract-pool-worker'
3 import type { IPool } from './pool'
4
5 /**
6 * Pool types.
7 */
8 export enum PoolType {
9 FIXED = 'fixed',
10 DYNAMIC = 'dynamic'
11 }
12
13 /**
14 * Tasks usage statistics.
15 */
16 export interface TasksUsage {
17 run: number
18 running: number
19 runTime: number
20 avgRunTime: number
21 }
22
23 /**
24 * Internal poolifier pool emitter.
25 */
26 export class PoolEmitter extends EventEmitter {}
27
28 /**
29 * Internal contract definition for a poolifier pool.
30 *
31 * @template Worker Type of worker which manages this pool.
32 * @template Data Type of data sent to the worker.
33 * @template Response Type of response of execution.
34 */
35 export interface IPoolInternal<
36 Worker extends AbstractPoolWorker,
37 Data = unknown,
38 Response = unknown
39 > extends IPool<Data, Response> {
40 /**
41 * List of currently available workers.
42 */
43 readonly workers: Worker[]
44
45 /**
46 * Emitter on which events can be listened to.
47 *
48 * Events that can currently be listened to:
49 *
50 * - `'busy'`
51 */
52 readonly emitter?: PoolEmitter
53
54 /**
55 * Pool type.
56 *
57 * If it is `'dynamic'`, it provides the `max` property.
58 */
59 readonly type: PoolType
60
61 /**
62 * Maximum number of workers that can be created by this pool.
63 */
64 readonly max?: number
65
66 /**
67 * Whether the pool is busy or not.
68 *
69 * The pool busyness boolean status.
70 */
71 readonly busy: boolean
72
73 /**
74 * Number of tasks currently concurrently running.
75 */
76 readonly numberOfRunningTasks: number
77
78 /**
79 * Find a free worker based on the number of tasks the worker has applied.
80 *
81 * If a worker is found with `0` running tasks, it is detected as free and returned.
82 *
83 * If no free worker is found, `false` is returned.
84 *
85 * @returns A free worker if there is one, otherwise `false`.
86 */
87 findFreeWorker(): Worker | false
88
89 /**
90 * Get worker index.
91 *
92 * @param worker The worker.
93 * @returns The worker index.
94 */
95 getWorkerIndex(worker: Worker): number
96
97 /**
98 * Get worker running tasks.
99 *
100 * @param worker The worker.
101 * @returns The number of tasks currently running on the worker.
102 */
103 getWorkerRunningTasks(worker: Worker): number | undefined
104
105 /**
106 * Get worker average tasks run time.
107 *
108 * @param worker The worker.
109 * @returns The average tasks run time on the worker.
110 */
111 getWorkerAverageTasksRunTime(worker: Worker): number | undefined
112 }