@webex/plugin-meetings 3.9.0 → 3.10.0

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 (117) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/constants.js +8 -0
  4. package/dist/constants.js.map +1 -1
  5. package/dist/controls-options-manager/index.js +22 -5
  6. package/dist/controls-options-manager/index.js.map +1 -1
  7. package/dist/index.js +2 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/interceptors/index.js +7 -0
  10. package/dist/interceptors/index.js.map +1 -1
  11. package/dist/interceptors/locusRouteToken.js +116 -0
  12. package/dist/interceptors/locusRouteToken.js.map +1 -0
  13. package/dist/interpretation/index.js +1 -1
  14. package/dist/interpretation/siLanguage.js +1 -1
  15. package/dist/locus-info/controlsUtils.js +11 -2
  16. package/dist/locus-info/controlsUtils.js.map +1 -1
  17. package/dist/locus-info/index.js +56 -14
  18. package/dist/locus-info/index.js.map +1 -1
  19. package/dist/locus-info/parser.js +4 -1
  20. package/dist/locus-info/parser.js.map +1 -1
  21. package/dist/media/properties.js +53 -5
  22. package/dist/media/properties.js.map +1 -1
  23. package/dist/meeting/in-meeting-actions.js +8 -0
  24. package/dist/meeting/in-meeting-actions.js.map +1 -1
  25. package/dist/meeting/index.js +339 -185
  26. package/dist/meeting/index.js.map +1 -1
  27. package/dist/meeting/muteState.js +2 -5
  28. package/dist/meeting/muteState.js.map +1 -1
  29. package/dist/meeting/request.js +177 -14
  30. package/dist/meeting/request.js.map +1 -1
  31. package/dist/meeting/util.js +39 -11
  32. package/dist/meeting/util.js.map +1 -1
  33. package/dist/meeting-info/meeting-info-v2.js +29 -21
  34. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  35. package/dist/meetings/index.js +31 -25
  36. package/dist/meetings/index.js.map +1 -1
  37. package/dist/member/index.js +9 -0
  38. package/dist/member/index.js.map +1 -1
  39. package/dist/member/types.js.map +1 -1
  40. package/dist/member/util.js +10 -0
  41. package/dist/member/util.js.map +1 -1
  42. package/dist/members/collection.js +13 -0
  43. package/dist/members/collection.js.map +1 -1
  44. package/dist/members/index.js +42 -20
  45. package/dist/members/index.js.map +1 -1
  46. package/dist/members/util.js +7 -2
  47. package/dist/members/util.js.map +1 -1
  48. package/dist/metrics/constants.js +2 -1
  49. package/dist/metrics/constants.js.map +1 -1
  50. package/dist/reachability/index.js +3 -3
  51. package/dist/reachability/index.js.map +1 -1
  52. package/dist/types/constants.d.ts +7 -0
  53. package/dist/types/controls-options-manager/index.d.ts +9 -1
  54. package/dist/types/interceptors/index.d.ts +2 -1
  55. package/dist/types/interceptors/locusRouteToken.d.ts +38 -0
  56. package/dist/types/locus-info/index.d.ts +56 -2
  57. package/dist/types/media/properties.d.ts +21 -0
  58. package/dist/types/meeting/in-meeting-actions.d.ts +8 -0
  59. package/dist/types/meeting/index.d.ts +41 -1
  60. package/dist/types/meeting/request.d.ts +42 -0
  61. package/dist/types/meeting/util.d.ts +13 -3
  62. package/dist/types/meeting-info/meeting-info-v2.d.ts +6 -3
  63. package/dist/types/meetings/index.d.ts +3 -1
  64. package/dist/types/member/index.d.ts +1 -0
  65. package/dist/types/member/types.d.ts +1 -0
  66. package/dist/types/member/util.d.ts +5 -0
  67. package/dist/types/members/collection.d.ts +6 -0
  68. package/dist/types/members/index.d.ts +12 -2
  69. package/dist/types/members/util.d.ts +6 -3
  70. package/dist/types/metrics/constants.d.ts +1 -0
  71. package/dist/webinar/index.js +1 -1
  72. package/package.json +23 -23
  73. package/src/constants.ts +10 -0
  74. package/src/controls-options-manager/index.ts +26 -5
  75. package/src/index.ts +2 -1
  76. package/src/interceptors/index.ts +2 -1
  77. package/src/interceptors/locusRouteToken.ts +80 -0
  78. package/src/locus-info/controlsUtils.ts +18 -0
  79. package/src/locus-info/index.ts +99 -17
  80. package/src/locus-info/parser.ts +5 -1
  81. package/src/media/properties.ts +43 -0
  82. package/src/meeting/in-meeting-actions.ts +16 -0
  83. package/src/meeting/index.ts +204 -24
  84. package/src/meeting/muteState.ts +2 -6
  85. package/src/meeting/request.ts +141 -0
  86. package/src/meeting/util.ts +50 -20
  87. package/src/meeting-info/meeting-info-v2.ts +24 -5
  88. package/src/meetings/index.ts +9 -3
  89. package/src/member/index.ts +10 -0
  90. package/src/member/types.ts +1 -0
  91. package/src/member/util.ts +14 -0
  92. package/src/members/collection.ts +11 -0
  93. package/src/members/index.ts +38 -5
  94. package/src/members/util.ts +18 -2
  95. package/src/metrics/constants.ts +1 -0
  96. package/src/reachability/index.ts +3 -3
  97. package/test/unit/spec/common/browser-detection.js +0 -24
  98. package/test/unit/spec/controls-options-manager/index.js +47 -0
  99. package/test/unit/spec/fixture/locus.js +1 -0
  100. package/test/unit/spec/interceptors/locusRouteToken.ts +87 -0
  101. package/test/unit/spec/locus-info/index.js +91 -15
  102. package/test/unit/spec/locus-info/parser.js +3 -2
  103. package/test/unit/spec/media/properties.ts +137 -0
  104. package/test/unit/spec/meeting/in-meeting-actions.ts +8 -0
  105. package/test/unit/spec/meeting/index.js +398 -30
  106. package/test/unit/spec/meeting/muteState.js +32 -6
  107. package/test/unit/spec/meeting/request.js +21 -0
  108. package/test/unit/spec/meeting/utils.js +49 -17
  109. package/test/unit/spec/meeting-info/meetinginfov2.js +8 -3
  110. package/test/unit/spec/meetings/index.js +10 -5
  111. package/test/unit/spec/member/util.js +24 -0
  112. package/test/unit/spec/members/collection.js +120 -0
  113. package/test/unit/spec/members/index.js +72 -3
  114. package/test/unit/spec/members/request.js +55 -0
  115. package/test/unit/spec/members/utils.js +116 -14
  116. package/test/unit/spec/reachability/index.ts +158 -3
  117. package/test/unit/spec/roap/turnDiscovery.ts +3 -3
@@ -476,6 +476,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
476
476
  (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "shareStatus", void 0);
477
477
  (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "screenShareFloorState", void 0);
478
478
  (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "statsAnalyzer", void 0);
479
+ (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "statsMonitor", void 0);
479
480
  (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "transcription", void 0);
480
481
  (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "updateMediaConnections", void 0);
481
482
  (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "userDisplayHints", void 0);
@@ -948,6 +949,10 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
948
949
  // @ts-ignore
949
950
  _this.webex.internal.newMetrics.submitClientEvent({
950
951
  name: 'client.ice.start',
952
+ payload: {
953
+ // @ts-ignore
954
+ labels: _util2.default.getCaEventLabelsForIpVersion(_this.webex)
955
+ },
951
956
  options: {
952
957
  meetingId: _this.id
953
958
  }
@@ -1072,10 +1077,10 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
1072
1077
  }
1073
1078
  }
1074
1079
 
1075
- // Count members that are in the meeting.
1080
+ // Count members that are in the meeting or in the lobby.
1076
1081
  var members = _this.getMembers().membersCollection.members;
1077
1082
  event.data.intervalMetadata.meetingUserCount = (0, _values.default)(members).filter(function (member) {
1078
- return member.isInMeeting;
1083
+ return member.isInMeeting || member.isInLobby;
1079
1084
  }).length;
1080
1085
 
1081
1086
  // @ts-ignore
@@ -1966,6 +1971,13 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
1966
1971
  * @memberof Meeting
1967
1972
  */
1968
1973
  _this.networkQualityMonitor = null;
