diff --git a/src/WebSocket.js b/src/WebSocket.js index f3f893b40..6e6b4e7ed 100644 --- a/src/WebSocket.js +++ b/src/WebSocket.js @@ -6,9 +6,13 @@ try { if (!erlpack.pack) erlpack = null; } catch (err) {} // eslint-disable-line no-empty +let TextDecoder; + if (browser) { + TextDecoder = window.TextDecoder; // eslint-disable-line no-undef exports.WebSocket = window.WebSocket; // eslint-disable-line no-undef } else { + TextDecoder = require('util').TextDecoder; try { exports.WebSocket = require('@discordjs/uws'); } catch (err) { @@ -16,12 +20,19 @@ if (browser) { } } +const ab = new TextDecoder(); + exports.encoding = erlpack ? 'etf' : 'json'; exports.pack = erlpack ? erlpack.pack : JSON.stringify; exports.unpack = data => { - if (!erlpack || data[0] === '{') return JSON.parse(data); + if (exports.encoding === 'json') { + if (typeof data !== 'string') { + data = ab.decode(data); + } + return JSON.parse(data); + } if (!Buffer.isBuffer(data)) data = Buffer.from(new Uint8Array(data)); return erlpack.unpack(data); }; diff --git a/src/client/websocket/WebSocketShard.js b/src/client/websocket/WebSocketShard.js index 1ad7065d9..3266c5782 100644 --- a/src/client/websocket/WebSocketShard.js +++ b/src/client/websocket/WebSocketShard.js @@ -3,16 +3,12 @@ const EventEmitter = require('events'); const WebSocket = require('../../WebSocket'); const { Status, Events, ShardEvents, OPCodes, WSEvents } = require('../../util/Constants'); -const { TextDecoder } = require('util'); let zstd; -let decoder; - let zlib; try { zstd = require('zucc'); - decoder = new TextDecoder('utf8'); } catch (e) { try { zlib = require('zlib-sync'); @@ -259,8 +255,7 @@ class WebSocketShard extends EventEmitter { onMessage({ data }) { let raw; if (zstd) { - const ab = this.inflate.decompress(new Uint8Array(data).buffer); - raw = decoder.decode(ab); + raw = this.inflate.decompress(new Uint8Array(data).buffer); } else { if (data instanceof ArrayBuffer) data = new Uint8Array(data); const l = data.length;