| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 | /**
 * Loads a script from a specific source. React Native cannot load a JS
 * file/resource/URL via a <script> HTML element, so the implementation
 * fetches the specified src as plain text (e.g. via XMLHttpRequest) and then
 * evaluates the fetched string as JavaScript code (i.e. via the {@link eval}
 * function).
 *
 * @param {string} src - The source from the which the script is to be
 * (down)loaded. Only absolute URLs are supported.
 * @param {Object} options - Additional options.
 * @param {boolean} options.async=true - True to asynchronously load the script
 * or false to synchronously load the script.
 * @returns {void}
 */
export function loadScript(
    src,
    options = {
        async: true
    }) {
    return new Promise((resolve, reject) => {
        // XXX We are using XMLHttpRequest instead of Fetch API only in order
        // to be able to do 'sync' requests. If this not needed, this can be
        // replaced with much simpler and readable fetch().
        const xhr = new XMLHttpRequest();
        xhr.open('GET', src, options.async);
        xhr.responseType = 'text';
        xhr.onload = () => {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    try {
                        // eslint-disable-next-line no-eval
                        eval.call(window, xhr.responseText);
                        resolve();
                    } catch (e) {
                        reject(e);
                    }
                } else {
                    reject(xhr.statusText);
                }
            }
        };
        xhr.onerror = () => reject(xhr.statusText);
        xhr.send();
    });
}
 |