1974
+ /**
1975
+ * @instance
1976
+ * @type {StatsMonitor}
1977
+ * @private
1978
+ * @memberof Meeting
1979
+ */
1980
+ _this.statsMonitor = null;
1969
1981
  /**
1970
1982
  * Indicates network status of the webrtc media connection
1971
1983
  * @instance
@@ -2601,11 +2613,11 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
2601
2613
  key: "fetchMeetingInfoInternal",
2602
2614
  value: (function () {
2603
2615
  var _fetchMeetingInfoInternal = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(_ref8) {
2604
- var destination, destinationType, _ref8$password, password, _ref8$captchaCode, captchaCode, _ref8$extraParams, extraParams, _ref8$sendCAevents, sendCAevents, _ref8$registrationId, registrationId, captchaInfo, info, _err$body, _err$body2;
2616
+ var destination, destinationType, _ref8$password, password, _ref8$captchaCode, captchaCode, _ref8$extraParams, extraParams, _ref8$sendCAevents, sendCAevents, _ref8$registrationId, registrationId, _ref8$classificationI, classificationId, captchaInfo, info, _err$body, _err$body2;
2605
2617
  return _regenerator.default.wrap(function _callee5$(_context5) {
2606
2618
  while (1) switch (_context5.prev = _context5.next) {
2607
2619
  case 0:
2608
- destination = _ref8.destination, destinationType = _ref8.destinationType, _ref8$password = _ref8.password, password = _ref8$password === void 0 ? null : _ref8$password, _ref8$captchaCode = _ref8.captchaCode, captchaCode = _ref8$captchaCode === void 0 ? null : _ref8$captchaCode, _ref8$extraParams = _ref8.extraParams, extraParams = _ref8$extraParams === void 0 ? {} : _ref8$extraParams, _ref8$sendCAevents = _ref8.sendCAevents, sendCAevents = _ref8$sendCAevents === void 0 ? false : _ref8$sendCAevents, _ref8$registrationId = _ref8.registrationId, registrationId = _ref8$registrationId === void 0 ? null : _ref8$registrationId;
2620
+ destination = _ref8.destination, destinationType = _ref8.destinationType, _ref8$password = _ref8.password, password = _ref8$password === void 0 ? null : _ref8$password, _ref8$captchaCode = _ref8.captchaCode, captchaCode = _ref8$captchaCode === void 0 ? null : _ref8$captchaCode, _ref8$extraParams = _ref8.extraParams, extraParams = _ref8$extraParams === void 0 ? {} : _ref8$extraParams, _ref8$sendCAevents = _ref8.sendCAevents, sendCAevents = _ref8$sendCAevents === void 0 ? false : _ref8$sendCAevents, _ref8$registrationId = _ref8.registrationId, registrationId = _ref8$registrationId === void 0 ? null : _ref8$registrationId, _ref8$classificationI = _ref8.classificationId, classificationId = _ref8$classificationI === void 0 ? null : _ref8$classificationI;
2609
2621
  _context5.prev = 1;
2610
2622
  captchaInfo = captchaCode ? {
2611
2623
  code: captchaCode,
@@ -2617,7 +2629,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
2617
2629
  this.config.installedOrgID, this.locusId, extraParams, {
2618
2630
  meetingId: this.id,
2619
2631
  sendCAevents: sendCAevents
2620
- }, registrationId);
2632
+ }, registrationId, null, classificationId);
2621
2633
  case 5:
2622
2634
  info = _context5.sent;
2623
2635
  this.parseMeetingInfo(info === null || info === void 0 ? void 0 : info.body, this.destination, info === null || info === void 0 ? void 0 : info.errors);
@@ -3577,26 +3589,35 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
3577
3589
  state: state
3578
3590
  });
3579
3591
  });
3580
- this.locusInfo.on(_constants.LOCUSINFO.EVENTS.CONTROLS_ANNOTATION_CHANGED, function (_ref28) {
3592
+ this.locusInfo.on(_constants.LOCUSINFO.EVENTS.CONTROLS_AUTO_END_MEETING_WARNING_CHANGED, function (_ref28) {
3581
3593
  var state = _ref28.state;
3582
3594
  _triggerProxy.default.trigger(_this14, {
3583
3595
  file: 'meeting/index',
3584
3596
  function: 'setupLocusControlsListener'
3585
- }, _constants.EVENT_TRIGGERS.MEETING_CONTROLS_ANNOTATION_UPDATED, {
3597
+ }, _constants.EVENT_TRIGGERS.MEETING_CONTROLS_AUTO_END_MEETING_WARNING_UPDATED, {
3586
3598
  state: state
3587
3599
  });
3588
3600
  });
3589
- this.locusInfo.on(_constants.LOCUSINFO.EVENTS.CONTROLS_REMOTE_DESKTOP_CONTROL_CHANGED, function (_ref29) {
3601
+ this.locusInfo.on(_constants.LOCUSINFO.EVENTS.CONTROLS_ANNOTATION_CHANGED, function (_ref29) {
3590
3602
  var state = _ref29.state;
3591
3603
  _triggerProxy.default.trigger(_this14, {
3592
3604
  file: 'meeting/index',
3593
3605
  function: 'setupLocusControlsListener'
3594
- }, _constants.EVENT_TRIGGERS.MEETING_CONTROLS_REMOTE_DESKTOP_CONTROL_UPDATED, {
3606
+ }, _constants.EVENT_TRIGGERS.MEETING_CONTROLS_ANNOTATION_UPDATED, {
3595
3607
  state: state
3596
3608
  });
3597
3609
  });
3598
- this.locusInfo.on(_constants.LOCUSINFO.EVENTS.CONTROLS_POLLING_QA_CHANGED, function (_ref30) {
3610
+ this.locusInfo.on(_constants.LOCUSINFO.EVENTS.CONTROLS_REMOTE_DESKTOP_CONTROL_CHANGED, function (_ref30) {
3599
3611
  var state = _ref30.state;
3612
+ _triggerProxy.default.trigger(_this14, {
3613
+ file: 'meeting/index',
3614
+ function: 'setupLocusControlsListener'
3615
+ }, _constants.EVENT_TRIGGERS.MEETING_CONTROLS_REMOTE_DESKTOP_CONTROL_UPDATED, {
3616
+ state: state
3617
+ });
3618
+ });
3619
+ this.locusInfo.on(_constants.LOCUSINFO.EVENTS.CONTROLS_POLLING_QA_CHANGED, function (_ref31) {
3620
+ var state = _ref31.state;
3600
3621
  _triggerProxy.default.trigger(_this14, {
3601
3622
  file: 'meeting/index',
3602
3623
  function: 'setupLocusControlsListener'
@@ -3643,7 +3664,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
3643
3664
  var _this15 = this;
3644
3665
  // Will get triggered on local and remote share
3645
3666
  this.locusInfo.on(_constants.EVENTS.LOCUS_INFO_UPDATE_MEDIA_SHARES, /*#__PURE__*/function () {
3646
- var _ref31 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(payload) {
3667
+ var _ref32 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(payload) {
3647
3668
  var _payload$previous, _payload$previous2;
3648
3669
  var _payload$current, contentShare, whiteboardShare, previousContentShare, previousWhiteboardShare, newShareStatus, _this15$locusInfo, _this15$locusInfo$inf, _this15$webinar, oldShareStatus, sendStartedSharingRemote, _this15$mediaProperti;
3649
3670
  return _regenerator.default.wrap(function _callee8$(_context8) {
@@ -3695,7 +3716,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
3695
3716
  }
3696
3717
  _loggerProxy.default.logger.info("Meeting:index#setUpLocusInfoMediaInactiveListener --> this.shareStatus=".concat(_this15.shareStatus, " newShareStatus=").concat(newShareStatus));
3697
3718
  if (!(newShareStatus !== _this15.shareStatus)) {
3698
- _context8.next = 46;
3719
+ _context8.next = 48;
3699
3720
  break;
3700
3721
  }
3701
3722
  oldShareStatus = _this15.shareStatus; // update our state before we send out any notifications
@@ -3703,14 +3724,14 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
3703
3724
 
3704
3725
  // send out "stop" notifications for the old state
3705
3726
  _context8.t0 = oldShareStatus;
3706
- _context8.next = _context8.t0 === _constants.SHARE_STATUS.REMOTE_SHARE_ACTIVE ? 15 : _context8.t0 === _constants.SHARE_STATUS.LOCAL_SHARE_ACTIVE ? 17 : _context8.t0 === _constants.SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE ? 19 : _context8.t0 === _constants.SHARE_STATUS.NO_SHARE ? 21 : 22;
3727
+ _context8.next = _context8.t0 === _constants.SHARE_STATUS.REMOTE_SHARE_ACTIVE ? 15 : _context8.t0 === _constants.SHARE_STATUS.LOCAL_SHARE_ACTIVE ? 17 : _context8.t0 === _constants.SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE ? 19 : _context8.t0 === _constants.SHARE_STATUS.NO_SHARE ? 23 : 24;
3707
3728
  break;
3708
3729
  case 15:
3709
3730
  _triggerProxy.default.trigger(_this15, {
3710
3731
  file: 'meetings/index',
3711
3732
  function: 'remoteShare'
3712
3733
  }, _constants.EVENT_TRIGGERS.MEETING_STOPPED_SHARING_REMOTE);
3713
- return _context8.abrupt("break", 23);
3734
+ return _context8.abrupt("break", 25);
3714
3735
  case 17:
3715
3736
  _triggerProxy.default.trigger(_this15, {
3716
3737
  file: 'meeting/index',
@@ -3718,51 +3739,76 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
3718
3739
  }, _constants.EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL, {
3719
3740
  reason: _constants.SHARE_STOPPED_REASON.SELF_STOPPED
3720
3741
  });
3721
- return _context8.abrupt("break", 23);
3742
+ return _context8.abrupt("break", 25);
3722
3743
  case 19:
3723
3744
  _triggerProxy.default.trigger(_this15, {
3724
3745
  file: 'meeting/index',
3725
3746
  function: 'stopWhiteboardShare'
3726
3747
  }, _constants.EVENT_TRIGGERS.MEETING_STOPPED_SHARING_WHITEBOARD);
3727
- return _context8.abrupt("break", 23);
3728
- case 21:
3729
- return _context8.abrupt("break", 23);
3730
- case 22:
3731
- return _context8.abrupt("break", 23);
3748
+ // @ts-ignore
3749
+ _this15.webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp({
3750
+ key: 'internal.client.share.stopped'
3751
+ });
3752
+ // @ts-ignore
3753
+ _this15.webex.internal.newMetrics.submitClientEvent({
3754
+ name: 'client.share.stopped',
3755
+ payload: {
3756
+ mediaType: 'whiteboard',
3757
+ shareDuration:
3758
+ // @ts-ignore
3759
+ _this15.webex.internal.newMetrics.callDiagnosticLatencies.getShareDuration()
3760
+ },
3761
+ options: {
3762
+ meetingId: _this15.id
3763
+ }
3764
+ });
3765
+ return _context8.abrupt("break", 25);
3732
3766
  case 23:
3767
+ return _context8.abrupt("break", 25);
3768
+ case 24:
3769
+ return _context8.abrupt("break", 25);
3770
+ case 25:
3733
3771
  _context8.t1 = newShareStatus;
3734
- _context8.next = _context8.t1 === _constants.SHARE_STATUS.REMOTE_SHARE_ACTIVE ? 26 : _context8.t1 === _constants.SHARE_STATUS.LOCAL_SHARE_ACTIVE ? 35 : _context8.t1 === _constants.SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE ? 38 : _context8.t1 === _constants.SHARE_STATUS.NO_SHARE ? 41 : 42;
3772
+ _context8.next = _context8.t1 === _constants.SHARE_STATUS.REMOTE_SHARE_ACTIVE ? 28 : _context8.t1 === _constants.SHARE_STATUS.LOCAL_SHARE_ACTIVE ? 37 : _context8.t1 === _constants.SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE ? 40 : _context8.t1 === _constants.SHARE_STATUS.NO_SHARE ? 43 : 44;
3735
3773
  break;
3736
- case 26:
3774
+ case 28:
3737
3775
  sendStartedSharingRemote = function sendStartedSharingRemote() {
3776
+ var _this15$locusInfo2, _this15$locusInfo2$in, _this15$webinar2;
3738
3777
  _this15.remoteShareInstanceId = contentShare.shareInstanceId;
3739
3778
  _this15.shareCAEventSentStatus.receiveStart = false;
3740
3779
  _this15.shareCAEventSentStatus.receiveStop = false;
3780
+ var finalBeneficiaryId = contentShare.beneficiaryId;
3781
+ // In case of attendee in webinar, the whiteboard is shared by other participants
3782
+ if ((_this15$locusInfo2 = _this15.locusInfo) !== null && _this15$locusInfo2 !== void 0 && (_this15$locusInfo2$in = _this15$locusInfo2.info) !== null && _this15$locusInfo2$in !== void 0 && _this15$locusInfo2$in.isWebinar && (_this15$webinar2 = _this15.webinar) !== null && _this15$webinar2 !== void 0 && _this15$webinar2.selfIsAttendee) {
3783
+ if (!finalBeneficiaryId && whiteboardShare.beneficiaryId) {
3784
+ finalBeneficiaryId = whiteboardShare.beneficiaryId;
3785
+ }
3786
+ }
3741
3787
  _triggerProxy.default.trigger(_this15, {
3742
3788
  file: 'meetings/index',
3743
3789
  function: 'remoteShare'
3744
3790
  }, _constants.EVENT_TRIGGERS.MEETING_STARTED_SHARING_REMOTE, {
3745
- memberId: contentShare.beneficiaryId,
3791
+ memberId: finalBeneficiaryId,
3746
3792
  url: contentShare.url,
3747
3793
  shareInstanceId: _this15.remoteShareInstanceId,
3748
3794
  annotationInfo: contentShare.annotation,
3749
3795
  resourceType: contentShare.resourceType
3750
3796
  });
3751
3797
  };
3752
- _context8.prev = 27;
3798
+ _context8.prev = 29;
3753
3799
  if (!((_this15$mediaProperti = _this15.mediaProperties.mediaDirection) !== null && _this15$mediaProperti !== void 0 && _this15$mediaProperti.sendShare && oldShareStatus === _constants.SHARE_STATUS.LOCAL_SHARE_ACTIVE)) {
3754
- _context8.next = 31;
3800
+ _context8.next = 33;
3755
3801
  break;
3756
3802
  }
3757
- _context8.next = 31;
3803
+ _context8.next = 33;
3758
3804
  return _this15.unpublishStreams([_this15.mediaProperties.shareVideoStream, _this15.mediaProperties.shareAudioStream]);
3759
- case 31:
3760
- _context8.prev = 31;
3805
+ case 33:
3806
+ _context8.prev = 33;
3761
3807
  sendStartedSharingRemote();
3762
- return _context8.finish(31);
3763
- case 34:
3764
- return _context8.abrupt("break", 43);
3765
- case 35:
3808
+ return _context8.finish(33);
3809
+ case 36:
3810
+ return _context8.abrupt("break", 45);
3811
+ case 37:
3766
3812
  _triggerProxy.default.trigger(_this15, {
3767
3813
  file: 'meeting/index',
3768
3814
  function: 'share'
@@ -3778,8 +3824,8 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
3778
3824
  meetingId: _this15.id
3779
3825
  }
3780
3826
  });
3781
- return _context8.abrupt("break", 43);
3782
- case 38:
3827
+ return _context8.abrupt("break", 45);
3828
+ case 40:
3783
3829
  _triggerProxy.default.trigger(_this15, {
3784
3830
  file: 'meeting/index',
3785
3831
  function: 'startWhiteboardShare'
@@ -3797,16 +3843,16 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
3797
3843
  meetingId: _this15.id
3798
3844
  }
3799
3845
  });
3800
- return _context8.abrupt("break", 43);
3801
- case 41:
3802
- return _context8.abrupt("break", 43);
3803
- case 42:
3804
- return _context8.abrupt("break", 43);
3846
+ return _context8.abrupt("break", 45);
3805
3847
  case 43:
3848
+ return _context8.abrupt("break", 45);
3849
+ case 44:
3850
+ return _context8.abrupt("break", 45);
3851
+ case 45:
3806
3852
  _this15.members.locusMediaSharesUpdate(payload);
3807
- _context8.next = 47;
3853
+ _context8.next = 49;
3808
3854
  break;
3809
- case 46:
3855
+ case 48:
3810
3856
  if (newShareStatus === _constants.SHARE_STATUS.REMOTE_SHARE_ACTIVE) {
3811
3857
  // if we got here, then some remote participant has stolen
3812
3858
  // the presentation from another remote participant
@@ -3846,14 +3892,14 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
3846
3892
  });
3847
3893
  _this15.members.locusMediaSharesUpdate(payload);
3848
3894
  }
