52 lines
		
	
	
		
			841 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			52 lines
		
	
	
		
			841 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | const {PassThrough} = require('stream'); | ||
|  | 
 | ||
|  | module.exports = options => { | ||
|  | 	options = Object.assign({}, options); | ||
|  | 
 | ||
|  | 	const {array} = options; | ||
|  | 	let {encoding} = options; | ||
|  | 	const buffer = encoding === 'buffer'; | ||
|  | 	let objectMode = false; | ||
|  | 
 | ||
|  | 	if (array) { | ||
|  | 		objectMode = !(encoding || buffer); | ||
|  | 	} else { | ||
|  | 		encoding = encoding || 'utf8'; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if (buffer) { | ||
|  | 		encoding = null; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	let len = 0; | ||
|  | 	const ret = []; | ||
|  | 	const stream = new PassThrough({objectMode}); | ||
|  | 
 | ||
|  | 	if (encoding) { | ||
|  | 		stream.setEncoding(encoding); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	stream.on('data', chunk => { | ||
|  | 		ret.push(chunk); | ||
|  | 
 | ||
|  | 		if (objectMode) { | ||
|  | 			len = ret.length; | ||
|  | 		} else { | ||
|  | 			len += chunk.length; | ||
|  | 		} | ||
|  | 	}); | ||
|  | 
 | ||
|  | 	stream.getBufferedValue = () => { | ||
|  | 		if (array) { | ||
|  | 			return ret; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return buffer ? Buffer.concat(ret, len) : ret.join(''); | ||
|  | 	}; | ||
|  | 
 | ||
|  | 	stream.getBufferedLength = () => len; | ||
|  | 
 | ||
|  | 	return stream; | ||
|  | }; |