|
import { __assign } from "tslib"; |
|
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: url, headers: headers }); |
|
} |
|
function ajaxPost(url, body, headers) { |
|
return ajax({ method: 'POST', url: url, body: body, headers: headers }); |
|
} |
|
function ajaxDelete(url, headers) { |
|
return ajax({ method: 'DELETE', url: url, headers: headers }); |
|
} |
|
function ajaxPut(url, body, headers) { |
|
return ajax({ method: 'PUT', url: url, body: body, headers: headers }); |
|
} |
|
function ajaxPatch(url, body, headers) { |
|
return ajax({ method: 'PATCH', url: url, body: body, headers: headers }); |
|
} |
|
var mapResponse = map(function (x) { return x.response; }); |
|
function ajaxGetJSON(url, headers) { |
|
return mapResponse(ajax({ |
|
method: 'GET', |
|
url: url, |
|
headers: headers, |
|
})); |
|
} |
|
export var ajax = (function () { |
|
var create = function (urlOrConfig) { |
|
var 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; |
|
})(); |
|
var UPLOAD = 'upload'; |
|
var DOWNLOAD = 'download'; |
|
var LOADSTART = 'loadstart'; |
|
var PROGRESS = 'progress'; |
|
var LOAD = 'load'; |
|
export function fromAjax(init) { |
|
return new Observable(function (destination) { |
|
var _a, _b; |
|
var config = __assign({ async: true, crossDomain: false, withCredentials: false, method: 'GET', timeout: 0, responseType: 'json' }, init); |
|
var queryParams = config.queryParams, configuredBody = config.body, configuredHeaders = config.headers; |
|
var url = config.url; |
|
if (!url) { |
|
throw new TypeError('url is required'); |
|
} |
|
if (queryParams) { |
|
var searchParams_1; |
|
if (url.includes('?')) { |
|
var parts = url.split('?'); |
|
if (2 < parts.length) { |
|
throw new TypeError('invalid url'); |
|
} |
|
searchParams_1 = new URLSearchParams(parts[1]); |
|
new URLSearchParams(queryParams).forEach(function (value, key) { return searchParams_1.set(key, value); }); |
|
url = parts[0] + '?' + searchParams_1; |
|
} |
|
else { |
|
searchParams_1 = new URLSearchParams(queryParams); |
|
url = url + '?' + searchParams_1; |
|
} |
|
} |
|
var headers = {}; |
|
if (configuredHeaders) { |
|
for (var key in configuredHeaders) { |
|
if (configuredHeaders.hasOwnProperty(key)) { |
|
headers[key.toLowerCase()] = configuredHeaders[key]; |
|
} |
|
} |
|
} |
|
var crossDomain = config.crossDomain; |
|
if (!crossDomain && !('x-requested-with' in headers)) { |
|
headers['x-requested-with'] = 'XMLHttpRequest'; |
|
} |
|
var withCredentials = config.withCredentials, xsrfCookieName = config.xsrfCookieName, xsrfHeaderName = config.xsrfHeaderName; |
|
if ((withCredentials || !crossDomain) && xsrfCookieName && xsrfHeaderName) { |
|
var 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; |
|
} |
|
} |
|
var body = extractContentTypeAndMaybeSerializeBody(configuredBody, headers); |
|
var _request = __assign(__assign({}, config), { url: url, |
|
headers: headers, |
|
body: body }); |
|
var xhr; |
|
xhr = init.createXHR ? init.createXHR() : new XMLHttpRequest(); |
|
{ |
|
var progressSubscriber_1 = init.progressSubscriber, _c = init.includeDownloadProgress, includeDownloadProgress = _c === void 0 ? false : _c, _d = init.includeUploadProgress, includeUploadProgress = _d === void 0 ? false : _d; |
|
var addErrorEvent = function (type, errorFactory) { |
|
xhr.addEventListener(type, function () { |
|
var _a; |
|
var error = errorFactory(); |
|
(_a = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.error) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber_1, error); |
|
destination.error(error); |
|
}); |
|
}; |
|
addErrorEvent('timeout', function () { return new AjaxTimeoutError(xhr, _request); }); |
|
addErrorEvent('abort', function () { return new AjaxError('aborted', xhr, _request); }); |
|
var createResponse_1 = function (direction, event) { |
|
return new AjaxResponse(event, xhr, _request, direction + "_" + event.type); |
|
}; |
|
var addProgressEvent_1 = function (target, type, direction) { |
|
target.addEventListener(type, function (event) { |
|
destination.next(createResponse_1(direction, event)); |
|
}); |
|
}; |
|
if (includeUploadProgress) { |
|
[LOADSTART, PROGRESS, LOAD].forEach(function (type) { return addProgressEvent_1(xhr.upload, type, UPLOAD); }); |
|
} |
|
if (progressSubscriber_1) { |
|
[LOADSTART, PROGRESS].forEach(function (type) { return xhr.upload.addEventListener(type, function (e) { var _a; return (_a = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.next) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber_1, e); }); }); |
|
} |
|
if (includeDownloadProgress) { |
|
[LOADSTART, PROGRESS].forEach(function (type) { return addProgressEvent_1(xhr, type, DOWNLOAD); }); |
|
} |
|
var emitError_1 = function (status) { |
|
var msg = 'ajax error' + (status ? ' ' + status : ''); |
|
destination.error(new AjaxError(msg, xhr, _request)); |
|
}; |
|
xhr.addEventListener('error', function (e) { |
|
var _a; |
|
(_a = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.error) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber_1, e); |
|
emitError_1(); |
|
}); |
|
xhr.addEventListener(LOAD, function (event) { |
|
var _a, _b; |
|
var status = xhr.status; |
|
if (status < 400) { |
|
(_a = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.complete) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber_1); |
|
var response = void 0; |
|
try { |
|
response = createResponse_1(DOWNLOAD, event); |
|
} |
|
catch (err) { |
|
destination.error(err); |
|
return; |
|
} |
|
destination.next(response); |
|
destination.complete(); |
|
} |
|
else { |
|
(_b = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.error) === null || _b === void 0 ? void 0 : _b.call(progressSubscriber_1, event); |
|
emitError_1(status); |
|
} |
|
}); |
|
} |
|
var user = _request.user, method = _request.method, async = _request.async; |
|
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 (var key in headers) { |
|
if (headers.hasOwnProperty(key)) { |
|
xhr.setRequestHeader(key, headers[key]); |
|
} |
|
} |
|
if (body) { |
|
xhr.send(body); |
|
} |
|
else { |
|
xhr.send(); |
|
} |
|
return function () { |
|
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'); |
|
} |
|
var _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; |
|
} |
|
|