diff --git a/src/client/websocket/WebSocketManager.js b/src/client/websocket/WebSocketManager.js index eb4a8282c..71a24757a 100644 --- a/src/client/websocket/WebSocketManager.js +++ b/src/client/websocket/WebSocketManager.js @@ -194,15 +194,6 @@ class WebSocketManager { if (!this.shardQueue.size) this.reconnecting = false; }); - shard.on(ShardEvents.RESUMED, () => { - /** - * Emitted when a shard resumes successfully. - * @event Client#shardResumed - * @param {number} id The shard ID that resumed - */ - this.client.emit(Events.SHARD_RESUMED, shard.id); - }); - shard.on(ShardEvents.CLOSE, event => { if (event.code === 1000 ? this.destroyed : UNRECOVERABLE_CLOSE_CODES.includes(event.code)) { /** diff --git a/src/client/websocket/WebSocketShard.js b/src/client/websocket/WebSocketShard.js index c927c1561..a317bc042 100644 --- a/src/client/websocket/WebSocketShard.js +++ b/src/client/websocket/WebSocketShard.js @@ -239,7 +239,7 @@ class WebSocketShard extends EventEmitter { /** * Called whenever a message is received. - * @param {Event} event Event received + * @param {MessageEvent} event Event received * @private */ onMessage({ data }) { @@ -266,11 +266,14 @@ class WebSocketShard extends EventEmitter { /** * Called whenever an error occurs with the WebSocket. - * @param {ErrorEvent} error The error that occurred + * @param {ErrorEvent|Object} event The error that occurred * @private */ - onError({ error }) { - if (error && error.message === 'uWs client connection error') { + onError(event) { + const error = event && event.error ? event.error : error; + if (!error) return; + + if (error.message === 'uWs client connection error') { this.debug('Received a uWs error. Closing the connection and reconnecting...'); this.connection.close(4000); return; @@ -295,6 +298,11 @@ class WebSocketShard extends EventEmitter { * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent} */ + /** + * @external MessageEvent + * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent} + */ + /** * Called whenever a connection to the gateway is closed. * @param {CloseEvent} event Close event that was received @@ -581,7 +589,7 @@ class WebSocketShard extends EventEmitter { this.setHeartbeatTimer(-1); this.setHelloTimeout(-1); // Close the WebSocket connection, if any - if (this.connection) { + if (this.connection && this.connection.readyState !== WebSocket.CLOSED) { this.connection.close(closeCode); } else { /** diff --git a/src/client/websocket/handlers/RESUMED.js b/src/client/websocket/handlers/RESUMED.js index bd00ec883..e345cb74b 100644 --- a/src/client/websocket/handlers/RESUMED.js +++ b/src/client/websocket/handlers/RESUMED.js @@ -5,10 +5,10 @@ const { Events } = require('../../../util/Constants'); module.exports = (client, packet, shard) => { const replayed = shard.sequence - shard.closeSequence; /** - * Emitted when the client gateway resumes. - * @event Client#resume - * @param {number} replayed The number of events that were replayed - * @param {number} shardID The ID of the shard that resumed + * Emitted when a shard resumes successfully. + * @event Client#shardResumed + * @param {number} id The shard ID that resumed + * @param {number} replayedEvents The amount of replayed events */ - client.emit(Events.RESUMED, replayed, shard.id); + client.emit(Events.SHARD_RESUMED, shard.id, replayed); }; diff --git a/src/sharding/ShardClientUtil.js b/src/sharding/ShardClientUtil.js index acbe22508..03c80ead6 100644 --- a/src/sharding/ShardClientUtil.js +++ b/src/sharding/ShardClientUtil.js @@ -181,6 +181,11 @@ class ShardClientUtil { _respond(type, message) { this.send(message).catch(err => { err.message = `Error when sending ${type} response to master process: ${err.message}`; + /** + * Emitted when the client encounters an error. + * @event Client#error + * @param {Error} error The error encountered + */ this.client.emit(Events.ERROR, err); }); } diff --git a/typings/index.d.ts b/typings/index.d.ts index d1894df89..f0b064f4b 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1339,7 +1339,7 @@ declare module 'discord.js' { private connect(): Promise; private onOpen(): void; private onMessage(event: MessageEvent): void; - private onError(error: ErrorEvent): void; + private onError(error: ErrorEvent | object): void; private onClose(event: CloseEvent): void; private onPacket(packet: object): void; private setHelloTimeout(time?: number): void;