baqend
Version:
Baqend JavaScript SDK
354 lines • 24.4 kB
JavaScript
"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,
TRANSACTION_INACTIVE: 472,
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVzc2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb25uZWN0b3IvTWVzc2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUEsa0NBQThDO0FBeUI5Qzs7R0FFRztBQUNILDZHQUE2RztBQUM3RyxhQUFhO0FBQ0EsUUFBQSxzQkFBc0IsR0FBRyxPQUFPLFNBQVMsS0FBSyxXQUFXLEtBQUksTUFBQSxNQUFBLFNBQVMsQ0FBQyxhQUFhLDBDQUFFLE1BQU0sMENBQUUsSUFBSSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLEVBQXpCLENBQXlCLENBQUMsQ0FBQSxDQUFDO0FBQ25KLHlLQUF5SztBQUN6SyxhQUFhO0FBQ0EsUUFBQSwyQkFBMkIsR0FBRyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksOEJBQXNCLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFFakksUUFBQSxVQUFVLEdBQUc7SUFDeEIsWUFBWSxFQUFFLEdBQUc7SUFDakIsZUFBZSxFQUFFLEdBQUc7SUFDcEIsZ0JBQWdCLEVBQUUsR0FBRztJQUNyQiwrQkFBK0IsRUFBRSxHQUFHO0lBQ3BDLGtCQUFrQixFQUFFLEdBQUc7SUFDdkIsU0FBUyxFQUFFLEdBQUc7SUFDZCxnQkFBZ0IsRUFBRSxHQUFHO0lBQ3JCLGtCQUFrQixFQUFFLEdBQUc7SUFDdkIsaUJBQWlCLEVBQUUsR0FBRztJQUN0QixjQUFjLEVBQUUsR0FBRztJQUNuQixtQkFBbUIsRUFBRSxHQUFHO0lBQ3hCLHFCQUFxQixFQUFFLEdBQUc7SUFDMUIsbUJBQW1CLEVBQUUsR0FBRztJQUN4QixZQUFZLEVBQUUsR0FBRztJQUNqQixvQkFBb0IsRUFBRSxHQUFHO0lBQ3pCLG1CQUFtQixFQUFFLEdBQUc7SUFDeEIscUJBQXFCLEVBQUUsR0FBRztJQUMxQixlQUFlLEVB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