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.
		
		
		
		
		
			
		
			
				
					
					
						
							144 lines
						
					
					
						
							3.7 KiB
						
					
					
				
			
		
		
	
	
							144 lines
						
					
					
						
							3.7 KiB
						
					
					
				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 | 
						|
}
 | 
						|
 |