|
@ -540,15 +540,23 @@ Readable.prototype.pipe = function(dest, pipeOpts) { |
|
|
|
|
|
|
|
|
// if the dest has an error, then stop piping into it.
|
|
|
// if the dest has an error, then stop piping into it.
|
|
|
// however, don't suppress the throwing behavior for this.
|
|
|
// 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) { |
|
|
function onerror(er) { |
|
|
debug('onerror', er); |
|
|
debug('onerror', er); |
|
|
unpipe(); |
|
|
unpipe(); |
|
|
if (errListeners === 0 && EE.listenerCount(dest, 'error') === 0) |
|
|
dest.removeListener('error', onerror); |
|
|
|
|
|
if (EE.listenerCount(dest, 'error') === 0) |
|
|
dest.emit('error', er); |
|
|
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.
|
|
|
// Both close and finish should trigger unpipe, but only once.
|
|
|
function onclose() { |
|
|
function onclose() { |
|
|