| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 | /* @flow */
import { ReducerRegistry, setStateProperty } from '../redux';
import {
    CONNECTION_DISCONNECTED,
    CONNECTION_ESTABLISHED,
    SET_DOMAIN
} from './actionTypes';
/**
 * Reduces the Redux actions of the feature base/connection.
 */
ReducerRegistry.register(
    'features/base/connection',
    (state: Object = {}, action: Object) => {
        switch (action.type) {
        case CONNECTION_DISCONNECTED:
            return _connectionDisconnected(state, action);
        case CONNECTION_ESTABLISHED:
            return _connectionEstablished(state, action);
        case SET_DOMAIN:
            return _setDomain(state, action);
        }
        return state;
    });
/**
 * Reduces a specific Redux action CONNECTION_DISCONNECTED of the feature
 * base/connection.
 *
 * @param {Object} state - The Redux state of the feature base/connection.
 * @param {Action} action - The Redux action CONNECTION_DISCONNECTED to reduce.
 * @private
 * @returns {Object} The new state of the feature base/connection after the
 * reduction of the specified action.
 */
function _connectionDisconnected(state: Object, action: Object) {
    if (state.connection === action.connection) {
        return setStateProperty(state, 'connection', undefined);
    }
    return state;
}
/**
 * Reduces a specific Redux action CONNECTION_ESTABLISHED of the feature
 * base/connection.
 *
 * @param {Object} state - The Redux state of the feature base/connection.
 * @param {Action} action - The Redux action CONNECTION_ESTABLISHED to reduce.
 * @private
 * @returns {Object} The new state of the feature base/connection after the
 * reduction of the specified action.
 */
function _connectionEstablished(state: Object, action: Object) {
    return setStateProperty(state, 'connection', action.connection);
}
/**
 * Constructs options to be passed to the constructor of JitsiConnection based
 * on a specific domain.
 *
 * @param {string} domain - The domain with which the returned options are to be
 * populated.
 * @private
 * @returns {Object}
 */
function _constructConnectionOptions(domain: string) {
    // FIXME The HTTPS scheme for the BOSH URL works with meet.jit.si on both
    // mobile & Web. It also works with beta.meet.jit.si on Web. Unfortunately,
    // it doesn't work with beta.meet.jit.si on mobile. Temporarily, use the
    // HTTP scheme for the BOSH URL with beta.meet.jit.si on mobile.
    let boshProtocol;
    if (domain === 'beta.meet.jit.si') {
        if (typeof window === 'object') {
            const windowLocation = window.location;
            if (windowLocation) {
                // React Native doesn't have a window.location at the time of
                // this writing, let alone a window.location.protocol.
                boshProtocol = windowLocation.protocol;
            }
        }
        boshProtocol || (boshProtocol = 'http:');
    }
    // Default to the HTTPS scheme for the BOSH URL.
    boshProtocol || (boshProtocol = 'https:');
    return {
        bosh: `${String(boshProtocol)}//${domain}/http-bind`,
        hosts: {
            domain,
            focus: `focus.${domain}`,
            muc: `conference.${domain}`
        }
    };
}
/**
 * Reduces a specific Redux action SET_DOMAIN of the feature base/connection.
 *
 * @param {Object} state - The Redux state of the feature base/connection.
 * @param {Action} action - The Redux action SET_DOMAIN to reduce.
 * @private
 * @returns {Object} The new state of the feature base/connection after the
 * reduction of the specified action.
 */
function _setDomain(state: Object, action: Object) {
    return {
        ...state,
        connectionOptions: {
            ...state.connectionOptions,
            ..._constructConnectionOptions(action.domain)
        }
    };
}
 |