| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 | var tape = require('tape')var through = require('through2')var concat = require('concat-stream')var net = require('net')var duplexify = require('./')tape('passthrough', function(t) {  t.plan(2)  var pt = through()  var dup = duplexify(pt, pt)  dup.end('hello world')  dup.on('finish', function() {    t.ok(true, 'should finish')  })  dup.pipe(concat(function(data) {    t.same(data.toString(), 'hello world', 'same in as out')  }))})tape('passthrough + double end', function(t) {  t.plan(2)  var pt = through()  var dup = duplexify(pt, pt)  dup.end('hello world')  dup.end()  dup.on('finish', function() {    t.ok(true, 'should finish')  })  dup.pipe(concat(function(data) {    t.same(data.toString(), 'hello world', 'same in as out')  }))})tape('async passthrough + end', function(t) {  t.plan(2)  var pt = through.obj({highWaterMark:1}, function(data, enc, cb) {    setTimeout(function() {      cb(null, data)    }, 100)  })  var dup = duplexify(pt, pt)  dup.write('hello ')  dup.write('world')  dup.end()  dup.on('finish', function() {    t.ok(true, 'should finish')  })  dup.pipe(concat(function(data) {    t.same(data.toString(), 'hello world', 'same in as out')  }))})tape('duplex', function(t) {  var readExpected = ['read-a', 'read-b', 'read-c']  var writeExpected = ['write-a', 'write-b', 'write-c']  t.plan(readExpected.length+writeExpected.length+2)  var readable = through.obj()  var writable = through.obj(function(data, enc, cb) {    t.same(data, writeExpected.shift(), 'onwrite should match')    cb()  })  var dup = duplexify.obj(writable, readable)  readExpected.slice().forEach(function(data) {    readable.write(data)  })  readable.end()  writeExpected.slice().forEach(function(data) {    dup.write(data)  })  dup.end()  dup.on('data', function(data) {    t.same(data, readExpected.shift(), 'ondata should match')  })  dup.on('end', function() {    t.ok(true, 'should end')  })  dup.on('finish', function() {    t.ok(true, 'should finish')  })})tape('async', function(t) {  var dup = duplexify()  var pt = through()  dup.pipe(concat(function(data) {    t.same(data.toString(), 'i was async', 'same in as out')    t.end()  }))  dup.write('i')  dup.write(' was ')  dup.end('async')  setTimeout(function() {    dup.setWritable(pt)    setTimeout(function() {      dup.setReadable(pt)    }, 50)  }, 50)})tape('destroy', function(t) {  t.plan(2)  var write = through()  var read = through()  var dup = duplexify(write, read)  write.destroy = function() {    t.ok(true, 'write destroyed')  }  dup.on('close', function() {    t.ok(true, 'close emitted')  })  dup.destroy()  dup.destroy() // should only work once})tape('destroy both', function(t) {  t.plan(3)  var write = through()  var read = through()  var dup = duplexify(write, read)  write.destroy = function() {    t.ok(true, 'write destroyed')  }  read.destroy = function() {    t.ok(true, 'read destroyed')  }  dup.on('close', function() {    t.ok(true, 'close emitted')  })  dup.destroy()  dup.destroy() // should only work once})tape('bubble read errors', function(t) {  t.plan(2)  var write = through()  var read = through()  var dup = duplexify(write, read)  dup.on('error', function(err) {    t.same(err.message, 'read-error', 'received read error')  })  dup.on('close', function() {    t.ok(true, 'close emitted')  })  read.emit('error', new Error('read-error'))  write.emit('error', new Error('write-error')) // only emit first error})tape('bubble write errors', function(t) {  t.plan(2)  var write = through()  var read = through()  var dup = duplexify(write, read)  dup.on('error', function(err) {    t.same(err.message, 'write-error', 'received write error')  })  dup.on('close', function() {    t.ok(true, 'close emitted')  })  write.emit('error', new Error('write-error'))  read.emit('error', new Error('read-error')) // only emit first error})tape('reset writable / readable', function(t) {  t.plan(3)  var toUpperCase = function(data, enc, cb) {    cb(null, data.toString().toUpperCase())  }  var passthrough = through()  var upper = through(toUpperCase)  var dup = duplexify(passthrough, passthrough)  dup.once('data', function(data) {    t.same(data.toString(), 'hello')    dup.setWritable(upper)    dup.setReadable(upper)    dup.once('data', function(data) {      t.same(data.toString(), 'HELLO')      dup.once('data', function(data) {        t.same(data.toString(), 'HI')        t.end()      })    })    dup.write('hello')    dup.write('hi')  })  dup.write('hello')})tape('cork', function(t) {  var passthrough = through()  var dup = duplexify(passthrough, passthrough)  var ok = false  dup.on('prefinish', function() {    dup.cork()    setTimeout(function() {      ok = true      dup.uncork()    }, 100)  })  dup.on('finish', function() {    t.ok(ok)    t.end()  })  dup.end()})tape('prefinish not twice', function(t) {  var passthrough = through()  var dup = duplexify(passthrough, passthrough)  var prefinished = false  dup.on('prefinish', function() {    t.ok(!prefinished, 'only prefinish once')    prefinished = true  })  dup.on('finish', function() {    t.end()  })  dup.end()})tape('close', function(t) {  var passthrough = through()  var dup = duplexify(passthrough, passthrough)  passthrough.emit('close')  dup.on('close', function() {    t.ok(true, 'should forward close')    t.end()  })})tape('works with node native streams (net)', function(t) {  t.plan(1)  var server = net.createServer(function(socket) {    var dup = duplexify(socket, socket)    dup.once('data', function(chunk) {      t.same(chunk, Buffer('hello world'))      server.close()      socket.end()      t.end()    })  })  server.listen(0, function () {    var socket = net.connect(server.address().port)    var dup = duplexify(socket, socket)    dup.write(Buffer('hello world'))  })})
 |