summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/_stream_writable.js3
-rw-r--r--test/sequential/test-stream-writable-clear-buffer.js34
2 files changed, 36 insertions, 1 deletions
diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js
index 3ac4df7ac4..685adf52f7 100644
--- a/lib/_stream_writable.js
+++ b/lib/_stream_writable.js
@@ -503,6 +503,7 @@ function clearBuffer(stream, state) {
corkReq.finish = onCorkedFinish.bind(undefined, corkReq, state);
state.corkedRequestsFree = corkReq;
}
+ state.bufferedRequestCount = 0;
} else {
// Slow case, write chunks one-by-one
while (entry) {
@@ -513,6 +514,7 @@ function clearBuffer(stream, state) {
doWrite(stream, state, false, len, chunk, encoding, cb);
entry = entry.next;
+ state.bufferedRequestCount--;
// if we didn't call the onwrite immediately, then
// it means that we need to wait until it does.
// also, that means that the chunk and cb are currently
@@ -526,7 +528,6 @@ function clearBuffer(stream, state) {
state.lastBufferedRequest = null;
}
- state.bufferedRequestCount = 0;
state.bufferedRequest = entry;
state.bufferProcessing = false;
}
diff --git a/test/sequential/test-stream-writable-clear-buffer.js b/test/sequential/test-stream-writable-clear-buffer.js
new file mode 100644
index 0000000000..dc859e3fb6
--- /dev/null
+++ b/test/sequential/test-stream-writable-clear-buffer.js
@@ -0,0 +1,34 @@
+'use strict';
+const common = require('../common');
+const Stream = require('stream');
+// This test ensures that the _writeableState.bufferedRequestCount and
+// the actual buffered request count are the same
+const assert = require('assert');
+
+class StreamWritable extends Stream.Writable {
+ constructor() {
+ super({ objectMode: true });
+ }
+
+ // We need a timeout like on the original issue thread
+ // otherwise the code will never reach our test case
+ // this means this should go on the sequential folder.
+ _write(chunk, encoding, cb) {
+ setTimeout(cb, common.platformTimeout(10));
+ }
+}
+
+const testStream = new StreamWritable();
+testStream.cork();
+
+for (let i = 1; i <= 5; i++) {
+ testStream.write(i, function() {
+ assert.strictEqual(
+ testStream._writableState.bufferedRequestCount,
+ testStream._writableState.getBuffer().length,
+ 'bufferedRequestCount variable is different from the actual length of' +
+ ' the buffer');
+ });
+}
+
+testStream.end();