diff --git a/conference.js b/conference.js index 3d5c94f2b..d27ff4278 100644 --- a/conference.js +++ b/conference.js @@ -18,6 +18,7 @@ import {reportError} from './modules/util/helpers'; import UIUtil from './modules/UI/util/UIUtil'; +const ConnectionEvents = JitsiMeetJS.events.connection; const ConnectionErrors = JitsiMeetJS.errors.connection; const ConferenceEvents = JitsiMeetJS.events.conference; @@ -511,6 +512,7 @@ export default { }).then(([tracks, con]) => { console.log('initialized with %s local tracks', tracks.length); APP.connection = connection = con; + this._bindConnectionFailedHandler(con); this._createRoom(tracks); this.isDesktopSharingEnabled = JitsiMeetJS.isDesktopSharingEnabled(); @@ -547,6 +549,28 @@ export default { isLocalId (id) { return this.getMyUserId() === id; }, + /** + * Binds a handler that will handle the case when the connection is dropped + * in the middle of the conference. + * @param {JitsiConnection} connection the connection to which the handler + * will be bound to. + * @private + */ + _bindConnectionFailedHandler (connection) { + const handler = function (error, errMsg) { + if (ConnectionErrors.OTHER_ERROR === error) { + // - item-not-found + // - connection dropped(closed by Strophe unexpectedly + // possible due too many transport errors) + console.error("XMPP connection error: " + errMsg); + APP.UI.showPageReloadOverlay(); + connection.removeEventListener( + ConnectionEvents.CONNECTION_FAILED, handler); + } + }; + connection.addEventListener( + ConnectionEvents.CONNECTION_FAILED, handler); + }, /** * Simulates toolbar button click for audio mute. Used by shortcuts and API. * @param mute true for mute and false for unmute. diff --git a/modules/UI/UI.js b/modules/UI/UI.js index 74917a5ef..192a0bb00 100644 --- a/modules/UI/UI.js +++ b/modules/UI/UI.js @@ -21,6 +21,7 @@ import SettingsMenu from "./side_pannels/settings/SettingsMenu"; import Profile from "./side_pannels/profile/Profile"; import Settings from "./../settings/Settings"; import RingOverlay from "./ring_overlay/RingOverlay"; +import RandomUtil from "../util/RandomUtil"; import UIErrors from './UIErrors'; var EventEmitter = require("events"); @@ -1088,7 +1089,8 @@ UI.notifyFocusDisconnected = function (focus, retrySec) { * the page should be reloaded. */ UI.showPageReloadOverlay = function () { - PageReloadOverlay.show(15 /* will reload in 15 seconds */); + // Reload the page after 10 - 30 seconds + PageReloadOverlay.show(10 + RandomUtil.randomInt(0, 20)); }; /**