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.
		
		
		
		
		
			
		
			
				
					145 lines
				
				3.7 KiB
			
		
		
			
		
	
	
					145 lines
				
				3.7 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								var Writable = require('readable-stream').Writable
							 | 
						||
| 
								 | 
							
								var inherits = require('inherits')
							 | 
						||
| 
								 | 
							
								var bufferFrom = require('buffer-from')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (typeof Uint8Array === 'undefined') {
							 | 
						||
| 
								 | 
							
								  var U8 = require('typedarray').Uint8Array
							 | 
						||
| 
								 | 
							
								} else {
							 | 
						||
| 
								 | 
							
								  var U8 = Uint8Array
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function ConcatStream(opts, cb) {
							 | 
						||
| 
								 | 
							
								  if (!(this instanceof ConcatStream)) return new ConcatStream(opts, cb)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (typeof opts === 'function') {
							 | 
						||
| 
								 | 
							
								    cb = opts
							 | 
						||
| 
								 | 
							
								    opts = {}
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (!opts) opts = {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var encoding = opts.encoding
							 | 
						||
| 
								 | 
							
								  var shouldInferEncoding = false
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (!encoding) {
							 | 
						||
| 
								 | 
							
								    shouldInferEncoding = true
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    encoding =  String(encoding).toLowerCase()
							 | 
						||
| 
								 | 
							
								    if (encoding === 'u8' || encoding === 'uint8') {
							 | 
						||
| 
								 | 
							
								      encoding = 'uint8array'
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Writable.call(this, { objectMode: true })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.encoding = encoding
							 | 
						||
| 
								 | 
							
								  this.shouldInferEncoding = shouldInferEncoding
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (cb) this.on('finish', function () { cb(this.getBody()) })
							 | 
						||
| 
								 | 
							
								  this.body = []
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = ConcatStream
							 | 
						||
| 
								 | 
							
								inherits(ConcatStream, Writable)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ConcatStream.prototype._write = function(chunk, enc, next) {
							 | 
						||
| 
								 | 
							
								  this.body.push(chunk)
							 | 
						||
| 
								 | 
							
								  next()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ConcatStream.prototype.inferEncoding = function (buff) {
							 | 
						||
| 
								 | 
							
								  var firstBuffer = buff === undefined ? this.body[0] : buff;
							 | 
						||
| 
								 | 
							
								  if (Buffer.isBuffer(firstBuffer)) return 'buffer'
							 | 
						||
| 
								 | 
							
								  if (typeof Uint8Array !== 'undefined' && firstBuffer instanceof Uint8Array) return 'uint8array'
							 | 
						||
| 
								 | 
							
								  if (Array.isArray(firstBuffer)) return 'array'
							 | 
						||
| 
								 | 
							
								  if (typeof firstBuffer === 'string') return 'string'
							 | 
						||
| 
								 | 
							
								  if (Object.prototype.toString.call(firstBuffer) === "[object Object]") return 'object'
							 | 
						||
| 
								 | 
							
								  return 'buffer'
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ConcatStream.prototype.getBody = function () {
							 | 
						||
| 
								 | 
							
								  if (!this.encoding && this.body.length === 0) return []
							 | 
						||
| 
								 | 
							
								  if (this.shouldInferEncoding) this.encoding = this.inferEncoding()
							 | 
						||
| 
								 | 
							
								  if (this.encoding === 'array') return arrayConcat(this.body)
							 | 
						||
| 
								 | 
							
								  if (this.encoding === 'string') return stringConcat(this.body)
							 | 
						||
| 
								 | 
							
								  if (this.encoding === 'buffer') return bufferConcat(this.body)
							 | 
						||
| 
								 | 
							
								  if (this.encoding === 'uint8array') return u8Concat(this.body)
							 | 
						||
| 
								 | 
							
								  return this.body
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var isArray = Array.isArray || function (arr) {
							 | 
						||
| 
								 | 
							
								  return Object.prototype.toString.call(arr) == '[object Array]'
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function isArrayish (arr) {
							 | 
						||
| 
								 | 
							
								  return /Array\]$/.test(Object.prototype.toString.call(arr))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function isBufferish (p) {
							 | 
						||
| 
								 | 
							
								  return typeof p === 'string' || isArrayish(p) || (p && typeof p.subarray === 'function')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function stringConcat (parts) {
							 | 
						||
| 
								 | 
							
								  var strings = []
							 | 
						||
| 
								 | 
							
								  var needsToString = false
							 | 
						||
| 
								 | 
							
								  for (var i = 0; i < parts.length; i++) {
							 | 
						||
| 
								 | 
							
								    var p = parts[i]
							 | 
						||
| 
								 | 
							
								    if (typeof p === 'string') {
							 | 
						||
| 
								 | 
							
								      strings.push(p)
							 | 
						||
| 
								 | 
							
								    } else if (Buffer.isBuffer(p)) {
							 | 
						||
| 
								 | 
							
								      strings.push(p)
							 | 
						||
| 
								 | 
							
								    } else if (isBufferish(p)) {
							 | 
						||
| 
								 | 
							
								      strings.push(bufferFrom(p))
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      strings.push(bufferFrom(String(p)))
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (Buffer.isBuffer(parts[0])) {
							 | 
						||
| 
								 | 
							
								    strings = Buffer.concat(strings)
							 | 
						||
| 
								 | 
							
								    strings = strings.toString('utf8')
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    strings = strings.join('')
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return strings
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function bufferConcat (parts) {
							 | 
						||
| 
								 | 
							
								  var bufs = []
							 | 
						||
| 
								 | 
							
								  for (var i = 0; i < parts.length; i++) {
							 | 
						||
| 
								 | 
							
								    var p = parts[i]
							 | 
						||
| 
								 | 
							
								    if (Buffer.isBuffer(p)) {
							 | 
						||
| 
								 | 
							
								      bufs.push(p)
							 | 
						||
| 
								 | 
							
								    } else if (isBufferish(p)) {
							 | 
						||
| 
								 | 
							
								      bufs.push(bufferFrom(p))
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      bufs.push(bufferFrom(String(p)))
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return Buffer.concat(bufs)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function arrayConcat (parts) {
							 | 
						||
| 
								 | 
							
								  var res = []
							 | 
						||
| 
								 | 
							
								  for (var i = 0; i < parts.length; i++) {
							 | 
						||
| 
								 | 
							
								    res.push.apply(res, parts[i])
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return res
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function u8Concat (parts) {
							 | 
						||
| 
								 | 
							
								  var len = 0
							 | 
						||
| 
								 | 
							
								  for (var i = 0; i < parts.length; i++) {
							 | 
						||
| 
								 | 
							
								    if (typeof parts[i] === 'string') {
							 | 
						||
| 
								 | 
							
								      parts[i] = bufferFrom(parts[i])
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    len += parts[i].length
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  var u8 = new U8(len)
							 | 
						||
| 
								 | 
							
								  for (var i = 0, offset = 0; i < parts.length; i++) {
							 | 
						||
| 
								 | 
							
								    var part = parts[i]
							 | 
						||
| 
								 | 
							
								    for (var j = 0; j < part.length; j++) {
							 | 
						||
| 
								 | 
							
								      u8[offset++] = part[j]
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return u8
							 | 
						||
| 
								 | 
							
								}
							 |