- private addWorkerSetElement(): WorkerSetElement {
- const worker = new Worker(this.workerScript);
- worker.on(
- 'message',
- (this.workerOptions?.messageHandler ?? WorkerConstants.EMPTY_FUNCTION).bind(
- this
- ) as MessageHandler<Worker>
- );
- worker.on('error', defaultErrorHandler.bind(this) as (err: Error) => void);
- worker.on('error', (error) => {
- this.emitter.emit('error', error);
- this.addWorkerSetElement();
- });
- worker.on('exit', defaultExitHandler.bind(this) as (exitCode: number) => void);
- worker.on('exit', () => this.workerSet.delete(this.getWorkerSetElementByWorker(worker)));
- const workerSetElement: WorkerSetElement = { worker, numberOfWorkerElements: 0 };
- this.workerSet.add(workerSetElement);
- return workerSetElement;
+ private addWorkerSetElement (): WorkerSetElement {
+ this.workerStartup = true
+ const worker = new Worker(this.workerScript, {
+ env: SHARE_ENV,
+ ...this.workerOptions.poolOptions?.workerOptions
+ })
+ worker.on('message', this.workerOptions.poolOptions?.messageHandler ?? EMPTY_FUNCTION)
+ worker.on('message', (message: WorkerMessage<WorkerData>) => {
+ if (message.event === WorkerMessageEvents.addedWorkerElement) {
+ this.emitter?.emit(WorkerSetEvents.elementAdded, this.info)
+ } else if (message.event === WorkerMessageEvents.workerElementError) {
+ this.emitter?.emit(WorkerSetEvents.elementError, message.data)
+ }
+ })
+ worker.on('error', this.workerOptions.poolOptions?.errorHandler ?? EMPTY_FUNCTION)
+ worker.on('error', error => {
+ this.emitter?.emit(WorkerSetEvents.error, error)
+ if (
+ this.workerOptions.poolOptions?.restartWorkerOnError === true &&
+ this.started &&
+ !this.workerStartup
+ ) {
+ this.addWorkerSetElement()
+ }
+ worker.unref()
+ worker.terminate().catch(error => this.emitter?.emit(WorkerSetEvents.error, error))
+ })
+ worker.on('online', this.workerOptions.poolOptions?.onlineHandler ?? EMPTY_FUNCTION)
+ worker.on('exit', this.workerOptions.poolOptions?.exitHandler ?? EMPTY_FUNCTION)
+ worker.once('exit', () => {
+ this.removeWorkerSetElement(this.getWorkerSetElementByWorker(worker))
+ })
+ const workerSetElement: WorkerSetElement = { worker, numberOfWorkerElements: 0 }
+ this.workerSet.add(workerSetElement)
+ this.workerStartup = false
+ return workerSetElement
+ }
+
+ private removeWorkerSetElement (workerSetElement: WorkerSetElement | undefined): void {
+ if (workerSetElement == null) {
+ return
+ }
+ this.workerSet.delete(workerSetElement)