From 77b8e0191123b0e76832c642454adceab9b8ad13 Mon Sep 17 00:00:00 2001 From: Jiralite <33201955+Jiralite@users.noreply.github.com> Date: Thu, 17 Feb 2022 16:46:06 +0000 Subject: [PATCH] fix(Shard): V13 EventEmitter listener warning (#7479) --- src/sharding/Shard.js | 32 ++++++++++++++++++++++++++++++++ src/sharding/ShardClientUtil.js | 31 ++++++++++++++++++++++++++++++- typings/index.d.ts | 4 ++++ 3 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/sharding/Shard.js b/src/sharding/Shard.js index 67d9d03365b8..321c0797357d 100644 --- a/src/sharding/Shard.js +++ b/src/sharding/Shard.js @@ -249,14 +249,18 @@ class Shard extends EventEmitter { const listener = message => { if (message?._fetchProp !== prop) return; child.removeListener('message', listener); + this.decrementMaxListeners(child); this._fetches.delete(prop); if (!message._error) resolve(message._result); else reject(Util.makeError(message._error)); }; + + this.incrementMaxListeners(child); child.on('message', listener); this.send({ _fetchProp: prop }).catch(err => { child.removeListener('message', listener); + this.decrementMaxListeners(child); this._fetches.delete(prop); reject(err); }); @@ -288,14 +292,18 @@ class Shard extends EventEmitter { const listener = message => { if (message?._eval !== _eval) return; child.removeListener('message', listener); + this.decrementMaxListeners(child); this._evals.delete(_eval); if (!message._error) resolve(message._result); else reject(Util.makeError(message._error)); }; + + this.incrementMaxListeners(child); child.on('message', listener); this.send({ _eval }).catch(err => { child.removeListener('message', listener); + this.decrementMaxListeners(child); this._evals.delete(_eval); reject(err); }); @@ -406,6 +414,30 @@ class Shard extends EventEmitter { if (respawn) this.spawn(timeout).catch(err => this.emit('error', err)); } + + /** + * Increments max listeners by one for a given emitter, if they are not zero. + * @param {EventEmitter|process} emitter The emitter that emits the events. + * @private + */ + incrementMaxListeners(emitter) { + const maxListeners = emitter.getMaxListeners(); + if (maxListeners !== 0) { + emitter.setMaxListeners(maxListeners + 1); + } + } + + /** + * Decrements max listeners by one for a given emitter, if they are not zero. + * @param {EventEmitter|process} emitter The emitter that emits the events. + * @private + */ + decrementMaxListeners(emitter) { + const maxListeners = emitter.getMaxListeners(); + if (maxListeners !== 0) { + emitter.setMaxListeners(maxListeners - 1); + } + } } module.exports = Shard; diff --git a/src/sharding/ShardClientUtil.js b/src/sharding/ShardClientUtil.js index 81cba4263ea1..982d4090dbc1 100644 --- a/src/sharding/ShardClientUtil.js +++ b/src/sharding/ShardClientUtil.js @@ -111,13 +111,16 @@ class ShardClientUtil { const listener = message => { if (message?._sFetchProp !== prop || message._sFetchPropShard !== shard) return; parent.removeListener('message', listener); + this.decrementMaxListeners(parent); if (!message._error) resolve(message._result); else reject(Util.makeError(message._error)); }; + this.incrementMaxListeners(parent); parent.on('message', listener); this.send({ _sFetchProp: prop, _sFetchPropShard: shard }).catch(err => { parent.removeListener('message', listener); + this.decrementMaxListeners(parent); reject(err); }); }); @@ -146,13 +149,15 @@ class ShardClientUtil { const listener = message => { if (message?._sEval !== script || message._sEvalShard !== options.shard) return; parent.removeListener('message', listener); + this.decrementMaxListeners(parent); if (!message._error) resolve(message._result); else reject(Util.makeError(message._error)); }; + this.incrementMaxListeners(parent); parent.on('message', listener); - this.send({ _sEval: script, _sEvalShard: options.shard }).catch(err => { parent.removeListener('message', listener); + this.decrementMaxListeners(parent); reject(err); }); }); @@ -241,6 +246,30 @@ class ShardClientUtil { if (shard < 0) throw new Error('SHARDING_SHARD_MISCALCULATION', shard, guildId, shardCount); return shard; } + + /** + * Increments max listeners by one for a given emitter, if they are not zero. + * @param {EventEmitter|process} emitter The emitter that emits the events. + * @private + */ + incrementMaxListeners(emitter) { + const maxListeners = emitter.getMaxListeners(); + if (maxListeners !== 0) { + emitter.setMaxListeners(maxListeners + 1); + } + } + + /** + * Decrements max listeners by one for a given emitter, if they are not zero. + * @param {EventEmitter|process} emitter The emitter that emits the events. + * @private + */ + decrementMaxListeners(emitter) { + const maxListeners = emitter.getMaxListeners(); + if (maxListeners !== 0) { + emitter.setMaxListeners(maxListeners - 1); + } + } } module.exports = ShardClientUtil; diff --git a/typings/index.d.ts b/typings/index.d.ts index 4c6659f08abf..da94505a4871 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -2008,6 +2008,8 @@ export class Shard extends EventEmitter { private _fetches: Map>; private _handleExit(respawn?: boolean, timeout?: number): void; private _handleMessage(message: unknown): void; + private incrementMaxListeners(emitter: EventEmitter | ChildProcess): void; + private decrementMaxListeners(emitter: EventEmitter | ChildProcess): void; public args: string[]; public execArgv: string[]; @@ -2041,6 +2043,8 @@ export class ShardClientUtil { private constructor(client: Client, mode: ShardingManagerMode); private _handleMessage(message: unknown): void; private _respond(type: string, message: unknown): void; + private incrementMaxListeners(emitter: EventEmitter | ChildProcess): void; + private decrementMaxListeners(emitter: EventEmitter | ChildProcess): void; public client: Client; public readonly count: number;