From 5167080b13bfecd307da3b04be3b1892a9e8996c Mon Sep 17 00:00:00 2001 From: Blaine Bublitz Date: Wed, 13 Jan 2016 23:39:08 -0700 Subject: [PATCH] harden event handling --- lib/sink.js | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/sink.js b/lib/sink.js index eacdb16b..dd908b04 100644 --- a/lib/sink.js +++ b/lib/sink.js @@ -2,6 +2,10 @@ var Writable = require('readable-stream/writable'); +function listenerCount(stream, evt) { + return stream.listeners(evt).length; +} + function sink(stream) { var sinkStream = new Writable({ objectMode: true, @@ -10,9 +14,26 @@ function sink(stream) { }, }); + stream.on('removeListener', function() { + if (listenerCount(stream, 'readable') || listenerCount(stream, 'data')) { + stream.unpipe(sinkStream); + } + }); + + stream.on('unpipe', function() { + if (!(listenerCount(stream, 'readable') || listenerCount(stream, 'data'))) { + stream.pipe(sinkStream); + } + }); + + stream.on('newListener', function() { + if (listenerCount(stream, 'readable') || listenerCount(stream, 'data')) { + stream.unpipe(sinkStream); + } + }); + return function() { - // Respect readable listeners on the underlying stream - if (stream.listeners('readable').length > 0) { + if (listenerCount(stream, 'readable') || listenerCount(stream, 'data')) { return; }