Merge remote-tracking branch 'ry/v0.10'
authorisaacs <i@izs.me>
Mon, 19 Aug 2013 21:15:03 +0000 (14:15 -0700)
committerisaacs <i@izs.me>
Mon, 19 Aug 2013 21:15:03 +0000 (14:15 -0700)
1  2 
lib/_stream_readable.js

index 067be3c,368c923..ca4cb0a
mode 100644,100755..100644
@@@ -526,29 -509,24 +526,37 @@@ Readable.prototype.pipe = function(dest
        ondrain();
    }
  
 +  src.on('data', ondata);
 +  function ondata(chunk) {
 +    debug('ondata');
 +    var ret = dest.write(chunk);
 +    if (false === ret) {
 +      debug('false write response, pause',
 +            src._readableState.awaitDrain);
 +      src._readableState.awaitDrain++;
 +      src.pause();
 +    }
 +  }
 +
    // if the dest has an error, then stop piping into it.
    // however, don't suppress the throwing behavior for this.
-   // check for listeners before emit removes one-time listeners.
-   var errListeners = EE.listenerCount(dest, 'error');
    function onerror(er) {
 +    debug('onerror', er);
      unpipe();
-     if (errListeners === 0 && EE.listenerCount(dest, 'error') === 0)
+     dest.removeListener('error', onerror);
+     if (EE.listenerCount(dest, 'error') === 0)
        dest.emit('error', er);
    }
-   dest.once('error', onerror);
+   // This is a brutally ugly hack to make sure that our error handler
+   // is attached before any userland ones.  NEVER DO THIS.
+   if (!dest._events.error)
+     dest.on('error', onerror);
+   else if (Array.isArray(dest._events.error))
+     dest._events.error.unshift(onerror);
+   else
+     dest._events.error = [onerror, dest._events.error];
  
    // Both close and finish should trigger unpipe, but only once.
    function onclose() {