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,094 lines • 44.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
require("fetch-everywhere");
var ResponseStatus = /** @class */ (function () {
function ResponseStatus() {
}
return ResponseStatus;
}());
exports.ResponseStatus = ResponseStatus;
var ResponseError = /** @class */ (function () {
function ResponseError() {
}
return ResponseError;
}());
exports.ResponseError = ResponseError;
var ErrorResponse = /** @class */ (function () {
function ErrorResponse() {
}
return ErrorResponse;
}());
exports.ErrorResponse = ErrorResponse;
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;
var TypeMap = {
onConnect: "ServerEventConnect",
onHeartbeat: "ServerEventHeartbeat",
onJoin: "ServerEventJoin",
onLeave: "ServerEventLeave",
onUpdate: "ServerEventUpdate"
};
/**
* 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 (_this.stopped)
return;
var opt = _this.options;
if (typeof document == "undefined") {
var document = {
querySelectorAll: function (sel) { return []; }
};
}
var parts = exports.splitOnFirst(e.data, " ");
var channel = null;
var selector = parts[0];
var selParts = exports.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 = exports.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 = exports.splitOnFirst(target, "$");
var cmd = tokens[0], cssSelector = tokens[1];
var els = cssSelector && document.querySelectorAll(cssSelector);
var el = els && els[0];
var eventId = parseInt(e.lastEventId);
var data = e.data;
var type = TypeMap[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 () {
if (_this.eventSource.readyState === EventSource.CLOSED) {
clearInterval(opt.heartbeat);
var stopFn = opt.handlers["onStop"];
if (stopFn != null)
stopFn.apply(_this.eventSource);
_this.reconnectServerEvents({ error: new Error("EventSource is CLOSED") });
return;
}
fetch(new Request(opt.heartbeatUrl, { method: "POST", mode: "cors", headers: headers }))
.then(function (res) { if (!res.ok)
throw new Error(res.status + " - " + res.statusText); })
.catch(function (error) { return _this.reconnectServerEvents({ error: error }); });
}, (_this.connectionInfo && _this.connectionInfo.heartbeatIntervalMs) || opt.heartbeatIntervalMs || 10000);
}
if (opt.unRegisterUrl) {
if (typeof window != "undefined") {
window.onunload = function () { return _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) {
var r = opt.receivers && opt.receivers["cmd"];
_this.invokeReceiver(r, 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") {
exports.css(els || document.querySelectorAll("body"), cmd, body);
}
//Named Receiver
var r = opt.receivers && opt.receivers[op];
_this.invokeReceiver(r, cmd, el, request, op);
if (!TypeMap[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 = exports.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; });
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" }))
.then(function (res) { if (!res.ok)
throw new Error(res.status + " - " + 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 cmdLower = cmd.toLowerCase();
for (var k in r) {
if (k.toLowerCase() == cmdLower) {
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;
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() {
}
GetAccessToken.prototype.createResponse = function () { return new GetAccessTokenResponse(); };
GetAccessToken.prototype.getTypeName = function () { return "GetAccessToken"; };
return GetAccessToken;
}());
var GetAccessTokenResponse = /** @class */ (function () {
function GetAccessTokenResponse() {
}
return GetAccessTokenResponse;
}());
exports.GetAccessTokenResponse = GetAccessTokenResponse;
var JsonServiceClient = /** @class */ (function () {
function JsonServiceClient(baseUrl) {
if (baseUrl == null)
throw "baseUrl is required";
this.baseUrl = baseUrl;
this.replyBaseUrl = exports.combinePaths(baseUrl, "json", "reply") + "/";
this.oneWayBaseUrl = exports.combinePaths(baseUrl, "json", "oneway") + "/";
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 = {};
}
JsonServiceClient.prototype.setCredentials = function (userName, password) {
this.userName = userName;
this.password = password;
};
// @deprecated use bearerToken property
JsonServiceClient.prototype.setBearerToken = function (token) {
this.bearerToken = token;
};
JsonServiceClient.prototype.get = function (request, args) {
return typeof request != "string"
? this.send(HttpMethods.Get, request, args)
: this.send(HttpMethods.Get, null, args, this.toAbsoluteUrl(request));
};
JsonServiceClient.prototype.delete = function (request, args) {
return typeof request != "string"
? this.send(HttpMethods.Delete, request, args)
: this.send(HttpMethods.Delete, null, args, this.toAbsoluteUrl(request));
};
JsonServiceClient.prototype.post = function (request, args) {
return this.send(HttpMethods.Post, request, args);
};
JsonServiceClient.prototype.postToUrl = function (url, request, args) {
return this.send(HttpMethods.Post, request, args, this.toAbsoluteUrl(url));
};
JsonServiceClient.prototype.postBody = function (request, body, args) {
return this.sendBody(HttpMethods.Post, request, body, args);
};
JsonServiceClient.prototype.put = function (request, args) {
return this.send(HttpMethods.Put, request, args);
};
JsonServiceClient.prototype.putToUrl = function (url, request, args) {
return this.send(HttpMethods.Put, request, args, this.toAbsoluteUrl(url));
};
JsonServiceClient.prototype.putBody = function (request, body, args) {
return this.sendBody(HttpMethods.Post, request, body, args);
};
JsonServiceClient.prototype.patch = function (request, args) {
return this.send(HttpMethods.Patch, request, args);
};
JsonServiceClient.prototype.patchToUrl = function (url, request, args) {
return this.send(HttpMethods.Patch, request, args, this.toAbsoluteUrl(url));
};
JsonServiceClient.prototype.patchBody = function (request, body, args) {
return this.sendBody(HttpMethods.Post, request, body, args);
};
JsonServiceClient.prototype.createUrlFromDto = function (method, request) {
var url = exports.combinePaths(this.replyBaseUrl, exports.nameOf(request));
var hasRequestBody = HttpMethods.hasRequestBody(method);
if (!hasRequestBody)
url = exports.appendQueryString(url, request);
return url;
};
JsonServiceClient.prototype.toAbsoluteUrl = function (relativeOrAbsoluteUrl) {
return relativeOrAbsoluteUrl.startsWith("http://") ||
relativeOrAbsoluteUrl.startsWith("https://")
? relativeOrAbsoluteUrl
: exports.combinePaths(this.baseUrl, relativeOrAbsoluteUrl);
};
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 = exports.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(this.userName + ":" + 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
: c.name + "=" + encodeURIComponent(c.value);
})
.filter(function (x) { return !!x; });
if (cookies.length > 0)
this.headers.set("Cookie", cookies.join("; "));
else
this.headers.delete("Cookie");
}
// Set `compress` false due to common error
// https://github.com/bitinn/node-fetch/issues/93#issuecomment-200791658
var reqOptions = {
method: method,
mode: this.mode,
credentials: this.credentials,
headers: this.headers,
compress: false
};
var req = new Request(url, reqOptions);
if (HttpMethods.hasRequestBody(method))
req.body = body || JSON.stringify(request);
var opt = { url: url };
if (this.requestFilter != null)
this.requestFilter(req, opt);
return [req, opt];
};
JsonServiceClient.prototype.createResponse = function (res, request) {
var _this = this;
if (!res.ok)
throw res;
if (this.manageCookies) {
var setCookies = [];
res.headers.forEach(function (v, k) {
if ("set-cookie" == k.toLowerCase())
setCookies.push(v);
});
setCookies.forEach(function (x) {
var cookie = exports.parseCookie(x);
if (cookie)
_this.cookies[cookie.name] = cookie;
});
}
if (this.responseFilter != null)
this.responseFilter(res);
var x = request && typeof request != "string" && typeof request.createResponse == 'function'
? request.createResponse()
: null;
if (typeof x === 'string')
return res.text().then(function (o) { return o; });
var contentType = res.headers.get("content-type");
var isJson = contentType && contentType.indexOf("application/json") !== -1;
if (isJson) {
return res.json().then(function (o) { return o; });
}
if (typeof Uint8Array != "undefined" && x instanceof Uint8Array) {
if (typeof res.arrayBuffer != 'function')
throw new Error("This fetch polyfill does not implement 'arrayBuffer'");
return res.arrayBuffer().then(function (o) { return new Uint8Array(o); });
}
else if (typeof Blob == "function" && x instanceof Blob) {
if (typeof res.blob != 'function')
throw new Error("This fetch polyfill does not implement 'blob'");
return res.blob().then(function (o) { return o; });
}
var contentLength = res.headers.get("content-length");
if (contentLength === "0" || (contentLength == null && !isJson)) {
return x;
}
return res.json().then(function (o) { return o; }); //fallback
};
JsonServiceClient.prototype.handleError = function (holdRes, res, type) {
var _this = this;
if (type === void 0) { type = null; }
if (res instanceof Error)
throw this.raiseError(holdRes, res);
// res.json can only be called once.
if (res.bodyUsed)
throw this.raiseError(res, createErrorResponse(res.status, res.statusText, type));
var isErrorResponse = typeof res.json == "undefined" && res.responseStatus;
if (isErrorResponse) {
return new Promise(function (resolve, reject) {
return reject(_this.raiseError(null, res));
});
}
return res.json().then(function (o) {
var errorDto = exports.sanitize(o);
if (!errorDto.responseStatus)
throw createErrorResponse(res.status, res.statusText, type);
if (type != null)
errorDto.type = type;
throw errorDto;
}).catch(function (error) {
// No responseStatus body, set from `res` Body object
if (error instanceof Error
|| (typeof window != "undefined" && error instanceof window.DOMException /*MS Edge*/)) {
throw _this.raiseError(res, createErrorResponse(res.status, res.statusText, type));
}
throw _this.raiseError(res, error);
});
};
JsonServiceClient.prototype.send = function (method, request, args, url) {
return this.sendRequest({ method: method, request: request, args: args, url: url });
};
JsonServiceClient.prototype.sendBody = function (method, request, body, args) {
var url = exports.combinePaths(this.replyBaseUrl, exports.nameOf(request));
return this.sendRequest({
method: method,
request: body,
body: typeof body == "string" ? body : JSON.stringify(body),
url: exports.appendQueryString(url, request),
args: args,
returns: request
});
};
JsonServiceClient.prototype.sendRequest = function (info) {
var _this = this;
var _a = this.createRequest(info), req = _a[0], opt = _a[1];
var returns = info.returns || info.request;
var holdRes = null;
var resendRequest = function () {
var _a = _this.createRequest(info), req = _a[0], opt = _a[1];
return fetch(opt.url || req.url, req)
.then(function (res) { return _this.createResponse(res, returns); })
.catch(function (res) { return _this.handleError(holdRes, res); });
};
return fetch(opt.url || req.url, req)
.then(function (res) {
holdRes = res;
var response = _this.createResponse(res, returns);
return response;
})
.catch(function (res) {
if (res.status === 401) {
if (_this.refreshToken) {
var jwtReq_1 = new GetAccessToken();
jwtReq_1.refreshToken = _this.refreshToken;
var url = _this.refreshTokenUri || _this.createUrlFromDto(HttpMethods.Post, jwtReq_1);
var _a = _this.createRequest({ method: HttpMethods.Post, request: jwtReq_1, args: null, url: url }), jwtRequest = _a[0], jwtOpt = _a[1];
return fetch(url, jwtRequest)
.then(function (r) { return _this.createResponse(r, jwtReq_1).then(function (jwtResponse) {
_this.bearerToken = jwtResponse.accessToken;
return resendRequest();
}); })
.catch(function (res) {
return _this.handleError(holdRes, res, "RefreshTokenException");
});
}
if (_this.onAuthenticationRequired) {
return _this.onAuthenticationRequired().then(resendRequest);
}
}
return _this.handleError(holdRes, res);
});
};
JsonServiceClient.prototype.raiseError = function (res, error) {
if (this.exceptionFilter != null) {
this.exceptionFilter(res, error);
}
return error;
};
return JsonServiceClient;
}());
exports.JsonServiceClient = JsonServiceClient;
var createErrorResponse = function (errorCode, message, type) {
if (type === void 0) { type = null; }
var error = new ErrorResponse();
if (type != null)
error.type = type;
error.responseStatus = new ResponseStatus();
error.responseStatus.errorCode = errorCode && errorCode.toString();
error.responseStatus.message = message;
return error;
};
exports.toCamelCase = function (key) {
return !key ? key : key.charAt(0).toLowerCase() + key.substring(1);
};
exports.sanitize = function (status) {
if (status.responseStatus)
return status;
if (status.errors)
return status;
var to = {};
for (var k_1 in status) {
if (status.hasOwnProperty(k_1)) {
if (status[k_1] instanceof Object)
to[exports.toCamelCase(k_1)] = exports.sanitize(status[k_1]);
else
to[exports.toCamelCase(k_1)] = status[k_1];
}
}
to.errors = [];
if (status.Errors != null) {
for (var i = 0, len = status.Errors.length; i < len; i++) {
var o = status.Errors[i];
var err = {};
for (var k in o)
err[exports.toCamelCase(k)] = o[k];
to.errors.push(err);
}
}
return to;
};
exports.nameOf = function (o) {
if (!o)
return "null";
if (typeof o.getTypeName == "function")
return o.getTypeName();
var ctor = o && o.constructor;
if (ctor == null)
throw o + " doesn't have constructor";
if (ctor.name)
return ctor.name;
var str = ctor.toString();
return str.substring(9, str.indexOf("(")); //"function ".length == 9
};
/* utils */
function log(o, prefix) {
if (prefix === void 0) { prefix = "LOG"; }
console.log(prefix, o);
return o;
}
exports.css = function (selector, name, value) {
var els = typeof selector == "string"
? document.querySelectorAll(selector)
: selector;
for (var i = 0; i < els.length; i++) {
var el = els[i];
if (el != null && el.style != null) {
el.style[name] = value;
}
}
};
exports.splitOnFirst = function (s, c) {
if (!s)
return [s];
var pos = s.indexOf(c);
return pos >= 0 ? [s.substring(0, pos), s.substring(pos + 1)] : [s];
};
exports.splitOnLast = function (s, c) {
if (!s)
return [s];
var pos = s.lastIndexOf(c);
return pos >= 0
? [s.substring(0, pos), s.substring(pos + 1)]
: [s];
};
var splitCase = function (t) {
return typeof t != 'string' ? t : t.replace(/([A-Z]|[0-9]+)/g, ' $1').replace(/_/g, ' ').trim();
};
exports.humanize = function (s) { return (!s || s.indexOf(' ') >= 0 ? s : splitCase(s)); };
exports.queryString = function (url) {
if (!url || url.indexOf('?') === -1)
return {};
var pairs = exports.splitOnFirst(url, '?')[1].split('&');
var map = {};
for (var i = 0; i < pairs.length; ++i) {
var p = pairs[i].split('=');
map[p[0]] = p.length > 1
? decodeURIComponent(p[1].replace(/\+/g, ' '))
: null;
}
return map;
};
exports.combinePaths = function () {
var paths = [];
for (var _i = 0; _i < arguments.length; _i++) {
paths[_i] = arguments[_i];
}
var parts = [], i, l;
for (i = 0, l = paths.length; i < l; i++) {
var arg = paths[i];
parts = arg.indexOf("://") === -1
? parts.concat(arg.split("/"))
: parts.concat(arg.lastIndexOf("/") === arg.length - 1 ? arg.substring(0, arg.length - 1) : arg);
}
var combinedPaths = [];
for (i = 0, l = parts.length; i < l; i++) {
var part = parts[i];
if (!part || part === ".")
continue;
if (part === "..")
combinedPaths.pop();
else
combinedPaths.push(part);
}
if (parts[0] === "")
combinedPaths.unshift("");
return combinedPaths.join("/") || (combinedPaths.length ? "/" : ".");
};
exports.createPath = function (route, args) {
var argKeys = {};
for (var k in args) {
argKeys[k.toLowerCase()] = k;
}
var parts = route.split("/");
var url = "";
for (var i = 0; i < parts.length; i++) {
var p = parts[i];
if (p == null)
p = "";
if (p[0] === "{" && p[p.length - 1] === "}") {
var key = argKeys[p.substring(1, p.length - 1).toLowerCase()];
if (key) {
p = args[key];
delete args[key];
}
}
if (url.length > 0)
url += "/";
url += p;
}
return url;
};
exports.createUrl = function (route, args) {
var url = exports.createPath(route, args);
return exports.appendQueryString(url, args);
};
exports.appendQueryString = function (url, args) {
for (var k in args) {
if (args.hasOwnProperty(k)) {
url += url.indexOf("?") >= 0 ? "&" : "?";
url += k + "=" + qsValue(args[k]);
}
}
return url;
};
var qsValue = function (arg) {
if (arg == null)
return "";
if (typeof Uint8Array != "undefined" && arg instanceof Uint8Array)
return exports.bytesToBase64(arg);
return encodeURIComponent(arg) || "";
};
//from: https://github.com/madmurphy/stringview.js/blob/master/stringview.js
exports.bytesToBase64 = function (aBytes) {
var eqLen = (3 - (aBytes.length % 3)) % 3, sB64Enc = "";
for (var nMod3, nLen = aBytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {
nMod3 = nIdx % 3;
nUint24 |= aBytes[nIdx] << (16 >>> nMod3 & 24);
if (nMod3 === 2 || aBytes.length - nIdx === 1) {
sB64Enc += String.fromCharCode(uint6ToB64(nUint24 >>> 18 & 63), uint6ToB64(nUint24 >>> 12 & 63), uint6ToB64(nUint24 >>> 6 & 63), uint6ToB64(nUint24 & 63));
nUint24 = 0;
}
}
return eqLen === 0
? sB64Enc
: sB64Enc.substring(0, sB64Enc.length - eqLen) + (eqLen === 1 ? "=" : "==");
};
var uint6ToB64 = function (nUint6) {
return nUint6 < 26 ?
nUint6 + 65
: nUint6 < 52 ?
nUint6 + 71
: nUint6 < 62 ?
nUint6 - 4
: nUint6 === 62 ? 43
: nUint6 === 63 ? 47 : 65;
};
var _btoa = typeof btoa == 'function'
? btoa
: function (str) { return new Buffer(str).toString('base64'); };
//from: http://stackoverflow.com/a/30106551/85785
JsonServiceClient.toBase64 = function (str) {
return _btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {
return String.fromCharCode(new Number('0x' + p1).valueOf());
}));
};
exports.stripQuotes = function (s) {
return s && s[0] == '"' && s[s.length] == '"' ? s.slice(1, -1) : s;
};
exports.tryDecode = function (s) {
try {
return decodeURIComponent(s);
}
catch (e) {
return s;
}
};
exports.parseCookie = function (setCookie) {
if (!setCookie)
return null;
var to = null;
var pairs = setCookie.split(/; */);
for (var i = 0; i < pairs.length; i++) {
var pair = pairs[i];
var parts = exports.splitOnFirst(pair, '=');
var name = parts[0].trim();
var value = parts.length > 1 ? exports.tryDecode(exports.stripQuotes(parts[1].trim())) : null;
if (i == 0) {
to = { name: name, value: value, path: "/" };
}
else {
var lower = name.toLowerCase();
if (lower == "httponly") {
to.httpOnly = true;
}
else if (lower == "secure") {
to.secure = true;
}
else if (lower == "expires") {
to.expires = new Date(value);
// MS Edge returns Invalid Date when using '-' in "12-Mar-2037"
if (to.expires.toString() === "Invalid Date") {
to.expires = new Date(value.replace(/-/g, " "));
}
}
else {
to[name] = value;
}
}
}
return to;
};
exports.normalizeKey = function (key) { return key.toLowerCase().replace(/_/g, ''); };
var isArray = function (o) { return Object.prototype.toString.call(o) === '[object Array]'; };
exports.normalize = function (dto, deep) {
if (isArray(dto)) {
if (!deep)
return dto;
var to = [];
for (var i = 0; i < dto.length; i++) {
to[i] = exports.normalize(dto[i], deep);
}
return to;
}
if (typeof dto != "object")
return dto;
var o = {};
for (var k in dto) {
o[exports.normalizeKey(k)] = deep ? exports.normalize(dto[k], deep) : dto[k];
}
return o;
};
exports.getField = function (o, name) {
return o == null || name == null ? null :
o[name] ||
o[Object.keys(o).filter(function (k) { return exports.normalizeKey(k) === exports.normalizeKey(name); })[0] || ''];
};
exports.parseResponseStatus = function (json, defaultMsg) {
if (defaultMsg === void 0) { defaultMsg = null; }
try {
var err = JSON.parse(json);
return exports.sanitize(err.ResponseStatus || err.responseStatus);
}
catch (e) {
return {
message: defaultMsg || e.message || e,
__error: { error: e, json: json }
};
}
};
exports.toDate = function (s) { return new Date(parseFloat(/Date\(([^)]+)\)/.exec(s)[1])); };
exports.toDateFmt = function (s) { return exports.dateFmt(exports.toDate(s)); };
exports.padInt = function (n) { return n < 10 ? '0' + n : n; };
exports.dateFmt = function (d) {
if (d === void 0) { d = new Date(); }
return d.getFullYear() + '/' + exports.padInt(d.getMonth() + 1) + '/' + exports.padInt(d.getDate());
};
exports.dateFmtHM = function (d) {
if (d === void 0) { d = new Date(); }
return d.getFullYear() + '/' + exports.padInt(d.getMonth() + 1) + '/' + exports.padInt(d.getDate()) + ' ' + exports.padInt(d.getHours()) + ":" + exports.padInt(d.getMinutes());
};
exports.timeFmt12 = function (d) {
if (d === void 0) { d = new Date(); }
return exports.padInt((d.getHours() + 24) % 12 || 12) + ":" + exports.padInt(d.getMinutes()) + ":" + exports.padInt(d.getSeconds()) + " " + (d.getHours() > 12 ? "PM" : "AM");
};
//# sourceMappingURL=index.js.map