; | |
function hasListeners(stream) { | |
return !!(stream.listenerCount('readable') || stream.listenerCount('data')); | |
} | |
function sink(stream) { | |
var sinkAdded = false; | |
function addSink() { | |
if (sinkAdded) { | |
return; | |
} | |
if (hasListeners(stream)) { | |
return; | |
} | |
sinkAdded = true; | |
stream.resume(); | |
} | |
function removeSink(evt) { | |
if (evt !== 'readable' && evt !== 'data') { | |
return; | |
} | |
if (hasListeners(stream)) { | |
sinkAdded = false; | |
} | |
process.nextTick(addSink); | |
} | |
function markSink() { | |
sinkAdded = true; | |
} | |
stream.on('newListener', removeSink); | |
stream.on('removeListener', removeSink); | |
stream.on('piping', markSink); | |
// Sink the stream to start flowing | |
// Do this on nextTick, it will flow at slowest speed of piped streams | |
process.nextTick(addSink); | |
return stream; | |
} | |
module.exports = sink; | |