diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js index 3a65b53fe0..ed65af9c2d 100644 --- a/lib/_stream_readable.js +++ b/lib/_stream_readable.js @@ -181,20 +181,17 @@ Readable.prototype.read = function(n) { if (state.length - n <= state.highWaterMark) doRead = true; - // if we currently have *nothing*, then always try to get *something* - // no matter what the high water mark says. - if (state.length === 0) - doRead = true; - // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. if (state.ended || state.reading) doRead = false; if (doRead) { - var sync = true; state.reading = true; state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) + state.needReadable = true; // call internal read method this._read(state.bufferSize, state.onread); state.sync = false; @@ -219,6 +216,11 @@ Readable.prototype.read = function(n) { state.length -= n; + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (state.length === 0 && !state.ended) + state.needReadable = true; + return ret; }; @@ -655,6 +657,9 @@ Readable.prototype.wrap = function(stream) { var ret = fromList(n, state.buffer, state.length, !!state.decoder); state.length -= n; + if (state.length === 0 && !state.ended) + state.needReadable = true; + if (state.length <= state.lowWaterMark && paused) { stream.resume(); paused = false;