From c91ee7a3e792370f1992d1557114296910411292 Mon Sep 17 00:00:00 2001 From: Gus Caplan Date: Wed, 23 Nov 2016 18:30:00 -0600 Subject: [PATCH] Replace ws with uws (#918) * change to uws (waiting for the next release tho) * clean up, fix reconnections (maybe) * change voice to use uws * so messy --- package.json | 8 ++++---- src/client/voice/VoiceWebSocket.js | 2 +- src/client/websocket/WebSocketManager.js | 24 +++++++++++++----------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 35c08a124..d27ffdfc9 100644 --- a/package.json +++ b/package.json @@ -29,9 +29,10 @@ }, "homepage": "https://github.com/hydrabolt/discord.js#readme", "dependencies": { + "pako": "^1.0.3", "superagent": "^3.0.0", "tweetnacl": "^0.14.3", - "ws": "^1.1.1" + "uws": "^0.11.0" }, "peerDependencies": { "node-opus": "^0.2.0", @@ -46,14 +47,13 @@ "parallel-webpack": "^1.5.0", "uglify-js": "github:mishoo/UglifyJS2#harmony", "utf-8-validate": "^1.2.1", - "webpack": "2.1.0-beta.27", - "zlibjs": "^0.2.0" + "webpack": "2.1.0-beta.27" }, "engines": { "node": ">=6.0.0" }, "browser": { - "ws": false, + "uws": false, "opusscript": false, "node-opus": false, "tweet-nacl": false, diff --git a/src/client/voice/VoiceWebSocket.js b/src/client/voice/VoiceWebSocket.js index ebc2a3103..6c7303e27 100644 --- a/src/client/voice/VoiceWebSocket.js +++ b/src/client/voice/VoiceWebSocket.js @@ -1,4 +1,4 @@ -const WebSocket = require('ws'); +const WebSocket = require('uws'); const Constants = require('../../util/Constants'); const SecretKey = require('./util/SecretKey'); const EventEmitter = require('events').EventEmitter; diff --git a/src/client/websocket/WebSocketManager.js b/src/client/websocket/WebSocketManager.js index cdaa4b29a..77a40e416 100644 --- a/src/client/websocket/WebSocketManager.js +++ b/src/client/websocket/WebSocketManager.js @@ -1,10 +1,9 @@ const browser = typeof window !== 'undefined'; -const WebSocket = browser ? window.WebSocket : require('ws'); // eslint-disable-line no-undef +const WebSocket = browser ? window.WebSocket : require('uws'); // eslint-disable-line no-undef const EventEmitter = require('events').EventEmitter; const Constants = require('../../util/Constants'); -const inflate = browser ? require('zlibjs').inflateSync : require('zlib').inflateSync; +const pako = require('pako'); const PacketManager = require('./packets/WebSocketPacketManager'); -const convertArrayBuffer = require('../../util/ConvertArrayBuffer'); /** * The WebSocket Manager of the Client @@ -80,11 +79,16 @@ class WebSocketManager extends EventEmitter { this.normalReady = false; if (this.status !== Constants.Status.RECONNECTING) this.status = Constants.Status.CONNECTING; this.ws = new WebSocket(gateway); - if (browser) this.ws.binaryType = 'arraybuffer'; - this.ws.onopen = () => this.eventOpen(); + if (browser) { + this.ws.binaryType = 'arraybuffer'; + this.ws.on('open', this.eventOpen.bind(this)); + this.ws.on('error', this.eventError.bind(this)); + } else { + this.ws.onopen = () => this.eventOpen(); + this.ws.onerror = (e) => this.eventError(e); + } this.ws.onclose = (d) => this.eventClose(d); this.ws.onmessage = (e) => this.eventMessage(e); - this.ws.onerror = (e) => this.eventError(e); this._queue = []; this._remaining = 3; } @@ -230,10 +234,7 @@ class WebSocketManager extends EventEmitter { * @returns {Object} */ parseEventData(data) { - if (typeof data !== 'string') { - if (data instanceof ArrayBuffer) data = convertArrayBuffer(data); - data = inflate(data).toString(); - } + if (data instanceof ArrayBuffer) data = pako.inflate(data, { to: 'string' }); return JSON.parse(data); } @@ -261,7 +262,7 @@ class WebSocketManager extends EventEmitter { * @param {Error} error The encountered error */ if (this.client.listenerCount('error') > 0) this.client.emit('error', err); - this.ws.close(); + this.tryReconnect(); } _emitReady(normal = true) { @@ -305,6 +306,7 @@ class WebSocketManager extends EventEmitter { * Tries to reconnect the client, changing the status to Constants.Status.RECONNECTING. */ tryReconnect() { + if (this.status === Constants.Status.RECONNECTING) return; this.status = Constants.Status.RECONNECTING; this.ws.close(); this.packetManager.handleQueue();