UNPKG

baqend

Version:

Baqend JavaScript SDK

353 lines 24.4 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var _a, _b; Object.defineProperty(exports, "__esModule", { value: true }); exports.OAuthMessage = exports.Message = exports.appendQueryParams = exports.StatusCode = exports.CACHE_REPLACEMENT_SUPPORTED = exports.REVALIDATION_SUPPORTED = void 0; var error_1 = require("../error"); /** * Checks whether the user uses a browser which does support revalidation. */ // only chromium based browsers are supporting cache revalidations with the cache-control: no-cache directive // @ts-ignore exports.REVALIDATION_SUPPORTED = typeof navigator === 'undefined' || ((_b = (_a = navigator.userAgentData) === null || _a === void 0 ? void 0 : _a.brands) === null || _b === void 0 ? void 0 : _b.some(function (data) { return data.brand === 'Chromium'; })); // webkit does not support cache replacement https://stackoverflow.com/questions/32571769/cache-control-no-cache-in-request-header-response-does-not-replace-previously-c // @ts-ignore exports.CACHE_REPLACEMENT_SUPPORTED = typeof navigator === 'undefined' || exports.REVALIDATION_SUPPORTED || /firefox/i.test(navigator.userAgent); exports.StatusCode = { NOT_MODIFIED: 304, BAD_CREDENTIALS: 460, BUCKET_NOT_FOUND: 461, INVALID_PERMISSION_MODIFICATION: 462, INVALID_TYPE_VALUE: 463, FORBIDDEN: 403, OBJECT_NOT_FOUND: 404, OBJECT_OUT_OF_DATE: 412, PERMISSION_DENIED: 466, QUERY_DISPOSED: 467, QUERY_NOT_SUPPORTED: 468, SCHEMA_NOT_COMPATIBLE: 469, SCHEMA_STILL_EXISTS: 470, SYNTAX_ERROR: 471, TYPE_ALREADY_EXISTS: 473, TYPE_STILL_REFERENCED: 474, SCRIPT_ABORTION: 475, }; /** * Appends the given query parameters to the url * @param url - on which the parameters will be appended * @param queryParams - The Query parameters which should be appended * @return The URL with the appended parameters */ function appendQueryParams(url, queryParams) { var queryString = typeof queryParams === 'string' ? queryParams : Object.entries(queryParams) .filter(function (_a) { var value = _a[1]; return value !== undefined; }) .map(function (_a) { var key = _a[0], value = _a[1]; return "".concat(key, "=").concat(encodeURIComponent(value)); }) .join('&'); if (!queryString) { return url; } var sep = url.indexOf('?') >= 0 ? '&' : '?'; return url + sep + queryString; } exports.appendQueryParams = appendQueryParams; var Message = /** @class */ (function () { /** * @param args The path arguments */ function Message() { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } this.withCredentials = false; this.progressCallback = null; this._tokenStorage = null; this._responseType = null; var index = 0; var path = this.spec.path[0]; var len = this.spec.path.length; for (var i = 1; i < len; i += 1) { if (this.spec.dynamic && len - 1 === i) { path += args[index].split('/').map(encodeURIComponent).join('/'); } else { path += encodeURIComponent(args[index]) + this.spec.path[i]; } index += 1; } var queryParams = {}; for (var i = 0; i < this.spec.query.length; i += 1) { var arg = args[index]; index += 1; if (arg !== undefined && arg !== null) { queryParams[this.spec.query[i]] = arg; } } this.request = { method: this.spec.method, path: appendQueryParams(path, queryParams), entity: null, headers: {}, }; if (args[index]) { this.entity(args[index], 'json'); } this.responseType('json'); } Object.defineProperty(Message.prototype, "spec", { /** * Returns the specification of this message */ get: function () { return null; }, enumerable: false, configurable: true }); /** * Creates a new message class with the given message specification * @return A created message object for the specification */ Message.create = function (specification) { var parts = specification.path.split('?'); var path = parts[0].split(/[:*]\w*/); var query = []; if (parts[1]) { parts[1].split('&').forEach(function (arg) { var part = arg.split('='); query.push(part[0]); }); } var spec = { path: path, query: query, status: specification.status, method: specification.method, dynamic: specification.path.indexOf('*') !== -1, }; return /** @class */ (function (_super) { __extends(class_1, _super); function class_1() { return _super !== null && _super.apply(this, arguments) || this; } Object.defineProperty(class_1.prototype, "spec", { get: function () { return spec; }, enumerable: false, configurable: true }); return class_1; }(Message)); }; Object.defineProperty(Message.prototype, "isBinary", { get: function () { return (this.request.type && this.request.type in Message.BINARY) || this._responseType in Message.BINARY; }, enumerable: false, configurable: true }); Message.prototype.tokenStorage = function (value) { if (value === undefined) { return this._tokenStorage; } this._tokenStorage = value; return this; }; Message.prototype.path = function (path) { if (path !== undefined) { var queryIndex = this.request.path.indexOf('?') + 1; this.request.path = path + (queryIndex > 0 ? (path.indexOf('?') > -1 ? '&' : '?') + this.request.path.substring(queryIndex) : ''); return this; } return this.request.path; }; Message.prototype.header = function (name, value) { if (value === null) { delete this.request.headers[name]; return this; } if (value !== undefined) { this.request.headers[name] = value; return this; } return this.request.headers[name]; }; /** * Sets the entity type * @param data - The data to send * @param type - the type of the data one of 'json'|'text'|'blob'|'arraybuffer' * defaults detect the type based on the body data * @return This message object */ Message.prototype.entity = function (data, type) { var requestType = type; if (!requestType) { if (typeof data === 'string') { if (/^data:(.+?)(;base64)?,.*$/.test(data)) { requestType = 'data-url'; } else { requestType = 'text'; } } else if (typeof Blob !== 'undefined' && data instanceof Blob) { requestType = 'blob'; } else if (typeof Buffer !== 'undefined' && data instanceof Buffer) { requestType = 'buffer'; } else if (typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) { requestType = 'arraybuffer'; } else if (typeof FormData !== 'undefined' && data instanceof FormData) { requestType = 'form'; } else { requestType = 'json'; } } this.request.type = requestType; this.request.entity = data; return this; }; Message.prototype.mimeType = function (mimeType) { return this.header('content-type', mimeType); }; Message.prototype.contentLength = function (contentLength) { if (contentLength !== undefined) { return this.header('content-length', "".concat(contentLength)); } return Number(this.header('content-length')); }; Message.prototype.ifMatch = function (eTag) { return this.header('If-Match', this.formatETag(eTag)); }; Message.prototype.ifNoneMatch = function (eTag) { return this.header('If-None-Match', this.formatETag(eTag)); }; Message.prototype.ifUnmodifiedSince = function (date) { // IE 10 returns UTC strings and not an RFC-1123 GMT date string return this.header('if-unmodified-since', date && date.toUTCString().replace('UTC', 'GMT')); }; /** * Indicates that the request should not be served by a local cache * @return */ Message.prototype.noCache = function () { if (!exports.REVALIDATION_SUPPORTED) { this.ifMatch('') // is needed for firefox or safari (but forbidden for chrome) .ifNoneMatch('-'); // is needed for edge and ie (but forbidden for chrome) } return this.cacheControl('max-age=0, no-cache'); }; Message.prototype.cacheControl = function (value) { return this.header('cache-control', value); }; Message.prototype.acl = function (acl) { return this.header('baqend-acl', acl && JSON.stringify(acl)); }; Message.prototype.customHeaders = function (customHeaders) { return this.header('baqend-custom-headers', customHeaders && JSON.stringify(customHeaders)); }; Message.prototype.accept = function (accept) { return this.header('accept', accept); }; Message.prototype.responseType = function (type) { if (type !== undefined) { this._responseType = type; return this; } return this._responseType; }; Message.prototype.progress = function (callback) { if (callback !== undefined) { this.progressCallback = callback; return this; } return this.progressCallback; }; /** * Adds the given string to the request path * * If the parameter is an object, it will be serialized as a query string. * * @param query which will added to the request path * @return */ Message.prototype.addQueryString = function (query) { this.request.path = appendQueryParams(this.request.path, query); return this; }; Message.prototype.formatETag = function (eTag) { if (eTag === null || eTag === undefined || eTag === '*') { return eTag; } var tag = "".concat(eTag); if (tag.indexOf('"') === -1) { tag = "\"".concat(tag, "\""); } return tag; }; /** * Handle the receive * @param response The received response headers and data * @return */ Message.prototype.doReceive = function (response) { if (this.spec.status.indexOf(response.status) === -1) { throw new error_1.CommunicationError(this, response); } }; Message.StatusCode = exports.StatusCode; Message.BINARY = { blob: true, buffer: true, stream: true, arraybuffer: true, 'data-url': true, base64: true, }; return Message; }()); exports.Message = Message; var OAuthMessage = /** @class */ (function (_super) { __extends(OAuthMessage, _super); function OAuthMessage() { return _super !== null && _super.apply(this, arguments) || this; } Object.defineProperty(OAuthMessage.prototype, "spec", { get: function () { return { method: 'OAUTH', dynamic: false, path: [''], query: [], status: [200], }; }, enumerable: false, configurable: true }); return OAuthMessage; }(Message)); exports.OAuthMessage = OAuthMessage; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVzc2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb25uZWN0b3IvTWVzc2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUEsa0NBQThDO0FBeUI5Qzs7R0FFRztBQUNILDZHQUE2RztBQUM3RyxhQUFhO0FBQ0EsUUFBQSxzQkFBc0IsR0FBRyxPQUFPLFNBQVMsS0FBSyxXQUFXLEtBQUksTUFBQSxNQUFBLFNBQVMsQ0FBQyxhQUFhLDBDQUFFLE1BQU0sMENBQUUsSUFBSSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLEVBQXpCLENBQXlCLENBQUMsQ0FBQSxDQUFDO0FBQ25KLHlLQUF5SztBQUN6SyxhQUFhO0FBQ0EsUUFBQSwyQkFBMkIsR0FBRyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksOEJBQXNCLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFFakksUUFBQSxVQUFVLEdBQUc7SUFDeEIsWUFBWSxFQUFFLEdBQUc7SUFDakIsZUFBZSxFQUFFLEdBQUc7SUFDcEIsZ0JBQWdCLEVBQUUsR0FBRztJQUNyQiwrQkFBK0IsRUFBRSxHQUFHO0lBQ3BDLGtCQUFrQixFQUFFLEdBQUc7SUFDdkIsU0FBUyxFQUFFLEdBQUc7SUFDZCxnQkFBZ0IsRUFBRSxHQUFHO0lBQ3JCLGtCQUFrQixFQUFFLEdBQUc7SUFDdkIsaUJBQWlCLEVBQUUsR0FBRztJQUN0QixjQUFjLEVBQUUsR0FBRztJQUNuQixtQkFBbUIsRUFBRSxHQUFHO0lBQ3hCLHFCQUFxQixFQUFFLEdBQUc7SUFDMUIsbUJBQW1CLEVBQUUsR0FBRztJQUN4QixZQUFZLEVBQUUsR0FBRztJQUNqQixtQkFBbUIsRUFBRSxHQUFHO0lBQ3hCLHFCQUFxQixFQUFFLEdBQUc7SUFDMUIsZUFBZSxFQUFFLEdBQUc7Q0FDckIsQ0FBQztBQUVG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