|
|
|
// TODO: This file was created by bulk-decaffeinate.
|
|
|
|
// Sanity-check the conversion and remove this comment.
|
|
|
|
/*
|
|
|
|
* decaffeinate suggestions:
|
|
|
|
* DS102: Remove unnecessary code created because of implicit returns
|
|
|
|
* DS205: Consider reworking code to avoid use of IIFEs
|
|
|
|
* DS207: Consider shorter variations of null checks
|
|
|
|
* DS208: Avoid top-level this
|
|
|
|
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
|
|
|
|
*/
|
|
|
|
const MIME_TYPES = {
|
|
|
|
json: 'application/json',
|
|
|
|
html: 'text/html'
|
|
|
|
};
|
|
|
|
|
|
|
|
this.ajax = function(options) {
|
|
|
|
applyDefaults(options);
|
|
|
|
serializeData(options);
|
|
|
|
|
|
|
|
const xhr = new XMLHttpRequest();
|
|
|
|
xhr.open(options.type, options.url, options.async);
|
|
|
|
|
|
|
|
applyCallbacks(xhr, options);
|
|
|
|
applyHeaders(xhr, options);
|
|
|
|
|
|
|
|
xhr.send(options.data);
|
|
|
|
|
|
|
|
if (options.async) {
|
|
|
|
return {abort: abort.bind(undefined, xhr)};
|
|
|
|
} else {
|
|
|
|
return parseResponse(xhr, options);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
ajax.defaults = {
|
|
|
|
async: true,
|
|
|
|
dataType: 'json',
|
|
|
|
timeout: 30,
|
|
|
|
type: 'GET'
|
|
|
|
};
|
|
|
|
// contentType
|
|
|
|
// context
|
|
|
|
// data
|
|
|
|
// error
|
|
|
|
// headers
|
|
|
|
// progress
|
|
|
|
// success
|
|
|
|
// url
|
|
|
|
|
|
|
|
var applyDefaults = function(options) {
|
|
|
|
for (var key in ajax.defaults) {
|
|
|
|
if (options[key] == null) { options[key] = ajax.defaults[key]; }
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var serializeData = function(options) {
|
|
|
|
if (!options.data) { return; }
|
|
|
|
|
|
|
|
if (options.type === 'GET') {
|
|
|
|
options.url += '?' + serializeParams(options.data);
|
|
|
|
options.data = null;
|
|
|
|
} else {
|
|
|
|
options.data = serializeParams(options.data);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var serializeParams = params => ((() => {
|
|
|
|
const result = [];
|
|
|
|
for (var key in params) {
|
|
|
|
var value = params[key];
|
|
|
|
result.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
})()).join('&');
|
|
|
|
|
|
|
|
var applyCallbacks = function(xhr, options) {
|
|
|
|
if (!options.async) { return; }
|
|
|
|
|
|
|
|
xhr.timer = setTimeout(onTimeout.bind(undefined, xhr, options), options.timeout * 1000);
|
|
|
|
if (options.progress) { xhr.onprogress = options.progress; }
|
|
|
|
xhr.onreadystatechange = function() {
|
|
|
|
if (xhr.readyState === 4) {
|
|
|
|
clearTimeout(xhr.timer);
|
|
|
|
onComplete(xhr, options);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
var applyHeaders = function(xhr, options) {
|
|
|
|
if (!options.headers) { options.headers = {}; }
|
|
|
|
|
|
|
|
if (options.contentType) {
|
|
|
|
options.headers['Content-Type'] = options.contentType;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!options.headers['Content-Type'] && options.data && (options.type !== 'GET')) {
|
|
|
|
options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
|
|
}
|
|
|
|
|
|
|
|
if (options.dataType) {
|
|
|
|
options.headers['Accept'] = MIME_TYPES[options.dataType] || options.dataType;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (var key in options.headers) {
|
|
|
|
var value = options.headers[key];
|
|
|
|
xhr.setRequestHeader(key, value);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var onComplete = function(xhr, options) {
|
|
|
|
if (200 <= xhr.status && xhr.status < 300) {
|
|
|
|
let response;
|
|
|
|
if ((response = parseResponse(xhr, options)) != null) {
|
|
|
|
onSuccess(response, xhr, options);
|
|
|
|
} else {
|
|
|
|
onError('invalid', xhr, options);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
onError('error', xhr, options);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var onSuccess = function(response, xhr, options) {
|
|
|
|
if (options.success != null) {
|
|
|
|
options.success.call(options.context, response, xhr, options);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var onError = function(type, xhr, options) {
|
|
|
|
if (options.error != null) {
|
|
|
|
options.error.call(options.context, type, xhr, options);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var onTimeout = function(xhr, options) {
|
|
|
|
xhr.abort();
|
|
|
|
onError('timeout', xhr, options);
|
|
|
|
};
|
|
|
|
|
|
|
|
var abort = function(xhr) {
|
|
|
|
clearTimeout(xhr.timer);
|
|
|
|
xhr.onreadystatechange = null;
|
|
|
|
xhr.abort();
|
|
|
|
};
|
|
|
|
|
|
|
|
var parseResponse = function(xhr, options) {
|
|
|
|
if (options.dataType === 'json') {
|
|
|
|
return parseJSON(xhr.responseText);
|
|
|
|
} else {
|
|
|
|
return xhr.responseText;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var parseJSON = function(json) {
|
|
|
|
try { return JSON.parse(json); } catch (error) {}
|
|
|
|
};
|