mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-17 03:53:29 +01:00
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: 39aa429f94/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
This commit is contained in:
@@ -194,15 +194,6 @@ class WebSocketManager {
|
|||||||
if (!this.shardQueue.size) this.reconnecting = false;
|
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 => {
|
shard.on(ShardEvents.CLOSE, event => {
|
||||||
if (event.code === 1000 ? this.destroyed : UNRECOVERABLE_CLOSE_CODES.includes(event.code)) {
|
if (event.code === 1000 ? this.destroyed : UNRECOVERABLE_CLOSE_CODES.includes(event.code)) {
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -239,7 +239,7 @@ class WebSocketShard extends EventEmitter {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Called whenever a message is received.
|
* Called whenever a message is received.
|
||||||
* @param {Event} event Event received
|
* @param {MessageEvent} event Event received
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
onMessage({ data }) {
|
onMessage({ data }) {
|
||||||
@@ -266,11 +266,14 @@ class WebSocketShard extends EventEmitter {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Called whenever an error occurs with the WebSocket.
|
* Called whenever an error occurs with the WebSocket.
|
||||||
* @param {ErrorEvent} error The error that occurred
|
* @param {ErrorEvent|Object} event The error that occurred
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
onError({ error }) {
|
onError(event) {
|
||||||
if (error && error.message === 'uWs client connection error') {
|
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.debug('Received a uWs error. Closing the connection and reconnecting...');
|
||||||
this.connection.close(4000);
|
this.connection.close(4000);
|
||||||
return;
|
return;
|
||||||
@@ -295,6 +298,11 @@ class WebSocketShard extends EventEmitter {
|
|||||||
* @see {@link https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent}
|
* @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.
|
* Called whenever a connection to the gateway is closed.
|
||||||
* @param {CloseEvent} event Close event that was received
|
* @param {CloseEvent} event Close event that was received
|
||||||
@@ -581,7 +589,7 @@ class WebSocketShard extends EventEmitter {
|
|||||||
this.setHeartbeatTimer(-1);
|
this.setHeartbeatTimer(-1);
|
||||||
this.setHelloTimeout(-1);
|
this.setHelloTimeout(-1);
|
||||||
// Close the WebSocket connection, if any
|
// Close the WebSocket connection, if any
|
||||||
if (this.connection) {
|
if (this.connection && this.connection.readyState !== WebSocket.CLOSED) {
|
||||||
this.connection.close(closeCode);
|
this.connection.close(closeCode);
|
||||||
} else {
|
} else {
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ const { Events } = require('../../../util/Constants');
|
|||||||
module.exports = (client, packet, shard) => {
|
module.exports = (client, packet, shard) => {
|
||||||
const replayed = shard.sequence - shard.closeSequence;
|
const replayed = shard.sequence - shard.closeSequence;
|
||||||
/**
|
/**
|
||||||
* Emitted when the client gateway resumes.
|
* Emitted when a shard resumes successfully.
|
||||||
* @event Client#resume
|
* @event Client#shardResumed
|
||||||
* @param {number} replayed The number of events that were replayed
|
* @param {number} id The shard ID that resumed
|
||||||
* @param {number} shardID The ID of the shard 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);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -181,6 +181,11 @@ class ShardClientUtil {
|
|||||||
_respond(type, message) {
|
_respond(type, message) {
|
||||||
this.send(message).catch(err => {
|
this.send(message).catch(err => {
|
||||||
err.message = `Error when sending ${type} response to master process: ${err.message}`;
|
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);
|
this.client.emit(Events.ERROR, err);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
2
typings/index.d.ts
vendored
2
typings/index.d.ts
vendored
@@ -1339,7 +1339,7 @@ declare module 'discord.js' {
|
|||||||
private connect(): Promise<void>;
|
private connect(): Promise<void>;
|
||||||
private onOpen(): void;
|
private onOpen(): void;
|
||||||
private onMessage(event: MessageEvent): void;
|
private onMessage(event: MessageEvent): void;
|
||||||
private onError(error: ErrorEvent): void;
|
private onError(error: ErrorEvent | object): void;
|
||||||
private onClose(event: CloseEvent): void;
|
private onClose(event: CloseEvent): void;
|
||||||
private onPacket(packet: object): void;
|
private onPacket(packet: object): void;
|
||||||
private setHelloTimeout(time?: number): void;
|
private setHelloTimeout(time?: number): void;
|
||||||
|
|||||||
Reference in New Issue
Block a user