3849
- case 47:
3895
+ case 49:
3850
3896
  case "end":
3851
3897
  return _context8.stop();
3852
3898
  }
3853
- }, _callee8, null, [[27,, 31, 34]]);
3899
+ }, _callee8, null, [[29,, 33, 36]]);
3854
3900
  }));
3855
3901
  return function (_x8) {
3856
- return _ref31.apply(this, arguments);
3902
+ return _ref32.apply(this, arguments);
3857
3903
  };
3858
3904
  }());
3859
3905
  }
@@ -3871,20 +3917,22 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
3871
3917
  var _this16 = this;
3872
3918
  this.locusInfo.on(_constants.EVENTS.LOCUS_INFO_UPDATE_URL, function (payload) {
3873
3919
  var _this16$locusUrl;
3874
- _this16.members.locusUrlUpdate(payload);
3875
- _this16.breakouts.locusUrlUpdate(payload);
3876
- _this16.simultaneousInterpretation.locusUrlUpdate(payload);
3877
- _this16.annotation.locusUrlUpdate(payload);
3878
- _this16.locusUrl = payload;
3920
+ var url = payload.url,
3921
+ isMainLocus = payload.isMainLocus;
3922
+ _this16.members.locusUrlUpdate(url);
3923
+ _this16.breakouts.locusUrlUpdate(url);
3924
+ _this16.simultaneousInterpretation.locusUrlUpdate(url);
3925
+ _this16.annotation.locusUrlUpdate(url);
3926
+ _this16.locusUrl = url;
3879
3927
  _this16.locusId = (_this16$locusUrl = _this16.locusUrl) === null || _this16$locusUrl === void 0 ? void 0 : _this16$locusUrl.split('/').pop();
3880
3928
  _this16.recordingController.setLocusUrl(_this16.locusUrl);
3881
- _this16.controlsOptionsManager.setLocusUrl(_this16.locusUrl);
3882
- _this16.webinar.locusUrlUpdate(payload);
3929
+ _this16.controlsOptionsManager.setLocusUrl(_this16.locusUrl, !!isMainLocus);
3930
+ _this16.webinar.locusUrlUpdate(url);
3883
3931
  _triggerProxy.default.trigger(_this16, {
3884
3932
  file: 'meeting/index',
3885
3933
  function: 'setUpLocusSelfListener'
3886
3934
  }, _constants.EVENT_TRIGGERS.MEETING_LOCUS_URL_UPDATE, {
3887
- locusUrl: payload
3935
+ locusUrl: url
3888
3936
  });
3889
3937
  });
3890
3938
  }
@@ -3967,8 +4015,8 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
3967
4015
  });
3968
4016
  }
3969
4017
  });
3970
- this.locusInfo.on(_constants.LOCUSINFO.EVENTS.MEETING_INFO_UPDATED, function (_ref32) {
3971
- var isInitializing = _ref32.isInitializing;
4018
+ this.locusInfo.on(_constants.LOCUSINFO.EVENTS.MEETING_INFO_UPDATED, function (_ref33) {
4019
+ var isInitializing = _ref33.isInitializing;
3972
4020
  _this19.updateMeetingActions();
3973
4021
  _this19.recordingController.setDisplayHints(_this19.userDisplayHints);
3974
4022
  _this19.recordingController.setUserPolicy(_this19.selfUserPolicies);
@@ -4106,7 +4154,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
4106
4154
  _this21.updateLLMConnection();
4107
4155
  });
4108
4156
  this.locusInfo.on(_constants.LOCUSINFO.EVENTS.SELF_ADMITTED_GUEST, /*#__PURE__*/function () {
4109
- var _ref33 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9(payload) {
4157
+ var _ref34 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9(payload) {
4110
4158
  var _this21$rtcMetrics;
4111
4159
  return _regenerator.default.wrap(function _callee9$(_context9) {
4112
4160
  while (1) switch (_context9.prev = _context9.next) {
@@ -4140,7 +4188,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
4140
4188
  }, _callee9);
4141
4189
  }));
4142
4190
  return function (_x9) {
4143
- return _ref33.apply(this, arguments);
4191
+ return _ref34.apply(this, arguments);
4144
4192
  };
4145
4193
  }());
4146
4194
 
@@ -4259,7 +4307,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
4259
4307
  }
4260
4308
  });
