Ohm-Management - Projektarbeit B-ME
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

AjaxObservable.js 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. "use strict";
  2. var __extends = (this && this.__extends) || (function () {
  3. var extendStatics = function (d, b) {
  4. extendStatics = Object.setPrototypeOf ||
  5. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  6. function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
  7. return extendStatics(d, b);
  8. }
  9. return function (d, b) {
  10. extendStatics(d, b);
  11. function __() { this.constructor = d; }
  12. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  13. };
  14. })();
  15. Object.defineProperty(exports, "__esModule", { value: true });
  16. var root_1 = require("../../util/root");
  17. var Observable_1 = require("../../Observable");
  18. var Subscriber_1 = require("../../Subscriber");
  19. var map_1 = require("../../operators/map");
  20. function getCORSRequest() {
  21. if (root_1.root.XMLHttpRequest) {
  22. return new root_1.root.XMLHttpRequest();
  23. }
  24. else if (!!root_1.root.XDomainRequest) {
  25. return new root_1.root.XDomainRequest();
  26. }
  27. else {
  28. throw new Error('CORS is not supported by your browser');
  29. }
  30. }
  31. function getXMLHttpRequest() {
  32. if (root_1.root.XMLHttpRequest) {
  33. return new root_1.root.XMLHttpRequest();
  34. }
  35. else {
  36. var progId = void 0;
  37. try {
  38. var progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
  39. for (var i = 0; i < 3; i++) {
  40. try {
  41. progId = progIds[i];
  42. if (new root_1.root.ActiveXObject(progId)) {
  43. break;
  44. }
  45. }
  46. catch (e) {
  47. }
  48. }
  49. return new root_1.root.ActiveXObject(progId);
  50. }
  51. catch (e) {
  52. throw new Error('XMLHttpRequest is not supported by your browser');
  53. }
  54. }
  55. }
  56. function ajaxGet(url, headers) {
  57. if (headers === void 0) { headers = null; }
  58. return new AjaxObservable({ method: 'GET', url: url, headers: headers });
  59. }
  60. exports.ajaxGet = ajaxGet;
  61. function ajaxPost(url, body, headers) {
  62. return new AjaxObservable({ method: 'POST', url: url, body: body, headers: headers });
  63. }
  64. exports.ajaxPost = ajaxPost;
  65. function ajaxDelete(url, headers) {
  66. return new AjaxObservable({ method: 'DELETE', url: url, headers: headers });
  67. }
  68. exports.ajaxDelete = ajaxDelete;
  69. function ajaxPut(url, body, headers) {
  70. return new AjaxObservable({ method: 'PUT', url: url, body: body, headers: headers });
  71. }
  72. exports.ajaxPut = ajaxPut;
  73. function ajaxPatch(url, body, headers) {
  74. return new AjaxObservable({ method: 'PATCH', url: url, body: body, headers: headers });
  75. }
  76. exports.ajaxPatch = ajaxPatch;
  77. var mapResponse = map_1.map(function (x, index) { return x.response; });
  78. function ajaxGetJSON(url, headers) {
  79. return mapResponse(new AjaxObservable({
  80. method: 'GET',
  81. url: url,
  82. responseType: 'json',
  83. headers: headers
  84. }));
  85. }
  86. exports.ajaxGetJSON = ajaxGetJSON;
  87. var AjaxObservable = (function (_super) {
  88. __extends(AjaxObservable, _super);
  89. function AjaxObservable(urlOrRequest) {
  90. var _this = _super.call(this) || this;
  91. var request = {
  92. async: true,
  93. createXHR: function () {
  94. return this.crossDomain ? getCORSRequest() : getXMLHttpRequest();
  95. },
  96. crossDomain: true,
  97. withCredentials: false,
  98. headers: {},
  99. method: 'GET',
  100. responseType: 'json',
  101. timeout: 0
  102. };
  103. if (typeof urlOrRequest === 'string') {
  104. request.url = urlOrRequest;
  105. }
  106. else {
  107. for (var prop in urlOrRequest) {
  108. if (urlOrRequest.hasOwnProperty(prop)) {
  109. request[prop] = urlOrRequest[prop];
  110. }
  111. }
  112. }
  113. _this.request = request;
  114. return _this;
  115. }
  116. AjaxObservable.prototype._subscribe = function (subscriber) {
  117. return new AjaxSubscriber(subscriber, this.request);
  118. };
  119. AjaxObservable.create = (function () {
  120. var create = function (urlOrRequest) {
  121. return new AjaxObservable(urlOrRequest);
  122. };
  123. create.get = ajaxGet;
  124. create.post = ajaxPost;
  125. create.delete = ajaxDelete;
  126. create.put = ajaxPut;
  127. create.patch = ajaxPatch;
  128. create.getJSON = ajaxGetJSON;
  129. return create;
  130. })();
  131. return AjaxObservable;
  132. }(Observable_1.Observable));
  133. exports.AjaxObservable = AjaxObservable;
  134. var AjaxSubscriber = (function (_super) {
  135. __extends(AjaxSubscriber, _super);
  136. function AjaxSubscriber(destination, request) {
  137. var _this = _super.call(this, destination) || this;
  138. _this.request = request;
  139. _this.done = false;
  140. var headers = request.headers = request.headers || {};
  141. if (!request.crossDomain && !_this.getHeader(headers, 'X-Requested-With')) {
  142. headers['X-Requested-With'] = 'XMLHttpRequest';
  143. }
  144. var contentTypeHeader = _this.getHeader(headers, 'Content-Type');
  145. if (!contentTypeHeader && !(root_1.root.FormData && request.body instanceof root_1.root.FormData) && typeof request.body !== 'undefined') {
  146. headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
  147. }
  148. request.body = _this.serializeBody(request.body, _this.getHeader(request.headers, 'Content-Type'));
  149. _this.send();
  150. return _this;
  151. }
  152. AjaxSubscriber.prototype.next = function (e) {
  153. this.done = true;
  154. var _a = this, xhr = _a.xhr, request = _a.request, destination = _a.destination;
  155. var result;
  156. try {
  157. result = new AjaxResponse(e, xhr, request);
  158. }
  159. catch (err) {
  160. return destination.error(err);
  161. }
  162. destination.next(result);
  163. };
  164. AjaxSubscriber.prototype.send = function () {
  165. var _a = this, request = _a.request, _b = _a.request, user = _b.user, method = _b.method, url = _b.url, async = _b.async, password = _b.password, headers = _b.headers, body = _b.body;
  166. try {
  167. var xhr = this.xhr = request.createXHR();
  168. this.setupEvents(xhr, request);
  169. if (user) {
  170. xhr.open(method, url, async, user, password);
  171. }
  172. else {
  173. xhr.open(method, url, async);
  174. }
  175. if (async) {
  176. xhr.timeout = request.timeout;
  177. xhr.responseType = request.responseType;
  178. }
  179. if ('withCredentials' in xhr) {
  180. xhr.withCredentials = !!request.withCredentials;
  181. }
  182. this.setHeaders(xhr, headers);
  183. if (body) {
  184. xhr.send(body);
  185. }
  186. else {
  187. xhr.send();
  188. }
  189. }
  190. catch (err) {
  191. this.error(err);
  192. }
  193. };
  194. AjaxSubscriber.prototype.serializeBody = function (body, contentType) {
  195. if (!body || typeof body === 'string') {
  196. return body;
  197. }
  198. else if (root_1.root.FormData && body instanceof root_1.root.FormData) {
  199. return body;
  200. }
  201. if (contentType) {
  202. var splitIndex = contentType.indexOf(';');
  203. if (splitIndex !== -1) {
  204. contentType = contentType.substring(0, splitIndex);
  205. }
  206. }
  207. switch (contentType) {
  208. case 'application/x-www-form-urlencoded':
  209. return Object.keys(body).map(function (key) { return encodeURIComponent(key) + "=" + encodeURIComponent(body[key]); }).join('&');
  210. case 'application/json':
  211. return JSON.stringify(body);
  212. default:
  213. return body;
  214. }
  215. };
  216. AjaxSubscriber.prototype.setHeaders = function (xhr, headers) {
  217. for (var key in headers) {
  218. if (headers.hasOwnProperty(key)) {
  219. xhr.setRequestHeader(key, headers[key]);
  220. }
  221. }
  222. };
  223. AjaxSubscriber.prototype.getHeader = function (headers, headerName) {
  224. for (var key in headers) {
  225. if (key.toLowerCase() === headerName.toLowerCase()) {
  226. return headers[key];
  227. }
  228. }
  229. return undefined;
  230. };
  231. AjaxSubscriber.prototype.setupEvents = function (xhr, request) {
  232. var progressSubscriber = request.progressSubscriber;
  233. function xhrTimeout(e) {
  234. var _a = xhrTimeout, subscriber = _a.subscriber, progressSubscriber = _a.progressSubscriber, request = _a.request;
  235. if (progressSubscriber) {
  236. progressSubscriber.error(e);
  237. }
  238. var error;
  239. try {
  240. error = new exports.AjaxTimeoutError(this, request);
  241. }
  242. catch (err) {
  243. error = err;
  244. }
  245. subscriber.error(error);
  246. }
  247. xhr.ontimeout = xhrTimeout;
  248. xhrTimeout.request = request;
  249. xhrTimeout.subscriber = this;
  250. xhrTimeout.progressSubscriber = progressSubscriber;
  251. if (xhr.upload && 'withCredentials' in xhr) {
  252. if (progressSubscriber) {
  253. var xhrProgress_1;
  254. xhrProgress_1 = function (e) {
  255. var progressSubscriber = xhrProgress_1.progressSubscriber;
  256. progressSubscriber.next(e);
  257. };
  258. if (root_1.root.XDomainRequest) {
  259. xhr.onprogress = xhrProgress_1;
  260. }
  261. else {
  262. xhr.upload.onprogress = xhrProgress_1;
  263. }
  264. xhrProgress_1.progressSubscriber = progressSubscriber;
  265. }
  266. var xhrError_1;
  267. xhrError_1 = function (e) {
  268. var _a = xhrError_1, progressSubscriber = _a.progressSubscriber, subscriber = _a.subscriber, request = _a.request;
  269. if (progressSubscriber) {
  270. progressSubscriber.error(e);
  271. }
  272. var error;
  273. try {
  274. error = new exports.AjaxError('ajax error', this, request);
  275. }
  276. catch (err) {
  277. error = err;
  278. }
  279. subscriber.error(error);
  280. };
  281. xhr.onerror = xhrError_1;
  282. xhrError_1.request = request;
  283. xhrError_1.subscriber = this;
  284. xhrError_1.progressSubscriber = progressSubscriber;
  285. }
  286. function xhrReadyStateChange(e) {
  287. return;
  288. }
  289. xhr.onreadystatechange = xhrReadyStateChange;
  290. xhrReadyStateChange.subscriber = this;
  291. xhrReadyStateChange.progressSubscriber = progressSubscriber;
  292. xhrReadyStateChange.request = request;
  293. function xhrLoad(e) {
  294. var _a = xhrLoad, subscriber = _a.subscriber, progressSubscriber = _a.progressSubscriber, request = _a.request;
  295. if (this.readyState === 4) {
  296. var status_1 = this.status === 1223 ? 204 : this.status;
  297. var response = (this.responseType === 'text' ? (this.response || this.responseText) : this.response);
  298. if (status_1 === 0) {
  299. status_1 = response ? 200 : 0;
  300. }
  301. if (status_1 < 400) {
  302. if (progressSubscriber) {
  303. progressSubscriber.complete();
  304. }
  305. subscriber.next(e);
  306. subscriber.complete();
  307. }
  308. else {
  309. if (progressSubscriber) {
  310. progressSubscriber.error(e);
  311. }
  312. var error = void 0;
  313. try {
  314. error = new exports.AjaxError('ajax error ' + status_1, this, request);
  315. }
  316. catch (err) {
  317. error = err;
  318. }
  319. subscriber.error(error);
  320. }
  321. }
  322. }
  323. xhr.onload = xhrLoad;
  324. xhrLoad.subscriber = this;
  325. xhrLoad.progressSubscriber = progressSubscriber;
  326. xhrLoad.request = request;
  327. };
  328. AjaxSubscriber.prototype.unsubscribe = function () {
  329. var _a = this, done = _a.done, xhr = _a.xhr;
  330. if (!done && xhr && xhr.readyState !== 4 && typeof xhr.abort === 'function') {
  331. xhr.abort();
  332. }
  333. _super.prototype.unsubscribe.call(this);
  334. };
  335. return AjaxSubscriber;
  336. }(Subscriber_1.Subscriber));
  337. exports.AjaxSubscriber = AjaxSubscriber;
  338. var AjaxResponse = (function () {
  339. function AjaxResponse(originalEvent, xhr, request) {
  340. this.originalEvent = originalEvent;
  341. this.xhr = xhr;
  342. this.request = request;
  343. this.status = xhr.status;
  344. this.responseType = xhr.responseType || request.responseType;
  345. this.response = parseXhrResponse(this.responseType, xhr);
  346. }
  347. return AjaxResponse;
  348. }());
  349. exports.AjaxResponse = AjaxResponse;
  350. function AjaxErrorImpl(message, xhr, request) {
  351. Error.call(this);
  352. this.message = message;
  353. this.name = 'AjaxError';
  354. this.xhr = xhr;
  355. this.request = request;
  356. this.status = xhr.status;
  357. this.responseType = xhr.responseType || request.responseType;
  358. this.response = parseXhrResponse(this.responseType, xhr);
  359. return this;
  360. }
  361. AjaxErrorImpl.prototype = Object.create(Error.prototype);
  362. exports.AjaxError = AjaxErrorImpl;
  363. function parseJson(xhr) {
  364. if ('response' in xhr) {
  365. return xhr.responseType ? xhr.response : JSON.parse(xhr.response || xhr.responseText || 'null');
  366. }
  367. else {
  368. return JSON.parse(xhr.responseText || 'null');
  369. }
  370. }
  371. function parseXhrResponse(responseType, xhr) {
  372. switch (responseType) {
  373. case 'json':
  374. return parseJson(xhr);
  375. case 'xml':
  376. return xhr.responseXML;
  377. case 'text':
  378. default:
  379. return ('response' in xhr) ? xhr.response : xhr.responseText;
  380. }
  381. }
  382. function AjaxTimeoutErrorImpl(xhr, request) {
  383. exports.AjaxError.call(this, 'ajax timeout', xhr, request);
  384. this.name = 'AjaxTimeoutError';
  385. return this;
  386. }
  387. exports.AjaxTimeoutError = AjaxTimeoutErrorImpl;
  388. //# sourceMappingURL=AjaxObservable.js.map