import { ReducerRegistry } from '../redux'; import { CONNECTION_DISCONNECTED, CONNECTION_ESTABLISHED, SET_DOMAIN } from './actionTypes'; /** * Initial Redux state. * * @type {{ * jitsiConnection: (JitsiConnection|null), * connectionOptions: Object * }} */ const INITIAL_STATE = { jitsiConnection: null, connectionOptions: null }; /** * Listen for actions that contain the connection object, so that * it can be stored for use by other action creators. */ ReducerRegistry.register('features/base/connection', (state = INITIAL_STATE, action) => { switch (action.type) { case CONNECTION_DISCONNECTED: if (state.jitsiConnection === action.connection) { return { ...state, jitsiConnection: null }; } return state; case CONNECTION_ESTABLISHED: return { ...state, jitsiConnection: action.connection }; case SET_DOMAIN: return { ...state, connectionOptions: { ...state.connectionOptions, ...buildConnectionOptions(action.domain) } }; default: return state; } }); /** * Builds connection options based on domain. * * @param {string} domain - Domain name. * @returns {Object} */ function buildConnectionOptions(domain) { // 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; } } if (!boshProtocol) { boshProtocol = 'http:'; } } // Default to the HTTPS scheme for the BOSH URL. if (!boshProtocol) { boshProtocol = 'https:'; } return { bosh: `${boshProtocol}//${domain}/http-bind`, hosts: { domain, focus: `focus.${domain}`, muc: `conference.${domain}` } }; }