jiti-meet/connection.js

184 lines
5.7 KiB
JavaScript
Raw Normal View History

2015-12-17 15:31:11 +00:00
/* global APP, JitsiMeetJS, config */
2016-11-11 15:00:54 +00:00
import AuthHandler from './modules/UI/authentication/AuthHandler';
import jitsiLocalStorage from './modules/util/JitsiLocalStorage';
2015-12-17 15:31:11 +00:00
import {
connectionEstablished,
connectionFailed
} from './react/features/base/connection';
2017-02-19 00:42:11 +00:00
import {
isFatalJitsiConnectionError,
JitsiConnectionErrors,
JitsiConnectionEvents
2017-02-19 00:42:11 +00:00
} from './react/features/base/lib-jitsi-meet';
const logger = require('jitsi-meet-logger').getLogger(__filename);
2015-12-17 15:31:11 +00:00
/**
* Checks if we have data to use attach instead of connect. If we have the data
* executes attach otherwise check if we have to wait for the data. If we have
* to wait for the attach data we are setting handler to APP.connect.handler
* which is going to be called when the attach data is received otherwise
* executes connect.
*
* @param {string} [id] user id
* @param {string} [password] password
* @param {string} [roomName] the name of the conference.
*/
function checkForAttachParametersAndConnect(id, password, connection) {
if (window.XMPPAttachInfo) {
APP.connect.status = 'connecting';
2016-03-28 22:42:20 +00:00
// When connection optimization is not deployed or enabled the default
// value will be window.XMPPAttachInfo.status = "error"
// If the connection optimization is deployed and enabled and there is
2016-04-20 19:02:16 +00:00
// a failure the value will be window.XMPPAttachInfo.status = "error"
if (window.XMPPAttachInfo.status === 'error') {
connection.connect({
id,
password
});
return;
}
const attachOptions = window.XMPPAttachInfo.data;
if (attachOptions) {
connection.attach(attachOptions);
delete window.XMPPAttachInfo.data;
} else {
connection.connect({
id,
password
});
}
} else {
APP.connect.status = 'ready';
APP.connect.handler
= checkForAttachParametersAndConnect.bind(
null,
id, password, connection);
}
}
2016-01-15 14:59:35 +00:00
/**
* Try to open connection using provided credentials.
* @param {string} [id]
* @param {string} [password]
2016-02-09 23:44:41 +00:00
* @param {string} [roomName]
2016-01-15 14:59:35 +00:00
* @returns {Promise<JitsiConnection>} connection if
* everything is ok, else error.
*/
2016-02-09 23:44:41 +00:00
function connect(id, password, roomName) {
2017-04-21 10:00:50 +00:00
const connectionConfig = Object.assign({}, config);
2017-10-05 22:54:13 +00:00
const { issuer, jwt } = APP.store.getState()['features/base/jwt'];
2016-02-09 23:44:41 +00:00
connectionConfig.bosh += `?room=${roomName}`;
2017-04-21 10:00:50 +00:00
const connection
2017-04-21 10:00:50 +00:00
= new JitsiMeetJS.JitsiConnection(
null,
jwt && issuer && issuer !== 'anonymous' ? jwt : undefined,
connectionConfig);
2015-12-17 15:31:11 +00:00
return new Promise((resolve, reject) => {
2015-12-17 15:31:11 +00:00
connection.addEventListener(
JitsiConnectionEvents.CONNECTION_ESTABLISHED,
2017-04-21 10:00:50 +00:00
handleConnectionEstablished);
2015-12-17 15:31:11 +00:00
connection.addEventListener(
JitsiConnectionEvents.CONNECTION_FAILED,
2017-04-21 10:00:50 +00:00
handleConnectionFailed);
connection.addEventListener(
JitsiConnectionEvents.CONNECTION_FAILED,
2017-04-21 10:00:50 +00:00
connectionFailedHandler);
/**
*
*/
function connectionFailedHandler(error, message, credentials) {
APP.store.dispatch(
connectionFailed(connection, error, message, credentials));
2017-02-19 00:42:11 +00:00
if (isFatalJitsiConnectionError(error)) {
connection.removeEventListener(
JitsiConnectionEvents.CONNECTION_FAILED,
connectionFailedHandler);
}
}
2015-12-17 15:31:11 +00:00
/**
*
*/
2015-12-17 15:31:11 +00:00
function unsubscribe() {
connection.removeEventListener(
JitsiConnectionEvents.CONNECTION_ESTABLISHED,
2017-04-21 10:00:50 +00:00
handleConnectionEstablished);
2015-12-17 15:31:11 +00:00
connection.removeEventListener(
JitsiConnectionEvents.CONNECTION_FAILED,
2017-04-21 10:00:50 +00:00
handleConnectionFailed);
2015-12-17 15:31:11 +00:00
}
/**
*
*/
2015-12-17 15:31:11 +00:00
function handleConnectionEstablished() {
APP.store.dispatch(connectionEstablished(connection));
2015-12-17 15:31:11 +00:00
unsubscribe();
resolve(connection);
}
/**
*
*/
2015-12-17 15:31:11 +00:00
function handleConnectionFailed(err) {
unsubscribe();
logger.error('CONNECTION FAILED:', err);
2015-12-17 15:31:11 +00:00
reject(err);
}
checkForAttachParametersAndConnect(id, password, connection);
});
}
2015-12-17 15:31:11 +00:00
2016-01-15 14:59:35 +00:00
/**
* Open JitsiConnection using provided credentials.
* If retry option is true it will show auth dialog on PASSWORD_REQUIRED error.
*
* @param {object} options
* @param {string} [options.id]
* @param {string} [options.password]
2016-02-09 23:44:41 +00:00
* @param {string} [options.roomName]
2016-01-15 14:59:35 +00:00
* @param {boolean} [retry] if we should show auth dialog
* on PASSWORD_REQUIRED error.
*
* @returns {Promise<JitsiConnection>}
*/
export function openConnection({ id, password, retry, roomName }) {
const usernameOverride
= jitsiLocalStorage.getItem('xmpp_username_override');
const passwordOverride
= jitsiLocalStorage.getItem('xmpp_password_override');
2016-04-20 19:02:16 +00:00
2016-04-26 21:38:07 +00:00
if (usernameOverride && usernameOverride.length > 0) {
id = usernameOverride; // eslint-disable-line no-param-reassign
2016-04-20 19:02:16 +00:00
}
2016-04-26 21:38:07 +00:00
if (passwordOverride && passwordOverride.length > 0) {
password = passwordOverride; // eslint-disable-line no-param-reassign
2016-04-20 19:02:16 +00:00
}
2017-04-21 10:00:50 +00:00
return connect(id, password, roomName).catch(err => {
if (retry) {
2017-10-05 22:54:13 +00:00
const { issuer, jwt } = APP.store.getState()['features/base/jwt'];
2015-12-17 15:31:11 +00:00
if (err === JitsiConnectionErrors.PASSWORD_REQUIRED
2017-04-21 10:00:50 +00:00
&& (!jwt || issuer === 'anonymous')) {
return AuthHandler.requestAuth(roomName, connect);
2015-12-17 15:31:11 +00:00
}
}
2017-04-21 10:00:50 +00:00
throw err;
2015-12-17 15:31:11 +00:00
});
}