| 'use strict'; |
| const bufferStream = require('./buffer-stream'); |
| |
| function getStream(inputStream, opts) { |
| if (!inputStream) { |
| return Promise.reject(new Error('Expected a stream')); |
| } |
| |
| opts = Object.assign({maxBuffer: Infinity}, opts); |
| |
| const maxBuffer = opts.maxBuffer; |
| let stream; |
| let clean; |
| |
| const p = new Promise((resolve, reject) => { |
| const error = err => { |
| if (err) { // null check |
| err.bufferedData = stream.getBufferedValue(); |
| } |
| |
| reject(err); |
| }; |
| |
| stream = bufferStream(opts); |
| inputStream.once('error', error); |
| inputStream.pipe(stream); |
| |
| stream.on('data', () => { |
| if (stream.getBufferedLength() > maxBuffer) { |
| reject(new Error('maxBuffer exceeded')); |
| } |
| }); |
| stream.once('error', error); |
| stream.on('end', resolve); |
| |
| clean = () => { |
| // some streams doesn't implement the `stream.Readable` interface correctly |
| if (inputStream.unpipe) { |
| inputStream.unpipe(stream); |
| } |
| }; |
| }); |
| |
| p.then(clean, clean); |
| |
| return p.then(() => stream.getBufferedValue()); |
| } |
| |
| module.exports = getStream; |
| module.exports.buffer = (stream, opts) => getStream(stream, Object.assign({}, opts, {encoding: 'buffer'})); |
| module.exports.array = (stream, opts) => getStream(stream, Object.assign({}, opts, {array: true})); |