4261
4309
  this.locusInfo.on(_constants.EVENTS.DESTROY_MEETING, /*#__PURE__*/function () {
4262
- var _ref34 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee10(payload) {
4310
+ var _ref35 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee10(payload) {
4263
4311
  return _regenerator.default.wrap(function _callee10$(_context10) {
4264
4312
  while (1) switch (_context10.prev = _context10.next) {
4265
4313
  case 0:
@@ -4319,7 +4367,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
4319
4367
  }, _callee10, null, [[8, 14]]);
4320
4368
  }));
4321
4369
  return function (_x10) {
4322
- return _ref34.apply(this, arguments);
4370
+ return _ref35.apply(this, arguments);
4323
4371
  };
4324
4372
  }());
4325
4373
  }
@@ -4667,6 +4715,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
4667
4715
  canPauseRecording: _util4.default.canUserPause(this.userDisplayHints, this.selfUserPolicies),
4668
4716
  canResumeRecording: _util4.default.canUserResume(this.userDisplayHints, this.selfUserPolicies),
4669
4717
  isPremiseRecordingEnabled: _util4.default.isPremiseRecordingEnabled(this.userDisplayHints, this.selfUserPolicies),
4718
+ showAutoEndMeetingWarning: _util2.default.showAutoEndMeetingWarning(this.userDisplayHints),
4670
4719
  canRaiseHand: _util2.default.canUserRaiseHand(this.userDisplayHints),
4671
4720
  canLowerAllHands: _util2.default.canUserLowerAllHands(this.userDisplayHints),
4672
4721
  canLowerSomeoneElsesHand: _util2.default.canUserLowerSomeoneElsesHand(this.userDisplayHints),
@@ -4680,8 +4729,11 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
4680
4729
  isLocalRecordingStarted: _util2.default.isLocalRecordingStarted(this.userDisplayHints),
4681
4730
  isLocalRecordingStopped: _util2.default.isLocalRecordingStopped(this.userDisplayHints),
4682
4731
  isLocalRecordingPaused: _util2.default.isLocalRecordingPaused(this.userDisplayHints),
4732
+ isLocalStreamingStarted: _util2.default.isLocalStreamingStarted(this.userDisplayHints),
4733
+ isLocalStreamingStopped: _util2.default.isLocalStreamingStopped(this.userDisplayHints),
4683
4734
  isManualCaptionActive: _util2.default.isManualCaptionActive(this.userDisplayHints),
4684
4735
  isSaveTranscriptsEnabled: _util2.default.isSaveTranscriptsEnabled(this.userDisplayHints),
4736
+ isSpokenLanguageAutoDetectionEnabled: _util2.default.isSpokenLanguageAutoDetectionEnabled(this.userDisplayHints),
4685
4737
  isWebexAssistantActive: _util2.default.isWebexAssistantActive(this.userDisplayHints),
4686
4738
  canViewCaptionPanel: _util2.default.canViewCaptionPanel(this.userDisplayHints),
4687
4739
  isRealTimeTranslationEnabled: _util2.default.isRealTimeTranslationEnabled(this.userDisplayHints),
