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.
		
		
		
		
			
				
					72 lines
				
				1.9 KiB
			
		
		
			
		
	
	
					72 lines
				
				1.9 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								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
							 |