diff --git a/src/client/Client.js b/src/client/Client.js index 47616d256..4629a38fe 100644 --- a/src/client/Client.js +++ b/src/client/Client.js @@ -416,6 +416,7 @@ class Client extends EventEmitter { _pong(startTime) { this.pings.unshift(Date.now() - startTime); if (this.pings.length > 3) this.pings.length = 3; + this.clearTimeout(this._ackTimeout); } _setPresence(id, presence) { diff --git a/src/client/ClientManager.js b/src/client/ClientManager.js index 01f664b0e..ca582668b 100644 --- a/src/client/ClientManager.js +++ b/src/client/ClientManager.js @@ -48,14 +48,22 @@ class ClientManager { * @param {number} time The interval in milliseconds at which heartbeat packets should be sent */ setupKeepAlive(time) { - this.heartbeatInterval = this.client.setInterval(() => { - this.client.emit('debug', 'Sending heartbeat'); - this.client._pingTimestamp = Date.now(); - this.client.ws.send({ - op: Constants.OPCodes.HEARTBEAT, - d: this.client.ws.sequence, - }, true); - }, time); + this.heartbeatInterval = this.client.setInterval(this.ping.bind(this), time); + } + + ping() { + this.client.emit('debug', 'Sending heartbeat'); + this.client._pingTimestamp = Date.now(); + this.client.ws.send({ + op: Constants.OPCodes.HEARTBEAT, + d: this.client.ws.sequence, + }, true); + + const lastPing = this.client.ping; + + this.client._ackTimeout = this.client.setTimeout(() => { + this.client.ws.ws.close(1005); + }, lastPing ? lastPing * 20 : 20e3); } destroy() { diff --git a/src/client/websocket/packets/handlers/Ready.js b/src/client/websocket/packets/handlers/Ready.js index aed766bf0..4f49980bb 100644 --- a/src/client/websocket/packets/handlers/Ready.js +++ b/src/client/websocket/packets/handlers/Ready.js @@ -7,6 +7,8 @@ class ReadyHandler extends AbstractHandler { const client = this.packetManager.client; const data = packet.d; + client.manager.ping(); + const clientUser = new ClientUser(client, data.user); client.user = clientUser; client.readyAt = new Date();