2015-12-17 15:31:11 +00:00
|
|
|
/* global APP, JitsiMeetJS, config */
|
2016-11-11 15:00:54 +00:00
|
|
|
|
2016-07-11 11:44:49 +00:00
|
|
|
import AuthHandler from './modules/UI/authentication/AuthHandler';
|
2016-10-27 18:19:11 +00:00
|
|
|
import jitsiLocalStorage from './modules/util/JitsiLocalStorage';
|
2015-12-17 15:31:11 +00:00
|
|
|
|
2017-01-31 20:58:48 +00:00
|
|
|
import {
|
|
|
|
connectionEstablished,
|
|
|
|
connectionFailed
|
|
|
|
} from './react/features/base/connection';
|
2017-02-19 00:42:11 +00:00
|
|
|
import {
|
|
|
|
isFatalJitsiConnectionError
|
|
|
|
} from './react/features/base/lib-jitsi-meet';
|
2017-01-31 20:58:48 +00:00
|
|
|
|
2015-12-17 15:31:11 +00:00
|
|
|
const ConnectionEvents = JitsiMeetJS.events.connection;
|
|
|
|
const ConnectionErrors = JitsiMeetJS.errors.connection;
|
2017-04-21 10:00:50 +00:00
|
|
|
const logger = require("jitsi-meet-logger").getLogger(__filename);
|
2015-12-17 15:31:11 +00:00
|
|
|
|
2016-03-28 21:19:32 +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"
|
2016-03-28 21:19:32 +00:00
|
|
|
if(window.XMPPAttachInfo.status === "error") {
|
|
|
|
connection.connect({id, password});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var attachOptions = window.XMPPAttachInfo.data;
|
|
|
|
if(attachOptions) {
|
|
|
|
connection.attach(attachOptions);
|
2016-05-02 19:09:57 +00:00
|
|
|
delete window.XMPPAttachInfo.data;
|
2016-03-28 21:19:32 +00:00
|
|
|
} 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);
|
|
|
|
const { issuer, jwt } = APP.store.getState()['features/jwt'];
|
2016-02-09 23:44:41 +00:00
|
|
|
|
|
|
|
connectionConfig.bosh += '?room=' + roomName;
|
2017-04-21 10:00:50 +00:00
|
|
|
|
2016-03-28 21:19:32 +00:00
|
|
|
let 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(function (resolve, reject) {
|
|
|
|
connection.addEventListener(
|
2017-04-21 10:00:50 +00:00
|
|
|
ConnectionEvents.CONNECTION_ESTABLISHED,
|
|
|
|
handleConnectionEstablished);
|
2015-12-17 15:31:11 +00:00
|
|
|
connection.addEventListener(
|
2017-04-21 10:00:50 +00:00
|
|
|
ConnectionEvents.CONNECTION_FAILED,
|
|
|
|
handleConnectionFailed);
|
2017-01-31 20:58:48 +00:00
|
|
|
connection.addEventListener(
|
2017-04-21 10:00:50 +00:00
|
|
|
ConnectionEvents.CONNECTION_FAILED,
|
|
|
|
connectionFailedHandler);
|
2017-01-31 20:58:48 +00:00
|
|
|
|
2017-09-24 21:51:43 +00:00
|
|
|
function connectionFailedHandler(error, message, credentials) {
|
|
|
|
APP.store.dispatch(
|
|
|
|
connectionFailed(connection, error, message, credentials));
|
2017-01-31 20:58:48 +00:00
|
|
|
|
2017-02-19 00:42:11 +00:00
|
|
|
if (isFatalJitsiConnectionError(error)) {
|
2017-01-31 20:58:48 +00:00
|
|
|
connection.removeEventListener(
|
|
|
|
ConnectionEvents.CONNECTION_FAILED,
|
|
|
|
connectionFailedHandler);
|
|
|
|
}
|
|
|
|
}
|
2015-12-17 15:31:11 +00:00
|
|
|
|
|
|
|
function unsubscribe() {
|
|
|
|
connection.removeEventListener(
|
|
|
|
ConnectionEvents.CONNECTION_ESTABLISHED,
|
2017-04-21 10:00:50 +00:00
|
|
|
handleConnectionEstablished);
|
2015-12-17 15:31:11 +00:00
|
|
|
connection.removeEventListener(
|
2015-12-18 17:54:15 +00:00
|
|
|
ConnectionEvents.CONNECTION_FAILED,
|
2017-04-21 10:00:50 +00:00
|
|
|
handleConnectionFailed);
|
2015-12-17 15:31:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function handleConnectionEstablished() {
|
2017-01-31 20:58:48 +00:00
|
|
|
APP.store.dispatch(connectionEstablished(connection));
|
2015-12-17 15:31:11 +00:00
|
|
|
unsubscribe();
|
|
|
|
resolve(connection);
|
|
|
|
}
|
|
|
|
|
|
|
|
function handleConnectionFailed(err) {
|
|
|
|
unsubscribe();
|
2016-11-11 15:00:54 +00:00
|
|
|
logger.error("CONNECTION FAILED:", err);
|
2015-12-17 15:31:11 +00:00
|
|
|
reject(err);
|
|
|
|
}
|
|
|
|
|
2016-03-28 21:19:32 +00:00
|
|
|
checkForAttachParametersAndConnect(id, password, connection);
|
2015-12-18 17:54:15 +00:00
|
|
|
});
|
|
|
|
}
|
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>}
|
|
|
|
*/
|
2016-02-09 23:44:41 +00:00
|
|
|
export function openConnection({id, password, retry, roomName}) {
|
2016-04-26 21:38:07 +00:00
|
|
|
let usernameOverride
|
2016-10-27 18:19:11 +00:00
|
|
|
= jitsiLocalStorage.getItem("xmpp_username_override");
|
2016-04-26 21:38:07 +00:00
|
|
|
let passwordOverride
|
2016-10-27 18:19:11 +00:00
|
|
|
= 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;
|
2016-04-20 19:02:16 +00:00
|
|
|
}
|
2016-04-26 21:38:07 +00:00
|
|
|
if (passwordOverride && passwordOverride.length > 0) {
|
|
|
|
password = passwordOverride;
|
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) {
|
|
|
|
const { issuer, jwt } = APP.store.getState()['features/jwt'];
|
2015-12-17 15:31:11 +00:00
|
|
|
|
2017-04-21 10:00:50 +00:00
|
|
|
if (err === ConnectionErrors.PASSWORD_REQUIRED
|
|
|
|
&& (!jwt || issuer === 'anonymous')) {
|
2016-07-11 11:44:49 +00:00
|
|
|
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
|
|
|
});
|
|
|
|
}
|