const { Minipass } = require('minipass') const _data = Symbol('_data') const _length = Symbol('_length') class Collect extends Minipass { constructor (options) { super(options) this[_data] = [] this[_length] = 0 } write (chunk, encoding, cb) { if (typeof encoding === 'function') cb = encoding, encoding = 'utf8' if (!encoding) encoding = 'utf8' const c = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, encoding) this[_data].push(c) this[_length] += c.length if (cb) cb() return true } end (chunk, encoding, cb) { if (typeof chunk === 'function') cb = chunk, chunk = null if (typeof encoding === 'function') cb = encoding, encoding = 'utf8' if (chunk) this.write(chunk, encoding) const result = Buffer.concat(this[_data], this[_length]) super.write(result) return super.end(cb) } } module.exports = Collect // it would be possible to DRY this a bit by doing something like // this.collector = new Collect() and listening on its data event, // but it's not much code, and we may as well save the extra obj class CollectPassThrough extends Minipass { constructor (options) { super(options) this[_data] = [] this[_length] = 0 } write (chunk, encoding, cb) { if (typeof encoding === 'function') cb = encoding, encoding = 'utf8' if (!encoding) encoding = 'utf8' const c = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, encoding) this[_data].push(c) this[_length] += c.length return super.write(chunk, encoding, cb) } end (chunk, encoding, cb) { if (typeof chunk === 'function') cb = chunk, chunk = null if (typeof encoding === 'function') cb = encoding, encoding = 'utf8' if (chunk) this.write(chunk, encoding) const result = Buffer.concat(this[_data], this[_length]) this.emit('collect', result) return super.end(cb) } } module.exports.PassThrough = CollectPassThrough