@webex/plugin-meetings 3.0.0-beta.330 → 3.0.0-beta.331
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/reconnection-manager/index.js +1 -2
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/webinar/index.js +1 -1
- package/package.json +19 -19
- package/src/reconnection-manager/index.ts +1 -2
- package/test/unit/spec/meeting/index.js +10 -0
- package/test/unit/spec/reconnection-manager/index.js +33 -18
package/dist/breakouts/index.js
CHANGED
|
@@ -1041,7 +1041,7 @@ var Breakouts = _webexCore.WebexPlugin.extend({
|
|
|
1041
1041
|
this.trigger(_constants.BREAKOUTS.EVENTS.ASK_RETURN_TO_MAIN);
|
|
1042
1042
|
}
|
|
1043
1043
|
},
|
|
1044
|
-
version: "3.0.0-beta.
|
|
1044
|
+
version: "3.0.0-beta.331"
|
|
1045
1045
|
});
|
|
1046
1046
|
var _default = Breakouts;
|
|
1047
1047
|
exports.default = _default;
|
|
@@ -23,9 +23,9 @@ var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy")
|
|
|
23
23
|
var _triggerProxy = _interopRequireDefault(require("../common/events/trigger-proxy"));
|
|
24
24
|
var _constants = require("../constants");
|
|
25
25
|
var _constants2 = _interopRequireDefault(require("../metrics/constants"));
|
|
26
|
-
var _reconnection = _interopRequireDefault(require("../common/errors/reconnection"));
|
|
27
26
|
var _reconnectionInProgress = _interopRequireDefault(require("../common/errors/reconnection-in-progress"));
|
|
28
27
|
var _metrics = _interopRequireDefault(require("../metrics"));
|
|
28
|
+
var _reconnection = _interopRequireDefault(require("../common/errors/reconnection"));
|
|
29
29
|
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
|
|
30
30
|
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
31
31
|
/**
|
|
@@ -242,7 +242,6 @@ var ReconnectionManager = /*#__PURE__*/function () {
|
|
|
242
242
|
key: "cleanUp",
|
|
243
243
|
value: function cleanUp() {
|
|
244
244
|
this.reset();
|
|
245
|
-
this.meeting = null;
|
|
246
245
|
}
|
|
247
246
|
|
|
248
247
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NeedsRetryError","Error","NeedsRejoinError","wasSharing","error","ReconnectionManager","meeting","iceState","disconnected","resolve","timer","undefined","timeoutDuration","config","reconnection","iceReconnectionTimeout","status","RECONNECTION","STATE","DEFAULT_STATUS","tryCount","DEFAULT_TRY_COUNT","webex","maxRejoinAttempts","rejoinAttempts","autoRejoinEnabled","autoRejoin","reset","clearTimeout","LoggerProxy","logger","log","resetReconnectionTimer","reject","setTimeout","reason","unpublishStreams","mediaProperties","shareVideoStream","shareAudioStream","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_STOPPED_SHARING_LOCAL","IN_PROGRESS","enabled","COMPLETE","info","ReconnectInProgress","ReconnectionError","networkDisconnect","networkRetry","id","validate","internal","newMetrics","submitClientEvent","name","options","meetingId","executeReconnection","catch","reconnectError","reconnect","message","payload","errors","category","errorCode","fatal","shownToUser","rejoinMeeting","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","stopLocalShareStream","SHARE_STOPPED_REASON","MEDIA_RECONNECTION","reconnectMercuryWebSocket","device","url","FAILURE","credentials","isUnverifiedGuest","meetings","syncMeetings","getMeetingByType","_ID_","state","_LEFT_","type","_CALL_","reconnectMedia","media","join","rejoin","MEETING_REJOIN","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETING_MAX_REJOIN_FAILURE","locus_id","locusUrl","split","pop","stack","roap","doTurnDiscovery","turnServerResult","iceServers","turnServerInfo","push","urls","username","credential","password","webrtcMediaConnection","isMultistream","mediaRequestManagers","forEach","mediaRequestManager","clearPreviousRequests","commit","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 ReconnectInProgress from '../common/errors/reconnection-in-progress';\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 tryCount: 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 {Number}\n * @private\n * @memberof ReconnectionManager\n */\n this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\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 = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\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.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public cleanUp() {\n this.reset();\n this.meeting = null;\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 * Sets the reconnection status\n *\n * @public\n * @param {RECONNECTION_STATE} status\n * @memberof ReconnectionManager\n * @returns {undefined}\n */\n public setStatus(status: RECONNECTION_STATE) {\n this.status = status;\n }\n\n /**\n * @returns {Boolean}\n * @throws {ReconnectionError}\n * @private\n * @memberof ReconnectionManager\n */\n private validate() {\n if (this.meeting.config.reconnection.enabled) {\n if (\n this.status === RECONNECTION.STATE.DEFAULT_STATUS ||\n this.status === RECONNECTION.STATE.COMPLETE\n ) {\n return true;\n }\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#validate --> Reconnection already in progress.'\n );\n\n throw new ReconnectInProgress('Reconnection already in progress.');\n }\n\n LoggerProxy.logger.info('ReconnectionManager:index#validate --> Reconnection is not enabled.');\n\n throw new ReconnectionError('Reconnection is not enabled.');\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 * @returns {Promise}\n * @public\n * @memberof ReconnectionManager\n */\n public async reconnect({\n networkDisconnect = false,\n networkRetry = false,\n }: {\n networkDisconnect?: boolean;\n networkRetry?: boolean;\n } = {}) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`\n );\n // First, validate that we can reconnect, if not, it will throw an error\n try {\n this.validate();\n } catch (error) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reconnection unable to begin.',\n error\n );\n throw error;\n }\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 return this.executeReconnection({networkDisconnect}).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 return this.reconnect({networkDisconnect: true, networkRetry: true});\n }\n\n // Reconnect has failed\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnect --> Reconnection failed.',\n reconnectError.message\n );\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect abort metric.'\n );\n\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 if (reconnectError instanceof NeedsRejoinError) {\n // send call aborded event with catogery as expected as we are trying to rejoin\n\n if (this.autoRejoinEnabled) {\n return this.rejoinMeeting(reconnectError.wasSharing);\n }\n }\n\n throw reconnectError;\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 this.status = RECONNECTION.STATE.IN_PROGRESS;\n\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 if (!this.webex.credentials.isUnverifiedGuest) {\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Updating meeting data from server.'\n );\n await this.webex.meetings.syncMeetings();\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\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) {\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":["NeedsRetryError","Error","NeedsRejoinError","wasSharing","error","ReconnectionManager","meeting","iceState","disconnected","resolve","timer","undefined","timeoutDuration","config","reconnection","iceReconnectionTimeout","status","RECONNECTION","STATE","DEFAULT_STATUS","tryCount","DEFAULT_TRY_COUNT","webex","maxRejoinAttempts","rejoinAttempts","autoRejoinEnabled","autoRejoin","reset","clearTimeout","LoggerProxy","logger","log","resetReconnectionTimer","reject","setTimeout","reason","unpublishStreams","mediaProperties","shareVideoStream","shareAudioStream","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_STOPPED_SHARING_LOCAL","IN_PROGRESS","enabled","COMPLETE","info","ReconnectInProgress","ReconnectionError","networkDisconnect","networkRetry","id","validate","internal","newMetrics","submitClientEvent","name","options","meetingId","executeReconnection","catch","reconnectError","reconnect","message","payload","errors","category","errorCode","fatal","shownToUser","rejoinMeeting","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","stopLocalShareStream","SHARE_STOPPED_REASON","MEDIA_RECONNECTION","reconnectMercuryWebSocket","device","url","FAILURE","credentials","isUnverifiedGuest","meetings","syncMeetings","getMeetingByType","_ID_","state","_LEFT_","type","_CALL_","reconnectMedia","media","join","rejoin","MEETING_REJOIN","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETING_MAX_REJOIN_FAILURE","locus_id","locusUrl","split","pop","stack","roap","doTurnDiscovery","turnServerResult","iceServers","turnServerInfo","push","urls","username","credential","password","webrtcMediaConnection","isMultistream","mediaRequestManagers","forEach","mediaRequestManager","clearPreviousRequests","commit","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 ReconnectInProgress from '../common/errors/reconnection-in-progress';\nimport Metrics from '../metrics';\nimport Meeting from '../meeting';\nimport {MediaRequestManager} from '../multistream/mediaRequestManager';\nimport ReconnectionError from '../common/errors/reconnection';\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 tryCount: 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 {Number}\n * @private\n * @memberof ReconnectionManager\n */\n this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\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 = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\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.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\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 * Sets the reconnection status\n *\n * @public\n * @param {RECONNECTION_STATE} status\n * @memberof ReconnectionManager\n * @returns {undefined}\n */\n public setStatus(status: RECONNECTION_STATE) {\n this.status = status;\n }\n\n /**\n * @returns {Boolean}\n * @throws {ReconnectionError}\n * @private\n * @memberof ReconnectionManager\n */\n private validate() {\n if (this.meeting.config.reconnection.enabled) {\n if (\n this.status === RECONNECTION.STATE.DEFAULT_STATUS ||\n this.status === RECONNECTION.STATE.COMPLETE\n ) {\n return true;\n }\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#validate --> Reconnection already in progress.'\n );\n\n throw new ReconnectInProgress('Reconnection already in progress.');\n }\n\n LoggerProxy.logger.info('ReconnectionManager:index#validate --> Reconnection is not enabled.');\n\n throw new ReconnectionError('Reconnection is not enabled.');\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 * @returns {Promise}\n * @public\n * @memberof ReconnectionManager\n */\n public async reconnect({\n networkDisconnect = false,\n networkRetry = false,\n }: {\n networkDisconnect?: boolean;\n networkRetry?: boolean;\n } = {}) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`\n );\n // First, validate that we can reconnect, if not, it will throw an error\n try {\n this.validate();\n } catch (error) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reconnection unable to begin.',\n error\n );\n throw error;\n }\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 return this.executeReconnection({networkDisconnect}).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 return this.reconnect({networkDisconnect: true, networkRetry: true});\n }\n\n // Reconnect has failed\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnect --> Reconnection failed.',\n reconnectError.message\n );\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect abort metric.'\n );\n\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 if (reconnectError instanceof NeedsRejoinError) {\n // send call aborded event with catogery as expected as we are trying to rejoin\n\n if (this.autoRejoinEnabled) {\n return this.rejoinMeeting(reconnectError.wasSharing);\n }\n }\n\n throw reconnectError;\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 this.status = RECONNECTION.STATE.IN_PROGRESS;\n\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 if (!this.webex.credentials.isUnverifiedGuest) {\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Updating meeting data from server.'\n );\n await this.webex.meetings.syncMeetings();\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\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) {\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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"}
|
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.0.0-beta.
|
|
65
|
+
version: "3.0.0-beta.331"
|
|
66
66
|
});
|
|
67
67
|
var _default = Webinar;
|
|
68
68
|
exports.default = _default;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/plugin-meetings",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.331",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
|
|
6
6
|
"contributors": [
|
|
@@ -33,12 +33,12 @@
|
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@peculiar/webcrypto": "^1.4.3",
|
|
36
|
-
"@webex/plugin-meetings": "3.0.0-beta.
|
|
37
|
-
"@webex/test-helper-chai": "3.0.0-beta.
|
|
38
|
-
"@webex/test-helper-mocha": "3.0.0-beta.
|
|
39
|
-
"@webex/test-helper-mock-webex": "3.0.0-beta.
|
|
40
|
-
"@webex/test-helper-retry": "3.0.0-beta.
|
|
41
|
-
"@webex/test-helper-test-users": "3.0.0-beta.
|
|
36
|
+
"@webex/plugin-meetings": "3.0.0-beta.331",
|
|
37
|
+
"@webex/test-helper-chai": "3.0.0-beta.331",
|
|
38
|
+
"@webex/test-helper-mocha": "3.0.0-beta.331",
|
|
39
|
+
"@webex/test-helper-mock-webex": "3.0.0-beta.331",
|
|
40
|
+
"@webex/test-helper-retry": "3.0.0-beta.331",
|
|
41
|
+
"@webex/test-helper-test-users": "3.0.0-beta.331",
|
|
42
42
|
"chai": "^4.3.4",
|
|
43
43
|
"chai-as-promised": "^7.1.1",
|
|
44
44
|
"jsdom-global": "3.0.2",
|
|
@@ -47,19 +47,19 @@
|
|
|
47
47
|
"typescript": "^4.7.4"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@webex/common": "3.0.0-beta.
|
|
50
|
+
"@webex/common": "3.0.0-beta.331",
|
|
51
51
|
"@webex/internal-media-core": "2.2.2",
|
|
52
|
-
"@webex/internal-plugin-conversation": "3.0.0-beta.
|
|
53
|
-
"@webex/internal-plugin-device": "3.0.0-beta.
|
|
54
|
-
"@webex/internal-plugin-llm": "3.0.0-beta.
|
|
55
|
-
"@webex/internal-plugin-mercury": "3.0.0-beta.
|
|
56
|
-
"@webex/internal-plugin-metrics": "3.0.0-beta.
|
|
57
|
-
"@webex/internal-plugin-support": "3.0.0-beta.
|
|
58
|
-
"@webex/internal-plugin-user": "3.0.0-beta.
|
|
59
|
-
"@webex/media-helpers": "3.0.0-beta.
|
|
60
|
-
"@webex/plugin-people": "3.0.0-beta.
|
|
61
|
-
"@webex/plugin-rooms": "3.0.0-beta.
|
|
62
|
-
"@webex/webex-core": "3.0.0-beta.
|
|
52
|
+
"@webex/internal-plugin-conversation": "3.0.0-beta.331",
|
|
53
|
+
"@webex/internal-plugin-device": "3.0.0-beta.331",
|
|
54
|
+
"@webex/internal-plugin-llm": "3.0.0-beta.331",
|
|
55
|
+
"@webex/internal-plugin-mercury": "3.0.0-beta.331",
|
|
56
|
+
"@webex/internal-plugin-metrics": "3.0.0-beta.331",
|
|
57
|
+
"@webex/internal-plugin-support": "3.0.0-beta.331",
|
|
58
|
+
"@webex/internal-plugin-user": "3.0.0-beta.331",
|
|
59
|
+
"@webex/media-helpers": "3.0.0-beta.331",
|
|
60
|
+
"@webex/plugin-people": "3.0.0-beta.331",
|
|
61
|
+
"@webex/plugin-rooms": "3.0.0-beta.331",
|
|
62
|
+
"@webex/webex-core": "3.0.0-beta.331",
|
|
63
63
|
"ampersand-collection": "^2.0.2",
|
|
64
64
|
"bowser": "^2.11.0",
|
|
65
65
|
"btoa": "^1.2.1",
|
|
@@ -17,11 +17,11 @@ import {
|
|
|
17
17
|
RECONNECTION_STATE,
|
|
18
18
|
} from '../constants';
|
|
19
19
|
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
20
|
-
import ReconnectionError from '../common/errors/reconnection';
|
|
21
20
|
import ReconnectInProgress from '../common/errors/reconnection-in-progress';
|
|
22
21
|
import Metrics from '../metrics';
|
|
23
22
|
import Meeting from '../meeting';
|
|
24
23
|
import {MediaRequestManager} from '../multistream/mediaRequestManager';
|
|
24
|
+
import ReconnectionError from '../common/errors/reconnection';
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
27
|
* Used to indicate that the reconnect logic needs to be retried.
|
|
@@ -228,7 +228,6 @@ export default class ReconnectionManager {
|
|
|
228
228
|
*/
|
|
229
229
|
public cleanUp() {
|
|
230
230
|
this.reset();
|
|
231
|
-
this.meeting = null;
|
|
232
231
|
}
|
|
233
232
|
|
|
234
233
|
/**
|
|
@@ -5684,6 +5684,16 @@ describe('plugin-meetings', () => {
|
|
|
5684
5684
|
});
|
|
5685
5685
|
});
|
|
5686
5686
|
|
|
5687
|
+
it('should reconnect successfully if reconnectionManager.cleanUp is called before reconnection attempt', async () => {
|
|
5688
|
+
meeting.reconnectionManager.cleanUp();
|
|
5689
|
+
|
|
5690
|
+
try {
|
|
5691
|
+
await meeting.reconnect();
|
|
5692
|
+
} catch (err) {
|
|
5693
|
+
assert.fail('reconnect should not error after clean up');
|
|
5694
|
+
}
|
|
5695
|
+
})
|
|
5696
|
+
|
|
5687
5697
|
it('should trigger reconnection success and send CA metric', async () => {
|
|
5688
5698
|
await meeting.reconnect();
|
|
5689
5699
|
|
|
@@ -178,9 +178,10 @@ describe('plugin-meetings', () => {
|
|
|
178
178
|
*/
|
|
179
179
|
describe('ReconnectionManager', () => {
|
|
180
180
|
let reconnectionManager;
|
|
181
|
+
let fakeMeeting;
|
|
181
182
|
|
|
182
183
|
beforeEach(() => {
|
|
183
|
-
|
|
184
|
+
fakeMeeting = {
|
|
184
185
|
config: {
|
|
185
186
|
reconnection: {
|
|
186
187
|
enabled: true,
|
|
@@ -195,7 +196,9 @@ describe('plugin-meetings', () => {
|
|
|
195
196
|
},
|
|
196
197
|
},
|
|
197
198
|
},
|
|
198
|
-
}
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
reconnectionManager = new ReconnectionManager(fakeMeeting);
|
|
199
202
|
});
|
|
200
203
|
|
|
201
204
|
describe('iceReconnected()', () => {
|
|
@@ -300,29 +303,41 @@ describe('plugin-meetings', () => {
|
|
|
300
303
|
assert.isTrue(reconnectionManager.iceState.disconnected);
|
|
301
304
|
});
|
|
302
305
|
});
|
|
306
|
+
});
|
|
303
307
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
+
describe('setStatus()', () => {
|
|
309
|
+
beforeEach(() => {
|
|
310
|
+
reconnectionManager.status = RECONNECTION.STATE.DEFAULT_STATUS;
|
|
311
|
+
});
|
|
308
312
|
|
|
309
|
-
|
|
310
|
-
|
|
313
|
+
it('should correctly change status to in progress', () => {
|
|
314
|
+
reconnectionManager.setStatus(RECONNECTION.STATE.IN_PROGRESS);
|
|
311
315
|
|
|
312
|
-
|
|
313
|
-
|
|
316
|
+
assert.equal(reconnectionManager.status, RECONNECTION.STATE.IN_PROGRESS);
|
|
317
|
+
});
|
|
314
318
|
|
|
315
|
-
|
|
316
|
-
|
|
319
|
+
it('should correctly change status to complete', () => {
|
|
320
|
+
reconnectionManager.setStatus(RECONNECTION.STATE.COMPLETE);
|
|
317
321
|
|
|
318
|
-
|
|
319
|
-
|
|
322
|
+
assert.equal(reconnectionManager.status, RECONNECTION.STATE.COMPLETE);
|
|
323
|
+
});
|
|
320
324
|
|
|
321
|
-
|
|
322
|
-
|
|
325
|
+
it('should correctly change status to failure', () => {
|
|
326
|
+
reconnectionManager.setStatus(RECONNECTION.STATE.FAILURE);
|
|
323
327
|
|
|
324
|
-
|
|
325
|
-
|
|
328
|
+
assert.equal(reconnectionManager.status, RECONNECTION.STATE.FAILURE);
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
describe('cleanUp()', () => {
|
|
333
|
+
it('should call reset and keep reference to meeting object', () => {
|
|
334
|
+
const resetSpy = sinon.spy(reconnectionManager, 'reset');
|
|
335
|
+
assert.equal(reconnectionManager.meeting, fakeMeeting);
|
|
336
|
+
|
|
337
|
+
reconnectionManager.cleanUp();
|
|
338
|
+
|
|
339
|
+
assert.equal(reconnectionManager.meeting, fakeMeeting);
|
|
340
|
+
assert.calledOnce(reconnectionManager.reset);
|
|
326
341
|
});
|
|
327
342
|
});
|
|
328
343
|
});
|