@looker/sdk-rtl
Version:
Looker SDK Runtime Library
230 lines (229 loc) • 7.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.linkHeaderParser = exports.TotalCountHeader = exports.Paging = exports.LinkHeader = void 0;
exports.pageAll = pageAll;
exports.pager = pager;
var _transport = require("./transport");
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); }); }; }
var LinkHeader = exports.LinkHeader = 'Link';
var TotalCountHeader = exports.TotalCountHeader = 'X-Total-Count';
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;
};
exports.linkHeaderParser = linkHeaderParser;
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);
}
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);
}
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 (0, _transport.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 (0, _transport.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');
})();
}
}
exports.Paging = Paging;
//# sourceMappingURL=paging.js.map