123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- import { map } from '../operators/map';
- import { Observable } from '../Observable';
- import { AjaxResponse } from './AjaxResponse';
- import { AjaxTimeoutError, AjaxError } from './errors';
- function ajaxGet(url, headers) {
- return ajax({ method: 'GET', url, headers });
- }
- function ajaxPost(url, body, headers) {
- return ajax({ method: 'POST', url, body, headers });
- }
- function ajaxDelete(url, headers) {
- return ajax({ method: 'DELETE', url, headers });
- }
- function ajaxPut(url, body, headers) {
- return ajax({ method: 'PUT', url, body, headers });
- }
- function ajaxPatch(url, body, headers) {
- return ajax({ method: 'PATCH', url, body, headers });
- }
- const mapResponse = map((x) => x.response);
- function ajaxGetJSON(url, headers) {
- return mapResponse(ajax({
- method: 'GET',
- url,
- headers,
- }));
- }
- export const ajax = (() => {
- const create = (urlOrConfig) => {
- const config = typeof urlOrConfig === 'string'
- ? {
- url: urlOrConfig,
- }
- : urlOrConfig;
- return fromAjax(config);
- };
- create.get = ajaxGet;
- create.post = ajaxPost;
- create.delete = ajaxDelete;
- create.put = ajaxPut;
- create.patch = ajaxPatch;
- create.getJSON = ajaxGetJSON;
- return create;
- })();
- const UPLOAD = 'upload';
- const DOWNLOAD = 'download';
- const LOADSTART = 'loadstart';
- const PROGRESS = 'progress';
- const LOAD = 'load';
- export function fromAjax(init) {
- return new Observable((destination) => {
- var _a, _b;
- const config = Object.assign({ async: true, crossDomain: false, withCredentials: false, method: 'GET', timeout: 0, responseType: 'json' }, init);
- const { queryParams, body: configuredBody, headers: configuredHeaders } = config;
- let url = config.url;
- if (!url) {
- throw new TypeError('url is required');
- }
- if (queryParams) {
- let searchParams;
- if (url.includes('?')) {
- const parts = url.split('?');
- if (2 < parts.length) {
- throw new TypeError('invalid url');
- }
- searchParams = new URLSearchParams(parts[1]);
- new URLSearchParams(queryParams).forEach((value, key) => searchParams.set(key, value));
- url = parts[0] + '?' + searchParams;
- }
- else {
- searchParams = new URLSearchParams(queryParams);
- url = url + '?' + searchParams;
- }
- }
- const headers = {};
- if (configuredHeaders) {
- for (const key in configuredHeaders) {
- if (configuredHeaders.hasOwnProperty(key)) {
- headers[key.toLowerCase()] = configuredHeaders[key];
- }
- }
- }
- const crossDomain = config.crossDomain;
- if (!crossDomain && !('x-requested-with' in headers)) {
- headers['x-requested-with'] = 'XMLHttpRequest';
- }
- const { withCredentials, xsrfCookieName, xsrfHeaderName } = config;
- if ((withCredentials || !crossDomain) && xsrfCookieName && xsrfHeaderName) {
- const xsrfCookie = (_b = (_a = document === null || document === void 0 ? void 0 : document.cookie.match(new RegExp(`(^|;\\s*)(${xsrfCookieName})=([^;]*)`))) === null || _a === void 0 ? void 0 : _a.pop()) !== null && _b !== void 0 ? _b : '';
- if (xsrfCookie) {
- headers[xsrfHeaderName] = xsrfCookie;
- }
- }
- const body = extractContentTypeAndMaybeSerializeBody(configuredBody, headers);
- const _request = Object.assign(Object.assign({}, config), { url,
- headers,
- body });
- let xhr;
- xhr = init.createXHR ? init.createXHR() : new XMLHttpRequest();
- {
- const { progressSubscriber, includeDownloadProgress = false, includeUploadProgress = false } = init;
- const addErrorEvent = (type, errorFactory) => {
- xhr.addEventListener(type, () => {
- var _a;
- const error = errorFactory();
- (_a = progressSubscriber === null || progressSubscriber === void 0 ? void 0 : progressSubscriber.error) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber, error);
- destination.error(error);
- });
- };
- addErrorEvent('timeout', () => new AjaxTimeoutError(xhr, _request));
- addErrorEvent('abort', () => new AjaxError('aborted', xhr, _request));
- const createResponse = (direction, event) => new AjaxResponse(event, xhr, _request, `${direction}_${event.type}`);
- const addProgressEvent = (target, type, direction) => {
- target.addEventListener(type, (event) => {
- destination.next(createResponse(direction, event));
- });
- };
- if (includeUploadProgress) {
- [LOADSTART, PROGRESS, LOAD].forEach((type) => addProgressEvent(xhr.upload, type, UPLOAD));
- }
- if (progressSubscriber) {
- [LOADSTART, PROGRESS].forEach((type) => xhr.upload.addEventListener(type, (e) => { var _a; return (_a = progressSubscriber === null || progressSubscriber === void 0 ? void 0 : progressSubscriber.next) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber, e); }));
- }
- if (includeDownloadProgress) {
- [LOADSTART, PROGRESS].forEach((type) => addProgressEvent(xhr, type, DOWNLOAD));
- }
- const emitError = (status) => {
- const msg = 'ajax error' + (status ? ' ' + status : '');
- destination.error(new AjaxError(msg, xhr, _request));
- };
- xhr.addEventListener('error', (e) => {
- var _a;
- (_a = progressSubscriber === null || progressSubscriber === void 0 ? void 0 : progressSubscriber.error) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber, e);
- emitError();
- });
- xhr.addEventListener(LOAD, (event) => {
- var _a, _b;
- const { status } = xhr;
- if (status < 400) {
- (_a = progressSubscriber === null || progressSubscriber === void 0 ? void 0 : progressSubscriber.complete) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber);
- let response;
- try {
- response = createResponse(DOWNLOAD, event);
- }
- catch (err) {
- destination.error(err);
- return;
- }
- destination.next(response);
- destination.complete();
- }
- else {
- (_b = progressSubscriber === null || progressSubscriber === void 0 ? void 0 : progressSubscriber.error) === null || _b === void 0 ? void 0 : _b.call(progressSubscriber, event);
- emitError(status);
- }
- });
- }
- const { user, method, async } = _request;
- if (user) {
- xhr.open(method, url, async, user, _request.password);
- }
- else {
- xhr.open(method, url, async);
- }
- if (async) {
- xhr.timeout = _request.timeout;
- xhr.responseType = _request.responseType;
- }
- if ('withCredentials' in xhr) {
- xhr.withCredentials = _request.withCredentials;
- }
- for (const key in headers) {
- if (headers.hasOwnProperty(key)) {
- xhr.setRequestHeader(key, headers[key]);
- }
- }
- if (body) {
- xhr.send(body);
- }
- else {
- xhr.send();
- }
- return () => {
- if (xhr && xhr.readyState !== 4) {
- xhr.abort();
- }
- };
- });
- }
- function extractContentTypeAndMaybeSerializeBody(body, headers) {
- var _a;
- if (!body ||
- typeof body === 'string' ||
- isFormData(body) ||
- isURLSearchParams(body) ||
- isArrayBuffer(body) ||
- isFile(body) ||
- isBlob(body) ||
- isReadableStream(body)) {
- return body;
- }
- if (isArrayBufferView(body)) {
- return body.buffer;
- }
- if (typeof body === 'object') {
- headers['content-type'] = (_a = headers['content-type']) !== null && _a !== void 0 ? _a : 'application/json;charset=utf-8';
- return JSON.stringify(body);
- }
- throw new TypeError('Unknown body type');
- }
- const _toString = Object.prototype.toString;
- function toStringCheck(obj, name) {
- return _toString.call(obj) === `[object ${name}]`;
- }
- function isArrayBuffer(body) {
- return toStringCheck(body, 'ArrayBuffer');
- }
- function isFile(body) {
- return toStringCheck(body, 'File');
- }
- function isBlob(body) {
- return toStringCheck(body, 'Blob');
- }
- function isArrayBufferView(body) {
- return typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(body);
- }
- function isFormData(body) {
- return typeof FormData !== 'undefined' && body instanceof FormData;
- }
- function isURLSearchParams(body) {
- return typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams;
- }
- function isReadableStream(body) {
- return typeof ReadableStream !== 'undefined' && body instanceof ReadableStream;
- }
- //# sourceMappingURL=ajax.js.map
|