UNPKG

@looker/sdk-rtl

Version:
220 lines 7.46 kB
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } import { sdkOk } from './transport'; export var LinkHeader = 'Link'; export var TotalCountHeader = 'X-Total-Count'; export var linkHeaderParser = linkHeader => { var re = /<\s*(.*)\s*>;\s*rel="\s*(.*)\s*"\s*/gm; var links = linkHeader.split(','); var obj = {}; var arrRes; links.forEach(link => { link = link.trim(); while (arrRes = re.exec(link)) { var key = arrRes[2].split(' ')[0].trim().toLocaleLowerCase(); obj[key] = { url: arrRes[1].trim(), rel: key, name: arrRes[2].trim() }; } }); return obj; }; export function pager(_x, _x2, _x3) { return _pager.apply(this, arguments); } function _pager() { _pager = _asyncToGenerator(function* (sdk, pageFunc, options) { return yield new Paging(sdk, pageFunc, options).init(); }); return _pager.apply(this, arguments); } export function pageAll(_x4, _x5) { return _pageAll.apply(this, arguments); } function _pageAll() { _pageAll = _asyncToGenerator(function* (sdk, pageFunc) { var onPage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : page => page; var options = arguments.length > 3 ? arguments[3] : undefined; var paged = yield pager(sdk, pageFunc, options); onPage(paged.items); try { while (paged.more()) { onPage(yield sdk.ok(paged.nextPage())); } } catch (err) { return Promise.reject(err); } return paged; }); return _pageAll.apply(this, arguments); } export class Paging { constructor(sdk, func, options) { this.sdk = sdk; this.func = func; this.options = options; _defineProperty(this, "items", []); _defineProperty(this, "links", {}); _defineProperty(this, "total", -1); _defineProperty(this, "offset", -1); _defineProperty(this, "limit", -1); _defineProperty(this, "transport", void 0); this.transport = sdk.authSession.transport; } rawCatch(func) { var _this = this; return _asyncToGenerator(function* () { var raw = {}; var saved = _this.transport.observer; try { _this.transport.observer = response => { if (saved) { response = saved(response); } raw = response; return response; }; _this.items = yield sdkOk(func()); } finally { _this.transport.observer = saved; } if (Object.keys(raw).length === 0 || Object.keys(raw.headers).length === 0) return Promise.reject(new Error('No paging headers were found')); _this.parse(raw); return _this; })(); } get page() { if (this.limit < 1 || this.offset < 0) return -1; var x = this.offset / this.limit + 1; return Math.ceil(x); } get pages() { if (this.total < 1 || this.limit < 1) return -1; var x = this.total / this.limit; return Math.ceil(x); } init() { var _this2 = this; return _asyncToGenerator(function* () { return yield _this2.rawCatch(_this2.func); })(); } hasRel(link) { return !!this.links[link]; } more() { return this.hasRel('next'); } static paramDefault(value, defaultValue) { var convert = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : v => parseInt(v, 10); if (value === null) return defaultValue; return convert(value); } reset() { this.links = {}; this.total = this.offset = this.limit = -1; this.items = []; } getRel(name, limit, offset) { var _this3 = this; return _asyncToGenerator(function* () { var rel = _this3.links[name]; var result; _this3.reset(); if (!rel) { result = { ok: true, value: _this3.items }; return result; } var authenticator = init => { return _this3.sdk.authSession.authenticate(init); }; var link = rel.url; if (limit !== undefined) { if (offset === undefined) { offset = 0; } if (limit < 1 || offset < 0) { result = { ok: false, error: new Error('limit must be > 0 and offset must be >= 0') }; return result; } var url = new URL(link); var params = url.searchParams; params.set('limit', limit.toString()); params.set('offset', offset.toString()); link = url.toString(); } var raw = yield _this3.transport.rawRequest('GET', link, undefined, undefined, authenticator, _this3.options); try { _this3.parse(raw); _this3.items = yield sdkOk(_this3.transport.parseResponse(raw)); result = { ok: true, value: _this3.items }; } catch (e) { result = { ok: false, error: e }; } return result; })(); } static findHeader(raw, name) { return raw.headers[name] || raw.headers[name.toLowerCase()] || raw.headers[name.toUpperCase()]; } parse(raw) { var params = new URL(raw.url, 'http://default').searchParams; this.limit = Paging.paramDefault(params.get('limit'), -1); this.offset = Paging.paramDefault(params.get('offset'), this.limit > 0 ? 0 : -1); var linkHeader = Paging.findHeader(raw, LinkHeader); if (linkHeader) { this.links = linkHeaderParser(linkHeader); } else { this.links = {}; } var totalHeader = Paging.findHeader(raw, TotalCountHeader); if (totalHeader) { this.total = parseInt(totalHeader.trim(), 10); } else { this.total = -1; } return this; } firstPage() { var _this4 = this; return _asyncToGenerator(function* () { return yield _this4.getRel('first'); })(); } lastPage() { var _this5 = this; return _asyncToGenerator(function* () { return yield _this5.getRel('last'); })(); } nextPage() { var _this6 = this; return _asyncToGenerator(function* () { return yield _this6.getRel('next'); })(); } prevPage() { var _this7 = this; return _asyncToGenerator(function* () { return yield _this7.getRel('prev'); })(); } } //# sourceMappingURL=paging.js.map