import { EventEmitter } from 'events'
-import type { FixedThreadPoolOptions, WorkerWithMessageChannel } from './fixed'
-import FixedThreadPool from './fixed'
+import {
+ FixedThreadPool,
+ FixedThreadPoolOptions,
+ WorkerWithMessageChannel
+} from './fixed'
class MyEmitter extends EventEmitter {}
* @author [Alessandro Pio Ardizio](https://github.com/pioardi)
* @since 0.0.1
*/
-export default class DynamicThreadPool<
+/* eslint-disable @typescript-eslint/no-explicit-any */
+export class DynamicThreadPool<
Data = any,
Response = any
> extends FixedThreadPool<Data, Response> {
+ /* eslint-enable @typescript-eslint/no-explicit-any */
public readonly emitter: MyEmitter
/**
this.emitter = new MyEmitter()
}
- protected _chooseWorker (): WorkerWithMessageChannel {
- let worker: WorkerWithMessageChannel
+ protected chooseWorker (): WorkerWithMessageChannel {
+ let worker: WorkerWithMessageChannel | undefined
for (const entry of this.tasks) {
if (entry[1] === 0) {
worker = entry[0]
} else {
if (this.workers.length === this.max) {
this.emitter.emit('FullPool')
- return super._chooseWorker()
+ return super.chooseWorker()
}
// all workers are busy create a new worker
- const worker = this._newWorker()
- worker.port2.on('message', (message) => {
+ const worker = this.newWorker()
+ worker.port2?.on('message', (message: { kill?: number }) => {
if (message.kill) {
worker.postMessage({ kill: 1 })
- worker.terminate()
+ void worker.terminate()
+ // clean workers from data structures
+ const workerIndex = this.workers.indexOf(worker)
+ this.workers.splice(workerIndex, 1)
+ this.tasks.delete(worker)
}
})
return worker
}
}
}
-
-module.exports = DynamicThreadPool