From e3798eb0a090fd157222c6c6c2889e493e5c27b7 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Tue, 27 Jul 2021 12:30:07 +0200 Subject: [PATCH] stream: readableDidRead if data has been read --- lib/internal/streams/readable.js | 9 +++--- test/parallel/test-stream-readable-didRead.js | 29 +++++++++++++++++-- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/lib/internal/streams/readable.js b/lib/internal/streams/readable.js index e7dd60a6d78c13..c74a0eec641361 100644 --- a/lib/internal/streams/readable.js +++ b/lib/internal/streams/readable.js @@ -316,6 +316,7 @@ function addChunk(stream, state, chunk, addToFront) { } else { state.awaitDrainWriters = null; } + state.didRead = true; stream.emit('data', chunk); } else { // Update the buffer info. @@ -541,10 +542,10 @@ Readable.prototype.read = function(n) { endReadable(this); } - if (ret !== null) + if (ret !== null) { + state.didRead = true; this.emit('data', ret); - - state.didRead = true; + } return ret; }; @@ -851,7 +852,6 @@ function pipeOnDrain(src, dest) { EE.listenerCount(src, 'data')) { // TODO(ronag): Call resume() instead? state.flowing = true; - state.didRead = true; flow(src); } }; @@ -999,7 +999,6 @@ Readable.prototype.resume = function() { function resume(stream, state) { if (!state.resumeScheduled) { state.resumeScheduled = true; - state.didRead = true; process.nextTick(resume_, stream, state); } } diff --git a/test/parallel/test-stream-readable-didRead.js b/test/parallel/test-stream-readable-didRead.js index 18e2da97e88e94..d9d95c3184b20f 100644 --- a/test/parallel/test-stream-readable-didRead.js +++ b/test/parallel/test-stream-readable-didRead.js @@ -1,5 +1,5 @@ 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('assert'); const Readable = require('stream').Readable; @@ -10,7 +10,7 @@ const Readable = require('stream').Readable; assert.strictEqual(readable.readableDidRead, false); readable.read(); - assert.strictEqual(readable.readableDidRead, true); + assert.strictEqual(readable.readableDidRead, false); } { @@ -20,5 +20,30 @@ const Readable = require('stream').Readable; assert.strictEqual(readable.readableDidRead, false); readable.resume(); + assert.strictEqual(readable.readableDidRead, false); +} + +{ + const readable = new Readable({ + read: () => {} + }); + readable.push('asd'); + + assert.strictEqual(readable.readableDidRead, false); + readable.read(); assert.strictEqual(readable.readableDidRead, true); } + +{ + const readable = new Readable({ + read: () => {} + }); + readable.push('asd'); + + assert.strictEqual(readable.readableDidRead, false); + readable.resume(); + assert.strictEqual(readable.readableDidRead, false); + readable.on('data', common.mustCall(function() { + assert.strictEqual(readable.readableDidRead, true); + })); +}