@webex/plugin-meetings 3.0.0-beta.162 → 3.0.0-beta.164

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.
Files changed (64) hide show
  1. package/dist/breakouts/breakout.js +7 -3
  2. package/dist/breakouts/breakout.js.map +1 -1
  3. package/dist/breakouts/events.js +31 -29
  4. package/dist/breakouts/events.js.map +1 -1
  5. package/dist/breakouts/index.js +4 -2
  6. package/dist/breakouts/index.js.map +1 -1
  7. package/dist/constants.js +2 -4
  8. package/dist/constants.js.map +1 -1
  9. package/dist/interpretation/index.js +1 -1
  10. package/dist/interpretation/siLanguage.js +1 -1
  11. package/dist/locus-info/index.js +33 -17
  12. package/dist/locus-info/index.js.map +1 -1
  13. package/dist/meeting/index.js +699 -682
  14. package/dist/meeting/index.js.map +1 -1
  15. package/dist/meeting/util.js +47 -25
  16. package/dist/meeting/util.js.map +1 -1
  17. package/dist/meeting-info/index.js +48 -7
  18. package/dist/meeting-info/index.js.map +1 -1
  19. package/dist/meeting-info/meeting-info-v2.js +24 -10
  20. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  21. package/dist/meetings/index.js +12 -9
  22. package/dist/meetings/index.js.map +1 -1
  23. package/dist/metrics/index.js +1 -487
  24. package/dist/metrics/index.js.map +1 -1
  25. package/dist/reconnection-manager/index.js +27 -17
  26. package/dist/reconnection-manager/index.js.map +1 -1
  27. package/dist/roap/request.js +20 -14
  28. package/dist/roap/request.js.map +1 -1
  29. package/dist/types/breakouts/events.d.ts +7 -1
  30. package/dist/types/constants.d.ts +0 -1
  31. package/dist/types/meeting/index.d.ts +31 -133
  32. package/dist/types/meeting-info/index.d.ts +6 -1
  33. package/dist/types/meetings/index.d.ts +1 -0
  34. package/dist/types/metrics/index.d.ts +4 -128
  35. package/package.json +19 -19
  36. package/src/breakouts/breakout.ts +10 -2
  37. package/src/breakouts/events.ts +51 -32
  38. package/src/breakouts/index.ts +9 -5
  39. package/src/constants.ts +0 -2
  40. package/src/locus-info/index.ts +35 -17
  41. package/src/meeting/index.ts +474 -536
  42. package/src/meeting/util.ts +42 -19
  43. package/src/meeting-info/index.ts +54 -8
  44. package/src/meeting-info/meeting-info-v2.ts +24 -9
  45. package/src/meetings/index.ts +11 -6
  46. package/src/metrics/index.ts +1 -506
  47. package/src/reconnection-manager/index.ts +27 -17
  48. package/src/roap/request.ts +21 -9
  49. package/test/unit/spec/breakouts/breakout.ts +4 -2
  50. package/test/unit/spec/breakouts/events.ts +24 -18
  51. package/test/unit/spec/locus-info/index.js +112 -0
  52. package/test/unit/spec/meeting/index.js +178 -145
  53. package/test/unit/spec/meeting/utils.js +93 -7
  54. package/test/unit/spec/meeting-info/index.js +181 -0
  55. package/test/unit/spec/meeting-info/meetinginfov2.js +68 -68
  56. package/test/unit/spec/meetings/index.js +35 -55
  57. package/test/unit/spec/metrics/index.js +1 -148
  58. package/test/unit/spec/reconnection-manager/index.js +51 -2
  59. package/test/unit/spec/roap/index.ts +8 -2
  60. package/test/unit/spec/roap/request.ts +43 -5
  61. package/dist/metrics/config.js +0 -335
  62. package/dist/metrics/config.js.map +0 -1
  63. package/dist/types/metrics/config.d.ts +0 -195
  64. package/src/metrics/config.ts +0 -534
@@ -25,7 +25,6 @@ var _constants = require("../constants");
25
25
  var _constants2 = _interopRequireDefault(require("../metrics/constants"));
26
26
  var _reconnection = _interopRequireDefault(require("../common/errors/reconnection"));
27
27
  var _reconnectionInProgress = _interopRequireDefault(require("../common/errors/reconnection-in-progress"));
28
- var _config = require("../metrics/config");
29
28
  var _metrics = _interopRequireDefault(require("../metrics"));
