1'use strict'; 2const pump = require('pump'); 3const bufferStream = require('./buffer-stream'); 4 5class MaxBufferError extends Error { 6 constructor() { 7 super('maxBuffer exceeded'); 8 this.name = 'MaxBufferError'; 9 } 10} 11 12function getStream(inputStream, options) { 13 if (!inputStream) { 14 return Promise.reject(new Error('Expected a stream')); 15 } 16 17 options = Object.assign({maxBuffer: Infinity}, options); 18 19 const {maxBuffer} = options; 20 21 let stream; 22 return new Promise((resolve, reject) => { 23 const rejectPromise = error => { 24 if (error) { // A null check 25 error.bufferedData = stream.getBufferedValue(); 26 } 27 reject(error); 28 }; 29 30 stream = pump(inputStream, bufferStream(options), error => { 31 if (error) { 32 rejectPromise(error); 33 return; 34 } 35 36 resolve(); 37 }); 38 39 stream.on('data', () => { 40 if (stream.getBufferedLength() > maxBuffer) { 41 rejectPromise(new MaxBufferError()); 42 } 43 }); 44 }).then(() => stream.getBufferedValue()); 45} 46 47module.exports = getStream; 48module.exports.buffer = (stream, options) => getStream(stream, Object.assign({}, options, {encoding: 'buffer'})); 49module.exports.array = (stream, options) => getStream(stream, Object.assign({}, options, {array: true})); 50module.exports.MaxBufferError = MaxBufferError; 51