@webex/plugin-meetings 3.4.0-next.8 → 3.4.0-next.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/meetings/index.js +4 -2
- package/dist/meetings/index.js.map +1 -1
- package/dist/reachability/index.js +22 -17
- package/dist/reachability/index.js.map +1 -1
- package/dist/reconnection-manager/index.js +1 -1
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/types/meetings/index.d.ts +2 -1
- package/dist/types/reachability/index.d.ts +3 -1
- package/dist/webinar/index.js +1 -1
- package/package.json +3 -3
- package/src/meetings/index.ts +4 -3
- package/src/reachability/index.ts +7 -1
- package/src/reconnection-manager/index.ts +1 -1
- package/test/unit/spec/meetings/index.js +30 -3
- package/test/unit/spec/reachability/index.ts +52 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_triggerProxy","_constants","_constants2","_reconnection","_reconnectionNotStarted","_metrics","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","NeedsRetryError","_Error","_inherits2","_super","_classCallCheck2","_createClass2","_wrapNativeSuper2","Error","NeedsRejoinError","_Error2","_super2","_ref","_this","wasSharing","_ref$error","error","_defineProperty2","_assertThisInitialized2","ReconnectionManager","exports","meeting","iceState","disconnected","resolve","timer","undefined","timeoutDuration","config","reconnection","iceReconnectionTimeout","status","RECONNECTION","STATE","DEFAULT_STATUS","webex","maxRejoinAttempts","rejoinAttempts","autoRejoinEnabled","autoRejoin","reset","key","value","resetReconnectionTimer","clearTimeout","iceReconnected","LoggerProxy","logger","log","waitForIceReconnect","_this2","_promise","reject","setTimeout","concat","cleanUp","_stopLocalShareStream","_asyncToGenerator2","_regenerator","mark","_callee","reason","wrap","_callee$","_context","prev","next","unpublishStreams","mediaProperties","shareVideoStream","shareAudioStream","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_STOPPED_SHARING_LOCAL","stop","stopLocalShareStream","_x","isReconnectInProgress","IN_PROGRESS","canStartReconnection","enabled","info","_reconnect","_callee2","_this3","_ref2","_ref2$networkDisconne","networkDisconnect","_ref2$networkRetry","networkRetry","completionCallback","triggerEvent","_args2","_callee2$","_context2","length","id","event","payload","ReconnectionNotStartedError","MEETING_RECONNECTION_STARTING","internal","newMetrics","submitClientEvent","name","options","meetingId","meetings","startReachability","t0","executeReconnection","t1","reconnect","abrupt","message","errors","category","errorCode","fatal","shownToUser","rejoinMeeting","MEETING_RECONNECTION_SUCCESS","recoveredBy","t2","MEETING_RECONNECTION_FAILURE","ReconnectionError","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETING_RECONNECT_FAILURE","correlation_id","correlationId","locus_id","locusUrl","split","pop","stack","finish","_executeReconnection","_callee3","_ref3","_ref3$networkDisconne","media","_callee3$","_context3","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","SHARE_STOPPED_REASON","MEDIA_RECONNECTION","reconnectMercuryWebSocket","device","url","FAILURE","syncMeetings","keepOnlyLocusMeetings","getMeetingByType","_ID_","state","_LEFT_","type","_CALL_","reconnectMedia","sent","_x2","_rejoinMeeting","_callee4","_args4","_callee4$","_context4","join","rejoin","MEETING_REJOIN","MEETING_MAX_REJOIN_FAILURE","_reconnectMedia","_callee5","_turnServerResult$tur","turnServerResult","iceServers","_callee5$","_context5","roap","doTurnDiscovery","turnServerInfo","push","urls","username","credential","password","webrtcMediaConnection","isMultistream","_values","mediaRequestManagers","forEach","mediaRequestManager","clearPreviousRequests","commit","_reconnectMercuryWebSocket","_callee6","_callee6$","_context6","mercury","connected","disconnect","connect"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable no-warning-comments */\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\nimport {\n EVENT_TRIGGERS,\n RECONNECTION,\n SHARE_STATUS,\n SHARE_STOPPED_REASON,\n _CALL_,\n _LEFT_,\n _ID_,\n RECONNECTION_STATE,\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport ReconnectionError from '../common/errors/reconnection';\nimport ReconnectionNotStartedError from '../common/errors/reconnection-not-started';\nimport Metrics from '../metrics';\nimport Meeting from '../meeting';\nimport {MediaRequestManager} from '../multistream/mediaRequestManager';\n\n/**\n * Used to indicate that the reconnect logic needs to be retried.\n *\n * @class NeedsRetryError\n * @extends {Error}\n */\nclass NeedsRetryError extends Error {}\n\n/**\n * Used to indicate that the meeting needs to be rejoined, not just media reconnected\n *\n * @class NeedsRejoinError\n * @extends {Error}\n */\nclass NeedsRejoinError extends Error {\n wasSharing: any;\n\n /**\n * Creates an instance of NeedsRejoinError.\n * @param {Object} params\n * @param {boolean} params.wasSharing\n * @param {Error} params.error\n * @memberof NeedsRejoinError\n */\n constructor({\n wasSharing,\n error = new Error('Meeting needs to be rejoined'),\n }: {\n wasSharing?: boolean;\n error?: Error;\n }) {\n // @ts-ignore\n super(error);\n\n this.wasSharing = wasSharing;\n }\n}\n\n/**\n * @export\n * @class ReconnectionManager\n */\nexport default class ReconnectionManager {\n autoRejoinEnabled: any;\n iceState: any;\n maxRejoinAttempts: any;\n meeting: any;\n rejoinAttempts: any;\n shareStatus: any;\n status: any;\n webex: any;\n /**\n * @param {Meeting} meeting\n */\n constructor(meeting: Meeting) {\n /**\n * Stores ICE reconnection state data.\n *\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n this.iceState = {\n disconnected: false,\n resolve: () => {},\n timer: undefined,\n // @ts-ignore\n timeoutDuration: meeting.config.reconnection.iceReconnectionTimeout,\n };\n\n /**\n * @instance\n * @type {RECONNECTION_STATE}\n * @private\n * @memberof ReconnectionManager\n */\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n /**\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO : change this logic to not save the meeting instance\n // It gets complicated when meeting ends on remote side , We have a old meeting instance which is not up to date\n // @ts-ignore\n this.webex = meeting.webex;\n /**\n * @instance\n * @type {Meeting}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO: try removing the circular dependency for meeting and reconnection manager\n // try moving this to meetings collection\n this.meeting = meeting;\n\n // @ts-ignore\n this.maxRejoinAttempts = meeting.config.reconnection.maxRejoinAttempts;\n this.rejoinAttempts = 0;\n // @ts-ignore\n this.autoRejoinEnabled = meeting.config.reconnection.autoRejoin;\n\n // Make sure reconnection state is in default\n this.reset();\n }\n\n /**\n * @public\n * @memberof ReconnectionManager\n * @returns {void}\n */\n resetReconnectionTimer() {\n this.iceState.resolve();\n this.iceState.resolve = () => {};\n\n if (this.iceState.timer) {\n clearTimeout(this.iceState.timer);\n delete this.iceState.timer;\n }\n }\n\n /**\n * Sets the iceState to connected and clears any disconnect timeouts and\n * related timeout data within the iceState.\n *\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public iceReconnected() {\n if (this.iceState.disconnected) {\n LoggerProxy.logger.log('ReconnectionManager:index#iceReconnected --> ice has reconnected');\n\n this.resetReconnectionTimer();\n\n this.iceState.disconnected = false;\n }\n }\n\n /**\n * Set the iceState to disconnected and generates a timeout that waits for the\n * iceState to reconnect and then resolves. If the ice state is already\n * processing a reconnect, it immediately resolves. Rejects if the timeout\n * duration is reached.\n *\n * @returns {Promise<undefined>}\n * @public\n * @memberof ReconnectionManager\n */\n public waitForIceReconnect() {\n if (!this.iceState.disconnected) {\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#waitForIceReconnect --> waiting for ice reconnect'\n );\n\n this.iceState.disconnected = true;\n\n return new Promise<void>((resolve, reject) => {\n this.iceState.timer = setTimeout(() => {\n if (this.iceState.disconnected === false) {\n resolve();\n } else {\n this.iceState.disconnected = false;\n reject(\n new Error(`ice reconnection did not occur in ${this.iceState.timeoutDuration}ms`)\n );\n }\n }, this.iceState.timeoutDuration);\n\n this.iceState.resolve = resolve;\n });\n }\n\n // return a resolved promise to prevent multiple catch executions of reconnect\n return Promise.resolve();\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public reset() {\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n this.rejoinAttempts = 0;\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public cleanUp() {\n this.reset();\n }\n\n /**\n * Stop the local share stream.\n *\n * @param {string} reason a {@link SHARE_STOPPED_REASON}\n * @returns {undefined}\n * @private\n * @memberof ReconnectionManager\n */\n private async stopLocalShareStream(reason: string) {\n await this.meeting.unpublishStreams([\n this.meeting.mediaProperties.shareVideoStream,\n this.meeting.mediaProperties.shareAudioStream,\n ]);\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'stopLocalShareStream',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,\n {\n reason,\n }\n );\n }\n\n /**\n * @public\n * @memberof ReconnectionManager\n * @returns {Boolean} true if reconnection operation is in progress\n */\n isReconnectInProgress() {\n return this.status === RECONNECTION.STATE.IN_PROGRESS;\n }\n\n /**\n * @returns {Boolean}\n * @throws {ReconnectInProgress, ReconnectionDisabled}\n * @private\n * @memberof ReconnectionManager\n */\n private canStartReconnection() {\n if (this.meeting.config.reconnection.enabled) {\n if (this.status === RECONNECTION.STATE.DEFAULT_STATUS) {\n return true;\n }\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#canStartReconnection --> Reconnection already in progress.'\n );\n\n return false;\n }\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#canStartReconnection --> Reconnection is not enabled.'\n );\n\n return false;\n }\n\n /**\n * Initiates a media reconnect for the active meeting\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @param {boolean} [reconnectOptions.networkRetry=false] indicates if we are retrying the reconnect\n * @param {Function} [completionCallback] callback that gets called when reconnection is started successfully\n * @returns {Promise}\n * @public\n * @memberof ReconnectionManager\n */\n public async reconnect(\n {\n networkDisconnect = false,\n networkRetry = false,\n }: {\n networkDisconnect?: boolean;\n networkRetry?: boolean;\n } = {},\n completionCallback: (() => Promise<void>) | undefined = undefined\n ) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`\n );\n\n const triggerEvent = (event, payload = undefined) =>\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'reconnect',\n },\n event,\n payload\n );\n\n if (!this.canStartReconnection()) {\n throw new ReconnectionNotStartedError();\n }\n\n try {\n this.status = RECONNECTION.STATE.IN_PROGRESS;\n\n triggerEvent(EVENT_TRIGGERS.MEETING_RECONNECTION_STARTING);\n\n if (!networkRetry) {\n // Only log START metrics on the initial reconnect\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect start metric.'\n );\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.media.reconnecting',\n options: {\n meetingId: this.meeting.id,\n },\n });\n }\n\n try {\n await this.webex.meetings.startReachability();\n } catch (err) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reachability failed, continuing with reconnection attempt, err: ',\n err\n );\n }\n\n try {\n await this.executeReconnection({networkDisconnect});\n } catch (reconnectError) {\n if (reconnectError instanceof NeedsRetryError) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reconnection not successful, retrying.'\n );\n // Reset our reconnect status since we are looping back to the beginning\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n\n // This is a network retry, so we should not log START metrics again\n await this.reconnect({networkDisconnect: true, networkRetry: true}, completionCallback);\n\n return;\n }\n\n // Reconnect has failed\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnect --> Reconnection failed.',\n reconnectError.message\n );\n\n // send call aborted event with category as expected as we are trying to rejoin\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.aborted',\n payload: {\n errors: [\n {\n category: 'expected',\n errorCode: 2008,\n fatal: true,\n name: 'media-engine',\n shownToUser: false,\n },\n ],\n },\n options: {\n meetingId: this.meeting.id,\n },\n });\n\n if (reconnectError instanceof NeedsRejoinError && this.autoRejoinEnabled) {\n await this.rejoinMeeting(reconnectError.wasSharing);\n\n return;\n }\n\n throw reconnectError;\n }\n\n // finalize the reconnection process by calling the completionCallback\n if (completionCallback) {\n await completionCallback();\n }\n\n triggerEvent(EVENT_TRIGGERS.MEETING_RECONNECTION_SUCCESS);\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.media.recovered',\n payload: {\n recoveredBy: 'new',\n },\n options: {\n meetingId: this.meeting.id,\n },\n });\n } catch (error) {\n triggerEvent(EVENT_TRIGGERS.MEETING_RECONNECTION_FAILURE, {\n error: new ReconnectionError('Reconnection failure event', error),\n });\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_RECONNECT_FAILURE, {\n correlation_id: this.meeting.correlationId,\n locus_id: this.meeting.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n throw new ReconnectionError('Reconnection failure event', error);\n } finally {\n this.reset();\n }\n }\n\n /**\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @returns {Promise}\n * @throws {NeedsRetryError}\n * @private\n * @memberof ReconnectionManager\n */\n private async executeReconnection({networkDisconnect = false}: {networkDisconnect?: boolean}) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.'\n );\n\n const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;\n\n if (wasSharing) {\n await this.stopLocalShareStream(SHARE_STOPPED_REASON.MEDIA_RECONNECTION);\n }\n\n if (networkDisconnect) {\n try {\n await this.reconnectMercuryWebSocket();\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Websocket reconnected.',\n this.webex.internal.device.url\n );\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Unable to reconnect to websocket, giving up.'\n );\n this.status = RECONNECTION.STATE.FAILURE;\n throw error;\n }\n }\n\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Updating meeting data from server.'\n );\n await this.webex.meetings.syncMeetings({keepOnlyLocusMeetings: false});\n } catch (syncError) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Unable to sync meetings, reconnecting.',\n syncError\n );\n throw new NeedsRetryError(syncError);\n }\n\n // TODO: try to improve this logic as the reconnection manager saves the instance of deleted meeting object\n // So that on rejoin it known what parametrs it was using\n if (!this.meeting || !this.webex.meetings.getMeetingByType(_ID_, this.meeting.id)) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely.'\n );\n\n throw new Error('Unable to rejoin a meeting already ended or inactive.');\n }\n\n LoggerProxy.logger.info(\n `ReconnectionManager:index#executeReconnection --> Current state of meeting is ${this.meeting.state}`\n );\n\n // If the meeting state was left, no longer reconnect media\n if (this.meeting.state === _LEFT_) {\n if (this.meeting.type === _CALL_) {\n throw new Error('Unable to rejoin a call in LEFT state.');\n }\n\n throw new NeedsRejoinError({wasSharing});\n }\n\n try {\n const media = await this.reconnectMedia();\n\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#executeReconnection --> webRTC media connection renewed and local sdp offer sent'\n );\n\n return media;\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> failed to renew webRTC media connection or initiate offer'\n );\n this.status = RECONNECTION.STATE.FAILURE;\n\n throw error;\n }\n }\n\n /**\n * Rejoins a meeting after detecting the member was in a LEFT state\n *\n * @async\n * @param {boolean} wasSharing\n * @returns {Promise}\n */\n async rejoinMeeting(wasSharing = false) {\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#rejoinMeeting --> attemping meeting rejoin'\n );\n\n await this.meeting.join({rejoin: true});\n LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');\n\n if (wasSharing) {\n await this.stopLocalShareStream(SHARE_STOPPED_REASON.MEETING_REJOIN);\n }\n } catch (joinError) {\n this.rejoinAttempts += 1;\n if (this.rejoinAttempts <= this.maxRejoinAttempts) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting, attempt #${this.rejoinAttempts}, retrying.`,\n joinError\n );\n this.rejoinMeeting();\n } else {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting after max attempts.',\n joinError\n );\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_MAX_REJOIN_FAILURE, {\n locus_id: this.meeting.locusUrl.split('/').pop(),\n reason: joinError.message,\n stack: joinError.stack,\n });\n this.status = RECONNECTION.STATE.FAILURE;\n throw joinError;\n }\n }\n\n try {\n await this.reconnectMedia();\n } catch (mediaError) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#rejoinMeeting --> Unable to reestablish media after rejoining.',\n mediaError\n );\n throw mediaError;\n }\n }\n\n /**\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n async reconnectMedia() {\n LoggerProxy.logger.log('ReconnectionManager:index#reconnectMedia --> do turn discovery');\n\n // do the TURN server discovery again and ignore reachability results since the TURN server might change\n const turnServerResult = await this.meeting.roap.doTurnDiscovery(this.meeting, true, true);\n\n const iceServers = [];\n\n if (turnServerResult.turnServerInfo?.url) {\n iceServers.push({\n urls: turnServerResult.turnServerInfo.url,\n username: turnServerResult.turnServerInfo.username || '',\n credential: turnServerResult.turnServerInfo.password || '',\n });\n }\n\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#reconnectMedia --> renew webRTC media connection and send local sdp offer'\n );\n\n await this.meeting.mediaProperties.webrtcMediaConnection.reconnect(iceServers);\n\n // resend media requests\n if (this.meeting.isMultistream) {\n Object.values(this.meeting.mediaRequestManagers).forEach(\n (mediaRequestManager: MediaRequestManager) => {\n mediaRequestManager.clearPreviousRequests();\n mediaRequestManager.commit();\n }\n );\n }\n }\n\n /**\n * Attempt to Reconnect Mercury Websocket\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n private async reconnectMercuryWebSocket() {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Reconnecting websocket.'\n );\n // First, attempt to disconnect if we think we are already connected.\n if (this.webex.internal.mercury.connected) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Disconnecting existing websocket.'\n );\n try {\n await this.webex.internal.mercury.disconnect();\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket disconnected successfully.'\n );\n } catch (disconnectError) {\n // If we can't disconnect, the sdk is in such a bad state that reconnecting is not going to happen.\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to disconnect from websocket, giving up.',\n disconnectError\n );\n throw disconnectError;\n }\n }\n\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Connecting websocket.'\n );\n await this.webex.internal.mercury.connect();\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket connected successfully.'\n );\n } catch (connectError) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to connect to websocket, giving up.',\n connectError\n );\n\n throw connectError;\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_triggerProxy","_constants","_constants2","_reconnection","_reconnectionNotStarted","_metrics","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","NeedsRetryError","_Error","_inherits2","_super","_classCallCheck2","_createClass2","_wrapNativeSuper2","Error","NeedsRejoinError","_Error2","_super2","_ref","_this","wasSharing","_ref$error","error","_defineProperty2","_assertThisInitialized2","ReconnectionManager","exports","meeting","iceState","disconnected","resolve","timer","undefined","timeoutDuration","config","reconnection","iceReconnectionTimeout","status","RECONNECTION","STATE","DEFAULT_STATUS","webex","maxRejoinAttempts","rejoinAttempts","autoRejoinEnabled","autoRejoin","reset","key","value","resetReconnectionTimer","clearTimeout","iceReconnected","LoggerProxy","logger","log","waitForIceReconnect","_this2","_promise","reject","setTimeout","concat","cleanUp","_stopLocalShareStream","_asyncToGenerator2","_regenerator","mark","_callee","reason","wrap","_callee$","_context","prev","next","unpublishStreams","mediaProperties","shareVideoStream","shareAudioStream","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_STOPPED_SHARING_LOCAL","stop","stopLocalShareStream","_x","isReconnectInProgress","IN_PROGRESS","canStartReconnection","enabled","info","_reconnect","_callee2","_this3","_ref2","_ref2$networkDisconne","networkDisconnect","_ref2$networkRetry","networkRetry","completionCallback","triggerEvent","_args2","_callee2$","_context2","length","id","event","payload","ReconnectionNotStartedError","MEETING_RECONNECTION_STARTING","internal","newMetrics","submitClientEvent","name","options","meetingId","meetings","startReachability","t0","executeReconnection","t1","reconnect","abrupt","message","errors","category","errorCode","fatal","shownToUser","rejoinMeeting","MEETING_RECONNECTION_SUCCESS","recoveredBy","t2","MEETING_RECONNECTION_FAILURE","ReconnectionError","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETING_RECONNECT_FAILURE","correlation_id","correlationId","locus_id","locusUrl","split","pop","stack","finish","_executeReconnection","_callee3","_ref3","_ref3$networkDisconne","media","_callee3$","_context3","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","SHARE_STOPPED_REASON","MEDIA_RECONNECTION","reconnectMercuryWebSocket","device","url","FAILURE","syncMeetings","keepOnlyLocusMeetings","getMeetingByType","_ID_","state","_LEFT_","type","_CALL_","reconnectMedia","sent","_x2","_rejoinMeeting","_callee4","_args4","_callee4$","_context4","join","rejoin","MEETING_REJOIN","MEETING_MAX_REJOIN_FAILURE","_reconnectMedia","_callee5","_turnServerResult$tur","turnServerResult","iceServers","_callee5$","_context5","roap","doTurnDiscovery","turnServerInfo","push","urls","username","credential","password","webrtcMediaConnection","isMultistream","_values","mediaRequestManagers","forEach","mediaRequestManager","clearPreviousRequests","commit","_reconnectMercuryWebSocket","_callee6","_callee6$","_context6","mercury","connected","disconnect","connect"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable no-warning-comments */\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\nimport {\n EVENT_TRIGGERS,\n RECONNECTION,\n SHARE_STATUS,\n SHARE_STOPPED_REASON,\n _CALL_,\n _LEFT_,\n _ID_,\n RECONNECTION_STATE,\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport ReconnectionError from '../common/errors/reconnection';\nimport ReconnectionNotStartedError from '../common/errors/reconnection-not-started';\nimport Metrics from '../metrics';\nimport Meeting from '../meeting';\nimport {MediaRequestManager} from '../multistream/mediaRequestManager';\n\n/**\n * Used to indicate that the reconnect logic needs to be retried.\n *\n * @class NeedsRetryError\n * @extends {Error}\n */\nclass NeedsRetryError extends Error {}\n\n/**\n * Used to indicate that the meeting needs to be rejoined, not just media reconnected\n *\n * @class NeedsRejoinError\n * @extends {Error}\n */\nclass NeedsRejoinError extends Error {\n wasSharing: any;\n\n /**\n * Creates an instance of NeedsRejoinError.\n * @param {Object} params\n * @param {boolean} params.wasSharing\n * @param {Error} params.error\n * @memberof NeedsRejoinError\n */\n constructor({\n wasSharing,\n error = new Error('Meeting needs to be rejoined'),\n }: {\n wasSharing?: boolean;\n error?: Error;\n }) {\n // @ts-ignore\n super(error);\n\n this.wasSharing = wasSharing;\n }\n}\n\n/**\n * @export\n * @class ReconnectionManager\n */\nexport default class ReconnectionManager {\n autoRejoinEnabled: any;\n iceState: any;\n maxRejoinAttempts: any;\n meeting: any;\n rejoinAttempts: any;\n shareStatus: any;\n status: any;\n webex: any;\n /**\n * @param {Meeting} meeting\n */\n constructor(meeting: Meeting) {\n /**\n * Stores ICE reconnection state data.\n *\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n this.iceState = {\n disconnected: false,\n resolve: () => {},\n timer: undefined,\n // @ts-ignore\n timeoutDuration: meeting.config.reconnection.iceReconnectionTimeout,\n };\n\n /**\n * @instance\n * @type {RECONNECTION_STATE}\n * @private\n * @memberof ReconnectionManager\n */\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n /**\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO : change this logic to not save the meeting instance\n // It gets complicated when meeting ends on remote side , We have a old meeting instance which is not up to date\n // @ts-ignore\n this.webex = meeting.webex;\n /**\n * @instance\n * @type {Meeting}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO: try removing the circular dependency for meeting and reconnection manager\n // try moving this to meetings collection\n this.meeting = meeting;\n\n // @ts-ignore\n this.maxRejoinAttempts = meeting.config.reconnection.maxRejoinAttempts;\n this.rejoinAttempts = 0;\n // @ts-ignore\n this.autoRejoinEnabled = meeting.config.reconnection.autoRejoin;\n\n // Make sure reconnection state is in default\n this.reset();\n }\n\n /**\n * @public\n * @memberof ReconnectionManager\n * @returns {void}\n */\n resetReconnectionTimer() {\n this.iceState.resolve();\n this.iceState.resolve = () => {};\n\n if (this.iceState.timer) {\n clearTimeout(this.iceState.timer);\n delete this.iceState.timer;\n }\n }\n\n /**\n * Sets the iceState to connected and clears any disconnect timeouts and\n * related timeout data within the iceState.\n *\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public iceReconnected() {\n if (this.iceState.disconnected) {\n LoggerProxy.logger.log('ReconnectionManager:index#iceReconnected --> ice has reconnected');\n\n this.resetReconnectionTimer();\n\n this.iceState.disconnected = false;\n }\n }\n\n /**\n * Set the iceState to disconnected and generates a timeout that waits for the\n * iceState to reconnect and then resolves. If the ice state is already\n * processing a reconnect, it immediately resolves. Rejects if the timeout\n * duration is reached.\n *\n * @returns {Promise<undefined>}\n * @public\n * @memberof ReconnectionManager\n */\n public waitForIceReconnect() {\n if (!this.iceState.disconnected) {\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#waitForIceReconnect --> waiting for ice reconnect'\n );\n\n this.iceState.disconnected = true;\n\n return new Promise<void>((resolve, reject) => {\n this.iceState.timer = setTimeout(() => {\n if (this.iceState.disconnected === false) {\n resolve();\n } else {\n this.iceState.disconnected = false;\n reject(\n new Error(`ice reconnection did not occur in ${this.iceState.timeoutDuration}ms`)\n );\n }\n }, this.iceState.timeoutDuration);\n\n this.iceState.resolve = resolve;\n });\n }\n\n // return a resolved promise to prevent multiple catch executions of reconnect\n return Promise.resolve();\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public reset() {\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n this.rejoinAttempts = 0;\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public cleanUp() {\n this.reset();\n }\n\n /**\n * Stop the local share stream.\n *\n * @param {string} reason a {@link SHARE_STOPPED_REASON}\n * @returns {undefined}\n * @private\n * @memberof ReconnectionManager\n */\n private async stopLocalShareStream(reason: string) {\n await this.meeting.unpublishStreams([\n this.meeting.mediaProperties.shareVideoStream,\n this.meeting.mediaProperties.shareAudioStream,\n ]);\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'stopLocalShareStream',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,\n {\n reason,\n }\n );\n }\n\n /**\n * @public\n * @memberof ReconnectionManager\n * @returns {Boolean} true if reconnection operation is in progress\n */\n isReconnectInProgress() {\n return this.status === RECONNECTION.STATE.IN_PROGRESS;\n }\n\n /**\n * @returns {Boolean}\n * @throws {ReconnectInProgress, ReconnectionDisabled}\n * @private\n * @memberof ReconnectionManager\n */\n private canStartReconnection() {\n if (this.meeting.config.reconnection.enabled) {\n if (this.status === RECONNECTION.STATE.DEFAULT_STATUS) {\n return true;\n }\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#canStartReconnection --> Reconnection already in progress.'\n );\n\n return false;\n }\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#canStartReconnection --> Reconnection is not enabled.'\n );\n\n return false;\n }\n\n /**\n * Initiates a media reconnect for the active meeting\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @param {boolean} [reconnectOptions.networkRetry=false] indicates if we are retrying the reconnect\n * @param {Function} [completionCallback] callback that gets called when reconnection is started successfully\n * @returns {Promise}\n * @public\n * @memberof ReconnectionManager\n */\n public async reconnect(\n {\n networkDisconnect = false,\n networkRetry = false,\n }: {\n networkDisconnect?: boolean;\n networkRetry?: boolean;\n } = {},\n completionCallback: (() => Promise<void>) | undefined = undefined\n ) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`\n );\n\n const triggerEvent = (event, payload = undefined) =>\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'reconnect',\n },\n event,\n payload\n );\n\n if (!this.canStartReconnection()) {\n throw new ReconnectionNotStartedError();\n }\n\n try {\n this.status = RECONNECTION.STATE.IN_PROGRESS;\n\n triggerEvent(EVENT_TRIGGERS.MEETING_RECONNECTION_STARTING);\n\n if (!networkRetry) {\n // Only log START metrics on the initial reconnect\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect start metric.'\n );\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.media.reconnecting',\n options: {\n meetingId: this.meeting.id,\n },\n });\n }\n\n try {\n await this.webex.meetings.startReachability('reconnection');\n } catch (err) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reachability failed, continuing with reconnection attempt, err: ',\n err\n );\n }\n\n try {\n await this.executeReconnection({networkDisconnect});\n } catch (reconnectError) {\n if (reconnectError instanceof NeedsRetryError) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reconnection not successful, retrying.'\n );\n // Reset our reconnect status since we are looping back to the beginning\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n\n // This is a network retry, so we should not log START metrics again\n await this.reconnect({networkDisconnect: true, networkRetry: true}, completionCallback);\n\n return;\n }\n\n // Reconnect has failed\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnect --> Reconnection failed.',\n reconnectError.message\n );\n\n // send call aborted event with category as expected as we are trying to rejoin\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.aborted',\n payload: {\n errors: [\n {\n category: 'expected',\n errorCode: 2008,\n fatal: true,\n name: 'media-engine',\n shownToUser: false,\n },\n ],\n },\n options: {\n meetingId: this.meeting.id,\n },\n });\n\n if (reconnectError instanceof NeedsRejoinError && this.autoRejoinEnabled) {\n await this.rejoinMeeting(reconnectError.wasSharing);\n\n return;\n }\n\n throw reconnectError;\n }\n\n // finalize the reconnection process by calling the completionCallback\n if (completionCallback) {\n await completionCallback();\n }\n\n triggerEvent(EVENT_TRIGGERS.MEETING_RECONNECTION_SUCCESS);\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.media.recovered',\n payload: {\n recoveredBy: 'new',\n },\n options: {\n meetingId: this.meeting.id,\n },\n });\n } catch (error) {\n triggerEvent(EVENT_TRIGGERS.MEETING_RECONNECTION_FAILURE, {\n error: new ReconnectionError('Reconnection failure event', error),\n });\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_RECONNECT_FAILURE, {\n correlation_id: this.meeting.correlationId,\n locus_id: this.meeting.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n throw new ReconnectionError('Reconnection failure event', error);\n } finally {\n this.reset();\n }\n }\n\n /**\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @returns {Promise}\n * @throws {NeedsRetryError}\n * @private\n * @memberof ReconnectionManager\n */\n private async executeReconnection({networkDisconnect = false}: {networkDisconnect?: boolean}) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.'\n );\n\n const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;\n\n if (wasSharing) {\n await this.stopLocalShareStream(SHARE_STOPPED_REASON.MEDIA_RECONNECTION);\n }\n\n if (networkDisconnect) {\n try {\n await this.reconnectMercuryWebSocket();\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Websocket reconnected.',\n this.webex.internal.device.url\n );\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Unable to reconnect to websocket, giving up.'\n );\n this.status = RECONNECTION.STATE.FAILURE;\n throw error;\n }\n }\n\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Updating meeting data from server.'\n );\n await this.webex.meetings.syncMeetings({keepOnlyLocusMeetings: false});\n } catch (syncError) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Unable to sync meetings, reconnecting.',\n syncError\n );\n throw new NeedsRetryError(syncError);\n }\n\n // TODO: try to improve this logic as the reconnection manager saves the instance of deleted meeting object\n // So that on rejoin it known what parametrs it was using\n if (!this.meeting || !this.webex.meetings.getMeetingByType(_ID_, this.meeting.id)) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely.'\n );\n\n throw new Error('Unable to rejoin a meeting already ended or inactive.');\n }\n\n LoggerProxy.logger.info(\n `ReconnectionManager:index#executeReconnection --> Current state of meeting is ${this.meeting.state}`\n );\n\n // If the meeting state was left, no longer reconnect media\n if (this.meeting.state === _LEFT_) {\n if (this.meeting.type === _CALL_) {\n throw new Error('Unable to rejoin a call in LEFT state.');\n }\n\n throw new NeedsRejoinError({wasSharing});\n }\n\n try {\n const media = await this.reconnectMedia();\n\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#executeReconnection --> webRTC media connection renewed and local sdp offer sent'\n );\n\n return media;\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> failed to renew webRTC media connection or initiate offer'\n );\n this.status = RECONNECTION.STATE.FAILURE;\n\n throw error;\n }\n }\n\n /**\n * Rejoins a meeting after detecting the member was in a LEFT state\n *\n * @async\n * @param {boolean} wasSharing\n * @returns {Promise}\n */\n async rejoinMeeting(wasSharing = false) {\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#rejoinMeeting --> attemping meeting rejoin'\n );\n\n await this.meeting.join({rejoin: true});\n LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');\n\n if (wasSharing) {\n await this.stopLocalShareStream(SHARE_STOPPED_REASON.MEETING_REJOIN);\n }\n } catch (joinError) {\n this.rejoinAttempts += 1;\n if (this.rejoinAttempts <= this.maxRejoinAttempts) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting, attempt #${this.rejoinAttempts}, retrying.`,\n joinError\n );\n this.rejoinMeeting();\n } else {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting after max attempts.',\n joinError\n );\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_MAX_REJOIN_FAILURE, {\n locus_id: this.meeting.locusUrl.split('/').pop(),\n reason: joinError.message,\n stack: joinError.stack,\n });\n this.status = RECONNECTION.STATE.FAILURE;\n throw joinError;\n }\n }\n\n try {\n await this.reconnectMedia();\n } catch (mediaError) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#rejoinMeeting --> Unable to reestablish media after rejoining.',\n mediaError\n );\n throw mediaError;\n }\n }\n\n /**\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n async reconnectMedia() {\n LoggerProxy.logger.log('ReconnectionManager:index#reconnectMedia --> do turn discovery');\n\n // do the TURN server discovery again and ignore reachability results since the TURN server might change\n const turnServerResult = await this.meeting.roap.doTurnDiscovery(this.meeting, true, true);\n\n const iceServers = [];\n\n if (turnServerResult.turnServerInfo?.url) {\n iceServers.push({\n urls: turnServerResult.turnServerInfo.url,\n username: turnServerResult.turnServerInfo.username || '',\n credential: turnServerResult.turnServerInfo.password || '',\n });\n }\n\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#reconnectMedia --> renew webRTC media connection and send local sdp offer'\n );\n\n await this.meeting.mediaProperties.webrtcMediaConnection.reconnect(iceServers);\n\n // resend media requests\n if (this.meeting.isMultistream) {\n Object.values(this.meeting.mediaRequestManagers).forEach(\n (mediaRequestManager: MediaRequestManager) => {\n mediaRequestManager.clearPreviousRequests();\n mediaRequestManager.commit();\n }\n );\n }\n }\n\n /**\n * Attempt to Reconnect Mercury Websocket\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n private async reconnectMercuryWebSocket() {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Reconnecting websocket.'\n );\n // First, attempt to disconnect if we think we are already connected.\n if (this.webex.internal.mercury.connected) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Disconnecting existing websocket.'\n );\n try {\n await this.webex.internal.mercury.disconnect();\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket disconnected successfully.'\n );\n } catch (disconnectError) {\n // If we can't disconnect, the sdk is in such a bad state that reconnecting is not going to happen.\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to disconnect from websocket, giving up.',\n disconnectError\n );\n throw disconnectError;\n }\n }\n\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Connecting websocket.'\n );\n await this.webex.internal.mercury.connect();\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket connected successfully.'\n );\n } catch (connectError) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to connect to websocket, giving up.',\n connectError\n );\n\n throw connectError;\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -253,11 +253,12 @@ export default class Meetings extends WebexPlugin {
|
|
|
253
253
|
getReachability(): Reachability;
|
|
254
254
|
/**
|
|
255
255
|
* initializes and starts gathering reachability for Meetings
|
|
256
|
+
* @param {string} trigger - explains the reason for starting reachability
|
|
256
257
|
* @returns {Promise}
|
|
257
258
|
* @public
|
|
258
259
|
* @memberof Meetings
|
|
259
260
|
*/
|
|
260
|
-
startReachability(): Promise<import("../reachability").ReachabilityResults>;
|
|
261
|
+
startReachability(trigger?: string): Promise<import("../reachability").ReachabilityResults>;
|
|
261
262
|
/**
|
|
262
263
|
* Get geoHint for info for meetings
|
|
263
264
|
* @returns {Promise}
|
|
@@ -73,6 +73,7 @@ export default class Reachability extends EventsScope {
|
|
|
73
73
|
xtls: number;
|
|
74
74
|
};
|
|
75
75
|
};
|
|
76
|
+
protected lastTrigger?: string;
|
|
76
77
|
/**
|
|
77
78
|
* Creates an instance of Reachability.
|
|
78
79
|
* @param {object} webex
|
|
@@ -91,11 +92,12 @@ export default class Reachability extends EventsScope {
|
|
|
91
92
|
}>;
|
|
92
93
|
/**
|
|
93
94
|
* Gets a list of media clusters from the backend and performs reachability checks on all the clusters
|
|
95
|
+
* @param {string} trigger - explains the reason for starting reachability
|
|
94
96
|
* @returns {Promise<ReachabilityResults>} reachability results
|
|
95
97
|
* @public
|
|
96
98
|
* @memberof Reachability
|
|
97
99
|
*/
|
|
98
|
-
gatherReachability(): Promise<ReachabilityResults>;
|
|
100
|
+
gatherReachability(trigger: string): Promise<ReachabilityResults>;
|
|
99
101
|
/**
|
|
100
102
|
* Returns statistics about last reachability results. The returned value is an object
|
|
101
103
|
* with a flat list of properties so that it can be easily sent with metrics
|
package/dist/webinar/index.js
CHANGED
|
@@ -62,7 +62,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
62
62
|
updateCanManageWebcast: function updateCanManageWebcast(canManageWebcast) {
|
|
63
63
|
this.set('canManageWebcast', canManageWebcast);
|
|
64
64
|
},
|
|
65
|
-
version: "3.4.0-next.
|
|
65
|
+
version: "3.4.0-next.9"
|
|
66
66
|
});
|
|
67
67
|
var _default = exports.default = Webinar;
|
|
68
68
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"@webex/eslint-config-legacy": "0.0.0",
|
|
44
44
|
"@webex/jest-config-legacy": "0.0.0",
|
|
45
45
|
"@webex/legacy-tools": "0.0.0",
|
|
46
|
-
"@webex/plugin-meetings": "3.4.0-next.
|
|
46
|
+
"@webex/plugin-meetings": "3.4.0-next.9",
|
|
47
47
|
"@webex/plugin-rooms": "3.4.0-next.2",
|
|
48
48
|
"@webex/test-helper-chai": "3.4.0-next.2",
|
|
49
49
|
"@webex/test-helper-mocha": "3.4.0-next.2",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"@webex/internal-plugin-metrics": "3.4.0-next.2",
|
|
71
71
|
"@webex/internal-plugin-support": "3.4.0-next.2",
|
|
72
72
|
"@webex/internal-plugin-user": "3.4.0-next.2",
|
|
73
|
-
"@webex/internal-plugin-voicea": "3.4.0-next.
|
|
73
|
+
"@webex/internal-plugin-voicea": "3.4.0-next.9",
|
|
74
74
|
"@webex/media-helpers": "3.4.0-next.3",
|
|
75
75
|
"@webex/plugin-people": "3.4.0-next.2",
|
|
76
76
|
"@webex/plugin-rooms": "3.4.0-next.2",
|
|
@@ -91,5 +91,5 @@
|
|
|
91
91
|
"//": [
|
|
92
92
|
"TODO: upgrade jwt-decode when moving to node 18"
|
|
93
93
|
],
|
|
94
|
-
"version": "3.4.0-next.
|
|
94
|
+
"version": "3.4.0-next.9"
|
|
95
95
|
}
|
package/src/meetings/index.ts
CHANGED
|
@@ -765,7 +765,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
765
765
|
return Promise.all([
|
|
766
766
|
this.fetchUserPreferredWebexSite(),
|
|
767
767
|
this.getGeoHint(),
|
|
768
|
-
this.startReachability().catch((error) => {
|
|
768
|
+
this.startReachability('registration').catch((error) => {
|
|
769
769
|
LoggerProxy.logger.error(`Meetings:index#register --> GDM error, ${error.message}`);
|
|
770
770
|
}),
|
|
771
771
|
// @ts-ignore
|
|
@@ -967,12 +967,13 @@ export default class Meetings extends WebexPlugin {
|
|
|
967
967
|
|
|
968
968
|
/**
|
|
969
969
|
* initializes and starts gathering reachability for Meetings
|
|
970
|
+
* @param {string} trigger - explains the reason for starting reachability
|
|
970
971
|
* @returns {Promise}
|
|
971
972
|
* @public
|
|
972
973
|
* @memberof Meetings
|
|
973
974
|
*/
|
|
974
|
-
startReachability() {
|
|
975
|
-
return this.getReachability().gatherReachability();
|
|
975
|
+
startReachability(trigger = 'client') {
|
|
976
|
+
return this.getReachability().gatherReachability(trigger);
|
|
976
977
|
}
|
|
977
978
|
|
|
978
979
|
/**
|
|
@@ -93,6 +93,8 @@ export default class Reachability extends EventsScope {
|
|
|
93
93
|
expectedResultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};
|
|
94
94
|
resultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};
|
|
95
95
|
|
|
96
|
+
protected lastTrigger?: string;
|
|
97
|
+
|
|
96
98
|
/**
|
|
97
99
|
* Creates an instance of Reachability.
|
|
98
100
|
* @param {object} webex
|
|
@@ -142,13 +144,16 @@ export default class Reachability extends EventsScope {
|
|
|
142
144
|
|
|
143
145
|
/**
|
|
144
146
|
* Gets a list of media clusters from the backend and performs reachability checks on all the clusters
|
|
147
|
+
* @param {string} trigger - explains the reason for starting reachability
|
|
145
148
|
* @returns {Promise<ReachabilityResults>} reachability results
|
|
146
149
|
* @public
|
|
147
150
|
* @memberof Reachability
|
|
148
151
|
*/
|
|
149
|
-
public async gatherReachability(): Promise<ReachabilityResults> {
|
|
152
|
+
public async gatherReachability(trigger: string): Promise<ReachabilityResults> {
|
|
150
153
|
// Fetch clusters and measure latency
|
|
151
154
|
try {
|
|
155
|
+
this.lastTrigger = trigger;
|
|
156
|
+
|
|
152
157
|
// kick off ip version detection. For now we don't await it, as we're doing it
|
|
153
158
|
// to gather the timings and send them with our reachability metrics
|
|
154
159
|
// @ts-ignore
|
|
@@ -552,6 +557,7 @@ export default class Reachability extends EventsScope {
|
|
|
552
557
|
// @ts-ignore
|
|
553
558
|
totalTime: this.webex.internal.device.ipNetworkDetector.totalTime,
|
|
554
559
|
},
|
|
560
|
+
trigger: this.lastTrigger,
|
|
555
561
|
};
|
|
556
562
|
Metrics.sendBehavioralMetric(
|
|
557
563
|
BEHAVIORAL_METRICS.REACHABILITY_COMPLETED,
|
|
@@ -342,7 +342,7 @@ export default class ReconnectionManager {
|
|
|
342
342
|
}
|
|
343
343
|
|
|
344
344
|
try {
|
|
345
|
-
await this.webex.meetings.startReachability();
|
|
345
|
+
await this.webex.meetings.startReachability('reconnection');
|
|
346
346
|
} catch (err) {
|
|
347
347
|
LoggerProxy.logger.info(
|
|
348
348
|
'ReconnectionManager:index#reconnect --> Reachability failed, continuing with reconnection attempt, err: ',
|
|
@@ -79,6 +79,7 @@ describe('plugin-meetings', () => {
|
|
|
79
79
|
let locusInfo;
|
|
80
80
|
let services;
|
|
81
81
|
let catalog;
|
|
82
|
+
let startReachabilityStub;
|
|
82
83
|
|
|
83
84
|
describe('meetings index', () => {
|
|
84
85
|
beforeEach(() => {
|
|
@@ -129,9 +130,7 @@ describe('plugin-meetings', () => {
|
|
|
129
130
|
logger,
|
|
130
131
|
});
|
|
131
132
|
|
|
132
|
-
|
|
133
|
-
startReachability: sinon.stub().returns(Promise.resolve()),
|
|
134
|
-
});
|
|
133
|
+
startReachabilityStub = sinon.stub(webex.meetings, 'startReachability').resolves();
|
|
135
134
|
|
|
136
135
|
Object.assign(webex.internal, {
|
|
137
136
|
llm: {on: sinon.stub()},
|
|
@@ -197,6 +196,34 @@ describe('plugin-meetings', () => {
|
|
|
197
196
|
assert.calledOnce(MeetingsUtil.checkH264Support);
|
|
198
197
|
});
|
|
199
198
|
|
|
199
|
+
describe('#startReachability', () => {
|
|
200
|
+
let gatherReachabilitySpy;
|
|
201
|
+
let fakeResult = {id: 'fake-result'};
|
|
202
|
+
|
|
203
|
+
beforeEach(() => {
|
|
204
|
+
startReachabilityStub.restore();
|
|
205
|
+
gatherReachabilitySpy = sinon
|
|
206
|
+
.stub(webex.meetings.getReachability(), 'gatherReachability')
|
|
207
|
+
.resolves(fakeResult);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('should gather reachability with default trigger value', async () => {
|
|
211
|
+
const result = await webex.meetings.startReachability();
|
|
212
|
+
|
|
213
|
+
assert.calledOnceWithExactly(gatherReachabilitySpy, 'client');
|
|
214
|
+
assert.equal(result, fakeResult);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('should gather reachability and pass custom trigger value', async () => {
|
|
218
|
+
const trigger = 'custom-trigger';
|
|
219
|
+
|
|
220
|
+
const result = await webex.meetings.startReachability(trigger);
|
|
221
|
+
|
|
222
|
+
assert.calledOnceWithExactly(gatherReachabilitySpy, trigger);
|
|
223
|
+
assert.equal(result, fakeResult);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
|
|
200
227
|
describe('#_toggleUnifiedMeetings', () => {
|
|
201
228
|
it('should have toggleUnifiedMeetings', () => {
|
|
202
229
|
assert.equal(typeof webex.meetings._toggleUnifiedMeetings, 'function');
|
|
@@ -4,7 +4,6 @@ import sinon from 'sinon';
|
|
|
4
4
|
import EventEmitter from 'events';
|
|
5
5
|
import testUtils from '../../../utils/testUtils';
|
|
6
6
|
import Reachability, {
|
|
7
|
-
ReachabilityResults,
|
|
8
7
|
ReachabilityResultsForBackend,
|
|
9
8
|
} from '@webex/plugin-meetings/src/reachability/';
|
|
10
9
|
import {ClusterNode} from '../../../../src/reachability/request';
|
|
@@ -507,6 +506,11 @@ describe('gatherReachability', () => {
|
|
|
507
506
|
mockClusterReachabilityInstances[id] = mockInstance;
|
|
508
507
|
return mockInstance;
|
|
509
508
|
});
|
|
509
|
+
|
|
510
|
+
webex.config.meetings.experimental = {
|
|
511
|
+
enableTcpReachability: false,
|
|
512
|
+
enableTlsReachability: false,
|
|
513
|
+
};
|
|
510
514
|
});
|
|
511
515
|
|
|
512
516
|
afterEach(() => {
|
|
@@ -1044,13 +1048,14 @@ describe('gatherReachability', () => {
|
|
|
1044
1048
|
enableTlsReachability: true,
|
|
1045
1049
|
};
|
|
1046
1050
|
|
|
1047
|
-
// the metrics related to ipver are not tested in these tests and are all the same, so setting them up here
|
|
1051
|
+
// the metrics related to ipver and trigger are not tested in these tests and are all the same, so setting them up here
|
|
1048
1052
|
const expectedMetricsFull = {
|
|
1049
1053
|
...expectedMetrics,
|
|
1050
1054
|
ipver_firstIpV4: -1,
|
|
1051
1055
|
ipver_firstIpV6: -1,
|
|
1052
1056
|
ipver_firstMdns: -1,
|
|
1053
1057
|
ipver_totalTime: -1,
|
|
1058
|
+
trigger: 'test',
|
|
1054
1059
|
};
|
|
1055
1060
|
|
|
1056
1061
|
const receivedEvents = {
|
|
@@ -1082,7 +1087,7 @@ describe('gatherReachability', () => {
|
|
|
1082
1087
|
|
|
1083
1088
|
reachability.reachabilityRequest.getClusters = sinon.stub().returns(mockGetClustersResult);
|
|
1084
1089
|
|
|
1085
|
-
const resultPromise = reachability.gatherReachability();
|
|
1090
|
+
const resultPromise = reachability.gatherReachability('test');
|
|
1086
1091
|
|
|
1087
1092
|
await testUtils.flushPromises();
|
|
1088
1093
|
|
|
@@ -1142,6 +1147,38 @@ describe('gatherReachability', () => {
|
|
|
1142
1147
|
})
|
|
1143
1148
|
);
|
|
1144
1149
|
|
|
1150
|
+
it('sends the trigger parameter in the metrics', async () => {
|
|
1151
|
+
const reachability = new TestReachability(webex);
|
|
1152
|
+
|
|
1153
|
+
const mockGetClustersResult = {
|
|
1154
|
+
clusters: {
|
|
1155
|
+
clusterA: {
|
|
1156
|
+
udp: ['udp-url'],
|
|
1157
|
+
tcp: [],
|
|
1158
|
+
xtls: [],
|
|
1159
|
+
isVideoMesh: false,
|
|
1160
|
+
},
|
|
1161
|
+
},
|
|
1162
|
+
joinCookie: {id: 'id'},
|
|
1163
|
+
};
|
|
1164
|
+
|
|
1165
|
+
reachability.reachabilityRequest.getClusters = sinon.stub().returns(mockGetClustersResult);
|
|
1166
|
+
|
|
1167
|
+
const resultPromise = reachability.gatherReachability('some trigger');
|
|
1168
|
+
|
|
1169
|
+
// let it time out
|
|
1170
|
+
await testUtils.flushPromises();
|
|
1171
|
+
clock.tick(15000);
|
|
1172
|
+
await resultPromise;
|
|
1173
|
+
|
|
1174
|
+
// check the metric contains the right trigger value
|
|
1175
|
+
assert.calledWith(
|
|
1176
|
+
Metrics.sendBehavioralMetric,
|
|
1177
|
+
'js_sdk_reachability_completed',
|
|
1178
|
+
sinon.match({trigger: 'some trigger'})
|
|
1179
|
+
);
|
|
1180
|
+
});
|
|
1181
|
+
|
|
1145
1182
|
it(`starts ip network version detection and includes the results in the metrics`, async () => {
|
|
1146
1183
|
webex.config.meetings.experimental = {
|
|
1147
1184
|
enableTcpReachability: true,
|
|
@@ -1180,7 +1217,7 @@ describe('gatherReachability', () => {
|
|
|
1180
1217
|
joinCookie: {id: 'id'},
|
|
1181
1218
|
});
|
|
1182
1219
|
|
|
1183
|
-
const resultPromise = reachability.gatherReachability();
|
|
1220
|
+
const resultPromise = reachability.gatherReachability('test');
|
|
1184
1221
|
|
|
1185
1222
|
await testUtils.flushPromises();
|
|
1186
1223
|
|
|
@@ -1217,6 +1254,7 @@ describe('gatherReachability', () => {
|
|
|
1217
1254
|
ipver_firstIpV6: webex.internal.device.ipNetworkDetector.firstIpV6,
|
|
1218
1255
|
ipver_firstMdns: webex.internal.device.ipNetworkDetector.firstMdns,
|
|
1219
1256
|
ipver_totalTime: webex.internal.device.ipNetworkDetector.totalTime,
|
|
1257
|
+
trigger: 'test',
|
|
1220
1258
|
});
|
|
1221
1259
|
});
|
|
1222
1260
|
|
|
@@ -1248,7 +1286,7 @@ describe('gatherReachability', () => {
|
|
|
1248
1286
|
|
|
1249
1287
|
reachability.reachabilityRequest.getClusters = sinon.stub().returns(mockGetClustersResult);
|
|
1250
1288
|
|
|
1251
|
-
const resultPromise = reachability.gatherReachability();
|
|
1289
|
+
const resultPromise = reachability.gatherReachability('test');
|
|
1252
1290
|
|
|
1253
1291
|
await testUtils.flushPromises();
|
|
1254
1292
|
|
|
@@ -1341,7 +1379,7 @@ describe('gatherReachability', () => {
|
|
|
1341
1379
|
|
|
1342
1380
|
reachability.reachabilityRequest.getClusters = sinon.stub().returns(mockGetClustersResult);
|
|
1343
1381
|
|
|
1344
|
-
const resultPromise = reachability.gatherReachability();
|
|
1382
|
+
const resultPromise = reachability.gatherReachability('test');
|
|
1345
1383
|
|
|
1346
1384
|
await testUtils.flushPromises();
|
|
1347
1385
|
|
|
@@ -1382,7 +1420,7 @@ describe('gatherReachability', () => {
|
|
|
1382
1420
|
|
|
1383
1421
|
reachability.reachabilityRequest.getClusters = sinon.stub().throws();
|
|
1384
1422
|
|
|
1385
|
-
const result = await reachability.gatherReachability();
|
|
1423
|
+
const result = await reachability.gatherReachability('test');
|
|
1386
1424
|
|
|
1387
1425
|
assert.empty(result);
|
|
1388
1426
|
|
|
@@ -1400,7 +1438,7 @@ describe('gatherReachability', () => {
|
|
|
1400
1438
|
reachability.reachabilityRequest.getClusters = sinon.stub().returns(getClustersResult);
|
|
1401
1439
|
(reachability as any).performReachabilityChecks = sinon.stub().throws();
|
|
1402
1440
|
|
|
1403
|
-
const result = await reachability.gatherReachability();
|
|
1441
|
+
const result = await reachability.gatherReachability('test');
|
|
1404
1442
|
|
|
1405
1443
|
assert.empty(result);
|
|
1406
1444
|
|
|
@@ -1435,7 +1473,7 @@ describe('gatherReachability', () => {
|
|
|
1435
1473
|
|
|
1436
1474
|
reachability.reachabilityRequest.getClusters = sinon.stub().returns(getClustersResult);
|
|
1437
1475
|
|
|
1438
|
-
const promise = reachability.gatherReachability();
|
|
1476
|
+
const promise = reachability.gatherReachability('test');
|
|
1439
1477
|
|
|
1440
1478
|
await simulateTimeout();
|
|
1441
1479
|
await promise;
|
|
@@ -1481,7 +1519,7 @@ describe('gatherReachability', () => {
|
|
|
1481
1519
|
|
|
1482
1520
|
reachability.reachabilityRequest.getClusters = sinon.stub().returns(getClustersResult);
|
|
1483
1521
|
|
|
1484
|
-
const promise = reachability.gatherReachability();
|
|
1522
|
+
const promise = reachability.gatherReachability('test');
|
|
1485
1523
|
await simulateTimeout();
|
|
1486
1524
|
await promise;
|
|
1487
1525
|
|
|
@@ -1515,7 +1553,7 @@ describe('gatherReachability', () => {
|
|
|
1515
1553
|
|
|
1516
1554
|
reachability.reachabilityRequest.getClusters = sinon.stub().returns(getClustersResult);
|
|
1517
1555
|
|
|
1518
|
-
const promise = reachability.gatherReachability();
|
|
1556
|
+
const promise = reachability.gatherReachability('test');
|
|
1519
1557
|
|
|
1520
1558
|
await simulateTimeout();
|
|
1521
1559
|
await promise;
|
|
@@ -1550,7 +1588,7 @@ describe('gatherReachability', () => {
|
|
|
1550
1588
|
|
|
1551
1589
|
reachability.reachabilityRequest.getClusters = sinon.stub().returns(getClustersResult);
|
|
1552
1590
|
|
|
1553
|
-
const promise = reachability.gatherReachability();
|
|
1591
|
+
const promise = reachability.gatherReachability('test');
|
|
1554
1592
|
|
|
1555
1593
|
await simulateTimeout();
|
|
1556
1594
|
await promise;
|
|
@@ -1595,7 +1633,7 @@ describe('gatherReachability', () => {
|
|
|
1595
1633
|
return getClustersResult;
|
|
1596
1634
|
});
|
|
1597
1635
|
|
|
1598
|
-
const promise = reachability.gatherReachability();
|
|
1636
|
+
const promise = reachability.gatherReachability('test');
|
|
1599
1637
|
|
|
1600
1638
|
await simulateTimeout();
|
|
1601
1639
|
await promise;
|
|
@@ -1616,7 +1654,7 @@ describe('gatherReachability', () => {
|
|
|
1616
1654
|
throw new Error('fake error');
|
|
1617
1655
|
});
|
|
1618
1656
|
|
|
1619
|
-
const promise = reachability.gatherReachability();
|
|
1657
|
+
const promise = reachability.gatherReachability('test');
|
|
1620
1658
|
|
|
1621
1659
|
await simulateTimeout();
|
|
1622
1660
|
|