30
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); }; }
31
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; } }
@@ -352,9 +351,13 @@ var ReconnectionManager = /*#__PURE__*/function () {
352
351
  if (!networkRetry) {
353
352
  // Only log START metrics on the initial reconnect
354
353
  _loggerProxy.default.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect start metric.');
355
- _metrics.default.postEvent({
356
- event: _config.eventType.MEDIA_RECONNECTING,
357
- meeting: this.meeting
354
+
355
+ // @ts-ignore
356
+ this.webex.internal.newMetrics.submitClientEvent({
357
+ name: 'client.media.reconnecting',
358
+ options: {
359
+ meetingId: this.meeting.id
360
+ }
358
361
  });
359
362
  }
360
363
  return _context2.abrupt("return", this.executeReconnection({
@@ -362,11 +365,15 @@ var ReconnectionManager = /*#__PURE__*/function () {
362
365
  }).then(function () {
363
366
  _loggerProxy.default.logger.info('ReconnectionManager:index#reconnect --> Reconnection successful.');
364
367
  _loggerProxy.default.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect success metric.');
365
- _metrics.default.postEvent({
366
- event: _config.eventType.MEDIA_RECOVERED,
367
- meeting: _this3.meeting,
368
- data: {
369
- recoveredBy: _config.reconnection.RECOVERED_BY_NEW
368
+
369
+ // @ts-ignore
370
+ _this3.webex.internal.newMetrics.submitClientEvent({
371
+ name: 'client.media.recovered',
372
+ payload: {
373
+ recoveredBy: 'new'
374
+ },
375
+ options: {
376
+ meetingId: _this3.meeting.id
370
377
  }
371
378
  });
372
379
  }).catch(function (reconnectError) {
@@ -385,20 +392,23 @@ var ReconnectionManager = /*#__PURE__*/function () {
385
392
  // Reconnect has failed
386
393
  _loggerProxy.default.logger.error('ReconnectionManager:index#reconnect --> Reconnection failed.', reconnectError.message);
387
394
  _loggerProxy.default.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect abort metric.');
388
- var reconnectMetric = {
389
- event: _config.eventType.CALL_ABORTED,
390
- meeting: _this3.meeting,
391
- data: {
395
+
396
+ // @ts-ignore
397
+ _this3.webex.internal.newMetrics.submitClientEvent({
398
+ name: 'client.call.aborted',
399
+ payload: {
392
400
  errors: [{
393
- category: _config.errorObjects.category.expected,
401
+ category: 'expected',
394
402
  errorCode: 2008,
395
403
  fatal: true,
396
- name: _config.errorObjects.name.mediaEngine,
404
+ name: 'media-engine',
397
405
  shownToUser: false
398
406
  }]
407
+ },
408
+ options: {
409
+ meetingId: _this3.meeting.id
399
410
  }
400
- };
401
- _metrics.default.postEvent(reconnectMetric);
411
+ });
402
412
  if (reconnectError instanceof NeedsRejoinError) {
403
413
  // send call aborded event with catogery as expected as we are trying to rejoin
404
414
 
@@ -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","unpublishTracks","mediaProperties","shareTrack","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_STOPPED_SHARING_LOCAL","IN_PROGRESS","enabled","COMPLETE","info","ReconnectInProgress","ReconnectionError","networkDisconnect","networkRetry","id","validate","Metrics","postEvent","event","eventType","MEDIA_RECONNECTING","executeReconnection","then","MEDIA_RECOVERED","data","recoveredBy","RECOVERED_BY_NEW","catch","reconnectError","reconnect","message","reconnectMetric","CALL_ABORTED","errors","category","errorObjects","expected","errorCode","fatal","name","mediaEngine","shownToUser","rejoinMeeting","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","stopLocalShareTrack","SHARE_STOPPED_REASON","MEDIA_RECONNECTION","reconnectMercuryWebSocket","internal","device","url","FAILURE","meetings","syncMeetings","getMeetingByType","_ID_","state","_LEFT_","type","_CALL_","reconnectMedia","media","join","rejoin","MEETING_REJOIN","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} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport ReconnectionError from '../common/errors/reconnection';\nimport ReconnectInProgress from '../common/errors/reconnection-in-progress';\nimport {eventType, reconnection, errorObjects} from '../metrics/config';\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 {String}\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 track.\n *\n * @param {string} reason a {@link SHARE_STOPPED_REASON}\n * @returns {undefined}\n * @private\n * @memberof ReconnectionManager\n */\n private async stopLocalShareTrack(reason: string) {\n await this.meeting.unpublishTracks([this.meeting.mediaProperties.shareTrack]); // todo screen share audio SPARK-399690\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'stopLocalShareTrack',\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 {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 Metrics.postEvent({\n event: eventType.MEDIA_RECONNECTING,\n meeting: this.meeting,\n });\n }\n\n return this.executeReconnection({networkDisconnect})\n .then(() => {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Reconnection successful.');\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect success metric.'\n );\n Metrics.postEvent({\n event: eventType.MEDIA_RECOVERED,\n meeting: this.meeting,\n data: {recoveredBy: reconnection.RECOVERED_BY_NEW},\n });\n })\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 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 const reconnectMetric = {\n event: eventType.CALL_ABORTED,\n meeting: this.meeting,\n data: {\n errors: [\n {\n category: errorObjects.category.expected,\n errorCode: 2008,\n fatal: true,\n name: errorObjects.name.mediaEngine,\n shownToUser: false,\n },\n ],\n },\n };\n\n Metrics.postEvent(reconnectMetric);\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.stopLocalShareTrack(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();\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 --> Media reestablished'\n );\n this.status = RECONNECTION.STATE.COMPLETE;\n\n return media;\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Media reestablishment failed'\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.stopLocalShareTrack(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(\n 'ReconnectionManager:index#reconnectMedia --> Begin reestablishment of media'\n );\n\n // do the TURN server discovery again since the TURN server might change\n const turnServerResult = await this.meeting.roap.doTurnDiscovery(this.meeting, 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 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","unpublishTracks","mediaProperties","shareTrack","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","then","payload","recoveredBy","catch","reconnectError","reconnect","message","errors","category","errorCode","fatal","shownToUser","rejoinMeeting","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","stopLocalShareTrack","SHARE_STOPPED_REASON","MEDIA_RECONNECTION","reconnectMercuryWebSocket","device","url","FAILURE","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} 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 {String}\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 track.\n *\n * @param {string} reason a {@link SHARE_STOPPED_REASON}\n * @returns {undefined}\n * @private\n * @memberof ReconnectionManager\n */\n private async stopLocalShareTrack(reason: string) {\n await this.meeting.unpublishTracks([this.meeting.mediaProperties.shareTrack]); // todo screen share audio SPARK-399690\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'stopLocalShareTrack',\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 {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})\n .then(() => {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Reconnection successful.');\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect success metric.'\n );\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 })\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 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.stopLocalShareTrack(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();\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 --> Media reestablished'\n );\n this.status = RECONNECTION.STATE.COMPLETE;\n\n return media;\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Media reestablishment failed'\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.stopLocalShareTrack(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(\n 'ReconnectionManager:index#reconnectMedia --> Begin reestablishment of media'\n );\n\n // do the TURN server discovery again since the TURN server might change\n const turnServerResult = await this.meeting.roap.doTurnDiscovery(this.meeting, 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 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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"}
@@ -26,8 +26,6 @@ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/he
26
26
  var _webexCore = require("@webex/webex-core");
27
27
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
28
28
  var _constants = require("../constants");
29
- var _metrics = _interopRequireDefault(require("../metrics"));
30
- var _config = require("../metrics/config");
31
29
  function ownKeys(object, enumerableOnly) { var keys = _Object$keys2(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
32
30
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
33
31
  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); }; }
@@ -113,6 +111,7 @@ var RoapRequest = /*#__PURE__*/function (_StatelessWebexPlugin) {
113
111
  key: "sendRoap",
114
112
  value: function () {
115
113
  var _sendRoap = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(options) {
114
+ var _this = this;
116
115
  var roapMessage, locusSelfUrl, mediaId, meetingId, locusMediaRequest, _yield$this$attachRea, localSdpWithReachabilityData, joinCookie;
117
116
  return _regenerator.default.wrap(function _callee2$(_context2) {
118
117
  while (1) switch (_context2.prev = _context2.next) {
@@ -137,9 +136,13 @@ var RoapRequest = /*#__PURE__*/function (_StatelessWebexPlugin) {
137
136
  localSdpWithReachabilityData = _yield$this$attachRea.localSdp;
138
137
  joinCookie = _yield$this$attachRea.joinCookie;
139
138
  _loggerProxy.default.logger.info("Roap:request#sendRoap --> ".concat(locusSelfUrl, " \n ").concat(roapMessage.messageType, " \n seq:").concat(roapMessage.seq));
140
- _metrics.default.postEvent({
141
- event: _config.eventType.MEDIA_REQUEST,
142
- meetingId: meetingId
139
+
140
+ // @ts-ignore
141
+ this.webex.internal.newMetrics.submitClientEvent({
142
+ name: 'client.locus.media.request',
143
+ options: {
144
+ meetingId: meetingId
145
+ }
143
146
  });
144
147
  return _context2.abrupt("return", locusMediaRequest.send({
145
148
  type: 'RoapMessage',
@@ -149,11 +152,13 @@ var RoapRequest = /*#__PURE__*/function (_StatelessWebexPlugin) {
149
152
  roapMessage: roapMessage,
150
153
  reachability: localSdpWithReachabilityData.reachability
151
154
  }).then(function (res) {
152
- _metrics.default.postEvent({
153
- event: _config.eventType.MEDIA_RESPONSE,
154
- meetingId: meetingId
155
+ // @ts-ignore
156
+ _this.webex.internal.newMetrics.submitClientEvent({
157
+ name: 'client.locus.media.response',
158
+ options: {
159
+ meetingId: meetingId
160
+ }
155
161
  });
156
-
157
162
  // always it will be the first mediaConnection Object
158
163
  var mediaConnections = res.body.mediaConnections && res.body.mediaConnections.length > 0 && res.body.mediaConnections[0];
159
164
  _loggerProxy.default.logger.debug("Roap:request#sendRoap --> response:".concat((0, _stringify.default)(mediaConnections, null, 2), "'\n StatusCode:'").concat(res.statusCode));
@@ -165,11 +170,12 @@ var RoapRequest = /*#__PURE__*/function (_StatelessWebexPlugin) {
165
170
  mediaConnections: res.body.mediaConnections
166
171
  });
167
172
  }).catch(function (err) {
168
- _metrics.default.postEvent({
169
- event: _config.eventType.MEDIA_RESPONSE,
170
- meetingId: meetingId,
171
- data: {
172
- error: _metrics.default.parseLocusError(err, true)
173
+ // @ts-ignore
174
+ _this.webex.internal.newMetrics.submitClientEvent({
175
+ name: 'client.locus.media.response',
176
+ options: {
177
+ meetingId: meetingId,
178
+ rawError: err
173
179
  }
174
180
  });
175
181
  _loggerProxy.default.logger.error("Roap:request#sendRoap --> Error:".concat((0, _stringify.default)(err, null, 2)));
@@ -1 +1 @@
1
- {"version":3,"names":["RoapRequest","localSdp","webex","boundedStorage","get","REACHABILITY","namespace","localStorageResult","catch","reachabilityData","reachabilityResult","JSON","parse","length","reachability","e","LoggerProxy","logger","error","localStorageJoinCookie","joinCookieRaw","joinCookie","options","roapMessage","locusSelfUrl","mediaId","meetingId","locusMediaRequest","info","warn","reject","Error","attachReachabilityData","localSdpWithReachabilityData","messageType","seq","Metrics","postEvent","event","eventType","MEDIA_REQUEST","send","type","selfUrl","then","res","MEDIA_RESPONSE","mediaConnections","body","debug","statusCode","locus","roapSeq","err","data","parseLocusError","StatelessWebexPlugin"],"sources":["request.ts"],"sourcesContent":["// @ts-ignore\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {REACHABILITY} from '../constants';\nimport Metrics from '../metrics';\nimport {eventType} from '../metrics/config';\nimport {LocusMediaRequest} from '../meeting/locusMediaRequest';\n\n/**\n * @class RoapRequest\n */\nexport default class RoapRequest extends StatelessWebexPlugin {\n /**\n * Returns reachability data.\n * @param {Object} localSdp\n * @returns {Object}\n */\n async attachReachabilityData(localSdp) {\n let joinCookie;\n\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResult = JSON.parse(reachabilityData);\n\n /* istanbul ignore else */\n if (reachabilityResult && Object.keys(reachabilityResult).length) {\n localSdp.reachability = reachabilityResult;\n }\n } catch (e) {\n LoggerProxy.logger.error(\n `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n // @ts-ignore\n const joinCookieRaw = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)\n .catch(() => {});\n\n if (joinCookieRaw) {\n try {\n joinCookie = JSON.parse(joinCookieRaw);\n } catch (e) {\n LoggerProxy.logger.error(\n `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`\n );\n }\n }\n\n return {localSdp, joinCookie};\n }\n\n /**\n * Sends a ROAP message\n * @param {Object} options\n * @param {Object} options.roapMessage\n * @param {String} options.locusSelfUrl\n * @param {String} options.mediaId\n * @param {String} options.correlationId\n * @param {String} options.meetingId\n * @returns {Promise} returns the response/failure of the request\n */\n async sendRoap(options: {\n roapMessage: any;\n locusSelfUrl: string;\n mediaId: string;\n meetingId: string;\n locusMediaRequest?: LocusMediaRequest;\n }) {\n const {roapMessage, locusSelfUrl, mediaId, meetingId, locusMediaRequest} = options;\n\n if (!mediaId) {\n LoggerProxy.logger.info('Roap:request#sendRoap --> sending empty mediaID');\n }\n\n if (!locusMediaRequest) {\n LoggerProxy.logger.warn(\n 'Roap:request#sendRoap --> locusMediaRequest unavailable, not sending roap'\n );\n\n return Promise.reject(new Error('sendRoap called when locusMediaRequest is undefined'));\n }\n const {localSdp: localSdpWithReachabilityData, joinCookie} = await this.attachReachabilityData({\n roapMessage,\n });\n\n LoggerProxy.logger.info(\n `Roap:request#sendRoap --> ${locusSelfUrl} \\n ${roapMessage.messageType} \\n seq:${roapMessage.seq}`\n );\n\n Metrics.postEvent({event: eventType.MEDIA_REQUEST, meetingId});\n\n return locusMediaRequest\n .send({\n type: 'RoapMessage',\n selfUrl: locusSelfUrl,\n joinCookie,\n mediaId,\n roapMessage,\n reachability: localSdpWithReachabilityData.reachability,\n })\n .then((res) => {\n Metrics.postEvent({event: eventType.MEDIA_RESPONSE, meetingId});\n\n // always it will be the first mediaConnection Object\n const mediaConnections =\n res.body.mediaConnections &&\n res.body.mediaConnections.length > 0 &&\n res.body.mediaConnections[0];\n\n LoggerProxy.logger.debug(\n `Roap:request#sendRoap --> response:${JSON.stringify(\n mediaConnections,\n null,\n 2\n )}'\\n StatusCode:'${res.statusCode}`\n );\n const {locus} = res.body;\n\n locus.roapSeq = options.roapMessage.seq;\n\n return {\n locus,\n ...(mediaConnections && {mediaConnections: res.body.mediaConnections}),\n };\n })\n .catch((err) => {\n Metrics.postEvent({\n event: eventType.MEDIA_RESPONSE,\n meetingId,\n data: {error: Metrics.parseLocusError(err, true)},\n });\n LoggerProxy.logger.error(`Roap:request#sendRoap --> Error:${JSON.stringify(err, null, 2)}`);\n LoggerProxy.logger.error(\n `Roap:request#sendRoapRequest --> errorBody:${JSON.stringify(\n roapMessage,\n null,\n 2\n )} + '\\\\n mediaId:'${options.mediaId}`\n );\n throw err;\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["RoapRequest","localSdp","webex","boundedStorage","get","REACHABILITY","namespace","localStorageResult","catch","reachabilityData","reachabilityResult","JSON","parse","length","reachability","e","LoggerProxy","logger","error","localStorageJoinCookie","joinCookieRaw","joinCookie","options","roapMessage","locusSelfUrl","mediaId","meetingId","locusMediaRequest","info","warn","reject","Error","attachReachabilityData","localSdpWithReachabilityData","messageType","seq","internal","newMetrics","submitClientEvent","name","send","type","selfUrl","then","res","mediaConnections","body","debug","statusCode","locus","roapSeq","err","rawError","StatelessWebexPlugin"],"sources":["request.ts"],"sourcesContent":["// @ts-ignore\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {REACHABILITY} from '../constants';\nimport {LocusMediaRequest} from '../meeting/locusMediaRequest';\n\n/**\n * @class RoapRequest\n */\nexport default class RoapRequest extends StatelessWebexPlugin {\n /**\n * Returns reachability data.\n * @param {Object} localSdp\n * @returns {Object}\n */\n async attachReachabilityData(localSdp) {\n let joinCookie;\n\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResult = JSON.parse(reachabilityData);\n\n /* istanbul ignore else */\n if (reachabilityResult && Object.keys(reachabilityResult).length) {\n localSdp.reachability = reachabilityResult;\n }\n } catch (e) {\n LoggerProxy.logger.error(\n `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n // @ts-ignore\n const joinCookieRaw = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)\n .catch(() => {});\n\n if (joinCookieRaw) {\n try {\n joinCookie = JSON.parse(joinCookieRaw);\n } catch (e) {\n LoggerProxy.logger.error(\n `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`\n );\n }\n }\n\n return {localSdp, joinCookie};\n }\n\n /**\n * Sends a ROAP message\n * @param {Object} options\n * @param {Object} options.roapMessage\n * @param {String} options.locusSelfUrl\n * @param {String} options.mediaId\n * @param {String} options.correlationId\n * @param {String} options.meetingId\n * @returns {Promise} returns the response/failure of the request\n */\n async sendRoap(options: {\n roapMessage: any;\n locusSelfUrl: string;\n mediaId: string;\n meetingId: string;\n locusMediaRequest?: LocusMediaRequest;\n }) {\n const {roapMessage, locusSelfUrl, mediaId, meetingId, locusMediaRequest} = options;\n\n if (!mediaId) {\n LoggerProxy.logger.info('Roap:request#sendRoap --> sending empty mediaID');\n }\n\n if (!locusMediaRequest) {\n LoggerProxy.logger.warn(\n 'Roap:request#sendRoap --> locusMediaRequest unavailable, not sending roap'\n );\n\n return Promise.reject(new Error('sendRoap called when locusMediaRequest is undefined'));\n }\n const {localSdp: localSdpWithReachabilityData, joinCookie} = await this.attachReachabilityData({\n roapMessage,\n });\n\n LoggerProxy.logger.info(\n `Roap:request#sendRoap --> ${locusSelfUrl} \\n ${roapMessage.messageType} \\n seq:${roapMessage.seq}`\n );\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.locus.media.request',\n options: {\n meetingId,\n },\n });\n\n return locusMediaRequest\n .send({\n type: 'RoapMessage',\n selfUrl: locusSelfUrl,\n joinCookie,\n mediaId,\n roapMessage,\n reachability: localSdpWithReachabilityData.reachability,\n })\n .then((res) => {\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.locus.media.response',\n options: {\n meetingId,\n },\n });\n // always it will be the first mediaConnection Object\n const mediaConnections =\n res.body.mediaConnections &&\n res.body.mediaConnections.length > 0 &&\n res.body.mediaConnections[0];\n\n LoggerProxy.logger.debug(\n `Roap:request#sendRoap --> response:${JSON.stringify(\n mediaConnections,\n null,\n 2\n )}'\\n StatusCode:'${res.statusCode}`\n );\n const {locus} = res.body;\n\n locus.roapSeq = options.roapMessage.seq;\n\n return {\n locus,\n ...(mediaConnections && {mediaConnections: res.body.mediaConnections}),\n };\n })\n .catch((err) => {\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.locus.media.response',\n options: {\n meetingId,\n rawError: err,\n },\n });\n LoggerProxy.logger.error(`Roap:request#sendRoap --> Error:${JSON.stringify(err, null, 2)}`);\n LoggerProxy.logger.error(\n `Roap:request#sendRoapRequest --> errorBody:${JSON.stringify(\n roapMessage,\n null,\n 2\n )} + '\\\\n mediaId:'${options.mediaId}`\n );\n throw err;\n });\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,8 @@
1
- declare const breakoutEvent: any;
1
+ import { ClientEvent } from '@webex/internal-plugin-metrics';
2
+ declare const breakoutEvent: {
3
+ onBreakoutMoveRequest: (eventInfo: any, submitClientEvent: any) => void;
4
+ onBreakoutMoveResponse: (eventInfo: any, submitClientEvent: any) => void;
5
+ onBreakoutJoinResponse: (eventInfo: any, submitClientEvent: any) => void;
6
+ postMoveCallAnalyzer: (event: ClientEvent['name'], eventInfo: any, submitClientEvent: any) => void;
7
+ };
2
8
  export default breakoutEvent;
@@ -949,7 +949,6 @@ export declare const MEDIA_DEVICES: {
949
949
  SPEAKER: string;
950
950
  CAMERA: string;
951
951
  };
952
- export declare const METRICS_JOIN_TIMES_MAX_DURATION = 1200000;
953
952
  export declare const PSTN_STATUS: {
954
953
  JOINED: string;
955
954
  CONNECTED: string;
@@ -1,5 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  import { StatelessWebexPlugin } from '@webex/webex-core';
3
+ import { ClientEvent } from '@webex/internal-plugin-metrics';
3
4
  import { LocalTrack, LocalCameraTrack, LocalDisplayTrack, LocalMicrophoneTrack, TrackMuteEvent } from '@webex/media-helpers';
4
5
  import { StatsAnalyzer } from '../statsAnalyzer';
5
6
  import NetworkQualityMonitor from '../networkQualityMonitor';
@@ -441,12 +442,12 @@ export default class Meeting extends StatelessWebexPlugin {
441
442
  refreshCaptcha(): any;
442
443
  /**
443
444
  * Posts metrics event for this meeting. Allows the app to send Call Analyzer events.
444
- * @param {String} eventName - Call Analyzer event, see eventType in src/metrics/config.ts for possible values
445
+ * @param {String} eventName - Call Analyzer event
445
446
  * @public
446
447
  * @memberof Meeting
447
448
  * @returns {Promise}
448
449
  */
449
- postMetrics(eventName: string): void;
450
+ postMetrics(eventName: ClientEvent['name']): void;
450
451
  /**
451
452
  * Proxy function for all the listener set ups
452
453
  * @returns {undefined}
@@ -489,52 +490,6 @@ export default class Meeting extends StatelessWebexPlugin {
489
490
  * @memberof Meeting
490
491
  */
491
492
  private setUpLocusFullStateListener;
492
- /**
493
- * get the metrics payload pre
494
- * @param {Object} options
495
- * @param {String} options.event
496
- * @param {String} options.trackingId
497
- * @param {Object} options.locus
498
- * @param {Array} options.mediaConnections
499
- * @param {Object} options.errors
500
- * @returns {Object}
501
- * @memberof Meeting
502
- */
503
- getAnalyzerMetricsPrePayload(options: {
504
- type?: string;
505
- event: string;
506
- trackingId: string;
507
- locus: object;
508
- mediaConnections?: Array<any>;
509
- errors?: object;
510
- meetingLookupUrl?: string;
511
- clientType?: any;
512
- subClientType?: any;
513
- [key: string]: any;
514
- }): {};
515
- /**
516
- * Send the metrics to call-analyzer dashboard
517
- * @param {Object} options
518
- * @param {String} options.event
519
- * @param {String} options.trackingId
520
- * @param {Object} options.locus
521
- * @param {Object} options.errors
522
- * @returns {Promise}
523
- * @private
524
- * @memberof Meeting
525
- */
526
- private sendCallAnalyzerMetrics;
527
- /**
528
- * Send the metrics to Media Quality Analyzer dashboard
529
- * @param {Object} options
530
- * @param {String} options.event
531
- * @param {String} options.trackingId
532
- * @param {Object} options.locus
533
- * @returns {Promise}
534
- * @private
535
- * @memberof Meeting
536
- */
537
- private sendMediaQualityAnalyzerMetrics;
538
493
  /**
539
494
  * sets the network status on meeting object
540
495
  * @param {String} networkStatus
@@ -888,6 +843,34 @@ export default class Meeting extends StatelessWebexPlugin {
888
843
  * @memberof Meeting
889
844
  */
890
845
  private setCorrelationId;
846
+ /**
847
+ * Mute the audio for a meeting
848
+ * @returns {Promise} resolves the data from muting audio {mute, self} or rejects if there is no audio set
849
+ * @public
850
+ * @memberof Meeting
851
+ */
852
+ muteAudio(): any;
853
+ /**
854
+ * Unmute meeting audio
855
+ * @returns {Promise} resolves data from muting audio {mute, self} or rejects if there is no audio set
856
+ * @public
857
+ * @memberof Meeting
858
+ */
859
+ unmuteAudio(): any;
860
+ /**
861
+ * Mute the video for a meeting
862
+ * @returns {Promise} resolves data from muting video {mute, self} or rejects if there is no video set
863
+ * @public
864
+ * @memberof Meeting
865
+ */
866
+ muteVideo(): any;
867
+ /**
868
+ * Unmute meeting video
869
+ * @returns {Promise} resolves data from muting video {mute, self} or rejects if there is no video set
870
+ * @public
871
+ * @memberof Meeting
872
+ */
873
+ unmuteVideo(): any;
891
874
  /**
892
875
  * Shorthand function to join AND set up media
893
876
  * @param {Object} options - options to join with media
@@ -1338,96 +1321,11 @@ export default class Meeting extends StatelessWebexPlugin {
1338
1321
  * @returns {undefined}
1339
1322
  */
1340
1323
  private handleMediaLogging;
1341
- /**
1342
- * @param {string} typeMedia 'audio' or 'video'
1343
- * @returns {undefined}
1344
- */
1345
- setStartSetupDelay(typeMedia: string): void;
1346
- /**
1347
- * @param {string} typeMedia 'audio' or 'video'
1348
- * @returns {undefined}
1349
- */
1350
- setEndSetupDelay(typeMedia: string): void;
1351
- /**
1352
- * @param {string} typeMedia 'audio' or 'video'
1353
- * @returns {string} duration between start and end of setup
1354
- */
1355
- getSetupDelayDuration(typeMedia: string): number;
1356
- /**
1357
- * @param {string} typeMedia 'audio' or 'video'
1358
- * @returns {undefined}
1359
- */
1360
- setStartSendingMediaDelay(typeMedia: string): void;
1361
- /**
1362
- * @param {string} typeMedia 'audio' or 'video'
1363
- * @returns {undefined}
1364
- */
1365
- setEndSendingMediaDelay(typeMedia: string): void;
1366
- /**
1367
- * @param {string} typeMedia 'audio' or 'video'
1368
- * @returns {string} duration between join response and first media tx
1369
- */
1370
- getSendingMediaDelayDuration(typeMedia: string): number;
1371
- /**
1372
- *
1373
- * @returns {undefined}
1374
- */
1375
- setStartLocalSDPGenRemoteSDPRecvDelay(): void;
1376
- /**
1377
- *
1378
- * @returns {undefined}
1379
- */
1380
- setEndLocalSDPGenRemoteSDPRecvDelay(): void;
1381
- /**
1382
- *
1383
- * @returns {string} duration between local SDP generation and remote SDP reception
1384
- */
1385
- getLocalSDPGenRemoteSDPRecvDelay(): number;
1386
- /**
1387
- *
1388
- * @returns {undefined}
1389
- */
1390
- setStartCallInitJoinReq(): void;
1391
- /**
1392
- *
1393
- * @returns {undefined}
1394
- */
1395
- setEndCallInitJoinReq(): void;
1396
- /**
1397
- *
1398
- * @returns {string} duration between call initiate and sending join request to locus
1399
- */
1400
- getCallInitJoinReq(): number;
1401
- /**
1402
- *
1403
- * @returns {undefined}
1404
- */
1405
- setStartJoinReqResp(): void;
1406
- /**
1407
- *
1408
- * @returns {undefined}
1409
- */
1410
- setEndJoinReqResp(): void;
1411
- /**
1412
- *
1413
- * @returns {string} duration between sending locus join request and receiving join response
1414
- */
1415
- getJoinReqResp(): number;
1416
- /**
1417
- *
1418
- * @returns {string} duration between call initiate and successful locus join (even if it is in lobby)
1419
- */
1420
- getTotalJmt(): number;
1421
1324
  /**
1422
1325
  *
1423
1326
  * @returns {string} one of 'attendee','host','cohost', returns the user type of the current user
1424
1327
  */
1425
1328
  getCurUserType(): "host" | "cohost" | "attendee";
1426
- /**
1427
- *
1428
- * @returns {string} one of 'login-ci','unverified-guest', returns the login type of the current user
1429
- */
1430
- getCurLoginType(): "unverified-guest" | "login-ci";
1431
1329
  /**
1432
1330
  * End the current meeting for all
1433
1331
  * @returns {Promise}
@@ -53,5 +53,10 @@ export default class MeetingInfo {
53
53
  * @public
54
54
  * @memberof MeetingInfo
55
55
  */
56
- fetchMeetingInfo(destination: string, type?: string): any;
56
+ fetchMeetingInfo(destination: string, type?: string, password?: string, captchaInfo?: {
57
+ code: string;
58
+ id: string;
59
+ }, installedOrgID?: any, locusId?: any, extraParams?: object, options?: {
60
+ meetingId?: string;
61
+ }): any;
57
62
  }
@@ -1,5 +1,6 @@
1
1
  import '@webex/internal-plugin-mercury';
2
2
  import '@webex/internal-plugin-conversation';
3
+ import '@webex/internal-plugin-metrics';
3
4
  import { WebexPlugin } from '@webex/webex-core';
4
5
  import 'webrtc-adapter';
5
6
  import { INoiseReductionEffect, IVirtualBackgroundEffect } from './meetings.types';