51 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			51 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | const pump = require('pump'); | ||
|  | const bufferStream = require('./buffer-stream'); | ||
|  | 
 | ||
|  | class MaxBufferError extends Error { | ||
|  | 	constructor() { | ||
|  | 		super('maxBuffer exceeded'); | ||
|  | 		this.name = 'MaxBufferError'; | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | function getStream(inputStream, options) { | ||
|  | 	if (!inputStream) { | ||
|  | 		return Promise.reject(new Error('Expected a stream')); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	options = Object.assign({maxBuffer: Infinity}, options); | ||
|  | 
 | ||
|  | 	const {maxBuffer} = options; | ||
|  | 
 | ||
|  | 	let stream; | ||
|  | 	return new Promise((resolve, reject) => { | ||
|  | 		const rejectPromise = error => { | ||
|  | 			if (error) { // A null check
 | ||
|  | 				error.bufferedData = stream.getBufferedValue(); | ||
|  | 			} | ||
|  | 			reject(error); | ||
|  | 		}; | ||
|  | 
 | ||
|  | 		stream = pump(inputStream, bufferStream(options), error => { | ||
|  | 			if (error) { | ||
|  | 				rejectPromise(error); | ||
|  | 				return; | ||
|  | 			} | ||
|  | 
 | ||
|  | 			resolve(); | ||
|  | 		}); | ||
|  | 
 | ||
|  | 		stream.on('data', () => { | ||
|  | 			if (stream.getBufferedLength() > maxBuffer) { | ||
|  | 				rejectPromise(new MaxBufferError()); | ||
|  | 			} | ||
|  | 		}); | ||
|  | 	}).then(() => stream.getBufferedValue()); | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = getStream; | ||
|  | module.exports.buffer = (stream, options) => getStream(stream, Object.assign({}, options, {encoding: 'buffer'})); | ||
|  | module.exports.array = (stream, options) => getStream(stream, Object.assign({}, options, {array: true})); | ||
|  | module.exports.MaxBufferError = MaxBufferError; |