UNPKG

request-multi-streams

Version:

Make multiple http requests. Receive response progress indicators, pipe streams.

83 lines (76 loc) 2.01 kB
'use strict'; const request = require('request'); const progress = require('request-progress'); const eventEmitter = require('events').EventEmitter; // defaults const defaultNumberOfRequests = 1; /** * Creates an iterable Array that is going to assist the async requests * @param {Int} n Number of iterations (Array size) * @return {Array} Iterable array filled with integers */ function createIterable(n) { var arr = Array.apply(null, Array(n)); return arr.map((x, i) => i); } /** * * Get a streams for locations. Build an iterable in the process. * @param {Object} args * * @return {Object} EventEmitter */ function get(args) { const iterable = createIterable( args.numberOfRequests || defaultNumberOfRequests ); const emitter = new eventEmitter(); for (const i of iterable) { let reqNumber = i + 1; const stream = progress(request(args.options), args.progressOptions) .on('response', response => { emitter.emit('response', { reqNumber: reqNumber, args: args, response: response, stream: stream, }); }) .on('progress', progress => { emitter.emit('progress', { reqNumber: reqNumber, args: args, progress: progress, }); }) .on('end', () => { emitter.emit('end', { reqNumber: reqNumber, args: args }); }) .on('error', error => { emitter.emit('error', { reqNumber: reqNumber, args: args, error: error, }); }); } return emitter; } /** * Dispatches the requests. * @param {Array} requests * @return {Object} the key is the url for each request/response */ function streams(requests) { if (!requests || requests.length === 0) { return new Error('There is no requests to be made'); } let emitters = {}; for (const request of requests) { emitters[request.options.url] = get(request); } return emitters; } module.exports = { streams: streams, };