UNPKG

@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
"use strict"; 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;