transform: Automatically read() on _write when read buffer is empty
authorisaacs <i@izs.me>
Thu, 4 Oct 2012 23:58:43 +0000 (16:58 -0700)
committerisaacs <i@izs.me>
Fri, 14 Dec 2012 01:00:25 +0000 (17:00 -0800)
lib/_stream_transform.js

index a3603f4..40917de 100644 (file)
@@ -110,14 +110,28 @@ Transform.prototype._transform = function(chunk, output, cb) {
 
 Transform.prototype._write = function(chunk, cb) {
   var ts = this._transformState;
+  var rs = this._readableState;
   ts.buffer.push([chunk, cb]);
 
+  // no need for auto-pull if already in the midst of one.
+  if (ts.transforming)
+    return;
+
   // now we have something to transform, if we were waiting for it.
-  if (ts.pendingReadCb && !ts.transforming) {
+  // kick off a _read to pull it in.
+  if (ts.pendingReadCb) {
     var readcb = ts.pendingReadCb;
     ts.pendingReadCb = null;
     this._read(-1, readcb);
   }
+
+  // if we weren't waiting for it, but nothing is queued up, then
+  // still kick off a transform, just so it's there when the user asks.
+  if (rs.length === 0) {
+    var ret = this.read();
+    if (ret !== null)
+      return cb(new Error('invalid stream transform state'));
+  }
 };
 
 Transform.prototype._read = function(n, readcb) {