You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
1.0 KiB
44 lines
1.0 KiB
var Writable = require('stream').Writable, |
|
util = require('util'); |
|
|
|
function Gatherer(opts) { |
|
opts.decodeStrings = true; |
|
Writable.call(this, opts); |
|
this._length = 0; |
|
this._chunks = []; |
|
this._maxLength = ('maxLength' in opts) ? opts.maxLength : Infinity; |
|
} |
|
|
|
util.inherits(Gatherer, Writable); |
|
|
|
Gatherer.prototype._write = function (d, _enc, cb) { |
|
if (this._length + d.length > this._maxLength) { |
|
return cb(new Error("Maximum length exceeded!")); |
|
} |
|
this._chunks.push(d); |
|
this._length += d.length; |
|
cb(); |
|
} |
|
|
|
Gatherer.prototype.getBuffer = function () { |
|
return Buffer.concat(this._chunks, this._length); |
|
} |
|
|
|
module.exports = function (opts, cb) { |
|
if (typeof opts === 'function') { |
|
cb = opts; |
|
opts = {}; |
|
} |
|
var target = new Gatherer(opts); |
|
target.on('error', cb); |
|
target.on('pipe', function (source) { |
|
source.on('error', cb); |
|
}); |
|
target.on('unpipe', function (source) { |
|
source.removeListener('error', cb); |
|
}); |
|
target.on('finish', function () { |
|
cb(null, target.getBuffer()); |
|
}); |
|
return target; |
|
}
|
|
|