streams2: Support a Readable hwm of 0
authorisaacs <i@izs.me>
Thu, 13 Dec 2012 06:03:19 +0000 (22:03 -0800)
committerisaacs <i@izs.me>
Fri, 14 Dec 2012 18:52:29 +0000 (10:52 -0800)
Necessary for proper stdin functioning

lib/_stream_readable.js

index 3a65b53..ed65af9 100644 (file)
@@ -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;