// 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) {} };