@servicestack/client
Version:
ServiceStack's TypeScript library providing convenience utilities in developing web apps. Integrates with ServiceStack's Server features including ServiceClient, Server Events, Error Handling and Validation
1,020 lines (1,019 loc) • 141 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports"], factory);
}
else if (typeof window != "undefined") factory(window.require||function(){}, window["@servicestack/client"]={});
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Inspect = exports.createBus = exports.EventBus = exports.alignAuto = exports.alignRight = exports.alignCenter = exports.alignLeft = exports.uniqueKeys = exports.JSV = exports.StringBuffer = exports.toBase64String = exports.toByteArray = exports.fromByteArray = exports.toGuid = exports.fromGuid = exports.toTimeSpan = exports.fromTimeSpan = exports.toDateTime = exports.fromDateTime = exports.isNullOrEmpty = exports.indexOfAny = exports.htmlAttrs = exports.enc = exports.uniq = exports.flatMap = exports.toTimeSpanFmt = exports.toXsdDuration = exports.fromXsdDuration = exports.classNames = exports.NavOptions = exports.UserAttributes = exports.LinkButtonDefaults = exports.NavButtonGroupDefaults = exports.NavbarDefaults = exports.NavLinkDefaults = exports.NavDefaults = exports.btnClasses = exports.btnSizeClass = exports.BootstrapSizes = exports.btnColorClass = exports.BootstrapColors = exports.activeClass = exports.activeClassNav = exports.apiValueFmt = exports.apiValue = exports.mapGet = exports.resolve = exports.each = exports.apply = exports.omitEmpty = exports.omit = exports.pick = exports.safeVarName = exports.trimEnd = exports.populateForm = exports.triggerEvent = exports.sanitizeFormData = exports.serializeToFormData = exports.serializeToUrlEncoded = exports.serializeToObject = exports.serializeForm = exports.ajaxSubmit = exports.formSubmit = exports.toVarNames = exports.bootstrapForm = exports.bindHandlers = exports.bootstrap = exports.delaySet = exports.addScript = exports.on = exports.$$ = exports.$1 = exports.isElement = exports.createElement = exports.padStart = exports.msToTime = exports.toTime = exports.toLocalISOString = exports.timeFmt12 = exports.dateFmtHM = exports.dateFmt = exports.padInt = exports.toDateFmt = exports.toDate = exports.isDate = exports.errorResponse = exports.errorResponseExcept = exports.errorResponseSummary = exports.toObject = exports.toFormData = exports.parseResponseStatus = exports.getField = exports.normalize = exports.normalizeKey = exports.parseCookie = exports.tryDecode = exports.stripQuotes = exports.bytesToBase64 = exports.setQueryString = exports.appendQueryString = exports.createUrl = exports.createPath = exports.combinePaths = exports.queryString = exports.humanify = exports.splitTitleCase = exports.isDigit = exports.isLower = exports.isUpper = exports.ucFirst = exports.humanize = exports.onlyProps = exports.chop = exports.lastRightPart = exports.lastLeftPart = exports.rightPart = exports.leftPart = exports.splitOnLast = exports.splitOnFirst = exports.css = exports.nameOf = exports.sanitize = exports.camelCaseAny = exports.map = exports.toKebabCase = exports.toCamelCase = exports.toPascalCase = exports.createError = exports.isFormData = exports.createFieldError = exports.createErrorStatus = exports.ApiResult = exports.getResponseStatus = exports.getMethod = exports.JsonApiClient = exports.JsonServiceClient = exports.GetAccessTokenResponse = exports.HttpMethods = exports.ServerEventUser = exports.GetEventSubscribers = exports.UpdateEventSubscriberResponse = exports.UpdateEventSubscriber = exports.ServerEventReceiver = exports.getAllMembers = exports.ServerEventsClient = exports.ReadyState = exports.SingletonInstanceResolver = exports.NewInstanceResolver = exports.FieldCss = exports.KeyValuePair = exports.RefInfo = exports.FormatInfo = exports.InputInfo = exports.ImageInfo = exports.MetadataType = exports.MetadataPropertyType = exports.MetadataAttribute = exports.MetadataDataMember = exports.MetadataDataContract = exports.MetadataTypeName = exports.MetadataTypes = exports.MetadataOperationType = exports.MetadataRoute = exports.MetadataTypesConfig = exports.GetNavItemsResponse = exports.GetNavItems = exports.NavItem = exports.EmptyResponse = exports.ErrorResponse = exports.ResponseError = exports.ResponseStatus = void 0;
var ResponseStatus = /** @class */ (function () {
function ResponseStatus(init) {
Object.assign(this, init);
}
return ResponseStatus;
}());
exports.ResponseStatus = ResponseStatus;
var ResponseError = /** @class */ (function () {
function ResponseError(init) {
Object.assign(this, init);
}
return ResponseError;
}());
exports.ResponseError = ResponseError;
var ErrorResponse = /** @class */ (function () {
function ErrorResponse(init) {
Object.assign(this, init);
}
return ErrorResponse;
}());
exports.ErrorResponse = ErrorResponse;
var EmptyResponse = /** @class */ (function () {
function EmptyResponse(init) {
Object.assign(this, init);
}
return EmptyResponse;
}());
exports.EmptyResponse = EmptyResponse;
var NavItem = /** @class */ (function () {
function NavItem(init) {
Object.assign(this, init);
}
return NavItem;
}());
exports.NavItem = NavItem;
var GetNavItems = /** @class */ (function () {
function GetNavItems(init) {
Object.assign(this, init);
}
GetNavItems.prototype.createResponse = function () { return new GetNavItemsResponse(); };
GetNavItems.prototype.getTypeName = function () { return 'GetNavItems'; };
GetNavItems.prototype.getMethod = function () { return 'GET'; };
return GetNavItems;
}());
exports.GetNavItems = GetNavItems;
var GetNavItemsResponse = /** @class */ (function () {
function GetNavItemsResponse(init) {
Object.assign(this, init);
}
return GetNavItemsResponse;
}());
exports.GetNavItemsResponse = GetNavItemsResponse;
var MetadataTypesConfig = /** @class */ (function () {
function MetadataTypesConfig(init) {
Object.assign(this, init);
}
return MetadataTypesConfig;
}());
exports.MetadataTypesConfig = MetadataTypesConfig;
var MetadataRoute = /** @class */ (function () {
function MetadataRoute(init) {
Object.assign(this, init);
}
return MetadataRoute;
}());
exports.MetadataRoute = MetadataRoute;
var MetadataOperationType = /** @class */ (function () {
function MetadataOperationType(init) {
Object.assign(this, init);
}
return MetadataOperationType;
}());
exports.MetadataOperationType = MetadataOperationType;
var MetadataTypes = /** @class */ (function () {
function MetadataTypes(init) {
Object.assign(this, init);
}
return MetadataTypes;
}());
exports.MetadataTypes = MetadataTypes;
var MetadataTypeName = /** @class */ (function () {
function MetadataTypeName(init) {
Object.assign(this, init);
}
return MetadataTypeName;
}());
exports.MetadataTypeName = MetadataTypeName;
var MetadataDataContract = /** @class */ (function () {
function MetadataDataContract(init) {
Object.assign(this, init);
}
return MetadataDataContract;
}());
exports.MetadataDataContract = MetadataDataContract;
var MetadataDataMember = /** @class */ (function () {
function MetadataDataMember(init) {
Object.assign(this, init);
}
return MetadataDataMember;
}());
exports.MetadataDataMember = MetadataDataMember;
var MetadataAttribute = /** @class */ (function () {
function MetadataAttribute(init) {
Object.assign(this, init);
}
return MetadataAttribute;
}());
exports.MetadataAttribute = MetadataAttribute;
var MetadataPropertyType = /** @class */ (function () {
function MetadataPropertyType(init) {
Object.assign(this, init);
}
return MetadataPropertyType;
}());
exports.MetadataPropertyType = MetadataPropertyType;
var MetadataType = /** @class */ (function () {
function MetadataType(init) {
Object.assign(this, init);
}
return MetadataType;
}());
exports.MetadataType = MetadataType;
var ImageInfo = /** @class */ (function () {
function ImageInfo() {
}
return ImageInfo;
}());
exports.ImageInfo = ImageInfo;
var InputInfo = /** @class */ (function () {
function InputInfo() {
}
return InputInfo;
}());
exports.InputInfo = InputInfo;
var FormatInfo = /** @class */ (function () {
function FormatInfo() {
}
return FormatInfo;
}());
exports.FormatInfo = FormatInfo;
var RefInfo = /** @class */ (function () {
function RefInfo() {
}
return RefInfo;
}());
exports.RefInfo = RefInfo;
var KeyValuePair = /** @class */ (function () {
function KeyValuePair() {
}
return KeyValuePair;
}());
exports.KeyValuePair = KeyValuePair;
var FieldCss = /** @class */ (function () {
function FieldCss() {
}
return FieldCss;
}());
exports.FieldCss = FieldCss;
var NewInstanceResolver = /** @class */ (function () {
function NewInstanceResolver() {
}
NewInstanceResolver.prototype.tryResolve = function (ctor) {
return new ctor();
};
return NewInstanceResolver;
}());
exports.NewInstanceResolver = NewInstanceResolver;
var SingletonInstanceResolver = /** @class */ (function () {
function SingletonInstanceResolver() {
}
SingletonInstanceResolver.prototype.tryResolve = function (ctor) {
return ctor.instance
|| (ctor.instance = new ctor());
};
return SingletonInstanceResolver;
}());
exports.SingletonInstanceResolver = SingletonInstanceResolver;
function eventMessageType(evt) {
switch (evt) {
case 'onConnect':
return 'ServerEventConnect';
case 'onHeartbeat':
return 'ServerEventHeartbeat';
case 'onJoin':
return 'ServerEventJoin';
case 'onLeave':
return 'ServerEventLeave';
case 'onUpdate':
return 'ServerEventUpdate';
}
return null;
}
/**
* EventSource
*/
var ReadyState;
(function (ReadyState) {
ReadyState[ReadyState["CONNECTING"] = 0] = "CONNECTING";
ReadyState[ReadyState["OPEN"] = 1] = "OPEN";
ReadyState[ReadyState["CLOSED"] = 2] = "CLOSED";
})(ReadyState = exports.ReadyState || (exports.ReadyState = {}));
var ServerEventsClient = /** @class */ (function () {
function ServerEventsClient(baseUrl, channels, options, eventSource) {
if (options === void 0) { options = {}; }
if (eventSource === void 0) { eventSource = null; }
var _this = this;
this.channels = channels;
this.options = options;
this.eventSource = eventSource;
this.onMessage = function (e) {
if (typeof document == "undefined") { //node
//latest node-fetch + eventsource doesn't split SSE messages properly
var requireSplitPos = e.data ? e.data.indexOf('\n') : -1;
if (requireSplitPos >= 0) {
var data = e.data;
var lastEventId = e.lastEventId;
var e1 = Object.assign({}, { lastEventId: lastEventId, data: data.substring(0, requireSplitPos) }), e2 = Object.assign({}, { lastEventId: lastEventId, data: data.substring(requireSplitPos + 1) });
_this._onMessage(e1);
_this._onMessage(e2);
return;
}
}
_this._onMessage(e);
};
this._onMessage = function (e) {
if (_this.stopped)
return;
var opt = _this.options;
if (typeof document == "undefined") {
var document = {
querySelectorAll: function (sel) { return []; }
};
}
var parts = splitOnFirst(e.data, " ");
var channel = null;
var selector = parts[0];
var selParts = splitOnFirst(selector, "@");
if (selParts.length > 1) {
channel = selParts[0];
selector = selParts[1];
}
var json = parts[1];
var body = null;
try {
body = json ? JSON.parse(json) : null;
}
catch (ignore) { }
parts = splitOnFirst(selector, ".");
if (parts.length <= 1)
throw "invalid selector format: " + selector;
var op = parts[0], target = parts[1].replace(new RegExp("%20", "g"), " ");
var tokens = splitOnFirst(target, "$");
var cmd = tokens[0], cssSelector = tokens[1];
var els = cssSelector && $$(cssSelector);
var el = els && els[0];
var eventId = parseInt(e.lastEventId);
var data = e.data;
var type = eventMessageType(cmd) || "ServerEventMessage";
var request = { eventId: eventId, data: data, type: type, channel: channel, selector: selector, json: json, body: body, op: op, target: tokens[0], cssSelector: cssSelector, meta: {} };
var mergedBody = typeof body == "object"
? Object.assign({}, request, body)
: request;
if (opt.validate && opt.validate(request) === false)
return;
var headers = new Headers();
headers.set("Content-Type", "text/plain");
if (op === "cmd") {
if (cmd === "onConnect") {
_this.connectionInfo = mergedBody;
if (typeof body.heartbeatIntervalMs == "string")
_this.connectionInfo.heartbeatIntervalMs = parseInt(body.heartbeatIntervalMs);
if (typeof body.idleTimeoutMs == "string")
_this.connectionInfo.idleTimeoutMs = parseInt(body.idleTimeoutMs);
Object.assign(opt, body);
var fn = opt.handlers["onConnect"];
if (fn) {
fn.call(el || document.body, _this.connectionInfo, request);
if (_this.stopped)
return;
}
if (opt.heartbeatUrl) {
if (opt.heartbeat) {
clearInterval(opt.heartbeat);
}
opt.heartbeat = setInterval(function () { return __awaiter(_this, void 0, void 0, function () {
var stopFn, reqHeartbeat, res, error, error_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (this.eventSource.readyState === EventSource.CLOSED) {
clearInterval(opt.heartbeat);
stopFn = opt.handlers["onStop"];
if (stopFn != null)
stopFn.apply(this.eventSource);
this.reconnectServerEvents({ error: new Error("EventSource is CLOSED") });
return [2 /*return*/];
}
reqHeartbeat = new Request(opt.heartbeatUrl, {
method: "POST", mode: "cors", headers: headers, credentials: this.serviceClient.credentials
});
_a.label = 1;
case 1:
_a.trys.push([1, 6, , 7]);
return [4 /*yield*/, fetch(reqHeartbeat)];
case 2:
res = _a.sent();
if (!!res.ok) return [3 /*break*/, 3];
error = new Error("".concat(res.status, " - ").concat(res.statusText));
this.reconnectServerEvents({ error: error });
return [3 /*break*/, 5];
case 3: return [4 /*yield*/, res.text()];
case 4:
_a.sent();
_a.label = 5;
case 5: return [3 /*break*/, 7];
case 6:
error_1 = _a.sent();
this.reconnectServerEvents({ error: error_1 });
return [3 /*break*/, 7];
case 7: return [2 /*return*/];
}
});
}); }, (_this.connectionInfo && _this.connectionInfo.heartbeatIntervalMs) || opt.heartbeatIntervalMs || 10000);
}
if (opt.unRegisterUrl) {
if (typeof window != "undefined") {
window.onunload = function () {
if (navigator.sendBeacon) { // Chrome https://developers.google.com/web/updates/2019/12/chrome-80-deps-rems
_this.stopped = true;
if (_this.eventSource)
_this.eventSource.close();
navigator.sendBeacon(opt.unRegisterUrl);
}
else {
_this.stop();
}
};
}
}
_this.updateSubscriberUrl = opt.updateSubscriberUrl;
_this.updateChannels((opt.channels || "").split(","));
}
else {
var isCmdMsg = cmd == "onJoin" || cmd == "onLeave" || cmd == "onUpdate";
var fn = opt.handlers[cmd];
if (fn) {
if (isCmdMsg) {
fn.call(el || document.body, mergedBody);
}
else {
fn.call(el || document.body, body, request);
}
}
else {
if (!isCmdMsg) { //global receiver
var r_1 = opt.receivers && opt.receivers["cmd"];
_this.invokeReceiver(r_1, cmd, el, request, "cmd");
}
}
if (isCmdMsg) {
fn = opt.handlers["onCommand"];
if (fn) {
fn.call(el || document.body, mergedBody);
}
}
}
}
else if (op === "trigger") {
_this.raiseEvent(target, request);
}
else if (op === "css") {
css(els || $$("body"), cmd, body);
}
//Named Receiver
var r = opt.receivers && opt.receivers[op];
_this.invokeReceiver(r, cmd, el, request, op);
if (!eventMessageType(cmd)) {
var fn = opt.handlers["onMessage"];
if (fn) {
fn.call(el || document.body, mergedBody);
}
}
if (opt.onTick)
opt.onTick();
};
this.onError = function (error) {
if (_this.stopped)
return;
if (!error)
error = event;
var fn = _this.options.onException;
if (fn != null)
fn.call(_this.eventSource, error);
if (_this.options.onTick)
_this.options.onTick();
};
if (this.channels.length === 0)
throw "at least 1 channel is required";
this.resolver = this.options.resolver || new NewInstanceResolver();
this.eventStreamUri = combinePaths(baseUrl, "event-stream") + "?";
this.updateChannels(channels);
this.serviceClient = new JsonServiceClient(baseUrl);
this.listeners = {};
this.withCredentials = true;
if (!this.options.handlers)
this.options.handlers = {};
}
ServerEventsClient.prototype.getEventSourceOptions = function () {
return { withCredentials: this.withCredentials };
};
ServerEventsClient.prototype.reconnectServerEvents = function (opt) {
var _this = this;
if (opt === void 0) { opt = {}; }
if (this.stopped)
return;
if (opt.error)
this.onError(opt.error);
var hold = this.eventSource;
var url = opt.url || this.eventStreamUri || hold.url;
if (this.options.resolveStreamUrl != null) {
url = this.options.resolveStreamUrl(url);
}
var es = this.EventSource
? new this.EventSource(url, this.getEventSourceOptions())
: new EventSource(url, this.getEventSourceOptions());
es.addEventListener('error', function (e) { return (opt.onerror || hold.onerror || _this.onError)(e); });
es.addEventListener('message', opt.onmessage || hold.onmessage || this.onMessage);
var fn = this.options.onReconnect;
if (fn != null)
fn.call(es, opt.error);
if (hold.removeEventListener) {
hold.removeEventListener('error', this.onError);
hold.removeEventListener('message', this.onMessage);
}
hold.close();
return this.eventSource = es;
};
ServerEventsClient.prototype.start = function () {
var _this = this;
this.stopped = false;
if (this.eventSource == null || this.eventSource.readyState === EventSource.CLOSED) {
var url = this.eventStreamUri;
if (this.options.resolveStreamUrl != null) {
url = this.options.resolveStreamUrl(url);
}
this.eventSource = this.EventSource
? new this.EventSource(url, this.getEventSourceOptions())
: new EventSource(url, this.getEventSourceOptions());
this.eventSource.addEventListener('error', this.onError);
this.eventSource.addEventListener('message', function (e) { return _this.onMessage(e); });
}
return this;
};
ServerEventsClient.prototype.stop = function () {
this.stopped = true;
if (this.eventSource) {
this.eventSource.close();
}
var opt = this.options;
if (opt && opt.heartbeat) {
clearInterval(opt.heartbeat);
}
var hold = this.connectionInfo;
if (hold == null || hold.unRegisterUrl == null)
return new Promise(function (resolve, reject) { return resolve(); });
this.connectionInfo = null;
return fetch(new Request(hold.unRegisterUrl, { method: "POST", mode: "cors", credentials: this.serviceClient.credentials }))
.then(function (res) { if (!res.ok)
throw new Error("".concat(res.status, " - ").concat(res.statusText)); })
.catch(this.onError);
};
ServerEventsClient.prototype.invokeReceiver = function (r, cmd, el, request, name) {
if (r) {
if (typeof r == "function") {
r = this.resolver.tryResolve(r);
}
cmd = cmd.replace("-", "");
r.client = this;
r.request = request;
if (typeof (r[cmd]) == "function") {
r[cmd].call(el || r, request.body, request);
}
else if (cmd in r) {
r[cmd] = request.body;
}
else {
var metaProp = Object.getOwnPropertyDescriptor(r, cmd);
if (metaProp != null) {
if (metaProp.set) {
metaProp.set(request.body);
}
else if (metaProp.writable) {
r[cmd] = request.body;
}
return;
}
var cmdLower_1 = cmd.toLowerCase();
getAllMembers(r).forEach(function (k) {
if (k.toLowerCase() == cmdLower_1) {
if (typeof r[k] == "function") {
r[k].call(el || r, request.body, request);
}
else {
r[k] = request.body;
}
return;
}
});
var noSuchMethod = r["noSuchMethod"];
if (typeof noSuchMethod == "function") {
noSuchMethod.call(el || r, request.target, request);
}
}
}
};
ServerEventsClient.prototype.hasConnected = function () {
return this.connectionInfo != null;
};
ServerEventsClient.prototype.registerHandler = function (name, fn) {
if (!this.options.handlers)
this.options.handlers = {};
this.options.handlers[name] = fn;
return this;
};
ServerEventsClient.prototype.setResolver = function (resolver) {
this.options.resolver = resolver;
return this;
};
ServerEventsClient.prototype.registerReceiver = function (receiver) {
return this.registerNamedReceiver("cmd", receiver);
};
ServerEventsClient.prototype.registerNamedReceiver = function (name, receiver) {
if (!this.options.receivers)
this.options.receivers = {};
this.options.receivers[name] = receiver;
return this;
};
ServerEventsClient.prototype.unregisterReceiver = function (name) {
if (name === void 0) { name = "cmd"; }
if (this.options.receivers) {
delete this.options.receivers[name];
}
return this;
};
ServerEventsClient.prototype.updateChannels = function (channels) {
this.channels = channels;
var url = this.eventSource != null
? this.eventSource.url
: this.eventStreamUri;
this.eventStreamUri = url.substring(0, Math.min(url.indexOf("?"), url.length)) + "?channels=" + channels.join(",") + "&t=" + new Date().getTime();
};
ServerEventsClient.prototype.update = function (subscribe, unsubscribe) {
var sub = typeof subscribe == "string" ? subscribe.split(',') : subscribe;
var unsub = typeof unsubscribe == "string" ? unsubscribe.split(',') : unsubscribe;
var channels = [];
for (var i in this.channels) {
var c = this.channels[i];
if (unsub == null || unsub.indexOf(c) === -1) {
channels.push(c);
}
}
if (sub) {
for (var i in sub) {
var c = sub[i];
if (channels.indexOf(c) === -1) {
channels.push(c);
}
}
}
this.updateChannels(channels);
};
ServerEventsClient.prototype.addListener = function (eventName, handler) {
var handlers = this.listeners[eventName] || (this.listeners[eventName] = []);
handlers.push(handler);
return this;
};
ServerEventsClient.prototype.removeListener = function (eventName, handler) {
var handlers = this.listeners[eventName];
if (handlers) {
var pos = handlers.indexOf(handler);
if (pos >= 0) {
handlers.splice(pos, 1);
}
}
return this;
};
ServerEventsClient.prototype.raiseEvent = function (eventName, msg) {
var _this = this;
var handlers = this.listeners[eventName];
if (handlers) {
handlers.forEach(function (x) {
try {
x(msg);
}
catch (e) {
_this.onError(e);
}
});
}
};
ServerEventsClient.prototype.getConnectionInfo = function () {
if (this.connectionInfo == null)
throw "Not Connected";
return this.connectionInfo;
};
ServerEventsClient.prototype.getSubscriptionId = function () {
return this.getConnectionInfo().id;
};
ServerEventsClient.prototype.updateSubscriber = function (request) {
var _this = this;
if (request.id == null)
request.id = this.getSubscriptionId();
return this.serviceClient.post(request)
.then(function (x) {
_this.update(request.subscribeChannels, request.unsubscribeChannels);
}).catch(this.onError);
};
ServerEventsClient.prototype.subscribeToChannels = function () {
var _this = this;
var channels = [];
for (var _i = 0; _i < arguments.length; _i++) {
channels[_i] = arguments[_i];
}
var request = new UpdateEventSubscriber();
request.id = this.getSubscriptionId();
request.subscribeChannels = channels;
return this.serviceClient.post(request)
.then(function (x) {
_this.update(channels, null);
}).catch(this.onError);
};
ServerEventsClient.prototype.unsubscribeFromChannels = function () {
var _this = this;
var channels = [];
for (var _i = 0; _i < arguments.length; _i++) {
channels[_i] = arguments[_i];
}
var request = new UpdateEventSubscriber();
request.id = this.getSubscriptionId();
request.unsubscribeChannels = channels;
return this.serviceClient.post(request)
.then(function (x) {
_this.update(null, channels);
}).catch(this.onError);
};
ServerEventsClient.prototype.getChannelSubscribers = function () {
var _this = this;
var request = new GetEventSubscribers();
request.channels = this.channels;
return this.serviceClient.get(request)
.then(function (r) { return r.map(function (x) { return _this.toServerEventUser(x); }); })
.catch(function (e) {
_this.onError(e);
return [];
});
};
ServerEventsClient.prototype.toServerEventUser = function (map) {
var channels = map["channels"];
var to = new ServerEventUser();
to.userId = map["userId"];
to.displayName = map["displayName"];
to.profileUrl = map["profileUrl"];
to.channels = channels ? channels.split(',') : null;
for (var k in map) {
if (k == "userId" || k == "displayName" ||
k == "profileUrl" || k == "channels")
continue;
if (to.meta == null)
to.meta = {};
to.meta[k] = map[k];
}
return to;
};
ServerEventsClient.UnknownChannel = "*";
return ServerEventsClient;
}());
exports.ServerEventsClient = ServerEventsClient;
function getAllMembers(o) {
var props = [];
do {
var l = Object.getOwnPropertyNames(o)
.concat(Object.getOwnPropertySymbols(o).map(function (s) { return s.toString(); }))
.sort()
.filter(function (p, i, arr) {
return p !== 'constructor' && //not the constructor
(i == 0 || p !== arr[i - 1]) && //not overriding in this prototype
props.indexOf(p) === -1;
} //not overridden in a child
);
props = props.concat(l);
} while ((o = Object.getPrototypeOf(o)) && //walk-up the prototype chain
Object.getPrototypeOf(o) //not the the Object prototype methods (hasOwnProperty, etc...)
);
return props;
}
exports.getAllMembers = getAllMembers;
var ServerEventReceiver = /** @class */ (function () {
function ServerEventReceiver() {
}
ServerEventReceiver.prototype.noSuchMethod = function (selector, message) { };
return ServerEventReceiver;
}());
exports.ServerEventReceiver = ServerEventReceiver;
var UpdateEventSubscriber = /** @class */ (function () {
function UpdateEventSubscriber() {
}
UpdateEventSubscriber.prototype.createResponse = function () { return new UpdateEventSubscriberResponse(); };
UpdateEventSubscriber.prototype.getTypeName = function () { return "UpdateEventSubscriber"; };
return UpdateEventSubscriber;
}());
exports.UpdateEventSubscriber = UpdateEventSubscriber;
var UpdateEventSubscriberResponse = /** @class */ (function () {
function UpdateEventSubscriberResponse() {
}
return UpdateEventSubscriberResponse;
}());
exports.UpdateEventSubscriberResponse = UpdateEventSubscriberResponse;
var GetEventSubscribers = /** @class */ (function () {
function GetEventSubscribers() {
}
GetEventSubscribers.prototype.createResponse = function () { return []; };
GetEventSubscribers.prototype.getTypeName = function () { return "GetEventSubscribers"; };
return GetEventSubscribers;
}());
exports.GetEventSubscribers = GetEventSubscribers;
var ServerEventUser = /** @class */ (function () {
function ServerEventUser() {
}
return ServerEventUser;
}());
exports.ServerEventUser = ServerEventUser;
var HttpMethods = /** @class */ (function () {
function HttpMethods() {
}
HttpMethods.Get = "GET";
HttpMethods.Post = "POST";
HttpMethods.Put = "PUT";
HttpMethods.Delete = "DELETE";
HttpMethods.Patch = "PATCH";
HttpMethods.Head = "HEAD";
HttpMethods.Options = "OPTIONS";
HttpMethods.hasRequestBody = function (method) {
return !(method === "GET" || method === "DELETE" || method === "HEAD" || method === "OPTIONS");
};
return HttpMethods;
}());
exports.HttpMethods = HttpMethods;
var GetAccessToken = /** @class */ (function () {
function GetAccessToken(init) {
Object.assign(this, init);
}
GetAccessToken.prototype.createResponse = function () { return new GetAccessTokenResponse(); };
GetAccessToken.prototype.getTypeName = function () { return 'GetAccessToken'; };
GetAccessToken.prototype.getMethod = function () { return 'POST'; };
return GetAccessToken;
}());
var GetAccessTokenResponse = /** @class */ (function () {
function GetAccessTokenResponse() {
}
return GetAccessTokenResponse;
}());
exports.GetAccessTokenResponse = GetAccessTokenResponse;
var JsonServiceClient = /** @class */ (function () {
function JsonServiceClient(baseUrl) {
if (baseUrl === void 0) { baseUrl = "/"; }
this.baseUrl = baseUrl;
this.mode = "cors";
this.credentials = "include";
this.headers = new Headers();
this.headers.set("Content-Type", "application/json");
this.manageCookies = typeof document == "undefined"; //because node-fetch doesn't
this.cookies = {};
this.enableAutoRefreshToken = true;
this.basePath = 'api';
}
JsonServiceClient.prototype.setCredentials = function (userName, password) {
this.userName = userName;
this.password = password;
};
JsonServiceClient.prototype.useBasePath = function (path) {
this.basePath = path;
return this;
};
Object.defineProperty(JsonServiceClient.prototype, "basePath", {
set: function (path) {
if (!path) {
this.replyBaseUrl = combinePaths(this.baseUrl, "json", "reply") + "/";
this.oneWayBaseUrl = combinePaths(this.baseUrl, "json", "oneway") + "/";
}
else {
this.replyBaseUrl = combinePaths(this.baseUrl, path) + "/";
this.oneWayBaseUrl = combinePaths(this.baseUrl, path) + "/";
}
},
enumerable: false,
configurable: true
});
JsonServiceClient.prototype.apply = function (f) {
f(this);
return this;
};
JsonServiceClient.prototype.get = function (request, args) {
return typeof request != "string"
? this.fetch(HttpMethods.Get, request, args)
: this.fetch(HttpMethods.Get, null, args, this.toAbsoluteUrl(request));
};
JsonServiceClient.prototype.delete = function (request, args) {
return typeof request != "string"
? this.fetch(HttpMethods.Delete, request, args)
: this.fetch(HttpMethods.Delete, null, args, this.toAbsoluteUrl(request));
};
JsonServiceClient.prototype.post = function (request, args) {
return this.fetch(HttpMethods.Post, request, args);
};
JsonServiceClient.prototype.postToUrl = function (url, request, args) {
return this.fetch(HttpMethods.Post, request, args, this.toAbsoluteUrl(url));
};
JsonServiceClient.prototype.postBody = function (request, body, args) {
return this.fetchBody(HttpMethods.Post, request, body, args);
};
JsonServiceClient.prototype.put = function (request, args) {
return this.fetch(HttpMethods.Put, request, args);
};
JsonServiceClient.prototype.putToUrl = function (url, request, args) {
return this.fetch(HttpMethods.Put, request, args, this.toAbsoluteUrl(url));
};
JsonServiceClient.prototype.putBody = function (request, body, args) {
return this.fetchBody(HttpMethods.Put, request, body, args);
};
JsonServiceClient.prototype.patch = function (request, args) {
return this.fetch(HttpMethods.Patch, request, args);
};
JsonServiceClient.prototype.patchToUrl = function (url, request, args) {
return this.fetch(HttpMethods.Patch, request, args, this.toAbsoluteUrl(url));
};
JsonServiceClient.prototype.patchBody = function (request, body, args) {
return this.fetchBody(HttpMethods.Patch, request, body, args);
};
JsonServiceClient.prototype.publish = function (request, args) {
return this.sendOneWay(request, args);
};
JsonServiceClient.prototype.sendOneWay = function (request, args) {
var url = combinePaths(this.oneWayBaseUrl, nameOf(request));
return this.fetch(HttpMethods.Post, request, null, url);
};
JsonServiceClient.prototype.sendAll = function (requests) {
if (requests.length == 0)
return Promise.resolve([]);
var url = combinePaths(this.replyBaseUrl, nameOf(requests[0]) + "[]");
return this.fetch(HttpMethods.Post, requests, null, url);
};
JsonServiceClient.prototype.sendAllOneWay = function (requests) {
if (requests.length == 0)
return Promise.resolve(void 0);
var url = combinePaths(this.oneWayBaseUrl, nameOf(requests[0]) + "[]");
return this.fetch(HttpMethods.Post, requests, null, url)
.then(function (r) { return void 0; });
};
JsonServiceClient.prototype.createUrlFromDto = function (method, request) {
var url = combinePaths(this.replyBaseUrl, nameOf(request));
var hasRequestBody = HttpMethods.hasRequestBody(method);
if (!hasRequestBody)
url = appendQueryString(url, request);
return url;
};
JsonServiceClient.prototype.toAbsoluteUrl = function (relativeOrAbsoluteUrl) {
return relativeOrAbsoluteUrl.startsWith("http://") ||
relativeOrAbsoluteUrl.startsWith("https://")
? relativeOrAbsoluteUrl
: combinePaths(this.baseUrl, relativeOrAbsoluteUrl);
};
JsonServiceClient.prototype.deleteCookie = function (name) {
if (this.manageCookies) {
delete this.cookies[name];
}
else {
if (document) {
document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/';
}
}
};
JsonServiceClient.prototype.createRequest = function (_a) {
var _this = this;
var method = _a.method, request = _a.request, url = _a.url, args = _a.args, body = _a.body;
if (!url)
url = this.createUrlFromDto(method, request);
if (args)
url = appendQueryString(url, args);
if (this.bearerToken != null) {
this.headers.set("Authorization", "Bearer " + this.bearerToken);
}
else if (this.userName != null) {
this.headers.set('Authorization', 'Basic ' + JsonServiceClient.toBase64("".concat(this.userName, ":").concat(this.password)));
}
if (this.manageCookies) {
var cookies = Object.keys(this.cookies)
.map(function (x) {
var c = _this.cookies[x];
return c.expires && c.expires < new Date()
? null
: "".concat(c.name, "=").concat(encodeURIComponent(c.value));
})
.filter(function (x) { return !!x; });
if (cookies.length > 0)
this.headers.set("Cookie", cookies.join("; "));
else
this.headers.delete("Cookie");
}
var headers = new Headers(this.headers);
var hasRequestBody = HttpMethods.hasRequestBody(method);
var reqInit = {
url: url,
method: method,
mode: this.mode,
credentials: this.credentials,
headers: headers,
compress: false, // https://github.com/bitinn/node-fetch/issues/93#issuecomment-200791658
};
if (hasRequestBody) {
reqInit.body = body || JSON.stringify(request);
if (isFormData(body)) {
reqInit.body = sanitizeFormData(body);
headers.delete('Content-Type'); //set by FormData
}
}
if (this.requestFilter != null)
this.requestFilter(reqInit);
if (JsonServiceClient.globalRequestFilter != null)
JsonServiceClient.globalRequestFilter(reqInit);
return reqInit;
};
JsonServiceClient.prototype.json = function (res) {
if (this.parseJson)
return this.parseJson(res);
return res.text().then(function (txt) {
return txt.length > 0 ? JSON.parse(txt) : null;
});
};
JsonServiceClient.prototype.applyResponseFilters = function (res) {
if (this.responseFilter != null)
this.responseFilter(res);
if (JsonServiceClient.globalResponseFilter != null)
JsonServiceClient.globalResponseFilter(res);
};
JsonServiceClient.prototype.createResponse = function (res, request) {
var _this = this;
if (!res.ok) {
this.applyResponseFilters(res);
throw res;
}
if (this.manageCookies) {
var setCookies_1 = [];
res.headers.forEach(function (v, k) {
switch (k.toLowerCase()) {
case "set-cookie":
var cookies = v.split(',');
cookies.forEach(function (c) { return setCookies_1.push(c); });
break;
}