Skip to content

Commit

Permalink
fix(Shard): V13 EventEmitter listener warning (#7479)
Browse files Browse the repository at this point in the history
  • Loading branch information
Jiralite committed Feb 17, 2022
1 parent bc5ddc3 commit 77b8e01
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 1 deletion.
32 changes: 32 additions & 0 deletions src/sharding/Shard.js
Expand Up @@ -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);
});
Expand Down Expand Up @@ -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);
});
Expand Down Expand Up @@ -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;
31 changes: 30 additions & 1 deletion src/sharding/ShardClientUtil.js
Expand Up @@ -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);
});
});
Expand Down Expand Up @@ -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);
});
});
Expand Down Expand Up @@ -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;
4 changes: 4 additions & 0 deletions typings/index.d.ts
Expand Up @@ -2008,6 +2008,8 @@ export class Shard extends EventEmitter {
private _fetches: Map<string, Promise<unknown>>;
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[];
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 77b8e01

Please sign in to comment.