+ }
+
+ private checkAndEmitBusy (): void {
+ if (this.opts.enableEvents && this.busy) {
+ this.emitter?.emit('busy')
+ }
+ }
+
+ /**
+ * Increase the number of tasks that the given worker has applied.
+ *
+ * @param worker Worker which running tasks is increased.
+ */
+ private increaseWorkerRunningTasks (worker: Worker): void {
+ this.stepWorkerRunningTasks(worker, 1)
+ }
+
+ /**
+ * Decrease the number of tasks that the given worker has applied.
+ *
+ * @param worker Worker which running tasks is decreased.
+ */
+ private decreaseWorkerRunningTasks (worker: Worker): void {
+ this.stepWorkerRunningTasks(worker, -1)
+ }
+
+ /**
+ * Step the number of tasks that the given worker has applied.
+ *
+ * @param worker Worker which running tasks are stepped.
+ * @param step Number of running tasks step.
+ */
+ private stepWorkerRunningTasks (worker: Worker, step: number): void {
+ const tasksUsage = this.workersTasksUsage.get(worker)
+ if (tasksUsage !== undefined) {
+ tasksUsage.running = tasksUsage.running + step
+ this.workersTasksUsage.set(worker, tasksUsage)
+ } else {
+ throw new Error(WORKER_NOT_FOUND_TASKS_USAGE_MAP)
+ }
+ }
+
+ /**
+ * Step the number of tasks that the given worker has run.
+ *
+ * @param worker Worker which has run tasks.
+ * @param step Number of run tasks step.
+ */
+ private stepWorkerRunTasks (worker: Worker, step: number) {
+ const tasksUsage = this.workersTasksUsage.get(worker)
+ if (tasksUsage !== undefined) {
+ tasksUsage.run = tasksUsage.run + step
+ this.workersTasksUsage.set(worker, tasksUsage)
+ } else {
+ throw new Error(WORKER_NOT_FOUND_TASKS_USAGE_MAP)
+ }
+ }
+
+ /**
+ * Update tasks run time for the given worker.
+ *
+ * @param worker Worker which run the task.
+ * @param taskRunTime Worker task run time.
+ */
+ private updateWorkerTasksRunTime (
+ worker: Worker,
+ taskRunTime: number | undefined
+ ) {
+ const tasksUsage = this.workersTasksUsage.get(worker)
+ if (tasksUsage !== undefined && tasksUsage.run !== 0) {
+ tasksUsage.runTime += taskRunTime ?? 0
+ tasksUsage.avgRunTime = tasksUsage.runTime / tasksUsage.run
+ this.workersTasksUsage.set(worker, tasksUsage)
+ } else {
+ throw new Error(WORKER_NOT_FOUND_TASKS_USAGE_MAP)
+ }
+ }
+
+ /**
+ * Reset worker tasks usage statistics.
+ *
+ * @param worker The worker.
+ */
+ private resetWorkerTasksUsage (worker: Worker): void {
+ this.workersTasksUsage.delete(worker)