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