Skip to content

Commit

Permalink
fix: emit resume event, silent disconnects, error event param (discor…
Browse files Browse the repository at this point in the history
…djs#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: discordjs#1528
  • Loading branch information
vladfrangu authored and samsamson33 committed Feb 27, 2020
1 parent 7772717 commit 0c44008
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 20 deletions.
9 changes: 0 additions & 9 deletions src/client/websocket/WebSocketManager.js
Expand Up @@ -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)) {
/**
Expand Down
18 changes: 13 additions & 5 deletions src/client/websocket/WebSocketShard.js
Expand Up @@ -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 }) {
Expand All @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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 {
/**
Expand Down
10 changes: 5 additions & 5 deletions src/client/websocket/handlers/RESUMED.js
Expand Up @@ -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);
};
5 changes: 5 additions & 0 deletions src/sharding/ShardClientUtil.js
Expand Up @@ -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);
});
}
Expand Down
2 changes: 1 addition & 1 deletion typings/index.d.ts
Expand Up @@ -1339,7 +1339,7 @@ declare module 'discord.js' {
private connect(): Promise<void>;
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;
Expand Down

0 comments on commit 0c44008

Please sign in to comment.