Skip to content
Turn a writable and readable stream into a streams2 duplex stream with support for async initialization and streams1/streams2 input
Branch: master
Clone or download
Latest commit 8f80328 Jun 12, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
.gitignore first commit Jul 7, 2014
.travis.yml bump travis Feb 4, 2019
LICENSE add full license text Aug 21, 2014 correct spelling mistake (#15) Sep 1, 2017
example.js make example simpler Jul 26, 2014
index.js fix async iterators Jun 12, 2019
package.json 4.1.1 Jun 12, 2019
test.js Fix 'Cannot call write after a stream was destroyed' Jun 11, 2019


Turn a writeable and readable stream into a single streams2 duplex stream.

Similar to duplexer2 except it supports both streams2 and streams1 as input and it allows you to set the readable and writable part asynchronously using setReadable(stream) and setWritable(stream)

npm install duplexify

build status


Use duplexify(writable, readable, streamOptions) (or duplexify.obj(writable, readable) to create an object stream)

var duplexify = require('duplexify')

// turn writableStream and readableStream into a single duplex stream
var dup = duplexify(writableStream, readableStream)

dup.write('hello world') // will write to writableStream
dup.on('data', function(data) {
  // will read from readableStream

You can also set the readable and writable parts asynchronously

var dup = duplexify()

dup.write('hello world') // write will buffer until the writable
                         // part has been set

// wait a bit ...

// maybe wait some more?

If you call setReadable or setWritable multiple times it will unregister the previous readable/writable stream. To disable the readable or writable part call setReadable or setWritable with null.

If the readable or writable streams emits an error or close it will destroy both streams and bubble up the event. You can also explicitly destroy the streams by calling dup.destroy(). The destroy method optionally takes an error object as argument, in which case the error is emitted as part of the error event.

dup.on('error', function(err) {
  console.log('readable or writable emitted an error - close will follow')

dup.on('close', function() {
  console.log('the duplex stream is destroyed')

dup.destroy() // calls destroy on the readable and writable part (if present)

HTTP request example

Turn a node core http request into a duplex stream is as easy as

var duplexify = require('duplexify')
var http = require('http')

var request = function(opts) {
  var req = http.request(opts)
  var dup = duplexify(req)
  req.on('response', function(res) {
  return dup

var req = request({
  method: 'GET',
  host: '',
  port: 80





duplexify is part of the mississippi stream utility collection which includes more useful stream modules similar to this one.

You can’t perform that action at this time.