2022-06-16 12:27:41 +00:00
|
|
|
import _ from 'lodash';
|
|
|
|
|
2022-09-14 07:54:56 +00:00
|
|
|
import { IState } from '../../app/types';
|
2022-06-16 12:27:41 +00:00
|
|
|
import {
|
|
|
|
appendURLParam,
|
|
|
|
getBackendSafeRoomName,
|
|
|
|
parseURIString
|
2022-09-14 07:54:56 +00:00
|
|
|
} from '../util/uri';
|
2022-06-16 12:27:41 +00:00
|
|
|
|
|
|
|
import logger from './logger';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Constructs options to be passed to the constructor of {@code JitsiConnection}
|
|
|
|
* based on the redux state.
|
|
|
|
*
|
|
|
|
* @param {Object} state - The redux state.
|
|
|
|
* @returns {Object} The options to be passed to the constructor of
|
|
|
|
* {@code JitsiConnection}.
|
|
|
|
*/
|
2022-09-14 07:54:56 +00:00
|
|
|
export function constructOptions(state: IState) {
|
2022-06-16 12:27:41 +00:00
|
|
|
// Deep clone the options to make sure we don't modify the object in the
|
|
|
|
// redux store.
|
|
|
|
const options = _.cloneDeep(state['features/base/config']);
|
|
|
|
|
|
|
|
let { bosh, websocket } = options;
|
|
|
|
|
|
|
|
// TESTING: Only enable WebSocket for some percentage of users.
|
|
|
|
if (websocket && navigator.product === 'ReactNative') {
|
|
|
|
if ((Math.random() * 100) >= (options?.testing?.mobileXmppWsThreshold ?? 0)) {
|
|
|
|
websocket = undefined;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Normalize the BOSH URL.
|
|
|
|
if (bosh && !websocket) {
|
|
|
|
const { locationURL } = state['features/base/connection'];
|
|
|
|
|
|
|
|
if (bosh.startsWith('//')) {
|
|
|
|
// By default our config.js doesn't include the protocol.
|
2022-09-14 07:54:56 +00:00
|
|
|
bosh = `${locationURL?.protocol}${bosh}`;
|
2022-06-16 12:27:41 +00:00
|
|
|
} else if (bosh.startsWith('/')) {
|
|
|
|
// Handle relative URLs, which won't work on mobile.
|
|
|
|
const {
|
|
|
|
protocol,
|
|
|
|
host,
|
|
|
|
contextRoot
|
2022-09-14 07:54:56 +00:00
|
|
|
} = parseURIString(locationURL?.href);
|
2022-06-16 12:27:41 +00:00
|
|
|
|
|
|
|
bosh = `${protocol}//${host}${contextRoot || '/'}${bosh.substr(1)}`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// WebSocket is preferred over BOSH.
|
|
|
|
const serviceUrl = websocket || bosh;
|
|
|
|
|
|
|
|
logger.log(`Using service URL ${serviceUrl}`);
|
|
|
|
|
|
|
|
// Append room to the URL's search.
|
|
|
|
const { room } = state['features/base/conference'];
|
|
|
|
|
|
|
|
if (serviceUrl && room) {
|
|
|
|
const roomName = getBackendSafeRoomName(room);
|
|
|
|
|
2022-09-14 07:54:56 +00:00
|
|
|
options.serviceUrl = appendURLParam(serviceUrl, 'room', roomName ?? '');
|
2022-06-16 12:27:41 +00:00
|
|
|
|
|
|
|
if (options.websocketKeepAliveUrl) {
|
2022-09-14 07:54:56 +00:00
|
|
|
options.websocketKeepAliveUrl = appendURLParam(options.websocketKeepAliveUrl, 'room', roomName ?? '');
|
2022-06-16 12:27:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return options;
|
|
|
|
}
|