X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fpools%2Fabstract-pool.ts;h=2ffd292afab9a0b540826820935b4a0febd34057;hb=464609011adfbe9330e28d448d462adcdffa64f5;hp=6e4465edd7a262af497cf8e9b84942ca9b80d4f6;hpb=280c2a7728fbeb53612d8bc115a295d0255dd991;p=poolifier.git diff --git a/src/pools/abstract-pool.ts b/src/pools/abstract-pool.ts index 6e4465ed..2ffd292a 100644 --- a/src/pools/abstract-pool.ts +++ b/src/pools/abstract-pool.ts @@ -24,6 +24,7 @@ export interface IWorker { on(event: 'error', handler: ErrorHandler): void on(event: 'online', handler: OnlineHandler): void on(event: 'exit', handler: ExitHandler): void + once(event: 'exit', handler: ExitHandler): void } /** @@ -161,9 +162,7 @@ export abstract class AbstractPool< } public async destroy (): Promise { - for (const worker of this.workers) { - await this.destroyWorker(worker) - } + await Promise.all(this.workers.map(worker => this.destroyWorker(worker))) } /** @@ -221,8 +220,10 @@ export abstract class AbstractPool< */ protected chooseWorker (): Worker { const chosenWorker = this.workers[this.nextWorkerIndex] - this.nextWorkerIndex++ - this.nextWorkerIndex %= this.workers.length + this.nextWorkerIndex = + this.workers.length - 1 === this.nextWorkerIndex + ? 0 + : this.nextWorkerIndex + 1 return chosenWorker } @@ -237,15 +238,13 @@ export abstract class AbstractPool< message: MessageValue ): void - protected abstract registerWorkerMessageListener ( - port: Worker, - listener: (message: MessageValue) => void - ): void + protected abstract registerWorkerMessageListener< + Message extends Data | Response + > (worker: Worker, listener: (message: MessageValue) => void): void - protected abstract unregisterWorkerMessageListener ( - port: Worker, - listener: (message: MessageValue) => void - ): void + protected abstract unregisterWorkerMessageListener< + Message extends Data | Response + > (worker: Worker, listener: (message: MessageValue) => void): void protected internalExecute ( worker: Worker, @@ -288,8 +287,8 @@ export abstract class AbstractPool< worker.on('error', this.opts.errorHandler ?? (() => {})) worker.on('online', this.opts.onlineHandler ?? (() => {})) - // TODO handle properly when a worker exit worker.on('exit', this.opts.exitHandler ?? (() => {})) + worker.once('exit', () => this.removeWorker(worker)) this.workers.push(worker)