node package manager
Share your code. npm Orgs help your team discover, share, and reuse code. Create a free org ยป


Duplex Stream

Composes two distinct readable and writable streams into one cohesive Stream. Why would you want to do this? I honestly have no idea. You'd have to be really stupid or something.


npm install duplex-stream


var DuplexStream = require("duplex-stream");

var myDuplexStream = new DuplexStream(aReadableStream, aWritableStream);

The DuplexStream should behave exactly how you'd expect.

// Probably because of this:
console.log((new DuplexStream()) instanceof Stream);	// -> true

That is, when events occur on the underlying streams, they occur on the DuplexStream.

  • When data is on the line from the underlying readable stream, the data event is emitted on DuplexStream
  • Writing to DuplexStream will write to the underlying writable stream.
  • Pausing/Resuming the DuplexStream will pause/resume the underlying readable stream.
  • Ending the DuplexStream will end the underlying writable, readable will still be available.
  • Setting encoding on DuplexStream will set encoding on underlying readable.
  • When end event occurs on underlying readable, DuplexStream marks itself as unreadable but can still be written to (if it's not already been ended).
  • Destroying the duplex stream will destroy both underlying streams.
  • Calling destroySoon() on the duplex stream will destroy readable stream immediately and tell writable stream to destroy as soon as it can.

One little "gotcha" though, close won't be emitted on the DuplexStream until both underlying streams are closed.


DuplexStream is just a silly little convenience. An (unnecessary) abstraction. I use it for composing automated tests that deal with Streams, along with my node-stream-buffer project.