From 0c4400809c13347fe3c03d1ba0bb27df4b25c5f9 Mon Sep 17 00:00:00 2001 From: Vlad Frangu Date: Sun, 21 Apr 2019 10:32:16 +0300 Subject: [PATCH] fix: emit resume event, silent disconnects, error event param (#3192) * src: Fix shardResumed event not being emitted * docs: Document Client#error again * src: Fix onError due to incorrect typings * src: handle onError properly for both uws and ws * src: Try to fix silent disconnects when using uWs * fix(WebSocketShard): uws emits plain objects, not errors Emitting line of code: https://github.com/discordjs/uws/blob/39aa429f94d9668608f69848b3a84db3a3e92914/src/uws.js#L80-L83 Listener attaching is here: https://github.com/discordjs/uws/blob/master/src/uws.js#L128 For reference, found a clue here: https://github.com/discordjs/discord.js/issues/1528 --- src/client/websocket/WebSocketManager.js | 9 --------- src/client/websocket/WebSocketShard.js | 18 +++++++++++++----- src/client/websocket/handlers/RESUMED.js | 10 +++++----- src/sharding/ShardClientUtil.js | 5 +++++ typings/index.d.ts | 2 +- 5 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/client/websocket/WebSocketManager.js b/src/client/websocket/WebSocketManager.js index eb4a8282c9e6..71a24757abeb 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 c927c1561016..a317bc04218c 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 bd00ec8837a8..e345cb74bf9d 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 acbe225089a4..03c80ead65d7 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 d1894df89d59..f0b064f4b6f6 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;