refactor: add task function name to task performance
[poolifier.git] / src / pools / worker-node.ts
CommitLineData
4b628b48
JB
1import { CircularArray } from '../circular-array'
2import { Queue } from '../queue'
3import {
4 type IWorker,
5 type IWorkerNode,
6 type Task,
7 type WorkerInfo,
8 type WorkerType,
9 WorkerTypes,
10 type WorkerUsage
11} from './worker'
12
60664f48
JB
13/**
14 * Worker node.
15 *
16 * @typeParam Worker - Type of worker.
17 * @typeParam Data - Type of data sent to the worker. This can only be structured-cloneable data.
18 */
4b628b48
JB
19export class WorkerNode<Worker extends IWorker, Data = unknown>
20implements IWorkerNode<Worker, Data> {
21 public readonly worker: Worker
22 public readonly info: WorkerInfo
23 public usage: WorkerUsage
24 private readonly tasksQueue: Queue<Task<Data>>
25
60664f48
JB
26 /**
27 * Constructs a new worker node.
28 *
29 * @param worker - The worker.
30 * @param workerType - The worker type.
60664f48 31 */
4b628b48
JB
32 constructor (worker: Worker, workerType: WorkerType) {
33 this.worker = worker
34 this.info = this.initWorkerInfo(worker, workerType)
35 this.usage = this.initWorkerUsage()
36 this.tasksQueue = new Queue<Task<Data>>()
37 }
38
39 /** @inheritdoc */
40 public tasksQueueSize (): number {
41 return this.tasksQueue.size
42 }
43
44 /**
45 * Worker node tasks queue maximum size.
46 *
47 * @returns The tasks queue maximum size.
48 */
49 private tasksQueueMaxSize (): number {
50 return this.tasksQueue.maxSize
51 }
52
53 /** @inheritdoc */
54 public enqueueTask (task: Task<Data>): number {
55 return this.tasksQueue.enqueue(task)
56 }
57
58 /** @inheritdoc */
59 public dequeueTask (): Task<Data> | undefined {
60 return this.tasksQueue.dequeue()
61 }
62
63 /** @inheritdoc */
64 public clearTasksQueue (): void {
65 this.tasksQueue.clear()
66 }
67
68 public resetUsage (): void {
69 this.usage = this.initWorkerUsage()
70 }
71
72 private initWorkerInfo (worker: Worker, workerType: WorkerType): WorkerInfo {
73 return {
74 id: this.getWorkerId(worker, workerType),
75 type: workerType,
76 dynamic: false,
2431bdb4 77 ready: false
4b628b48
JB
78 }
79 }
80
81 private initWorkerUsage (): WorkerUsage {
82 const getTasksQueueSize = (): number => {
83 return this.tasksQueueSize()
84 }
bf4ef2ca 85 const getTasksQueueMaxSize = (): number => {
4b628b48
JB
86 return this.tasksQueueMaxSize()
87 }
88 return {
89 tasks: {
90 executed: 0,
91 executing: 0,
92 get queued (): number {
93 return getTasksQueueSize()
94 },
95 get maxQueued (): number {
bf4ef2ca 96 return getTasksQueueMaxSize()
4b628b48
JB
97 },
98 failed: 0
99 },
100 runTime: {
101 history: new CircularArray()
102 },
103 waitTime: {
104 history: new CircularArray()
105 },
106 elu: {
107 idle: {
108 history: new CircularArray()
109 },
110 active: {
111 history: new CircularArray()
112 }
113 }
114 }
115 }
116
117 /**
118 * Gets the worker id.
119 *
120 * @param worker - The worker.
60664f48 121 * @param workerType - The worker type.
4b628b48
JB
122 * @returns The worker id.
123 */
124 private getWorkerId (
125 worker: Worker,
126 workerType: WorkerType
127 ): number | undefined {
128 if (workerType === WorkerTypes.thread) {
129 return worker.threadId
130 } else if (workerType === WorkerTypes.cluster) {
131 return worker.id
132 }
133 }
134}