bl.js
1 'use strict' 2 3 const DuplexStream = require('readable-stream').Duplex 4 const inherits = require('inherits') 5 const BufferList = require('./BufferList') 6 7 function BufferListStream (callback) { 8 if (!(this instanceof BufferListStream)) { 9 return new BufferListStream(callback) 10 } 11 12 if (typeof callback === 'function') { 13 this._callback = callback 14 15 const piper = function piper (err) { 16 if (this._callback) { 17 this._callback(err) 18 this._callback = null 19 } 20 }.bind(this) 21 22 this.on('pipe', function onPipe (src) { 23 src.on('error', piper) 24 }) 25 this.on('unpipe', function onUnpipe (src) { 26 src.removeListener('error', piper) 27 }) 28 29 callback = null 30 } 31 32 BufferList._init.call(this, callback) 33 DuplexStream.call(this) 34 } 35 36 inherits(BufferListStream, DuplexStream) 37 Object.assign(BufferListStream.prototype, BufferList.prototype) 38 39 BufferListStream.prototype._new = function _new (callback) { 40 return new BufferListStream(callback) 41 } 42 43 BufferListStream.prototype._write = function _write (buf, encoding, callback) { 44 this._appendBuffer(buf) 45 46 if (typeof callback === 'function') { 47 callback() 48 } 49 } 50 51 BufferListStream.prototype._read = function _read (size) { 52 if (!this.length) { 53 return this.push(null) 54 } 55 56 size = Math.min(size, this.length) 57 this.push(this.slice(0, size)) 58 this.consume(size) 59 } 60 61 BufferListStream.prototype.end = function end (chunk) { 62 DuplexStream.prototype.end.call(this, chunk) 63 64 if (this._callback) { 65 this._callback(null, this.slice()) 66 this._callback = null 67 } 68 } 69 70 BufferListStream.prototype._destroy = function _destroy (err, cb) { 71 this._bufs.length = 0 72 this.length = 0 73 cb(err) 74 } 75 76 BufferListStream.prototype._isBufferList = function _isBufferList (b) { 77 return b instanceof BufferListStream || b instanceof BufferList || BufferListStream.isBufferList(b) 78 } 79 80 BufferListStream.isBufferList = BufferList.isBufferList 81 82 module.exports = BufferListStream 83 module.exports.BufferListStream = BufferListStream 84 module.exports.BufferList = BufferList