diff --git a/bigbluebutton-html5/imports/api/audio/client/bridge/sip.js b/bigbluebutton-html5/imports/api/audio/client/bridge/sip.js index 2d06adf3c7..9b7ce9474d 100755 --- a/bigbluebutton-html5/imports/api/audio/client/bridge/sip.js +++ b/bigbluebutton-html5/imports/api/audio/client/bridge/sip.js @@ -27,7 +27,7 @@ const IPV4_FALLBACK_DOMAIN = Meteor.settings.public.app.ipv4FallbackDomain; const CALL_CONNECT_TIMEOUT = 20000; const ICE_NEGOTIATION_TIMEOUT = 20000; const AUDIO_SESSION_NUM_KEY = 'AudioSessionNumber'; -const USER_AGENT_RECONNECTION_ATTEMPTS = 3; +const USER_AGENT_RECONNECTION_ATTEMPTS = 7; const USER_AGENT_RECONNECTION_DELAY_MS = 5000; const USER_AGENT_CONNECTION_TIMEOUT_MS = 5000; const ICE_GATHERING_TIMEOUT = MEDIA.iceGatheringTimeout || 5000; @@ -310,15 +310,18 @@ class SIPSession { }); } - onBeforeUnload() { - this.userRequestedHangup = true; - if (this.userAgent) { + stopUserAgent() { + if (this.userAgent && (typeof this.userAgent.stop === 'function')) { return this.userAgent.stop(); } - return Promise.resolve(); } + onBeforeUnload() { + this.userRequestedHangup = true; + return this.stopUserAgent(); + } + createUserAgent(iceServers) { return new Promise((resolve, reject) => { if (this.userRequestedHangup === true) reject(); @@ -426,6 +429,9 @@ class SIPSession { error = 1002; bridgeError = 'Websocket failed to connect'; } + + this.stopUserAgent(); + this.callback({ status: this.baseCallStates.failed, error, @@ -463,6 +469,8 @@ class SIPSession { if (code === 1006) { + this.stopUserAgent(); + this.callback({ status: this.baseCallStates.failed, error: 1006, @@ -483,6 +491,8 @@ class SIPSession { resolve(); }).catch(() => { + this.stopUserAgent(); + logger.info({ logCode: 'sip_js_session_ua_disconnected', extraInfo: { @@ -521,6 +531,13 @@ class SIPSession { this._reconnecting = true; + logger.info({ + logCode: 'sip_js_session_ua_reconnection_attempt', + extraInfo: { + callerIdName: this.user.callerIdName, + }, + }, `User agent reconnection attempt ${attempts}`); + setTimeout(() => { this.userAgent.reconnect().then(() => { this._reconnecting = false;