• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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