diff --git a/core/websock.js b/core/websock.js index 711ea02b..75be044a 100644 --- a/core/websock.js +++ b/core/websock.js @@ -308,6 +308,12 @@ export default class Websock { // push arraybuffer values onto the end of the receive que _recvMessage(e) { + if (this._rQlen == this._rQi) { + // All data has now been processed, this means we + // can reset the receive queue. + this._rQlen = 0; + this._rQi = 0; + } const u8 = new Uint8Array(e.data); if (u8.length > this._rQbufferSize - this._rQlen) { this._expandCompactRQ(u8.length); @@ -317,12 +323,6 @@ export default class Websock { if (this._rQlen - this._rQi > 0) { this._eventHandlers.message(); - if (this._rQlen == this._rQi) { - // All data has now been processed, this means we - // can reset the receive queue. - this._rQlen = 0; - this._rQi = 0; - } } else { Log.Debug("Ignoring empty message"); } diff --git a/tests/test.websock.js b/tests/test.websock.js index de7fe0d1..f3cc4224 100644 --- a/tests/test.websock.js +++ b/tests/test.websock.js @@ -418,14 +418,13 @@ describe('Websock', function () { expect(sock._eventHandlers.message).not.to.have.been.called; }); - it('should compact the receive queue when a message handler empties it', function () { - sock._eventHandlers.message = () => { sock._rQi = sock._rQlen; }; + it('should compact the receive queue when fully read', function () { sock._rQ = new Uint8Array([0, 1, 2, 3, 4, 5, 0, 0, 0, 0]); sock._rQlen = 6; sock._rQi = 6; const msg = { data: new Uint8Array([1, 2, 3]).buffer }; sock._recvMessage(msg); - expect(sock._rQlen).to.equal(0); + expect(sock._rQlen).to.equal(3); expect(sock._rQi).to.equal(0); }); @@ -455,13 +454,13 @@ describe('Websock', function () { it('should automatically resize the receive queue if the incoming message is larger than 1/8th of the buffer and we reach the end of the buffer', function () { sock._rQ = new Uint8Array(20); sock._rQlen = 16; - sock._rQi = 16; + sock._rQi = 15; sock._rQbufferSize = 20; const msg = { data: new Uint8Array(6).buffer }; sock._recvMessage(msg); - expect(sock._rQlen).to.equal(6); + expect(sock._rQlen).to.equal(7); expect(sock._rQi).to.equal(0); - expect(sock._rQ.length).to.equal(48); + expect(sock._rQ.length).to.equal(56); }); }); });