tns-core-modules
Version:
Telerik NativeScript Core Modules
293 lines (292 loc) • 10.3 kB
JavaScript
var http = require("http");
var types = require("utils/types");
var XMLHttpRequestResponseType;
(function (XMLHttpRequestResponseType) {
XMLHttpRequestResponseType.empty = "";
XMLHttpRequestResponseType.text = "text";
XMLHttpRequestResponseType.json = "json";
})(XMLHttpRequestResponseType || (XMLHttpRequestResponseType = {}));
var XMLHttpRequest = (function () {
function XMLHttpRequest() {
this.UNSENT = 0;
this.OPENED = 1;
this.HEADERS_RECEIVED = 2;
this.LOADING = 3;
this.DONE = 4;
this._responseType = "";
this._listeners = new Map();
this._readyState = this.UNSENT;
}
XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
if (types.isString(method) && types.isString(url)) {
this._options = { url: url, method: method };
this._options.headers = {};
if (types.isString(user)) {
this._options.headers["user"] = user;
}
if (types.isString(password)) {
this._options.headers["password"] = password;
}
this._setReadyState(this.OPENED);
}
};
XMLHttpRequest.prototype.abort = function () {
this._errorFlag = true;
this._response = null;
this._responseTextReader = null;
this._headers = null;
this._status = null;
if (this._readyState === this.UNSENT || this._readyState === this.OPENED || this._readyState === this.DONE) {
this._readyState = this.UNSENT;
}
else {
this._setReadyState(this.DONE);
}
};
XMLHttpRequest.prototype.send = function (data) {
var _this = this;
this._errorFlag = false;
this._response = null;
this._responseTextReader = null;
this._headers = null;
this._status = null;
if (types.isDefined(this._options)) {
if (types.isString(data) && this._options.method !== 'GET') {
this._options.content = data;
}
else if (data instanceof FormData) {
this._options.content = data.toString();
}
http.request(this._options).then(function (r) {
if (!_this._errorFlag) {
_this._loadResponse(r);
}
}).catch(function (e) {
_this._errorFlag = true;
_this._setReadyState(_this.DONE, e);
});
}
};
XMLHttpRequest.prototype._loadResponse = function (r) {
this._status = r.statusCode;
this._response = r.content.raw;
this._headers = r.headers;
this._setReadyState(this.HEADERS_RECEIVED);
this._setReadyState(this.LOADING);
this._setResponseType();
if (this.responseType === XMLHttpRequestResponseType.json) {
this._responseTextReader = function () { return r.content.toString(); };
this._response = JSON.parse(this.responseText);
}
else if (this.responseType === XMLHttpRequestResponseType.empty ||
this.responseType === XMLHttpRequestResponseType.text) {
this._responseTextReader = function () { return r.content.toString(); };
}
this._setReadyState(this.DONE);
};
XMLHttpRequest.prototype._setResponseType = function () {
var header = this.getResponseHeader('Content-Type');
var contentType = header && header.toLowerCase();
if (contentType) {
if (contentType.indexOf('application/json') >= 0) {
this.responseType = XMLHttpRequestResponseType.json;
}
else if (contentType.indexOf('text/plain') >= 0) {
this.responseType = XMLHttpRequestResponseType.text;
}
}
else {
this.responseType = XMLHttpRequestResponseType.text;
}
};
XMLHttpRequest.prototype.addEventListener = function (eventName, handler) {
if (eventName !== 'load' && eventName !== 'error') {
throw new Error('Event not supported: ' + eventName);
}
var handlers = this._listeners.get(eventName) || [];
handlers.push(handler);
this._listeners.set(eventName, handlers);
};
XMLHttpRequest.prototype.removeEventListener = function (eventName, toDetach) {
var handlers = this._listeners.get(eventName) || [];
handlers = handlers.filter(function (handler) { return handler !== toDetach; });
this._listeners.set(eventName, handlers);
};
XMLHttpRequest.prototype.emitEvent = function (eventName) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
var handlers = this._listeners.get(eventName) || [];
handlers.forEach(function (handler) {
handler.apply(void 0, args);
});
};
XMLHttpRequest.prototype.setRequestHeader = function (header, value) {
if (types.isDefined(this._options) && types.isString(header) && types.isString(value)) {
this._options.headers[header] = value;
}
};
XMLHttpRequest.prototype.getAllResponseHeaders = function () {
if (this._readyState < 2 || this._errorFlag) {
return "";
}
var result = "";
for (var i in this._headers) {
if (i !== "set-cookie" && i !== "set-cookie2") {
result += i + ": " + this._headers[i] + "\r\n";
}
}
return result.substr(0, result.length - 2);
};
XMLHttpRequest.prototype.getResponseHeader = function (header) {
if (types.isString(header) && this._readyState > 1
&& this._headers
&& this._headers[header]
&& !this._errorFlag) {
return this._headers[header];
}
return null;
};
XMLHttpRequest.prototype.overrideMimeType = function (mime) {
};
Object.defineProperty(XMLHttpRequest.prototype, "readyState", {
get: function () {
return this._readyState;
},
enumerable: true,
configurable: true
});
Object.defineProperty(XMLHttpRequest.prototype, "responseType", {
get: function () {
return this._responseType;
},
set: function (value) {
if (value === XMLHttpRequestResponseType.empty || value in XMLHttpRequestResponseType) {
this._responseType = value;
}
else {
throw new Error("Response type of '" + value + "' not supported.");
}
},
enumerable: true,
configurable: true
});
XMLHttpRequest.prototype._setReadyState = function (value, error) {
if (this._readyState !== value) {
this._readyState = value;
if (types.isFunction(this.onreadystatechange)) {
this.onreadystatechange();
}
}
if (this._readyState === this.DONE) {
if (this._errorFlag) {
if (types.isFunction(this.onerror)) {
this.onerror(error);
}
this.emitEvent('error', error);
}
else {
if (types.isFunction(this.onload)) {
this.onload();
}
this.emitEvent('load');
}
}
};
Object.defineProperty(XMLHttpRequest.prototype, "responseText", {
get: function () {
if (types.isFunction(this._responseTextReader)) {
return this._responseTextReader();
}
return "";
},
enumerable: true,
configurable: true
});
Object.defineProperty(XMLHttpRequest.prototype, "response", {
get: function () {
return this._response;
},
enumerable: true,
configurable: true
});
Object.defineProperty(XMLHttpRequest.prototype, "status", {
get: function () {
return this._status;
},
enumerable: true,
configurable: true
});
Object.defineProperty(XMLHttpRequest.prototype, "statusText", {
get: function () {
if (this._readyState === this.UNSENT || this._readyState === this.OPENED || this._errorFlag) {
return "";
}
return statuses[this._status];
},
enumerable: true,
configurable: true
});
return XMLHttpRequest;
}());
exports.XMLHttpRequest = XMLHttpRequest;
var statuses = {
100: "Continue",
101: "Switching Protocols",
200: "OK",
201: "Created",
202: "Accepted",
203: "Non - Authoritative Information",
204: "No Content",
205: "Reset Content",
206: "Partial Content",
300: "Multiple Choices",
301: "Moved Permanently",
302: "Found",
303: "See Other",
304: "Not Modified",
305: "Use Proxy",
307: "Temporary Redirect",
400: "Bad Request",
401: "Unauthorized",
402: "Payment Required",
403: "Forbidden",
404: "Not Found",
405: "Method Not Allowed",
406: "Not Acceptable",
407: "Proxy Authentication Required",
408: "Request Timeout",
409: "Conflict",
410: "Gone",
411: "Length Required",
412: "Precondition Failed",
413: "Request Entity Too Large",
414: "Request - URI Too Long",
415: "Unsupported Media Type",
416: "Requested Range Not Satisfiable",
417: "Expectation Failed",
500: "Internal Server Error",
501: "Not Implemented",
502: "Bad Gateway",
503: "Service Unavailable",
504: "Gateway Timeout",
505: "HTTP Version Not Supported"
};
var FormData = (function () {
function FormData() {
this._data = new Map();
}
FormData.prototype.append = function (name, value) {
this._data.set(name, value);
};
FormData.prototype.toString = function () {
var arr = new Array();
this._data.forEach(function (value, name, map) {
arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(value));
});
return arr.join("&");
};
return FormData;
}());
exports.FormData = FormData;