mercadopago
Version:
Mercadopago SDK for Node.js
93 lines (92 loc) • 4.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createAutoPagingIterable = createAutoPagingIterable;
const DEFAULT_PAGE_SIZE = 100;
/**
* Creates an `AsyncIterable<TResult>` that auto-fetches all pages.
*
* Supports both offset/limit pagination (Pattern A) and page/page_size
* pagination (Pattern B, used by some Order endpoints).
*
* @param searchFn Callable that accepts search options and returns one page.
* @param baseOptions Initial search options. `limit`/`offset` are managed automatically.
* @param pageSize Items per page. Defaults to 100.
*/
function createAutoPagingIterable(searchFn, baseOptions, pageSize = DEFAULT_PAGE_SIZE) {
return {
[Symbol.asyncIterator]() {
var _a;
let offset = (_a = baseOptions === null || baseOptions === void 0 ? void 0 : baseOptions.offset) !== null && _a !== void 0 ? _a : 0;
let page = 1;
let buffer = [];
let bufferIndex = 0;
let done = false;
let total = null;
const fetchNextPage = async () => {
var _a, _b, _c, _d, _e;
if (done)
return;
const options = Object.assign(Object.assign({}, baseOptions), { limit: pageSize, offset });
const result = await searchFn(options);
// Pattern A: offset/limit with paging.total
if (result.results !== undefined) {
const items = (_a = result.results) !== null && _a !== void 0 ? _a : [];
buffer = items;
bufferIndex = 0;
if (total === null && result.paging) {
total = result.paging.total;
}
offset += items.length;
if (items.length === 0 || (total !== null && offset >= total)) {
done = true;
}
return;
}
// Pattern B: page/page_size with elements (Orders)
if (result.elements !== undefined) {
const items = (_b = result.elements) !== null && _b !== void 0 ? _b : [];
buffer = items;
bufferIndex = 0;
if (total === null)
total = (_c = result.total) !== null && _c !== void 0 ? _c : 0;
page++;
offset = (page - 1) * pageSize;
if (items.length === 0 || offset >= (total !== null && total !== void 0 ? total : 0)) {
done = true;
}
return;
}
// Pattern C: data key with string paging (Orders v2 API)
if (result.data !== undefined) {
const items = (_d = result.data) !== null && _d !== void 0 ? _d : [];
buffer = items;
bufferIndex = 0;
if (total === null && result.paging) {
total = parseInt(String((_e = result.paging.total) !== null && _e !== void 0 ? _e : '0'), 10);
}
offset += items.length;
if (items.length === 0 || (total !== null && offset >= total)) {
done = true;
}
return;
}
done = true;
};
return {
async next() {
if (bufferIndex < buffer.length) {
return { value: buffer[bufferIndex++], done: false };
}
if (done) {
return { value: undefined, done: true };
}
await fetchNextPage();
if (bufferIndex < buffer.length) {
return { value: buffer[bufferIndex++], done: false };
}
return { value: undefined, done: true };
},
};
},
};
}