UNPKG

@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
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; }