diff --git a/lib/permessage-deflate.js b/lib/permessage-deflate.js index 74bf14a23..a8974b988 100644 --- a/lib/permessage-deflate.js +++ b/lib/permessage-deflate.js @@ -376,11 +376,16 @@ class PerMessageDeflate { this._inflate[kTotalLength] ); - this._inflate[kTotalLength] = 0; - this._inflate[kBuffers] = []; + if (this._inflate._readableState.endEmitted) { + this._inflate.close(); + this._inflate = null; + } else { + this._inflate[kTotalLength] = 0; + this._inflate[kBuffers] = []; - if (fin && this.params[`${endpoint}_no_context_takeover`]) { - this._inflate.reset(); + if (fin && this.params[`${endpoint}_no_context_takeover`]) { + this._inflate.reset(); + } } callback(null, data); diff --git a/test/permessage-deflate.test.js b/test/permessage-deflate.test.js index 09681d96f..a547762ca 100644 --- a/test/permessage-deflate.test.js +++ b/test/permessage-deflate.test.js @@ -631,5 +631,26 @@ describe('PerMessageDeflate', () => { process.nextTick(() => perMessageDeflate.cleanup()); }); + + it('recreates the inflate stream if it ends', (done) => { + const perMessageDeflate = new PerMessageDeflate(); + const extensions = extension.parse( + 'permessage-deflate; client_no_context_takeover; ' + + 'server_no_context_takeover' + ); + const buf = Buffer.from('33343236313533b7000000', 'hex'); + const expected = Buffer.from('12345678'); + + perMessageDeflate.accept(extensions['permessage-deflate']); + + perMessageDeflate.decompress(buf, true, (err, data) => { + assert.ok(data.equals(expected)); + + perMessageDeflate.decompress(buf, true, (err, data) => { + assert.ok(data.equals(expected)); + done(); + }); + }); + }); }); });