Skip to content

Commit

Permalink
refactor: make ShardEvents the events of Shard (#8185)
Browse files Browse the repository at this point in the history
  • Loading branch information
almeidx committed Jul 3, 2022
1 parent 31d5930 commit c5750d5
Show file tree
Hide file tree
Showing 8 changed files with 91 additions and 50 deletions.
10 changes: 5 additions & 5 deletions packages/discord.js/src/client/websocket/WebSocketManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ const WebSocketShard = require('./WebSocketShard');
const PacketHandlers = require('./handlers');
const { Error, ErrorCodes } = require('../../errors');
const Events = require('../../util/Events');
const ShardEvents = require('../../util/ShardEvents');
const Status = require('../../util/Status');
const WebSocketShardEvents = require('../../util/WebSocketShardEvents');

const BeforeReadyWhitelist = [
GatewayDispatchEvents.Ready,
Expand Down Expand Up @@ -181,7 +181,7 @@ class WebSocketManager extends EventEmitter {
this.shardQueue.delete(shard);

if (!shard.eventsAttached) {
shard.on(ShardEvents.AllReady, unavailableGuilds => {
shard.on(WebSocketShardEvents.AllReady, unavailableGuilds => {
/**
* Emitted when a shard turns ready.
* @event Client#shardReady
Expand All @@ -194,7 +194,7 @@ class WebSocketManager extends EventEmitter {
this.checkShardsReady();
});

shard.on(ShardEvents.Close, event => {
shard.on(WebSocketShardEvents.Close, event => {
if (event.code === 1_000 ? this.destroyed : event.code in unrecoverableErrorCodeMap) {
/**
* Emitted when a shard's WebSocket disconnects and will no longer reconnect.
Expand Down Expand Up @@ -225,11 +225,11 @@ class WebSocketManager extends EventEmitter {
this.reconnect();
});

shard.on(ShardEvents.InvalidSession, () => {
shard.on(WebSocketShardEvents.InvalidSession, () => {
this.client.emit(Events.ShardReconnecting, shard.id);
});

shard.on(ShardEvents.Destroyed, () => {
shard.on(WebSocketShardEvents.Destroyed, () => {
this.debug('Shard was destroyed but no WebSocket connection was present! Reconnecting...', shard);

this.client.emit(Events.ShardReconnecting, shard.id);
Expand Down
36 changes: 18 additions & 18 deletions packages/discord.js/src/client/websocket/WebSocketShard.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ const { GatewayDispatchEvents, GatewayIntentBits, GatewayOpcodes } = require('di
const WebSocket = require('../../WebSocket');
const Events = require('../../util/Events');
const IntentsBitField = require('../../util/IntentsBitField');
const ShardEvents = require('../../util/ShardEvents');
const Status = require('../../util/Status');
const WebSocketShardEvents = require('../../util/WebSocketShardEvents');

const STATUS_KEYS = Object.keys(Status);
const CONNECTION_STATE = Object.keys(WebSocket.WebSocket);
Expand Down Expand Up @@ -202,11 +202,11 @@ class WebSocketShard extends EventEmitter {

return new Promise((resolve, reject) => {
const cleanup = () => {
this.removeListener(ShardEvents.Close, onClose);
this.removeListener(ShardEvents.Ready, onReady);
this.removeListener(ShardEvents.Resumed, onResumed);
this.removeListener(ShardEvents.InvalidSession, onInvalidOrDestroyed);
this.removeListener(ShardEvents.Destroyed, onInvalidOrDestroyed);
this.removeListener(WebSocketShardEvents.Close, onClose);
this.removeListener(WebSocketShardEvents.Ready, onReady);
this.removeListener(WebSocketShardEvents.Resumed, onResumed);
this.removeListener(WebSocketShardEvents.InvalidSession, onInvalidOrDestroyed);
this.removeListener(WebSocketShardEvents.Destroyed, onInvalidOrDestroyed);
};

const onReady = () => {
Expand All @@ -230,11 +230,11 @@ class WebSocketShard extends EventEmitter {
reject();
};

this.once(ShardEvents.Ready, onReady);
this.once(ShardEvents.Resumed, onResumed);
this.once(ShardEvents.Close, onClose);
this.once(ShardEvents.InvalidSession, onInvalidOrDestroyed);
this.once(ShardEvents.Destroyed, onInvalidOrDestroyed);
this.once(WebSocketShardEvents.Ready, onReady);
this.once(WebSocketShardEvents.Resumed, onResumed);
this.once(WebSocketShardEvents.Close, onClose);
this.once(WebSocketShardEvents.InvalidSession, onInvalidOrDestroyed);
this.once(WebSocketShardEvents.Destroyed, onInvalidOrDestroyed);

if (this.connection?.readyState === WebSocket.OPEN) {
this.debug('An open connection was found, attempting an immediate identify.');
Expand Down Expand Up @@ -395,7 +395,7 @@ class WebSocketShard extends EventEmitter {
* @event WebSocketShard#close
* @param {CloseEvent} event The received event
*/
this.emit(ShardEvents.Close, event);
this.emit(WebSocketShardEvents.Close, event);
}
/**
* Called whenever a packet is received.
Expand All @@ -414,7 +414,7 @@ class WebSocketShard extends EventEmitter {
* Emitted when the shard receives the READY payload and is now waiting for guilds
* @event WebSocketShard#ready
*/
this.emit(ShardEvents.Ready);
this.emit(WebSocketShardEvents.Ready);

this.sessionId = packet.d.session_id;
this.expectedGuilds = new Set(packet.d.guilds.map(d => d.id));
Expand All @@ -428,7 +428,7 @@ class WebSocketShard extends EventEmitter {
* Emitted when the shard resumes successfully
* @event WebSocketShard#resumed
*/
this.emit(ShardEvents.Resumed);
this.emit(WebSocketShardEvents.Resumed);

this.status = Status.Ready;
const replayed = packet.s - this.closeSequence;
Expand Down Expand Up @@ -469,7 +469,7 @@ class WebSocketShard extends EventEmitter {
* Emitted when the session has been invalidated.
* @event WebSocketShard#invalidSession
*/
this.emit(ShardEvents.InvalidSession);
this.emit(WebSocketShardEvents.InvalidSession);
break;
case GatewayOpcodes.HeartbeatAck:
this.ackHeartbeat();
Expand Down Expand Up @@ -509,7 +509,7 @@ class WebSocketShard extends EventEmitter {
* @event WebSocketShard#allReady
* @param {?Set<string>} unavailableGuilds Set of unavailable guilds, if any
*/
this.emit(ShardEvents.AllReady);
this.emit(WebSocketShardEvents.AllReady);
return;
}
const hasGuildsIntent = new IntentsBitField(this.manager.client.options.intents).has(GatewayIntentBits.Guilds);
Expand All @@ -533,7 +533,7 @@ class WebSocketShard extends EventEmitter {

this.status = Status.Ready;

this.emit(ShardEvents.AllReady, this.expectedGuilds);
this.emit(WebSocketShardEvents.AllReady, this.expectedGuilds);
},
hasGuildsIntent ? waitGuildTimeout : 0,
).unref();
Expand Down Expand Up @@ -878,7 +878,7 @@ class WebSocketShard extends EventEmitter {
* @private
* @event WebSocketShard#destroyed
*/
this.emit(ShardEvents.Destroyed);
this.emit(WebSocketShardEvents.Destroyed);
}
}

Expand Down
1 change: 1 addition & 0 deletions packages/discord.js/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ exports.SystemChannelFlagsBitField = require('./util/SystemChannelFlagsBitField'
exports.ThreadMemberFlagsBitField = require('./util/ThreadMemberFlagsBitField');
exports.UserFlagsBitField = require('./util/UserFlagsBitField');
__exportStar(require('./util/Util.js'), exports);
exports.WebSocketShardEvents = require('./util/WebSocketShardEvents');
exports.version = require('../package.json').version;

// Managers
Expand Down
15 changes: 8 additions & 7 deletions packages/discord.js/src/sharding/Shard.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const process = require('node:process');
const { setTimeout, clearTimeout } = require('node:timers');
const { setTimeout: sleep } = require('node:timers/promises');
const { Error, ErrorCodes } = require('../errors');
const ShardEvents = require('../util/ShardEvents');
const { makeError, makePlainError } = require('../util/Util');
let childProcess = null;
let Worker = null;
Expand Down Expand Up @@ -135,7 +136,7 @@ class Shard extends EventEmitter {
* @event Shard#spawn
* @param {ChildProcess|Worker} process Child process/worker that was created
*/
this.emit('spawn', child);
this.emit(ShardEvents.Spawn, child);

if (timeout === -1 || timeout === Infinity) return Promise.resolve(child);
return new Promise((resolve, reject) => {
Expand Down Expand Up @@ -327,7 +328,7 @@ class Shard extends EventEmitter {
* Emitted upon the shard's {@link Client#event:shardReady} event.
* @event Shard#ready
*/
this.emit('ready');
this.emit(ShardEvents.Ready);
return;
}

Expand All @@ -338,7 +339,7 @@ class Shard extends EventEmitter {
* Emitted upon the shard's {@link Client#event:shardDisconnect} event.
* @event Shard#disconnect
*/
this.emit('disconnect');
this.emit(ShardEvents.Disconnect);
return;
}

Expand All @@ -349,7 +350,7 @@ class Shard extends EventEmitter {
* Emitted upon the shard's {@link Client#event:shardReconnecting} event.
* @event Shard#reconnecting
*/
this.emit('reconnecting');
this.emit(ShardEvents.Reconnecting);
return;
}

Expand Down Expand Up @@ -388,7 +389,7 @@ class Shard extends EventEmitter {
* @event Shard#message
* @param {*} message Message that was received
*/
this.emit('message', message);
this.emit(ShardEvents.Message, message);
}

/**
Expand All @@ -404,15 +405,15 @@ class Shard extends EventEmitter {
* @event Shard#death
* @param {ChildProcess|Worker} process Child process/worker that exited
*/
this.emit('death', this.process ?? this.worker);
this.emit(ShardEvents.Death, this.process ?? this.worker);

this.ready = false;
this.process = null;
this.worker = null;
this._evals.clear();
this._fetches.clear();

if (respawn) this.spawn(timeout).catch(err => this.emit('error', err));
if (respawn) this.spawn(timeout).catch(err => this.emit(ShardEvents.Error, err));
}

/**
Expand Down
22 changes: 12 additions & 10 deletions packages/discord.js/src/util/ShardEvents.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

/**
* @typedef {Object} ShardEvents
* @property {string} Close close
* @property {string} Destroyed destroyed
* @property {string} InvalidSession invalidSession
* @property {string} Death death
* @property {string} Disconnect disconnect
* @property {string} Error error
* @property {string} Message message
* @property {string} Ready ready
* @property {string} Resumed resumed
* @property {string} AllReady allReady
* @property {string} Reconnecting reconnecting
* @property {string} Spawn spawn
*/

// JSDoc for IntelliSense purposes
Expand All @@ -16,10 +17,11 @@
* @ignore
*/
module.exports = {
Close: 'close',
Destroyed: 'destroyed',
InvalidSession: 'invalidSession',
Death: 'death',
Disconnect: 'disconnect',
Error: 'error',
Message: 'message',
Ready: 'ready',
Resumed: 'resumed',
AllReady: 'allReady',
Reconnecting: 'reconnecting',
Spawn: 'spawn',
};
25 changes: 25 additions & 0 deletions packages/discord.js/src/util/WebSocketShardEvents.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
'use strict';

/**
* @typedef {Object} WebSocketShardEvents
* @property {string} Close close
* @property {string} Destroyed destroyed
* @property {string} InvalidSession invalidSession
* @property {string} Ready ready
* @property {string} Resumed resumed
* @property {string} AllReady allReady
*/

// JSDoc for IntelliSense purposes
/**
* @type {WebSocketShardEvents}
* @ignore
*/
module.exports = {
Close: 'close',
Destroyed: 'destroyed',
InvalidSession: 'invalidSession',
Ready: 'ready',
Resumed: 'resumed',
AllReady: 'allReady',
};
26 changes: 18 additions & 8 deletions packages/discord.js/typings/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2183,13 +2183,13 @@ export class SelectMenuInteraction<Cached extends CacheType = CacheType> extends
}

export interface ShardEventTypes {
spawn: [process: ChildProcess | Worker];
death: [process: ChildProcess | Worker];
disconnect: [];
ready: [];
reconnecting: [];
error: [error: Error];
message: [message: any];
ready: [];
reconnecting: [];
spawn: [process: ChildProcess | Worker];
}

export class Shard extends EventEmitter {
Expand Down Expand Up @@ -2852,7 +2852,7 @@ export class WebSocketManager extends EventEmitter {
private triggerClientReady(): void;
}

export interface WebSocketShardEvents {
export interface WebSocketShardEventTypes {
ready: [];
resumed: [];
invalidSession: [];
Expand Down Expand Up @@ -2913,14 +2913,14 @@ export class WebSocketShard extends EventEmitter {

public send(data: unknown, important?: boolean): void;

public on<K extends keyof WebSocketShardEvents>(
public on<K extends keyof WebSocketShardEventTypes>(
event: K,
listener: (...args: WebSocketShardEvents[K]) => Awaitable<void>,
listener: (...args: WebSocketShardEventTypes[K]) => Awaitable<void>,
): this;

public once<K extends keyof WebSocketShardEvents>(
public once<K extends keyof WebSocketShardEventTypes>(
event: K,
listener: (...args: WebSocketShardEvents[K]) => Awaitable<void>,
listener: (...args: WebSocketShardEventTypes[K]) => Awaitable<void>,
): this;
}

Expand Down Expand Up @@ -4344,6 +4344,16 @@ export declare const Events: {
};

export enum ShardEvents {
Death = 'death',
Disconnect = 'disconnect',
Error = 'error',
Message = 'message',
Ready = 'ready',
Reconnecting = 'reconnecting',
Spawn = 'spawn',
}

export enum WebSocketShardEvents {
Close = 'close',
Destroyed = 'destroyed',
InvalidSession = 'invalidSession',
Expand Down
6 changes: 4 additions & 2 deletions packages/discord.js/typings/index.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ import {
InteractionResponseFields,
ThreadChannelType,
Events,
ShardEvents,
WebSocketShardEvents,
Status,
CategoryChannelChildManager,
ActionRowData,
Expand All @@ -129,6 +129,7 @@ import {
AnyThreadChannel,
ThreadMemberManager,
CollectedMessageInteraction,
ShardEvents,
} from '.';
import { expectAssignable, expectNotAssignable, expectNotType, expectType } from 'tsd';
import {
Expand Down Expand Up @@ -1099,7 +1100,8 @@ reactionCollector.on('dispose', (...args) => {
// Make sure the properties are typed correctly, and that no backwards properties
// (K -> V and V -> K) exist:
expectAssignable<'messageCreate'>(Events.MessageCreate);
expectAssignable<'close'>(ShardEvents.Close);
expectAssignable<'close'>(WebSocketShardEvents.Close);
expectAssignable<'death'>(ShardEvents.Death);
expectAssignable<1>(Status.Connecting);

declare const applicationCommandData: ApplicationCommandData;
Expand Down

0 comments on commit c5750d5

Please sign in to comment.