@datocms/rest-client-utils
Version:
Utilities for DatoCMS REST API clients
55 lines • 3.29 kB
JavaScript
;
var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
var g = generator.apply(thisArg, _arguments || []), i, q = [];
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
function fulfill(value) { resume("next", value); }
function reject(value) { resume("throw", value); }
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.warnOnPageQueryParam = exports.rawPageIterator = void 0;
const async_scheduler_1 = require("async-scheduler");
const deserialize_1 = require("./deserialize");
function rawPageIterator(pagination, callPerformer, iteratorOptions, deserializeRawRequestBodyWithItems) {
return __asyncGenerator(this, arguments, function* rawPageIterator_1() {
const perPage = (iteratorOptions === null || iteratorOptions === void 0 ? void 0 : iteratorOptions.perPage) || pagination.defaultLimit;
if (perPage > pagination.maxLimit) {
throw new Error(`perPage option cannot exceed maximum value of ${pagination.maxLimit}`);
}
const concurrency = (iteratorOptions === null || iteratorOptions === void 0 ? void 0 : iteratorOptions.concurrency) || 1;
if (concurrency > 10) {
throw new Error('concurrency option cannot exceed maximum value of 10');
}
const firstResponse = yield __await(callPerformer({ limit: perPage, offset: 0 }));
for (const item of firstResponse.data) {
yield yield __await(item);
}
const totalCount = firstResponse.meta.total_count;
const limiter = new async_scheduler_1.Scheduler(concurrency);
const promises = [];
for (let offset = perPage; offset < totalCount; offset += perPage) {
promises.push(limiter.enqueue(() => callPerformer({ limit: perPage, offset })));
}
while (promises.length > 0) {
const response = yield __await(promises.shift());
for (const item of response.data) {
yield yield __await(deserializeRawRequestBodyWithItems
? (0, deserialize_1.deserializeRawItem)(item)
: item);
}
}
});
}
exports.rawPageIterator = rawPageIterator;
function warnOnPageQueryParam(queryParams) {
if (queryParams && 'page' in queryParams) {
console.warn('Passing a `page` query param on paged iterators has no effect: use the `perPage` option instead.');
}
}
exports.warnOnPageQueryParam = warnOnPageQueryParam;
//# sourceMappingURL=rawPageIterator.js.map