diff --git a/conference.js b/conference.js index 620287dc5..f60979291 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; @@ -515,6 +516,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(); @@ -551,6 +553,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.