| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | /* @flow */
import { setConfigFromURLParams } from '../../base/config';
import { loadScript } from '../../base/util';
import JitsiMeetJS from './_';
declare var APP: Object;
const JitsiConnectionErrors = JitsiMeetJS.errors.connection;
/**
 * Creates a JitsiLocalTrack model from the given device id.
 *
 * @param {string} type - The media type of track being created. Expected values
 * are "video" or "audio".
 * @param {string} deviceId - The id of the target media source.
 * @returns {Promise<JitsiLocalTrack>}
 */
export function createLocalTrack(type: string, deviceId: string) {
    return (
        JitsiMeetJS.createLocalTracks({
            cameraDeviceId: deviceId,
            devices: [ type ],
            // eslint-disable-next-line camelcase
            firefox_fake_device:
                window.config && window.config.firefox_fake_device,
            micDeviceId: deviceId
        })
            .then(([ jitsiLocalTrack ]) => jitsiLocalTrack));
}
/**
 * Determines whether a specific JitsiConnectionErrors instance indicates a
 * fatal JitsiConnection error.
 *
 * FIXME Figure out the category of errors defined by the fucntion and describe
 * that category. I've currently named the category fatal because it appears to
 * be used in the cases of unrecoverable errors that necessitate a reload.
 *
 * @param {string} error - The JitsiConnectionErrors instance to
 * categorize/classify.
 * @returns {boolean} True if the specified JitsiConnectionErrors instance
 * indicates a fatal JitsiConnection error; otherwise, false.
 */
export function isFatalJitsiConnectionError(error: string) {
    return (
        error === JitsiConnectionErrors.CONNECTION_DROPPED_ERROR
            || error === JitsiConnectionErrors.OTHER_ERROR
            || error === JitsiConnectionErrors.SERVER_ERROR);
}
/**
 * Loads config.js from a specific remote server.
 *
 * @param {string} host - Host where config.js is hosted.
 * @param {string} path='config.js' - Relative pah to config.js file.
 * @returns {Promise<Object>}
 */
export function loadConfig(host: string, path: string = 'config.js') {
    let promise;
    if (typeof APP === 'undefined') {
        promise
            = loadScript(new URL(path, host).toString())
                .then(() => {
                    const { config } = window;
                    // We don't want to pollute the global scope.
                    window.config = undefined;
                    if (typeof config !== 'object') {
                        throw new Error('window.config is not an object');
                    }
                    return config;
                })
                .catch(err => {
                    console.error(`Failed to load ${path} from ${host}`, err);
                    throw err;
                });
    } else {
        // Return "the config.js file" from the global scope - that is how the
        // Web app on both the client and the server was implemented before the
        // React Native app was even conceived.
        promise = Promise.resolve(window.config);
    }
    // FIXME It's neither here nor there at the time of this writing where
    // config, interfaceConfig, and loggingConfig should be overwritten by URL
    // params.
    promise = promise.then(value => {
        setConfigFromURLParams();
        return value;
    });
    return promise;
}
 |