Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

streams: fix pipe is destructed by 'end' from destination

  • Loading branch information...
commit c6fb7d223a1612516257cb1aca91e2242f5b9dae 1 parent 7dffbaf
@koichik authored
Showing with 37 additions and 8 deletions.
  1. +0 −1  lib/stream.js
  2. +37 −7 test/simple/test-stream-pipe-cleanup.js
View
1  lib/stream.js
@@ -112,7 +112,6 @@ Stream.prototype.pipe = function(dest, options) {
source.on('end', cleanup);
source.on('close', cleanup);
- dest.on('end', cleanup);
dest.on('close', cleanup);
dest.emit('pipe', source);
View
44 test/simple/test-stream-pipe-cleanup.js
@@ -46,6 +46,12 @@ function Readable() {
}
util.inherits(Readable, stream.Stream);
+function Duplex() {
+ this.readable = true;
+ Writable.call(this);
+}
+util.inherits(Duplex, Writable);
+
var i = 0;
var limit = 100;
@@ -82,14 +88,38 @@ r = new Readable();
for (i = 0; i < limit; i++) {
w = new Writable();
r.pipe(w);
- w.emit('end');
-}
-assert.equal(0, w.listeners('end').length);
-
-for (i = 0; i < limit; i++) {
- w = new Writable();
- r.pipe(w);
w.emit('close');
}
assert.equal(0, w.listeners('close').length);
+r = new Readable();
+w = new Writable();
+d = new Duplex();
+r.pipe(d); // pipeline A
+d.pipe(w); // pipeline B
+assert.equal(r.listeners('end').length, 2); // A.onend, A.cleanup
+assert.equal(r.listeners('close').length, 2); // A.onclose, A.cleanup
+assert.equal(d.listeners('end').length, 2); // B.onend, B.cleanup
+assert.equal(d.listeners('close').length, 3); // A.cleanup, B.onclose, B.cleanup
+assert.equal(w.listeners('end').length, 0);
+assert.equal(w.listeners('close').length, 1); // B.cleanup
+
+r.emit('end');
+assert.equal(d.endCalls, 1);
+assert.equal(w.endCalls, 0);
+assert.equal(r.listeners('end').length, 0);
+assert.equal(r.listeners('close').length, 0);
+assert.equal(d.listeners('end').length, 2); // B.onend, B.cleanup
+assert.equal(d.listeners('close').length, 2); // B.onclose, B.cleanup
+assert.equal(w.listeners('end').length, 0);
+assert.equal(w.listeners('close').length, 1); // B.cleanup
+
+d.emit('end');
+assert.equal(d.endCalls, 1);
+assert.equal(w.endCalls, 1);
+assert.equal(r.listeners('end').length, 0);
+assert.equal(r.listeners('close').length, 0);
+assert.equal(d.listeners('end').length, 0);
+assert.equal(d.listeners('close').length, 0);
+assert.equal(w.listeners('end').length, 0);
+assert.equal(w.listeners('close').length, 0);
Please sign in to comment.
Something went wrong with that request. Please try again.