@@ -7062,14 +7114,17 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7062
7114
  }, {
7063
7115
  key: "createStatsAnalyzer",
7064
7116
  value: function createStatsAnalyzer() {
7117
+ var _this44 = this;
7065
7118
  // @ts-ignore - config coming from registerPlugin
7066
7119
  if (this.config.stats.enableStatsAnalyzer) {
7067
7120
  // @ts-ignore - config coming from registerPlugin
7068
7121
  this.networkQualityMonitor = new _internalMediaCore.NetworkQualityMonitor(this.config.stats);
7122
+ this.statsMonitor = new _internalMediaCore.StatsMonitor();
7069
7123
  this.statsAnalyzer = new _internalMediaCore.StatsAnalyzer({
7070
7124
  // @ts-ignore - config coming from registerPlugin
7071
7125
  config: this.config.stats,
7072
7126
  networkQualityMonitor: this.networkQualityMonitor,
7127
+ statsMonitor: this.statsMonitor,
7073
7128
  isMultistream: this.isMultistream
7074
7129
  });
7075
7130
  this.shareCAEventSentStatus = {
@@ -7080,6 +7135,22 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7080
7135
  };
7081
7136
  this.setupStatsAnalyzerEventHandlers();
7082
7137
  this.networkQualityMonitor.on(_internalMediaCore.NetworkQualityEventNames.NETWORK_QUALITY, this.sendNetworkQualityEvent.bind(this));
7138
+ this.statsMonitor.on(_internalMediaCore.StatsMonitorEventNames.INBOUND_AUDIO_ISSUE, function (data) {
7139
+ // Before forwarding any inbound audio issues to the app, make sure that we have at least one other
7140
+ // participant in the meeting with unmuted audio.
7141
+ // We don't check this.mediaProperties.mediaDirection here, because that's already handled in statsAnalyzer,
7142
+ // so we won't get this event if we are not setup to receive any audio
7143
+ var atLeastOneUnmutedOtherMember = (0, _values.default)(_this44.members.membersCollection.getAll()).find(function (member) {
7144
+ return !member.isSelf && !member.isPairedWithSelf && !member.isAudioMuted;
7145
+ });
7146
+ if (atLeastOneUnmutedOtherMember) {
7147
+ _this44.mediaProperties.sendMediaIssueMetric('inbound_audio', data.issueSubType, _this44.correlationId);
7148
+ _triggerProxy.default.trigger(_this44, {
7149
+ file: 'meeting/index',
7150
+ function: 'createStatsAnalyzer'
7151
+ }, _constants.EVENT_TRIGGERS.MEDIA_INBOUND_AUDIO_ISSUE_DETECTED, data);
7152
+ }
7153
+ });
7083
7154
  }
7084
7155
  }
7085
7156
 
@@ -7094,7 +7165,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7094
7165
  key: "waitForRemoteSDPAnswer",
7095
7166
  value: (function () {
7096
7167
  var _waitForRemoteSDPAnswer = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee25() {
7097
- var _this44 = this;
7168
+ var _this45 = this;
7098
7169
  var LOG_HEADER, deferSDPAnswer;
7099
7170
  return _regenerator.default.wrap(function _callee25$(_context25) {
7100
7171
  while (1) switch (_context25.prev = _context25.next) {
@@ -7113,18 +7184,18 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7113
7184
  var error = new Error('Timed out waiting for REMOTE SDP ANSWER');
7114
7185
 
7115
7186
  // @ts-ignore
7116
- _this44.webex.internal.newMetrics.submitClientEvent({
7187
+ _this45.webex.internal.newMetrics.submitClientEvent({
7117
7188
  name: 'client.media-engine.remote-sdp-received',
7118
7189
  payload: {
7119
7190
  canProceed: false,
7120
7191
  errors: [
7121
7192
  // @ts-ignore
7122
- _this44.webex.internal.newMetrics.callDiagnosticMetrics.getErrorPayloadForClientErrorCode({
7193
+ _this45.webex.internal.newMetrics.callDiagnosticMetrics.getErrorPayloadForClientErrorCode({
7123
7194
  clientErrorCode: _internalPluginMetrics.CALL_DIAGNOSTIC_CONFIG.MISSING_ROAP_ANSWER_CLIENT_CODE
7124
7195
  })]
7125
7196
  },
7126
7197
  options: {
7127
- meetingId: _this44.id,
7198
+ meetingId: _this45.id,
7128
7199
  rawError: error
7129
7200
  }
7130
7201
  });
@@ -7433,6 +7504,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7433
7504
  key: "cleanUpOnAddMediaFailure",
7434
7505
  value: (function () {
7435
7506
  var _cleanUpOnAddMediaFailure = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee31() {
7507
+ var _this$networkQualityM, _this$statsMonitor;
7436
7508
  return _regenerator.default.wrap(function _callee31$(_context31) {
7437
7509
  while (1) switch (_context31.prev = _context31.next) {
7438
7510
  case 0:
@@ -7444,19 +7516,23 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7444
7516
  return this.statsAnalyzer.stopAnalyzer();
7445
7517
  case 3:
7446
7518
  this.statsAnalyzer = null;
7519
+ (_this$networkQualityM = this.networkQualityMonitor) === null || _this$networkQualityM === void 0 ? void 0 : _this$networkQualityM.removeAllListeners();
7520
+ this.networkQualityMonitor = null;
7521
+ (_this$statsMonitor = this.statsMonitor) === null || _this$statsMonitor === void 0 ? void 0 : _this$statsMonitor.removeAllListeners();
7522
+ this.statsMonitor = null;
7447
7523
 
7448
7524
  // when media fails, we want to upload a webrtc dump to see whats going on
7449
7525
  // this function is async, but returns once the stats have been gathered
7450
- _context31.next = 6;
7526
+ _context31.next = 10;
7451
7527
  return this.forceSendStatsReport({
7452
7528
  callFrom: 'addMedia'
7453
7529
  });
7454
- case 6:
7530
+ case 10:
7455
7531
  if (this.mediaProperties.webrtcMediaConnection) {
7456
7532
  this.closePeerConnections();
7457
7533
  this.unsetPeerConnections();
7458
7534
  }
7459
- case 7:
7535
+ case 11:
7460
7536
  case "end":
7461
7537
  return _context31.stop();
7462
7538
  }
@@ -7479,7 +7555,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7479
7555
  key: "downgradeFromMultistreamToTranscoded",
7480
7556
  value: (function () {
7481
7557
  var _downgradeFromMultistreamToTranscoded = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee32() {
7482
- var _this$locusMediaReque2;
7558
+ var _this$networkQualityM2, _this$statsMonitor2, _this$locusMediaReque2;
7483
7559
  return _regenerator.default.wrap(function _callee32$(_context32) {
7484
7560
  while (1) switch (_context32.prev = _context32.next) {
7485
7561
  case 0:
@@ -7491,6 +7567,10 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7491
7567
  return this.statsAnalyzer.stopAnalyzer();
7492
7568
  case 3:
7493
7569
  this.statsAnalyzer = null;
7570
+ (_this$networkQualityM2 = this.networkQualityMonitor) === null || _this$networkQualityM2 === void 0 ? void 0 : _this$networkQualityM2.removeAllListeners();
7571
+ this.networkQualityMonitor = null;
7572
+ (_this$statsMonitor2 = this.statsMonitor) === null || _this$statsMonitor2 === void 0 ? void 0 : _this$statsMonitor2.removeAllListeners();
7573
+ this.statsMonitor = null;
7494
7574
  this.isMultistream = false;
7495
7575
  if (this.mediaProperties.webrtcMediaConnection) {
7496
7576
  // close peer connection, but don't reset mute state information, because we will want to use it on the retry
@@ -7499,7 +7579,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7499
7579
  }
7500
7580
  (_this$locusMediaReque2 = this.locusMediaRequest) === null || _this$locusMediaReque2 === void 0 ? void 0 : _this$locusMediaReque2.downgradeFromMultistreamToTranscoded();
7501
7581
  this.createStatsAnalyzer();
7502
- case 8:
7582
+ case 12:
7503
7583
  case "end":
7504
7584
  return _context32.stop();
7505
7585
  }
@@ -7631,10 +7711,10 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7631
7711
  }, {
7632
7712
  key: "addMedia",
7633
7713
  value: function addMedia() {
7634
- var _this45 = this;
7714
+ var _this46 = this;
7635
7715
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
7636
7716
  return this.addMediaInternal(function () {
7637
- return _this45.turnServerUsed ? 'JOIN_MEETING_FINAL' : 'JOIN_MEETING_RETRY';
7717
+ return _this46.turnServerUsed ? 'JOIN_MEETING_FINAL' : 'JOIN_MEETING_RETRY';
7638
7718
  }, undefined, false, options);
7639
7719
  }
7640
7720
 
@@ -7677,6 +7757,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7677
7757
  receiveVideo,
7678
7758
  sendAudio,
7679
7759
  receiveAudio,
7760
+ ipver,
7680
7761
  _this$remoteMediaMana,
7681
7762
  _yield$this$mediaProp,
7682
7763
  connectionType,
@@ -7741,14 +7822,16 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7741
7822
  receiveAudio = audioEnabled && (rawReceiveAudio !== null && rawReceiveAudio !== void 0 ? rawReceiveAudio : true);
7742
7823
  this.allowMediaInLobby = options === null || options === void 0 ? void 0 : options.allowMediaInLobby;
7743
7824
 
7825
+ // @ts-ignore
7826
+ ipver = _util2.default.getIpVersion(this.webex); // used just for metrics
7744
7827
  // If the user is unjoined or guest waiting in lobby dont allow the user to addMedia
7745
7828
  // @ts-ignore - isUserUnadmitted coming from SelfUtil
7746
7829
  if (!(this.isUserUnadmitted && !this.wirelessShare && !this.allowMediaInLobby)) {
7747
- _context35.next = 19;
7830
+ _context35.next = 20;
7748
7831
  break;
7749
7832
  }
7750
7833
  throw new _webexErrors.UserInLobbyError();
7751
- case 19:
7834
+ case 20:
7752
7835
  // @ts-ignore
7753
7836
  this.webex.internal.newMetrics.submitClientEvent({
7754
7837
  name: 'client.media.capabilities',
@@ -7788,63 +7871,64 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7788
7871
  this.audio = (0, _muteState.createMuteState)(_constants.AUDIO, this, audioEnabled);
7789
7872
  this.video = (0, _muteState.createMuteState)(_constants.VIDEO, this, videoEnabled);
7790
7873
  this.brbState = (0, _brbState.createBrbState)(this, false);
7791
- _context35.prev = 24;
7792
- _context35.next = 27;
7874
+ _context35.prev = 25;
7875
+ _context35.next = 28;
7793
7876
  return this.setUpLocalStreamReferences(localStreams);
7794
- case 27:
7877
+ case 28:
7795
7878
  this.setMercuryListener();
7796
7879
  this.createStatsAnalyzer();
7797
- _context35.prev = 29;
7798
- _context35.next = 32;
7880
+ _context35.prev = 30;
7881
+ _context35.next = 33;
7799
7882
  return this.establishMediaConnection(remoteMediaManagerConfig, bundlePolicy, forceTurnDiscovery, turnServerInfo);
7800
- case 32:
7801
- _context35.next = 45;
7883
+ case 33:
7884
+ _context35.next = 46;
7802
7885
  break;
7803
- case 34:
7804
- _context35.prev = 34;
7805
- _context35.t0 = _context35["catch"](29);
7886
+ case 35:
7887
+ _context35.prev = 35;
7888
+ _context35.t0 = _context35["catch"](30);
7806
7889
  if (!(_context35.t0 instanceof _multistreamNotSupportedError.default)) {
7807
- _context35.next = 44;
7890
+ _context35.next = 45;
7808
7891
  break;
7809
7892
  }
7810
7893
  _loggerProxy.default.logger.warn("".concat(LOG_HEADER, " we asked for multistream backend (Homer), but got transcoded backend, recreating media connection..."));
7811
- _context35.next = 40;
7894
+ _context35.next = 41;
7812
7895
  return this.downgradeFromMultistreamToTranscoded();
7813
- case 40:
7814
- _context35.next = 42;
7896
+ case 41:
7897
+ _context35.next = 43;
7815
7898
  return this.establishMediaConnection(remoteMediaManagerConfig, bundlePolicy, true, undefined);
7816
- case 42:
7817
- _context35.next = 45;
7899
+ case 43:
7900
+ _context35.next = 46;
7818
7901
  break;
7819
- case 44:
7820
- throw _context35.t0;
7821
7902
  case 45:
7903
+ throw _context35.t0;
7904
+ case 46:
7822
7905
  _loggerProxy.default.logger.info("".concat(LOG_HEADER, " media connected, finalizing..."));
7823
7906
  if (!this.mediaProperties.hasLocalShareStream()) {
7824
- _context35.next = 49;
7907
+ _context35.next = 50;
7825
7908
  break;
7826
7909
  }
7827
- _context35.next = 49;
7910
+ _context35.next = 50;
7828
7911
  return this.enqueueScreenShareFloorRequest();
7829
- case 49:
7830
- _context35.next = 51;
7912
+ case 50:
7913
+ _context35.next = 52;
7831
7914
  return this.mediaProperties.getCurrentConnectionInfo();
7832
- case 51:
7915
+ case 52:
7833
7916
  _yield$this$mediaProp = _context35.sent;
7834
7917
  connectionType = _yield$this$mediaProp.connectionType;
7835
7918
  ipVersion = _yield$this$mediaProp.ipVersion;
7836
7919
  selectedCandidatePairChanges = _yield$this$mediaProp.selectedCandidatePairChanges;
7837
7920
  numTransports = _yield$this$mediaProp.numTransports;
7838
7921
  iceCandidateErrors = Object.fromEntries(this.iceCandidateErrors);
7839
- _context35.next = 59;
7922
+ _context35.next = 60;
7840
7923
  return this.getMediaReachabilityMetricFields();
7841
- case 59:
7924
+ case 60:
7842
7925
  reachabilityMetrics = _context35.sent;
7843
7926
  _metrics.default.sendBehavioralMetric(_constants2.default.ADD_MEDIA_SUCCESS, _objectSpread(_objectSpread(_objectSpread({
7844
7927
  correlation_id: this.correlationId,
7845
7928
  locus_id: this.locusUrl.split('/').pop(),
7846
7929
  connectionType: connectionType,
7847
7930
  ipVersion: ipVersion,
7931
+ ipver: ipver,
7848
7932
  selectedCandidatePairChanges: selectedCandidatePairChanges,
7849
7933
  numTransports: numTransports,
7850
7934
  isMultistream: this.isMultistream,
@@ -7868,21 +7952,21 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7868
7952
  // We can log ReceiveSlot SSRCs only after the SDP exchange, so doing it here:
7869
7953
  (_this$remoteMediaMana = this.remoteMediaManager) === null || _this$remoteMediaMana === void 0 ? void 0 : _this$remoteMediaMana.logAllReceiveSlots();
7870
7954
  this.startPeriodicLogUpload();
7871
- _context35.next = 85;
7955
+ _context35.next = 86;
7872
7956
  break;
7873
- case 67:
7874
- _context35.prev = 67;
7875
- _context35.t1 = _context35["catch"](24);
7957
+ case 68:
7958
+ _context35.prev = 68;
7959
+ _context35.t1 = _context35["catch"](25);
7876
7960
  _loggerProxy.default.logger.error("".concat(LOG_HEADER, " failed to establish media connection: "), _context35.t1);
7877
7961
 
7878
7962
  // @ts-ignore
7879
- _context35.next = 72;
7963
+ _context35.next = 73;
7880
7964
  return this.getMediaReachabilityMetricFields();
7881
- case 72:
7965
+ case 73:
7882
7966
  _reachabilityMetrics = _context35.sent;
7883
- _context35.next = 75;
7967
+ _context35.next = 76;
7884
7968
  return this.mediaProperties.getCurrentConnectionInfo();
7885
- case 75:
7969
+ case 76:
7886
7970
  _yield$this$mediaProp2 = _context35.sent;
7887
7971
  _selectedCandidatePairChanges = _yield$this$mediaProp2.selectedCandidatePairChanges;
7888
7972
  _numTransports = _yield$this$mediaProp2.numTransports;
@@ -7904,11 +7988,12 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7904
7988
  connectionState: ((_this$mediaProperties22 = this.mediaProperties.webrtcMediaConnection) === null || _this$mediaProperties22 === void 0 ? void 0 : (_this$mediaProperties23 = _this$mediaProperties22.multistreamConnection) === null || _this$mediaProperties23 === void 0 ? void 0 : (_this$mediaProperties24 = _this$mediaProperties23.pc) === null || _this$mediaProperties24 === void 0 ? void 0 : (_this$mediaProperties25 = _this$mediaProperties24.pc) === null || _this$mediaProperties25 === void 0 ? void 0 : _this$mediaProperties25.connectionState) || ((_this$mediaProperties26 = this.mediaProperties.webrtcMediaConnection) === null || _this$mediaProperties26 === void 0 ? void 0 : (_this$mediaProperties27 = _this$mediaProperties26.mediaConnection) === null || _this$mediaProperties27 === void 0 ? void 0 : (_this$mediaProperties28 = _this$mediaProperties27.pc) === null || _this$mediaProperties28 === void 0 ? void 0 : _this$mediaProperties28.connectionState) || 'unknown',
7905
7989
  iceConnectionState: ((_this$mediaProperties29 = this.mediaProperties.webrtcMediaConnection) === null || _this$mediaProperties29 === void 0 ? void 0 : (_this$mediaProperties30 = _this$mediaProperties29.multistreamConnection) === null || _this$mediaProperties30 === void 0 ? void 0 : (_this$mediaProperties31 = _this$mediaProperties30.pc) === null || _this$mediaProperties31 === void 0 ? void 0 : (_this$mediaProperties32 = _this$mediaProperties31.pc) === null || _this$mediaProperties32 === void 0 ? void 0 : _this$mediaProperties32.iceConnectionState) || ((_this$mediaProperties33 = this.mediaProperties.webrtcMediaConnection) === null || _this$mediaProperties33 === void 0 ? void 0 : (_this$mediaProperties34 = _this$mediaProperties33.mediaConnection) === null || _this$mediaProperties34 === void 0 ? void 0 : (_this$mediaProperties35 = _this$mediaProperties34.pc) === null || _this$mediaProperties35 === void 0 ? void 0 : _this$mediaProperties35.iceConnectionState) || 'unknown'
7906
7990
  }, _reachabilityMetrics), _iceCandidateErrors), {}, {
7907
- iceCandidatesCount: this.iceCandidatesCount
7991
+ iceCandidatesCount: this.iceCandidatesCount,
7992
+ ipver: ipver
7908
7993
  }));
7909
- _context35.next = 82;
7994
+ _context35.next = 83;
7910
7995
  return this.cleanUpOnAddMediaFailure();
7911
- case 82:
7996
+ case 83:
7912
7997
  // Upload logs on error while adding media
7913
7998
  _triggerProxy.default.trigger(this, {
7914
7999
  file: 'meeting/index',
@@ -7920,15 +8005,15 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7920
8005
  });
7921
8006
  }
7922
8007
  throw _context35.t1;
7923
- case 85:
7924
- _context35.prev = 85;
8008
+ case 86:
8009
+ _context35.prev = 86;
7925
8010
  this.addMediaData.icePhaseCallback = DEFAULT_ICE_PHASE_CALLBACK;
7926
- return _context35.finish(85);
7927
- case 88:
8011
+ return _context35.finish(86);
8012
+ case 89:
7928
8013
  case "end":
7929
8014
  return _context35.stop();
7930
8015
  }
7931
- }, _callee35, this, [[24, 67, 85, 88], [29, 34]]);
8016
+ }, _callee35, this, [[25, 68, 86, 89], [30, 35]]);
7932
8017
  }));
7933
8018
  function addMediaInternal(_x33, _x34, _x35) {
7934
8019
  return _addMediaInternal.apply(this, arguments);
@@ -7960,7 +8045,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7960
8045
  * @memberof Meeting
7961
8046
  */
7962
8047
  function enqueueMediaUpdate(mediaUpdateType) {
7963
- var _this46 = this;
8048
+ var _this47 = this;
7964
8049
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
7965
8050
  var canUpdateMediaNow = this.canUpdateMedia();
7966
8051
  return new _promise.default(function (resolve, reject) {
@@ -7971,9 +8056,9 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7971
8056
  options: options
7972
8057
  };
7973
8058
  _loggerProxy.default.logger.log("Meeting:index#enqueueMediaUpdate --> enqueuing media update type=".concat(mediaUpdateType));
7974
- _this46.queuedMediaUpdates.push(queueItem);
8059
+ _this47.queuedMediaUpdates.push(queueItem);
7975
8060
  if (canUpdateMediaNow) {
7976
- _this46.processNextQueuedMediaUpdate();
8061
+ _this47.processNextQueuedMediaUpdate();
7977
8062
  }
7978
8063
  });
7979
8064
  }
@@ -8078,7 +8163,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8078
8163
  }, {
8079
8164
  key: "acknowledge",
8080
8165
  value: function acknowledge(type) {
8081
- var _this47 = this;
8166
+ var _this48 = this;
8082
8167
  if (!type) {
8083
8168
  return _promise.default.reject(new _parameter.default('Type must be set to acknowledge the meeting.'));
8084
8169
  }
@@ -8090,12 +8175,12 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8090
8175
  }).then(function (response) {
8091
8176
  return _promise.default.resolve(response);
8092
8177
  }).then(function (response) {
8093
- _this47.meetingFiniteStateMachine.ring(type);
8178
+ _this48.meetingFiniteStateMachine.ring(type);
8094
8179
  // @ts-ignore
8095
- _this47.webex.internal.newMetrics.submitClientEvent({
8180
+ _this48.webex.internal.newMetrics.submitClientEvent({
8096
8181
  name: 'client.alert.displayed',
8097
8182
  options: {
8098
- meetingId: _this47.id
8183
+ meetingId: _this48.id
8099
8184
  }
8100
8185
  });
8101
8186
  return _promise.default.resolve({
@@ -8120,12 +8205,12 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8120
8205
  }, {
8121
8206
  key: "decline",
8122
8207
  value: function decline(reason) {
8123
- var _this48 = this;
8208
+ var _this49 = this;
8124
8209
  return _util2.default.declineMeeting(this, reason).then(function (decline) {
8125
- _this48.meetingFiniteStateMachine.decline();
8210
+ _this49.meetingFiniteStateMachine.decline();
8126
8211
  return _promise.default.resolve(decline);
8127
8212
  }).catch(function (error) {
8128
- _this48.meetingFiniteStateMachine.fail(error);
8213
+ _this49.meetingFiniteStateMachine.fail(error);
8129
8214
  return _promise.default.reject(error);
8130
8215
  });
8131
8216
  }
@@ -8176,7 +8261,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8176
8261
  }, {
8177
8262
  key: "leave",
8178
8263
  value: function leave() {
8179
- var _this49 = this;
8264
+ var _this50 = this;
8180
8265
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
8181
8266
  var leaveReason = options.reason || _constants.MEETING_REMOVED_REASON.CLIENT_LEAVE_REQUEST;
8182
8267
 
@@ -8188,7 +8273,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8188
8273
  var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
8189
8274
  return (
8190
8275
  // @ts-ignore
8191
- _this49.webex.internal.newMetrics.submitClientEvent({
8276
+ _this50.webex.internal.newMetrics.submitClientEvent({
8192
8277
  name: 'client.call.leave',
8193
8278
  payload: _objectSpread({
8194
8279
  trigger: 'user-interaction',
@@ -8196,7 +8281,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8196
8281
  leaveReason: options.clientEventLeaveReason
8197
8282
  }, payload),
8198
8283
  options: {
8199
- meetingId: _this49.id
8284
+ meetingId: _this50.id
8200
8285
  }
8201
8286
  })
8202
8287
  );
@@ -8205,24 +8290,24 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8205
8290
  return _util2.default.leaveMeeting(this, options).then(function (leave) {
8206
8291
  // CA team recommends submitting this *after* locus /leave
8207
8292
  submitLeaveMetric();
8208
- _this49.meetingFiniteStateMachine.leave();
8209
- _this49.clearMeetingData();
8293
+ _this50.meetingFiniteStateMachine.leave();
8294
+ _this50.clearMeetingData();
8210
8295
 
8211
8296
  // upload logs on leave irrespective of meeting delete
8212
- _triggerProxy.default.trigger(_this49, {
8297
+ _triggerProxy.default.trigger(_this50, {
8213
8298
  file: 'meeting/index',
8214
8299
  function: 'leave'
8215
- }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this49);
8300
+ }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this50);
8216
8301
 
8217
8302
  // TODO: more testing before we remove this code, we are not sure the scenarios for destroy here
8218
- if (_this49.wirelessShare || _this49.guest) {
8303
+ if (_this50.wirelessShare || _this50.guest) {
8219
8304
  // If screen sharing clean the meeting object
8220
- _triggerProxy.default.trigger(_this49, {
8305
+ _triggerProxy.default.trigger(_this50, {
8221
8306
  file: 'meeting/index',
8222
8307
  function: 'leave'
8223
8308
  }, _constants.EVENTS.DESTROY_MEETING, {
8224
8309
  reason: options.reason,
8225
- meetingId: _this49.id
8310
+ meetingId: _this50.id
8226
8311
  });
8227
8312
  }
8228
8313
  _loggerProxy.default.logger.log('Meeting:index#leave --> LEAVE REASON ', leaveReason);
@@ -8239,16 +8324,16 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8239
8324
  shownToUser: false
8240
8325
  }]
8241
8326
  });
8242
- _this49.meetingFiniteStateMachine.fail(error);
8327
+ _this50.meetingFiniteStateMachine.fail(error);
8243
8328
  _loggerProxy.default.logger.error('Meeting:index#leave --> Failed to leave ', error);
8244
8329
  // upload logs on leave irrespective of meeting delete
8245
- _triggerProxy.default.trigger(_this49, {
8330
+ _triggerProxy.default.trigger(_this50, {
8246
8331
  file: 'meeting/index',
8247
8332
  function: 'leave'
8248
- }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this49);
8333
+ }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this50);
8249
8334
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_LEAVE_FAILURE, {
8250
- correlation_id: _this49.correlationId,
8251
- locus_id: _this49.locusUrl.split('/').pop(),
8335
+ correlation_id: _this50.correlationId,
8336
+ locus_id: _this50.locusUrl.split('/').pop(),
8252
8337
  reason: error.message,
8253
8338
  stack: error.stack,
8254
8339
  code: error.code
@@ -8268,7 +8353,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8268
8353
  }, {
8269
8354
  key: "startWhiteboardShare",
8270
8355
  value: function startWhiteboardShare(channelUrl, resourceToken) {
8271
- var _this50 = this;
8356
+ var _this51 = this;
8272
8357
  var whiteboard = this.locusInfo.mediaShares.find(function (element) {
8273
8358
  return element.name === 'whiteboard';
8274
8359
  });
@@ -8301,13 +8386,13 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8301
8386
  body.resourceToken = resourceToken;
8302
8387
  }
8303
8388
  return this.meetingRequest.changeMeetingFloor(body).then(function () {
8304
- _this50.screenShareFloorState = ScreenShareFloorStatus.RELEASED;
8389
+ _this51.screenShareFloorState = ScreenShareFloorStatus.RELEASED;
8305
8390
  return _promise.default.resolve();
8306
8391
  }).catch(function (error) {
8307
8392
  _loggerProxy.default.logger.error('Meeting:index#startWhiteboardShare --> Error ', error);
8308
8393
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_START_WHITEBOARD_SHARE_FAILURE, {
8309
- correlation_id: _this50.correlationId,
8310
- locus_id: _this50.locusUrl.split('/').pop(),
8394
+ correlation_id: _this51.correlationId,
8395
+ locus_id: _this51.locusUrl.split('/').pop(),
8311
8396
  reason: error.message,
8312
8397
  stack: error.stack,
8313
8398
  board: {
@@ -8330,7 +8415,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8330
8415
  }, {
8331
8416
  key: "stopWhiteboardShare",
8332
8417
  value: function stopWhiteboardShare(channelUrl) {
8333
- var _this51 = this;
8418
+ var _this52 = this;
8334
8419
  var whiteboard = this.locusInfo.mediaShares.find(function (element) {
8335
8420
  return element.name === 'whiteboard';
8336
8421
  });
@@ -8359,8 +8444,8 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8359
8444
  }).catch(function (error) {
8360
8445
  _loggerProxy.default.logger.error('Meeting:index#stopWhiteboardShare --> Error ', error);
8361
8446
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_STOP_WHITEBOARD_SHARE_FAILURE, {
8362
- correlation_id: _this51.correlationId,
8363
- locus_id: _this51.locusUrl.split('/').pop(),
8447
+ correlation_id: _this52.correlationId,
8448
+ locus_id: _this52.locusUrl.split('/').pop(),
8364
8449
  reason: error.message,
8365
8450
  stack: error.stack,
8366
8451
  board: {
@@ -8382,7 +8467,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8382
8467
  }, {
8383
8468
  key: "requestScreenShareFloor",
8384
8469
  value: function requestScreenShareFloor() {
8385
- var _this52 = this;
8470
+ var _this53 = this;
8386
8471
  if (!this.mediaProperties.hasLocalShareStream() || !this.mediaProperties.mediaDirection.sendShare) {
8387
8472
  _loggerProxy.default.logger.log("Meeting:index#requestScreenShareFloor --> NOT requesting floor, because we don't have the share stream anymore (shareStream=".concat(this.mediaProperties.shareVideoStream ? 'yes' : 'no', ", sendShare=").concat(this.mediaProperties.mediaDirection.sendShare, ")"));
8388
8473
  this.screenShareFloorState = ScreenShareFloorStatus.RELEASED;
@@ -8413,34 +8498,34 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8413
8498
  resourceUrl: this.resourceUrl,
8414
8499
  shareInstanceId: this.localShareInstanceId
8415
8500
  }).then(function () {
8416
- _this52.screenShareFloorState = ScreenShareFloorStatus.GRANTED;
8501
+ _this53.screenShareFloorState = ScreenShareFloorStatus.GRANTED;
8417
8502
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_SHARE_SUCCESS, {
8418
- correlation_id: _this52.correlationId,
8419
- locus_id: _this52.locusUrl.split('/').pop()
8503
+ correlation_id: _this53.correlationId,
8504
+ locus_id: _this53.locusUrl.split('/').pop()
8420
8505
  });
8421
8506
  return _promise.default.resolve();
8422
8507
  }).catch(function (error) {
8423
8508
  _loggerProxy.default.logger.error('Meeting:index#share --> Error ', error);
8424
8509
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_SHARE_FAILURE, {
8425
- correlation_id: _this52.correlationId,
8426
- locus_id: _this52.locusUrl.split('/').pop(),
8510
+ correlation_id: _this53.correlationId,
8511
+ locus_id: _this53.locusUrl.split('/').pop(),
8427
8512
  reason: error.message,
8428
8513
  stack: error.stack
8429
8514
  });
8430
8515
 
8431
8516
  // @ts-ignore
8432
- _this52.webex.internal.newMetrics.submitClientEvent({
8517
+ _this53.webex.internal.newMetrics.submitClientEvent({
8433
8518
  name: 'client.share.floor-granted.local',
8434
8519
  payload: {
8435
8520
  mediaType: 'share',
8436
8521
  errors: _util2.default.getChangeMeetingFloorErrorPayload(error.message),
8437
- shareInstanceId: _this52.localShareInstanceId
8522
+ shareInstanceId: _this53.localShareInstanceId
8438
8523
  },
8439
8524
  options: {
8440
- meetingId: _this52.id
8525
+ meetingId: _this53.id
8441
8526
  }
8442
8527
  });
8443
- _this52.screenShareFloorState = ScreenShareFloorStatus.RELEASED;
8528
+ _this53.screenShareFloorState = ScreenShareFloorStatus.RELEASED;
8444
8529
  return _promise.default.reject(error);
8445
8530
  });
8446
8531
  }
@@ -8463,10 +8548,10 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8463
8548
  }, {
8464
8549
  key: "requestScreenShareFloorIfPending",
8465
8550
  value: function requestScreenShareFloorIfPending() {
8466
- var _this53 = this;
8551
+ var _this54 = this;
8467
8552
  if (this.floorGrantPending && this.state === _constants.MEETING_STATE.STATES.JOINED) {
8468
8553
  this.requestScreenShareFloor().then(function () {
8469
- _this53.floorGrantPending = false;
8554
+ _this54.floorGrantPending = false;
8470
8555
  });
8471
8556
  }
8472
8557
  }
@@ -8480,7 +8565,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8480
8565
  }, {
8481
8566
  key: "releaseScreenShareFloor",
8482
8567
  value: function releaseScreenShareFloor() {
8483
- var _this54 = this;
8568
+ var _this55 = this;
8484
8569
  var content = this.locusInfo.mediaShares.find(function (element) {
8485
8570
  return element.name === _constants.CONTENT;
8486
8571
  });
@@ -8521,8 +8606,8 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8521
8606
  }).catch(function (error) {
8522
8607
  _loggerProxy.default.logger.error('Meeting:index#releaseScreenShareFloor --> Error ', error);
8523
8608
  _metrics.default.sendBehavioralMetric(_constants2.default.STOP_FLOOR_REQUEST_FAILURE, {
8524
- correlation_id: _this54.correlationId,
8525
- locus_id: _this54.locusUrl.split('/').pop(),
8609
+ correlation_id: _this55.correlationId,
8610
+ locus_id: _this55.locusUrl.split('/').pop(),
8526
8611
  reason: error.message,
8527
8612
  stack: error.stack
8528
8613
  });
@@ -8702,7 +8787,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8702
8787
  }, {
8703
8788
  key: "changeVideoLayout",
8704
8789
  value: function changeVideoLayout(layoutType) {
8705
- var _this55 = this;
8790
+ var _this56 = this;
8706
8791
  var renderInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
8707
8792
  var main = renderInfo.main,
8708
8793
  content = renderInfo.content;
@@ -8756,7 +8841,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8756
8841
  }
8757
8842
  this.lastVideoLayoutInfo = (0, _lodash.cloneDeep)(layoutInfo);
8758
8843
  this.locusInfo.once(_constants.LOCUSINFO.EVENTS.CONTROLS_MEETING_LAYOUT_UPDATED, function (envelope) {
8759
- _triggerProxy.default.trigger(_this55, {
8844
+ _triggerProxy.default.trigger(_this56, {
8760
8845
  file: 'meeting/index',
8761
8846
  function: 'changeVideoLayout'
8762
8847
  }, _constants.EVENT_TRIGGERS.MEETING_CONTROLS_LAYOUT_UPDATE, {
@@ -8872,7 +8957,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8872
8957
  }, {
8873
8958
  key: "endMeetingForAll",
8874
8959
  value: function endMeetingForAll() {
8875
- var _this56 = this;
8960
+ var _this57 = this;
8876
8961
  // @ts-ignore
8877
8962
  this.webex.internal.newMetrics.submitClientEvent({
8878
8963
  name: 'client.call.leave',
@@ -8890,25 +8975,25 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8890
8975
  locus_id: this.locusId
8891
8976
  });
8892
8977
  return _util2.default.endMeetingForAll(this).then(function (end) {
8893
- _this56.meetingFiniteStateMachine.end();
8894
- _this56.clearMeetingData();
8978
+ _this57.meetingFiniteStateMachine.end();
8979
+ _this57.clearMeetingData();
8895
8980
  // upload logs on leave irrespective of meeting delete
8896
- _triggerProxy.default.trigger(_this56, {
8981
+ _triggerProxy.default.trigger(_this57, {
8897
8982
  file: 'meeting/index',
8898
8983
  function: 'endMeetingForAll'
8899
- }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this56);
8984
+ }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this57);
8900
8985
  return end;
8901
8986
  }).catch(function (error) {
8902
- _this56.meetingFiniteStateMachine.fail(error);
8987
+ _this57.meetingFiniteStateMachine.fail(error);
8903
8988
  _loggerProxy.default.logger.error('Meeting:index#endMeetingForAll --> Failed to end meeting ', error);
8904
8989
  // upload logs on leave irrespective of meeting delete
8905
- _triggerProxy.default.trigger(_this56, {
8990
+ _triggerProxy.default.trigger(_this57, {
8906
8991
  file: 'meeting/index',
8907
8992
  function: 'endMeetingForAll'
8908
- }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this56);
8993
+ }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this57);
8909
8994
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_END_ALL_FAILURE, {
8910
- correlation_id: _this56.correlationId,
8911
- locus_id: _this56.locusUrl.split('/').pop(),
8995
+ correlation_id: _this57.correlationId,
8996
+ locus_id: _this57.locusUrl.split('/').pop(),
8912
8997
  reason: error.message,
8913
8998
  stack: error.stack,
8914
8999
  code: error.code
@@ -8950,6 +9035,36 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8950
9035
  return _promise.default.reject(new Error('Error sending reaction, service url not found.'));
8951
9036
  }
8952
9037
 
9038
+ /**
9039
+ * Extend the current meeting duration.
9040
+ *
9041
+ * @param {number} extensionMinutes - how many minutes to extend
9042
+ * @returns {Promise}
9043
+ * @public
9044
+ * @memberof Meeting
9045
+ */
9046
+ }, {
9047
+ key: "extendMeeting",
9048
+ value: function extendMeeting(_ref38) {
9049
+ var meetingPolicyUrl = _ref38.meetingPolicyUrl,
9050
+ meetingInstanceId = _ref38.meetingInstanceId,
9051
+ participantId = _ref38.participantId,
9052
+ _ref38$extensionMinut = _ref38.extensionMinutes,
9053
+ extensionMinutes = _ref38$extensionMinut === void 0 ? 30 : _ref38$extensionMinut;
9054
+ if (!meetingInstanceId || !participantId) {
9055
+ return _promise.default.reject(new Error('Missing meetingInstanceId or participantId'));
9056
+ }
9057
+ if (!meetingPolicyUrl) {
9058
+ return _promise.default.reject(new Error('Missing meetingPolicyUrl'));
9059
+ }
9060
+ return this.meetingRequest.extendMeeting({
9061
+ meetingInstanceId: meetingInstanceId,
9062
+ participantId: participantId,
9063
+ extensionMinutes: extensionMinutes,
9064
+ meetingPolicyUrl: meetingPolicyUrl
9065
+ });
9066
+ }
9067
+
8953
9068
  /**
8954
9069
  * Method to enable or disable reactions inside the meeting.
8955
9070
  *
@@ -9069,7 +9184,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
9069
9184
  _this$mediaProperties43,
9070
9185
  _this$mediaProperties44,
9071
9186
  _this$mediaProperties45,
9072
- _this57 = this;
9187
+ _this58 = this;
9073
9188
  var LOG_HEADER = 'Meeting:index#updateTranscodedMediaConnection -->';
9074
9189
  _loggerProxy.default.logger.info("".concat(LOG_HEADER, " starting"));
9075
9190
  if (!this.canUpdateMedia()) {
@@ -9094,8 +9209,8 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
9094
9209
  }).catch(function (error) {
9095
9210
  _loggerProxy.default.logger.error("".concat(LOG_HEADER, " Error: "), error);
9096
9211
  _metrics.default.sendBehavioralMetric(_constants2.default.UPDATE_MEDIA_FAILURE, {
9097
- correlation_id: _this57.correlationId,
9098
- locus_id: _this57.locusUrl.split('/').pop(),
9212
+ correlation_id: _this58.correlationId,
9213
+ locus_id: _this58.locusUrl.split('/').pop(),
9099
9214
  reason: error.message,
9100
9215
  stack: error.stack
9101
9216
  });
@@ -9549,17 +9664,17 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
9549
9664
  }, {
9550
9665
  key: "setStage",
9551
9666
  value: function setStage() {
9552
- var _ref37 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
9553
- _ref37$activeSpeakerP = _ref37.activeSpeakerProportion,
9554
- activeSpeakerProportion = _ref37$activeSpeakerP === void 0 ? 0.5 : _ref37$activeSpeakerP,
9555
- customBackground = _ref37.customBackground,
9556
- customLogo = _ref37.customLogo,
9557
- customNameLabel = _ref37.customNameLabel,
9558
- importantParticipants = _ref37.importantParticipants,
9559
- _ref37$lockAttendeeVi = _ref37.lockAttendeeViewOnStage,
9560
- lockAttendeeViewOnStage = _ref37$lockAttendeeVi === void 0 ? false : _ref37$lockAttendeeVi,
9561
- _ref37$showActiveSpea = _ref37.showActiveSpeaker,
9562
- showActiveSpeaker = _ref37$showActiveSpea === void 0 ? false : _ref37$showActiveSpea;
9667
+ var _ref39 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
9668
+ _ref39$activeSpeakerP = _ref39.activeSpeakerProportion,
9669
+ activeSpeakerProportion = _ref39$activeSpeakerP === void 0 ? 0.5 : _ref39$activeSpeakerP,
9670
+ customBackground = _ref39.customBackground,
9671
+ customLogo = _ref39.customLogo,
9672
+ customNameLabel = _ref39.customNameLabel,
9673
+ importantParticipants = _ref39.importantParticipants,
9674
+ _ref39$lockAttendeeVi = _ref39.lockAttendeeViewOnStage,
9675
+ lockAttendeeViewOnStage = _ref39$lockAttendeeVi === void 0 ? false : _ref39$lockAttendeeVi,
9676
+ _ref39$showActiveSpea = _ref39.showActiveSpeaker,
9677
+ showActiveSpeaker = _ref39$showActiveSpea === void 0 ? false : _ref39$showActiveSpea;
9563
9678
  var videoLayout = {
9564
9679
  overrideDefault: true,
9565
9680
  lockAttendeeViewOnStageOnly: lockAttendeeViewOnStage,
@@ -9616,6 +9731,45 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
9616
9731
  };
9617
9732
  return this.meetingRequest.synchronizeStage(this.locusUrl, videoLayout);
9618
9733
  }
9734
+
9735
+ /**
9736
+ * Notifies the host with the given meeting UUID and display names.
9737
+ *
9738
+ * @param {string} meetingUuid - The UUID of the meeting.
9739
+ * @param {string[]} displayName - An array of display names to notify the host with.
9740
+ * @returns {Promise<any>} The result of the notifyHost request.
9741
+ */
9742
+ }, {
9743
+ key: "notifyHost",
9744
+ value: function notifyHost(meetingUuid, displayName) {
9745
+ return this.meetingRequest.notifyHost(this.meetingInfo.siteFullUrl, this.locusId, meetingUuid, displayName);
9746
+ }
9747
+
9748
+ /**
9749
+ * Call out a SIP participant to a meeting
9750
+ * @param {string} address - The SIP address or phone number
9751
+ * @param {string} displayName - The display name for the participant
9752
+ * @param {string} [correlationId] - Optional correlation ID
9753
+ * @returns {Promise} Promise that resolves when the call-out is initiated
9754
+ */
9755
+ }, {
9756
+ key: "sipCallOut",
9757
+ value: function sipCallOut(address, displayName) {
9758
+ return this.meetingRequest.sipCallOut(this.meetingInfo.meetingId, this.meetingInfo.meetingId, address, displayName);
9759
+ }
9760
+
9761
+ /**
9762
+ * Cancel an ongoing SIP call-out
9763
+ * @param {string} participantId - The participant ID to cancel
9764
+ * @returns {Promise} Promise that resolves when the call-out is cancelled
9765
+ * @public
9766
+ * @memberof Meetings
9767
+ */
9768
+ }, {
9769
+ key: "cancelSipCallOut",
9770
+ value: function cancelSipCallOut(participantId) {
9771
+ return this.meetingRequest.cancelSipCallOut(participantId);
9772
+ }
9619
9773
  }]);
9620
9774
  return Meeting;
9621
9775
  }(_webexCore.StatelessWebexPlugin);