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() {