UNPKG

@digitalbits-blockchain/xdb-digitalbits-sdk

Version:

@digitalbits-blockchain/xdb-digitalbits-sdk is a library for working with the DigitalBits Frontier server.

281 lines 11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CallBuilder = void 0; var tslib_1 = require("tslib"); var detect_node_1 = tslib_1.__importDefault(require("detect-node")); var urijs_1 = tslib_1.__importDefault(require("urijs")); var URITemplate_1 = tslib_1.__importDefault(require("urijs/src/URITemplate")); var errors_1 = require("./errors"); var frontier_axios_client_1 = tslib_1.__importDefault(require("./frontier_axios_client")); var version = require("../package.json").version; var JOINABLE = ["transaction"]; var EventSource; var anyGlobal = global; if (anyGlobal.EventSource) { EventSource = anyGlobal.EventSource; } else if (detect_node_1.default) { EventSource = require("eventsource"); } else if (anyGlobal.window.EventSource) { EventSource = anyGlobal.window.EventSource; } else { EventSource = require("eventsource"); } var CallBuilder = (function () { function CallBuilder(serverUrl, neighborRoot) { if (neighborRoot === void 0) { neighborRoot = ""; } this.url = serverUrl.clone(); this.filter = []; this.originalSegments = this.url.segment() || []; this.neighborRoot = neighborRoot; } CallBuilder.prototype.call = function () { var _this = this; this.checkFilter(); return this._sendNormalRequest(this.url).then(function (r) { return _this._parseResponse(r); }); }; CallBuilder.prototype.stream = function (options) { var _this = this; if (options === void 0) { options = {}; } this.checkFilter(); this.url.setQuery("X-Client-Name", "xdb-digitalbits-sdk"); this.url.setQuery("X-Client-Version", version); var es; var timeout; var createTimeout = function () { timeout = setTimeout(function () { if (es) { es.close(); } es = createEventSource(); }, options.reconnectTimeout || 15 * 1000); }; var createEventSource = function () { try { es = new EventSource(_this.url.toString()); } catch (err) { if (options.onerror) { options.onerror(err); } } createTimeout(); if (es) { var closed_1 = false; var onClose_1 = function () { if (closed_1) { return; } clearTimeout(timeout); es.close(); createEventSource(); closed_1 = true; }; var onMessage = function (message) { if (message.type === "close") { onClose_1(); return; } var result = message.data ? _this._parseRecord(JSON.parse(message.data)) : message; if (result.paging_token) { _this.url.setQuery("cursor", result.paging_token); } clearTimeout(timeout); createTimeout(); if (typeof options.onmessage !== "undefined") { options.onmessage(result); } }; var onError = function (error) { if (options.onerror) { options.onerror(error); } }; if (es.addEventListener) { es.addEventListener("message", onMessage.bind(_this)); es.addEventListener("error", onError.bind(_this)); es.addEventListener("close", onClose_1.bind(_this)); } else { es.onmessage = onMessage.bind(_this); es.onerror = onError.bind(_this); } } return es; }; createEventSource(); return function close() { clearTimeout(timeout); if (es) { es.close(); } }; }; CallBuilder.prototype.cursor = function (cursor) { this.url.setQuery("cursor", cursor); return this; }; CallBuilder.prototype.limit = function (recordsNumber) { this.url.setQuery("limit", recordsNumber.toString()); return this; }; CallBuilder.prototype.order = function (direction) { this.url.setQuery("order", direction); return this; }; CallBuilder.prototype.join = function (include) { this.url.setQuery("join", include); return this; }; CallBuilder.prototype.forEndpoint = function (endpoint, param) { if (this.neighborRoot === "") { throw new Error("Invalid usage: neighborRoot not set in constructor"); } this.filter.push([endpoint, param, this.neighborRoot]); return this; }; CallBuilder.prototype.checkFilter = function () { if (this.filter.length >= 2) { throw new errors_1.BadRequestError("Too many filters specified", this.filter); } if (this.filter.length === 1) { var newSegment = this.originalSegments.concat(this.filter[0]); this.url.segment(newSegment); } }; CallBuilder.prototype._requestFnForLink = function (link) { var _this = this; return function (opts) { if (opts === void 0) { opts = {}; } return tslib_1.__awaiter(_this, void 0, void 0, function () { var uri, template, r; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (link.templated) { template = URITemplate_1.default(link.href); uri = urijs_1.default(template.expand(opts)); } else { uri = urijs_1.default(link.href); } return [4, this._sendNormalRequest(uri)]; case 1: r = _a.sent(); return [2, this._parseResponse(r)]; } }); }); }; }; CallBuilder.prototype._parseRecord = function (json) { var _this = this; if (!json._links) { return json; } var _loop_1 = function (key) { var n = json._links[key]; var included = false; if (typeof json[key] !== "undefined") { json[key + "_attr"] = json[key]; included = true; } if (included && JOINABLE.indexOf(key) >= 0) { var record_1 = this_1._parseRecord(json[key]); json[key] = function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { return [2, record_1]; }); }); }; } else { json[key] = this_1._requestFnForLink(n); } }; var this_1 = this; for (var _i = 0, _a = Object.keys(json._links); _i < _a.length; _i++) { var key = _a[_i]; _loop_1(key); } return json; }; CallBuilder.prototype._sendNormalRequest = function (initialUrl) { return tslib_1.__awaiter(this, void 0, void 0, function () { var url; return tslib_1.__generator(this, function (_a) { url = initialUrl; if (url.authority() === "") { url = url.authority(this.url.authority()); } if (url.protocol() === "") { url = url.protocol(this.url.protocol()); } return [2, frontier_axios_client_1.default.get(url.toString()) .then(function (response) { return response.data; }) .catch(this._handleNetworkError)]; }); }); }; CallBuilder.prototype._parseResponse = function (json) { if (json._embedded && json._embedded.records) { return this._toCollectionPage(json); } return this._parseRecord(json); }; CallBuilder.prototype._toCollectionPage = function (json) { var _this = this; for (var i = 0; i < json._embedded.records.length; i += 1) { json._embedded.records[i] = this._parseRecord(json._embedded.records[i]); } return { records: json._embedded.records, next: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var r; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4, this._sendNormalRequest(urijs_1.default(json._links.next.href))]; case 1: r = _a.sent(); return [2, this._toCollectionPage(r)]; } }); }); }, prev: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var r; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4, this._sendNormalRequest(urijs_1.default(json._links.prev.href))]; case 1: r = _a.sent(); return [2, this._toCollectionPage(r)]; } }); }); }, }; }; CallBuilder.prototype._handleNetworkError = function (error) { return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { if (error.response && error.response.status && error.response.statusText) { switch (error.response.status) { case 404: return [2, Promise.reject(new errors_1.NotFoundError(error.response.statusText, error.response.data))]; default: return [2, Promise.reject(new errors_1.NetworkError(error.response.statusText, error.response.data))]; } } else { return [2, Promise.reject(new Error(error.message))]; } return [2]; }); }); }; return CallBuilder; }()); exports.CallBuilder = CallBuilder; //# sourceMappingURL=call_builder.js.map