diff options
author | Mikeal Rogers <mikeal.rogers@gmail.com> | 2011-03-28 11:19:44 -0700 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2011-03-28 11:19:44 -0700 |
commit | 2a65d2962578db2cc841c6679a1762a17ac8dfb2 (patch) | |
tree | e2a7032bbbba0742e24e55a7e29e6567fb552a13 /lib/stream.js | |
parent | 73ebea7a4d712668b3b2e98ea4f67caf72965655 (diff) | |
download | android-node-v8-2a65d2962578db2cc841c6679a1762a17ac8dfb2.tar.gz android-node-v8-2a65d2962578db2cc841c6679a1762a17ac8dfb2.tar.bz2 android-node-v8-2a65d2962578db2cc841c6679a1762a17ac8dfb2.zip |
Fix listener leak in stream.pipe()
Diffstat (limited to 'lib/stream.js')
-rw-r--r-- | lib/stream.js | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/lib/stream.js b/lib/stream.js index 94368d6c60..d31a9fe239 100644 --- a/lib/stream.js +++ b/lib/stream.js @@ -58,13 +58,6 @@ Stream.prototype.pipe = function(dest, options) { source.on('end', onend); } - dest.on('close', function() { - source.removeListener('data', ondata); - dest.removeListener('drain', ondrain); - source.removeListener('end', onend); - }); - - /* * Questionable: */ @@ -80,14 +73,39 @@ Stream.prototype.pipe = function(dest, options) { source.emit('resume'); }; } - - dest.on('pause', function() { + + var onpause = function() { source.pause(); - }); + } - dest.on('resume', function() { + dest.on('pause', onpause); + + var onresume = function() { if (source.readable) source.resume(); - }); + }; + + dest.on('resume', onresume); + + var cleanup = function () { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); + source.removeListener('end', onend); + + dest.removeListener('pause', onpause); + dest.removeListener('resume', onresume); + + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + + dest.removeListener('end', cleanup); + dest.removeListener('close', cleanup); + } + + source.on('end', cleanup); + source.on('close', cleanup); + + dest.on('end', cleanup); + dest.on('close', cleanup); dest.emit('pipe', source); }; |