summaryrefslogtreecommitdiff
path: root/lib/stream.js
diff options
context:
space:
mode:
authorMikeal Rogers <mikeal.rogers@gmail.com>2011-03-28 11:19:44 -0700
committerRyan Dahl <ry@tinyclouds.org>2011-03-28 11:19:44 -0700
commit2a65d2962578db2cc841c6679a1762a17ac8dfb2 (patch)
treee2a7032bbbba0742e24e55a7e29e6567fb552a13 /lib/stream.js
parent73ebea7a4d712668b3b2e98ea4f67caf72965655 (diff)
downloadandroid-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.js42
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);
};