@financial-times/o-fetch-jsonp
Version:
**o-fetch-jsonp is deprecated. Use the `fetch` [polyfill](http://polyfill.io/) and [Cross-Origin Resource Sharing](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) instead.**
58 lines (50 loc) • 1.67 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.jsonpFetch = exports.default = void 0;
var jsonpCallbackNames = [];
var generateCallbackName = () => {
var base = 'jsonpCallback';
var callbackName = "".concat(base, "_").concat(jsonpCallbackNames.length + 1);
jsonpCallbackNames.push(callbackName);
return callbackName;
};
var crossDomainFetch = 'withCredentials' in new XMLHttpRequest() ? fetch : jsonpFetch;
var jsonpFetch = (url, opts) => {
var defaultOpts = {
timeout: 2000
};
opts = opts || {};
Object.keys(defaultOpts).forEach(defaultOptsKey => {
if (!opts.hasOwnProperty(defaultOptsKey)) {
opts[defaultOptsKey] = defaultOpts[defaultOptsKey];
}
});
return new Promise((resolve, reject) => {
var callbackName = generateCallbackName();
var timeout;
window.FT = window.FT || {};
window.FT[callbackName] = response => {
var status = response.status ? response.status : 200;
resolve({
ok: Math.floor(status / 100) === 2,
status: status,
json: () => Promise.resolve(response.body || response)
});
if (timeout) {
clearTimeout(timeout);
}
};
var scriptTag = document.createElement('script');
scriptTag.defer = true;
scriptTag.src = "".concat(url).concat(url.indexOf('?') > -1 ? '&' : '?', "callback=FT.").concat(callbackName);
document.body.appendChild(scriptTag);
timeout = setTimeout(() => {
reject(new Error("JSONP request to ".concat(url, " timed out")));
}, opts.timeout);
});
};
exports.jsonpFetch = jsonpFetch;
var _default = crossDomainFetch;
exports.default = _default;