jiti-meet/connection.js

161 lines
5.4 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
} from './react/features/base/lib-jitsi-meet';
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
/**
* 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;
}
var 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);
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
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);
connection.addEventListener(
2017-04-21 10:00:50 +00:00
ConnectionEvents.CONNECTION_FAILED,
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(
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(
ConnectionEvents.CONNECTION_FAILED,
2017-04-21 10:00:50 +00:00
handleConnectionFailed);
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);
}
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);
}
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>}
*/
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
= jitsiLocalStorage.getItem("xmpp_username_override");
2016-04-26 21:38:07 +00:00
let 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;
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')) {
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
});
}