braintree-web
Version:
A suite of tools for integrating Braintree in the browser
115 lines (92 loc) • 2.43 kB
JavaScript
;
var head;
var uuid = require("@braintree/uuid");
var querystring = require("../../lib/querystring");
var timeouts = {};
function _removeScript(script) {
if (script && script.parentNode) {
script.parentNode.removeChild(script);
}
}
function _createScriptTag(url, callbackName) {
var script = document.createElement("script");
var done = false;
script.src = url;
script.async = true;
script.onerror = function () {
window[callbackName]({ message: "error", status: 500 });
};
script.onload = script.onreadystatechange = function () {
if (done) {
return;
}
if (
!this.readyState ||
this.readyState === "loaded" ||
this.readyState === "complete"
) {
done = true;
script.onload = script.onreadystatechange = null;
}
};
return script;
}
function _cleanupGlobal(callbackName) {
try {
delete window[callbackName];
} catch (_) {
window[callbackName] = null;
}
}
function _setupTimeout(timeout, callbackName) {
timeouts[callbackName] = setTimeout(function () {
timeouts[callbackName] = null;
window[callbackName]({
error: "timeout",
status: -1,
});
window[callbackName] = function () {
_cleanupGlobal(callbackName);
};
}, timeout);
}
function _setupGlobalCallback(script, callback, callbackName) {
window[callbackName] = function (response) {
var status = response.status || 500;
var err = null;
var data = null;
delete response.status;
if (status >= 400 || status < 200) {
err = response;
} else {
data = response;
}
_cleanupGlobal(callbackName);
_removeScript(script);
clearTimeout(timeouts[callbackName]);
callback(err, data, status);
};
}
function request(options, callback) {
var script;
var callbackName = "callback_json_" + uuid().replace(/-/g, "");
var url = options.url;
var attrs = options.data;
var method = options.method;
var timeout = options.timeout;
url = querystring.queryify(url, attrs);
url = querystring.queryify(url, {
_method: method,
callback: callbackName,
});
script = _createScriptTag(url, callbackName);
_setupGlobalCallback(script, callback, callbackName);
_setupTimeout(timeout, callbackName);
if (!head) {
head = document.getElementsByTagName("head")[0];
}
head.appendChild(script);
}
module.exports = {
request: request,
};