import type { MessageValue } from '../utility-types'
import type { IPool } from './pool'
+/**
+ * An intentional empty function.
+ */
+function emptyFunction () {
+ // intentionally left blank
+}
+
/**
* Callback invoked if the worker raised an error.
*/
* Base class containing some shared logic for all poolifier pools.
*
* @template Worker Type of worker which manages this pool.
- * @template Data Type of data sent to the worker.
- * @template Response Type of response of execution.
+ * @template Data Type of data sent to the worker. This can only be serializable data.
+ * @template Response Type of response of execution. This can only be serializable data.
*/
export abstract class AbstractPool<
Worker extends IWorker,
if (!this.isMain()) {
throw new Error('Cannot start a pool from a worker!')
}
- // TODO christopher 2021-02-07: Improve this check e.g. with a pattern or blank check
- if (!this.filePath) {
- throw new Error('Please specify a file with a worker implementation')
- }
+ this.checkFilePath(this.filePath)
this.setupHook()
for (let i = 1; i <= this.numberOfWorkers; i++) {
this.emitter = new PoolEmitter()
}
- /**
- * Number of workers that this pool should manage.
- *
- * @returns Number of workers that this pool manages.
- * @deprecated Only here for backward compatibility.
- */
- // eslint-disable-next-line spellcheck/spell-checker
- public get numWorkers (): number {
- return this.numberOfWorkers
- }
-
- /**
- * Index for the next worker.
- *
- * @returns Index for the next worker.
- * @deprecated Only here for backward compatibility.
- */
- public get nextWorker (): number {
- return this.nextWorkerIndex
+ private checkFilePath (filePath: string) {
+ if (!filePath) {
+ throw new Error('Please specify a file with a worker implementation')
+ }
}
/**
* Perform the task specified in the constructor with the data parameter.
*
- * @param data The input for the specified task.
+ * @param data The input for the specified task. This can only be serializable data.
* @returns Promise that will be resolved when the task is successfully completed.
*/
public execute (data: Data): Promise<Response> {
/**
* Increase the number of tasks that the given workers has done.
*
- * @param worker Workers whose tasks are increased.
+ * @param worker Worker whose tasks are increased.
*/
protected increaseWorkersTask (worker: Worker): void {
- const numberOfTasksInProgress = this.tasks.get(worker)
- if (numberOfTasksInProgress !== undefined) {
- this.tasks.set(worker, numberOfTasksInProgress + 1)
- } else {
- throw Error('Worker could not be found in tasks map')
- }
+ this.stepWorkerNumberOfTasks(worker, 1)
}
/**
* Decrease the number of tasks that the given workers has done.
*
- * @param worker Workers whose tasks are decreased.
+ * @param worker Worker whose tasks are decreased.
*/
protected decreaseWorkersTasks (worker: Worker): void {
+ this.stepWorkerNumberOfTasks(worker, -1)
+ }
+
+ /**
+ * Step the number of tasks that the given workers has done.
+ *
+ * @param worker Worker whose tasks are set.
+ * @param step Worker number of tasks step.
+ */
+ private stepWorkerNumberOfTasks (worker: Worker, step: number) {
const numberOfTasksInProgress = this.tasks.get(worker)
if (numberOfTasksInProgress !== undefined) {
- this.tasks.set(worker, numberOfTasksInProgress - 1)
+ this.tasks.set(worker, numberOfTasksInProgress + step)
} else {
throw Error('Worker could not be found in tasks map')
}
protected createAndSetupWorker (): Worker {
const worker: Worker = this.createWorker()
- worker.on('error', this.opts.errorHandler ?? (() => {}))
- worker.on('online', this.opts.onlineHandler ?? (() => {}))
- worker.on('exit', this.opts.exitHandler ?? (() => {}))
+ worker.on('error', this.opts.errorHandler ?? emptyFunction)
+ worker.on('online', this.opts.onlineHandler ?? emptyFunction)
+ worker.on('exit', this.opts.exitHandler ?? emptyFunction)
worker.once('exit', () => this.removeWorker(worker))
this.workers.push(worker)