fix(Shard): EventEmitter listener warning (#7240)

Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com>
This commit is contained in:
Voxelli
2022-01-11 17:00:00 +05:30
committed by GitHub
parent 86ab526d49
commit ff3a8b8323
3 changed files with 66 additions and 1 deletions

View File

@@ -249,14 +249,18 @@ class Shard extends EventEmitter {
const listener = message => { const listener = message => {
if (message?._fetchProp !== prop) return; if (message?._fetchProp !== prop) return;
child.removeListener('message', listener); child.removeListener('message', listener);
this.decrementMaxListeners(child);
this._fetches.delete(prop); this._fetches.delete(prop);
if (!message._error) resolve(message._result); if (!message._error) resolve(message._result);
else reject(Util.makeError(message._error)); else reject(Util.makeError(message._error));
}; };
this.incrementMaxListeners(child);
child.on('message', listener); child.on('message', listener);
this.send({ _fetchProp: prop }).catch(err => { this.send({ _fetchProp: prop }).catch(err => {
child.removeListener('message', listener); child.removeListener('message', listener);
this.decrementMaxListeners(child);
this._fetches.delete(prop); this._fetches.delete(prop);
reject(err); reject(err);
}); });
@@ -288,14 +292,18 @@ class Shard extends EventEmitter {
const listener = message => { const listener = message => {
if (message?._eval !== _eval) return; if (message?._eval !== _eval) return;
child.removeListener('message', listener); child.removeListener('message', listener);
this.decrementMaxListeners(child);
this._evals.delete(_eval); this._evals.delete(_eval);
if (!message._error) resolve(message._result); if (!message._error) resolve(message._result);
else reject(Util.makeError(message._error)); else reject(Util.makeError(message._error));
}; };
this.incrementMaxListeners(child);
child.on('message', listener); child.on('message', listener);
this.send({ _eval }).catch(err => { this.send({ _eval }).catch(err => {
child.removeListener('message', listener); child.removeListener('message', listener);
this.decrementMaxListeners(child);
this._evals.delete(_eval); this._evals.delete(_eval);
reject(err); reject(err);
}); });
@@ -406,6 +414,30 @@ class Shard extends EventEmitter {
if (respawn) this.spawn(timeout).catch(err => this.emit('error', err)); 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; module.exports = Shard;

View File

@@ -111,13 +111,16 @@ class ShardClientUtil {
const listener = message => { const listener = message => {
if (message?._sFetchProp !== prop || message._sFetchPropShard !== shard) return; if (message?._sFetchProp !== prop || message._sFetchPropShard !== shard) return;
parent.removeListener('message', listener); parent.removeListener('message', listener);
this.decrementMaxListeners(parent);
if (!message._error) resolve(message._result); if (!message._error) resolve(message._result);
else reject(Util.makeError(message._error)); else reject(Util.makeError(message._error));
}; };
this.incrementMaxListeners(parent);
parent.on('message', listener); parent.on('message', listener);
this.send({ _sFetchProp: prop, _sFetchPropShard: shard }).catch(err => { this.send({ _sFetchProp: prop, _sFetchPropShard: shard }).catch(err => {
parent.removeListener('message', listener); parent.removeListener('message', listener);
this.decrementMaxListeners(parent);
reject(err); reject(err);
}); });
}); });
@@ -146,13 +149,15 @@ class ShardClientUtil {
const listener = message => { const listener = message => {
if (message?._sEval !== script || message._sEvalShard !== options.shard) return; if (message?._sEval !== script || message._sEvalShard !== options.shard) return;
parent.removeListener('message', listener); parent.removeListener('message', listener);
this.decrementMaxListeners(parent);
if (!message._error) resolve(message._result); if (!message._error) resolve(message._result);
else reject(Util.makeError(message._error)); else reject(Util.makeError(message._error));
}; };
this.incrementMaxListeners(parent);
parent.on('message', listener); parent.on('message', listener);
this.send({ _sEval: script, _sEvalShard: options.shard }).catch(err => { this.send({ _sEval: script, _sEvalShard: options.shard }).catch(err => {
parent.removeListener('message', listener); parent.removeListener('message', listener);
this.decrementMaxListeners(parent);
reject(err); reject(err);
}); });
}); });
@@ -241,6 +246,30 @@ class ShardClientUtil {
if (shard < 0) throw new Error('SHARDING_SHARD_MISCALCULATION', shard, guildId, shardCount); if (shard < 0) throw new Error('SHARDING_SHARD_MISCALCULATION', shard, guildId, shardCount);
return shard; 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; module.exports = ShardClientUtil;

View File

@@ -1975,6 +1975,8 @@ export class Shard extends EventEmitter {
private _fetches: Map<string, Promise<unknown>>; private _fetches: Map<string, Promise<unknown>>;
private _handleExit(respawn?: boolean, timeout?: number): void; private _handleExit(respawn?: boolean, timeout?: number): void;
private _handleMessage(message: unknown): void; private _handleMessage(message: unknown): void;
private incrementMaxListeners(emitter: EventEmitter | ChildProcess): void;
private decrementMaxListeners(emitter: EventEmitter | ChildProcess): void;
public args: string[]; public args: string[];
public execArgv: string[]; public execArgv: string[];
@@ -2008,6 +2010,8 @@ export class ShardClientUtil {
private constructor(client: Client, mode: ShardingManagerMode); private constructor(client: Client, mode: ShardingManagerMode);
private _handleMessage(message: unknown): void; private _handleMessage(message: unknown): void;
private _respond(type: string, 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 client: Client;
public readonly count: number; public readonly count: number;