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;
 |