jiti-meet/react/features/base/connection/reducer.js

129 lines
3.8 KiB
JavaScript

/* @flow */
import { assign, ReducerRegistry, set } from '../redux';
import {
CONNECTION_DISCONNECTED,
CONNECTION_ESTABLISHED,
SET_LOCATION_URL
} 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_LOCATION_URL:
return _setLocationURL(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,
{ connection }: { connection: Object }) {
if (state.connection === connection) {
return set(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,
{ connection }: { connection: Object }) {
return set(state, 'connection', connection);
}
/**
* Constructs options to be passed to the constructor of {@code JitsiConnection}
* based on a specific domain.
*
* @param {string} domain - The domain with which the returned options are to be
* populated.
* @private
* @returns {Object}
*/
function _constructOptions(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,
// Required by:
// - lib-jitsi-meet/modules/xmpp/xmpp.js
muc: `conference.${domain}`
}
};
}
/**
* Reduces a specific redux action {@link SET_LOCATION_URL} of the feature
* base/connection.
*
* @param {Object} state - The redux state of the feature base/connection.
* @param {Action} action - The redux action {@code SET_LOCATION_URL} to reduce.
* @private
* @returns {Object} The new state of the feature base/connection after the
* reduction of the specified action.
*/
function _setLocationURL(
state: Object,
{ locationURL }: { locationURL: ?URL }) {
return assign(state, {
locationURL,
options: locationURL ? _constructOptions(locationURL.host) : undefined
});
}