diff --git a/lib/recurly.js b/lib/recurly.js index cf7b3357b..be80e577f 100644 --- a/lib/recurly.js +++ b/lib/recurly.js @@ -1,6 +1,7 @@ /*jshint -W058 */ import clone from 'component-clone'; +import chunk from 'lodash.chunk'; import merge from 'lodash.merge'; import jsonp from 'jsonp'; import qs from 'qs'; @@ -25,6 +26,8 @@ import uuid from './util/uuid'; const debug = require('debug')('recurly'); +const NOOP = () => {}; + /** * Default configuration values. * @@ -277,6 +280,40 @@ export class Recurly extends Emitter { } } + /** + * Pipelines a request across several requests + * + * Chunks are made of data[chunkBy] in size chunkSize. If any request errors, + * the entire pipeline errors + * + * @param {String} method + * @param {String} route + * @param {Object} data + * @param {Array} data[chunkBy] must be an Array + * @param {String} chunkBy + * @param {Number} chunkSize + * @param {Function} done + * @private + */ + + pipedRequest (method, route, data, chunkBy, chunkSize, done) { + let results = []; + const part = (err, res) => { + if (err) { + done(err) + return done = NOOP; + } + results.push(res); + if (results.length === dataChunks.length) done(null, results); + }; + + const dataChunks = chunk(data[chunkBy], chunkSize).map(chunkPiece => { + return Object.assign({}, data, { [chunkBy]: chuckPiece }); + }); + + dataChunks.forEach(dataChunk => this.request(method, route, dataChunk, part)); + } + /** * Issues an API request over xhr. *