Skip to content

Commit ff3a8b8

Browse files
fix(Shard): EventEmitter listener warning (#7240)
Co-authored-by: Jiralite <[email protected]>
1 parent 86ab526 commit ff3a8b8

File tree

3 files changed

+66
-1
lines changed

3 files changed

+66
-1
lines changed

packages/discord.js/src/sharding/Shard.js

+32
Original file line numberDiff line numberDiff line change
@@ -249,14 +249,18 @@ class Shard extends EventEmitter {
249249
const listener = message => {
250250
if (message?._fetchProp !== prop) return;
251251
child.removeListener('message', listener);
252+
this.decrementMaxListeners(child);
252253
this._fetches.delete(prop);
253254
if (!message._error) resolve(message._result);
254255
else reject(Util.makeError(message._error));
255256
};
257+
258+
this.incrementMaxListeners(child);
256259
child.on('message', listener);
257260

258261
this.send({ _fetchProp: prop }).catch(err => {
259262
child.removeListener('message', listener);
263+
this.decrementMaxListeners(child);
260264
this._fetches.delete(prop);
261265
reject(err);
262266
});
@@ -288,14 +292,18 @@ class Shard extends EventEmitter {
288292
const listener = message => {
289293
if (message?._eval !== _eval) return;
290294
child.removeListener('message', listener);
295+
this.decrementMaxListeners(child);
291296
this._evals.delete(_eval);
292297
if (!message._error) resolve(message._result);
293298
else reject(Util.makeError(message._error));
294299
};
300+
301+
this.incrementMaxListeners(child);
295302
child.on('message', listener);
296303

297304
this.send({ _eval }).catch(err => {
298305
child.removeListener('message', listener);
306+
this.decrementMaxListeners(child);
299307
this._evals.delete(_eval);
300308
reject(err);
301309
});
@@ -406,6 +414,30 @@ class Shard extends EventEmitter {
406414

407415
if (respawn) this.spawn(timeout).catch(err => this.emit('error', err));
408416
}
417+
418+
/**
419+
* Increments max listeners by one for a given emitter, if they are not zero.
420+
* @param {EventEmitter|process} emitter The emitter that emits the events.
421+
* @private
422+
*/
423+
incrementMaxListeners(emitter) {
424+
const maxListeners = emitter.getMaxListeners();
425+
if (maxListeners !== 0) {
426+
emitter.setMaxListeners(maxListeners + 1);
427+
}
428+
}
429+
430+
/**
431+
* Decrements max listeners by one for a given emitter, if they are not zero.
432+
* @param {EventEmitter|process} emitter The emitter that emits the events.
433+
* @private
434+
*/
435+
decrementMaxListeners(emitter) {
436+
const maxListeners = emitter.getMaxListeners();
437+
if (maxListeners !== 0) {
438+
emitter.setMaxListeners(maxListeners - 1);
439+
}
440+
}
409441
}
410442

411443
module.exports = Shard;

packages/discord.js/src/sharding/ShardClientUtil.js

+30-1
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,16 @@ class ShardClientUtil {
111111
const listener = message => {
112112
if (message?._sFetchProp !== prop || message._sFetchPropShard !== shard) return;
113113
parent.removeListener('message', listener);
114+
this.decrementMaxListeners(parent);
114115
if (!message._error) resolve(message._result);
115116
else reject(Util.makeError(message._error));
116117
};
118+
this.incrementMaxListeners(parent);
117119
parent.on('message', listener);
118120

119121
this.send({ _sFetchProp: prop, _sFetchPropShard: shard }).catch(err => {
120122
parent.removeListener('message', listener);
123+
this.decrementMaxListeners(parent);
121124
reject(err);
122125
});
123126
});
@@ -146,13 +149,15 @@ class ShardClientUtil {
146149
const listener = message => {
147150
if (message?._sEval !== script || message._sEvalShard !== options.shard) return;
148151
parent.removeListener('message', listener);
152+
this.decrementMaxListeners(parent);
149153
if (!message._error) resolve(message._result);
150154
else reject(Util.makeError(message._error));
151155
};
156+
this.incrementMaxListeners(parent);
152157
parent.on('message', listener);
153-
154158
this.send({ _sEval: script, _sEvalShard: options.shard }).catch(err => {
155159
parent.removeListener('message', listener);
160+
this.decrementMaxListeners(parent);
156161
reject(err);
157162
});
158163
});
@@ -241,6 +246,30 @@ class ShardClientUtil {
241246
if (shard < 0) throw new Error('SHARDING_SHARD_MISCALCULATION', shard, guildId, shardCount);
242247
return shard;
243248
}
249+
250+
/**
251+
* Increments max listeners by one for a given emitter, if they are not zero.
252+
* @param {EventEmitter|process} emitter The emitter that emits the events.
253+
* @private
254+
*/
255+
incrementMaxListeners(emitter) {
256+
const maxListeners = emitter.getMaxListeners();
257+
if (maxListeners !== 0) {
258+
emitter.setMaxListeners(maxListeners + 1);
259+
}
260+
}
261+
262+
/**
263+
* Decrements max listeners by one for a given emitter, if they are not zero.
264+
* @param {EventEmitter|process} emitter The emitter that emits the events.
265+
* @private
266+
*/
267+
decrementMaxListeners(emitter) {
268+
const maxListeners = emitter.getMaxListeners();
269+
if (maxListeners !== 0) {
270+
emitter.setMaxListeners(maxListeners - 1);
271+
}
272+
}
244273
}
245274

246275
module.exports = ShardClientUtil;

packages/discord.js/typings/index.d.ts

+4
Original file line numberDiff line numberDiff line change
@@ -1975,6 +1975,8 @@ export class Shard extends EventEmitter {
19751975
private _fetches: Map<string, Promise<unknown>>;
19761976
private _handleExit(respawn?: boolean, timeout?: number): void;
19771977
private _handleMessage(message: unknown): void;
1978+
private incrementMaxListeners(emitter: EventEmitter | ChildProcess): void;
1979+
private decrementMaxListeners(emitter: EventEmitter | ChildProcess): void;
19781980

19791981
public args: string[];
19801982
public execArgv: string[];
@@ -2008,6 +2010,8 @@ export class ShardClientUtil {
20082010
private constructor(client: Client, mode: ShardingManagerMode);
20092011
private _handleMessage(message: unknown): void;
20102012
private _respond(type: string, message: unknown): void;
2013+
private incrementMaxListeners(emitter: EventEmitter | ChildProcess): void;
2014+
private decrementMaxListeners(emitter: EventEmitter | ChildProcess): void;
20112015

20122016
public client: Client;
20132017
public readonly count: number;

0 commit comments

Comments
 (0)