@webex/plugin-meetings 3.8.1-web-workers-keepalive.1 → 3.9.0-next.1

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 (87) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/constants.js +24 -2
  4. package/dist/constants.js.map +1 -1
  5. package/dist/interpretation/index.js +1 -1
  6. package/dist/interpretation/siLanguage.js +1 -1
  7. package/dist/locus-info/index.js +39 -85
  8. package/dist/locus-info/index.js.map +1 -1
  9. package/dist/meeting/brbState.js +14 -12
  10. package/dist/meeting/brbState.js.map +1 -1
  11. package/dist/meeting/in-meeting-actions.js +6 -0
  12. package/dist/meeting/in-meeting-actions.js.map +1 -1
  13. package/dist/meeting/index.js +274 -140
  14. package/dist/meeting/index.js.map +1 -1
  15. package/dist/meeting/request.js +19 -0
  16. package/dist/meeting/request.js.map +1 -1
  17. package/dist/meeting/request.type.js.map +1 -1
  18. package/dist/meeting/type.js +7 -0
  19. package/dist/meeting/type.js.map +1 -0
  20. package/dist/meeting/util.js +68 -2
  21. package/dist/meeting/util.js.map +1 -1
  22. package/dist/meetings/index.js +35 -33
  23. package/dist/meetings/index.js.map +1 -1
  24. package/dist/member/index.js.map +1 -1
  25. package/dist/members/index.js +11 -9
  26. package/dist/members/index.js.map +1 -1
  27. package/dist/members/request.js +3 -3
  28. package/dist/members/request.js.map +1 -1
  29. package/dist/members/util.js +18 -6
  30. package/dist/members/util.js.map +1 -1
  31. package/dist/multistream/mediaRequestManager.js +1 -1
  32. package/dist/multistream/mediaRequestManager.js.map +1 -1
  33. package/dist/multistream/remoteMedia.js +34 -5
  34. package/dist/multistream/remoteMedia.js.map +1 -1
  35. package/dist/multistream/remoteMediaGroup.js +42 -2
  36. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  37. package/dist/multistream/sendSlotManager.js +32 -2
  38. package/dist/multistream/sendSlotManager.js.map +1 -1
  39. package/dist/types/constants.d.ts +22 -0
  40. package/dist/types/locus-info/index.d.ts +0 -9
  41. package/dist/types/meeting/brbState.d.ts +0 -1
  42. package/dist/types/meeting/in-meeting-actions.d.ts +6 -0
  43. package/dist/types/meeting/index.d.ts +40 -19
  44. package/dist/types/meeting/request.d.ts +9 -1
  45. package/dist/types/meeting/request.type.d.ts +74 -0
  46. package/dist/types/meeting/type.d.ts +9 -0
  47. package/dist/types/meeting/util.d.ts +3 -0
  48. package/dist/types/members/index.d.ts +10 -7
  49. package/dist/types/members/request.d.ts +1 -1
  50. package/dist/types/members/util.d.ts +7 -3
  51. package/dist/types/multistream/remoteMedia.d.ts +20 -1
  52. package/dist/types/multistream/remoteMediaGroup.d.ts +11 -0
  53. package/dist/types/multistream/sendSlotManager.d.ts +16 -0
  54. package/dist/webinar/index.js +1 -1
  55. package/package.json +22 -23
  56. package/src/constants.ts +23 -2
  57. package/src/locus-info/index.ts +48 -86
  58. package/src/meeting/brbState.ts +9 -7
  59. package/src/meeting/in-meeting-actions.ts +13 -0
  60. package/src/meeting/index.ts +165 -38
  61. package/src/meeting/request.ts +16 -0
  62. package/src/meeting/request.type.ts +64 -0
  63. package/src/meeting/type.ts +9 -0
  64. package/src/meeting/util.ts +73 -2
  65. package/src/meetings/index.ts +3 -2
  66. package/src/member/index.ts +1 -0
  67. package/src/members/index.ts +13 -10
  68. package/src/members/request.ts +2 -2
  69. package/src/members/util.ts +16 -4
  70. package/src/multistream/mediaRequestManager.ts +7 -7
  71. package/src/multistream/remoteMedia.ts +34 -4
  72. package/src/multistream/remoteMediaGroup.ts +37 -2
  73. package/src/multistream/sendSlotManager.ts +34 -2
  74. package/test/unit/spec/locus-info/index.js +199 -83
  75. package/test/unit/spec/meeting/brbState.ts +9 -9
  76. package/test/unit/spec/meeting/in-meeting-actions.ts +6 -0
  77. package/test/unit/spec/meeting/index.js +729 -80
  78. package/test/unit/spec/meeting/request.js +71 -0
  79. package/test/unit/spec/meeting/utils.js +122 -1
  80. package/test/unit/spec/meetings/index.js +2 -0
  81. package/test/unit/spec/members/index.js +68 -9
  82. package/test/unit/spec/members/request.js +2 -2
  83. package/test/unit/spec/members/utils.js +27 -7
  84. package/test/unit/spec/multistream/mediaRequestManager.ts +19 -6
  85. package/test/unit/spec/multistream/remoteMedia.ts +66 -2
  86. package/test/unit/spec/multistream/sendSlotManager.ts +59 -0
  87. package/test/unit/spec/reachability/index.ts +3 -1
@@ -382,10 +382,11 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
382
382
  /**
383
383
  * @param {Object} attrs
384
384
  * @param {Object} options
385
+ * @param {Function} callback - if provided, it will be called with the newly created meeting object as soon as the meeting.id is set
385
386
  * @constructor
386
387
  * @memberof Meeting
387
388
  */
388
- function Meeting(attrs, _options) {
389
+ function Meeting(attrs, _options, callback) {
389
390
  var _attrs$callStateForMe, _attrs$callStateForMe2, _this$locusInfo, _this$locusInfo$links, _this$locusInfo$links2, _this$locusInfo$links3, _this$locusInfo2, _this$locusInfo2$full, _this$locusInfo3, _this$locusInfo4;
390
391
  var _this;
391
392
  (0, _classCallCheck2.default)(this, Meeting);
@@ -1489,6 +1490,10 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
1489
1490
  * @memberof Meeting
1490
1491
  */
1491
1492
  _this.id = _uuid.default.v4();
1493
+ if (callback) {
1494
+ callback((0, _assertThisInitialized2.default)(_this));
1495
+ }
1496
+
1492
1497
  /**
1493
1498
  * Call state used for metrics
1494
1499
  * @instance
@@ -2377,6 +2382,24 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
2377
2382
  this.callStateForMetrics.correlationId = correlationId;
2378
2383
  }
2379
2384
 
2385
+ /**
2386
+ * Getter - Returns callStateForMetrics.pstnCorrelationId
2387
+ * @returns {string | undefined}
2388
+ */
2389
+ }, {
2390
+ key: "pstnCorrelationId",
2391
+ get: function get() {
2392
+ return this.callStateForMetrics.pstnCorrelationId;
2393
+ }
2394
+
2395
+ /**
2396
+ * Setter - sets callStateForMetrics.pstnCorrelationId
2397
+ * @param {string | undefined} correlationId
2398
+ */,
2399
+ set: function set(correlationId) {
2400
+ this.callStateForMetrics.pstnCorrelationId = correlationId;
2401
+ }
2402
+
2380
2403
  /**
2381
2404
  * Getter - Returns callStateForMetrics.userNameInput
2382
2405
  * @returns {string}
@@ -3655,9 +3678,16 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
3655
3678
  // There is no concept of local/remote share for whiteboard
3656
3679
  // It does not matter who requested to share the whiteboard, everyone gets the same view
3657
3680
  else if (whiteboardShare.disposition === _constants.FLOOR_ACTION.GRANTED) {
3658
- // WHITEBOARD - sharing whiteboard
3659
- // Webinar attendee should receive whiteboard as remote share
3660
- newShareStatus = (_this15$locusInfo = _this15.locusInfo) !== null && _this15$locusInfo !== void 0 && (_this15$locusInfo$inf = _this15$locusInfo.info) !== null && _this15$locusInfo$inf !== void 0 && _this15$locusInfo$inf.isWebinar && (_this15$webinar = _this15.webinar) !== null && _this15$webinar !== void 0 && _this15$webinar.selfIsAttendee ? _constants.SHARE_STATUS.REMOTE_SHARE_ACTIVE : _constants.SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE;
3681
+ if ((_this15$locusInfo = _this15.locusInfo) !== null && _this15$locusInfo !== void 0 && (_this15$locusInfo$inf = _this15$locusInfo.info) !== null && _this15$locusInfo$inf !== void 0 && _this15$locusInfo$inf.isWebinar && (_this15$webinar = _this15.webinar) !== null && _this15$webinar !== void 0 && _this15$webinar.selfIsAttendee) {
3682
+ // WHITEBOARD - sharing whiteboard
3683
+ // Webinar attendee should receive whiteboard as remote share
3684
+ newShareStatus = _constants.SHARE_STATUS.REMOTE_SHARE_ACTIVE;
3685
+ } else if (_this15.guest) {
3686
+ // If user is a guest to a meeting, they should receive whiteboard as remote share
3687
+ newShareStatus = _constants.SHARE_STATUS.REMOTE_SHARE_ACTIVE;
3688
+ } else {
3689
+ newShareStatus = _constants.SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE;
3690
+ }
3661
3691
  }
3662
3692
  // or if content share is either released or null and whiteboard share is either released or null, no one is sharing
3663
3693
  else if ((previousContentShare && contentShare.disposition === _constants.FLOOR_ACTION.RELEASED || contentShare.disposition === null) && (previousWhiteboardShare && whiteboardShare.disposition === _constants.FLOOR_ACTION.RELEASED || whiteboardShare.disposition === null)) {
@@ -4318,11 +4348,13 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
4318
4348
 
4319
4349
  /**
4320
4350
  * Invite a guest to the call that isn't normally part of this call
4321
- * @param {Object} invitee
4351
+ * @param {Invitee} invitee
4322
4352
  * @param {String} invitee.emailAddress
4323
4353
  * @param {String} invitee.email
4324
4354
  * @param {String} invitee.phoneNumber
4325
4355
  * @param {Boolean} [alertIfActive]
4356
+ * @param {Boolean} [invitee.skipEmailValidation]
4357
+ * @param {Boolean} [invitee.isInternalNumber]
4326
4358
  * @returns {Promise} see #members.addMember
4327
4359
  * @public
4328
4360
  * @memberof Meeting
@@ -4336,7 +4368,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
4336
4368
 
4337
4369
  /**
4338
4370
  * Cancel an outgoing phone call invitation made during a meeting
4339
- * @param {Object} invitee
4371
+ * @param {Invitee} invitee
4340
4372
  * @param {String} invitee.phoneNumber
4341
4373
  * @returns {Promise} see #members.cancelPhoneInvite
4342
4374
  * @public
@@ -4349,17 +4381,18 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
4349
4381
  }
4350
4382
 
4351
4383
  /**
4352
- * Cancel an SIP call invitation made during a meeting
4353
- * @param {Object} invitee
4384
+ * Cancel an SIP/phone call invitation made during a meeting
4385
+ * @param {Invitee} invitee
4354
4386
  * @param {String} invitee.memberId
4355
- * @returns {Promise} see #members.cancelSIPInvite
4387
+ * @param {Boolean} [invitee.isInternalNumber] - When cancel phone invitation, if the number is internal
4388
+ * @returns {Promise} see #members.cancelInviteByMemberId
4356
4389
  * @public
4357
4390
  * @memberof Meeting
4358
4391
  */
4359
4392
  }, {
4360
- key: "cancelSIPInvite",
4361
- value: function cancelSIPInvite(invitee) {
4362
- return this.members.cancelSIPInvite(invitee);
4393
+ key: "cancelInviteByMemberId",
4394
+ value: function cancelInviteByMemberId(invitee) {
4395
+ return this.members.cancelInviteByMemberId(invitee);
4363
4396
  }
4364
4397
 
4365
4398
  /**
@@ -4644,6 +4677,9 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
4644
4677
  isClosedCaptionActive: _util2.default.isClosedCaptionActive(this.userDisplayHints),
4645
4678
  canStartManualCaption: _util2.default.canStartManualCaption(this.userDisplayHints),
4646
4679
  canStopManualCaption: _util2.default.canStopManualCaption(this.userDisplayHints),
4680
+ isLocalRecordingStarted: _util2.default.isLocalRecordingStarted(this.userDisplayHints),
4681
+ isLocalRecordingStopped: _util2.default.isLocalRecordingStopped(this.userDisplayHints),
4682
+ isLocalRecordingPaused: _util2.default.isLocalRecordingPaused(this.userDisplayHints),
4647
4683
  isManualCaptionActive: _util2.default.isManualCaptionActive(this.userDisplayHints),
4648
4684
  isSaveTranscriptsEnabled: _util2.default.isSaveTranscriptsEnabled(this.userDisplayHints),
4649
4685
  isWebexAssistantActive: _util2.default.isWebexAssistantActive(this.userDisplayHints),
@@ -6318,24 +6354,10 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6318
6354
  _this36.deferJoin = undefined;
6319
6355
  return join;
6320
6356
  }).catch(function (error) {
6321
- var _this36$meetingInfo, _error$error;
6357
+ var _error$error;
6322
6358
  _this36.meetingFiniteStateMachine.fail(error);
6323
6359
  _loggerProxy.default.logger.error('Meeting:index#join --> Failed', error);
6324
6360
 
6325
- // @ts-ignore
6326
- _this36.webex.internal.newMetrics.submitClientEvent({
6327
- name: 'client.locus.join.response',
6328
- payload: {
6329
- identifiers: {
6330
- meetingLookupUrl: (_this36$meetingInfo = _this36.meetingInfo) === null || _this36$meetingInfo === void 0 ? void 0 : _this36$meetingInfo.meetingLookupUrl
6331
- }
6332
- },
6333
- options: {
6334
- meetingId: _this36.id,
6335
- rawError: error
6336
- }
6337
- });
6338
-
6339
6361
  // TODO: change this to error codes and pre defined dictionary
6340
6362
  _metrics.default.sendBehavioralMetric(_constants2.default.JOIN_FAILURE, {
6341
6363
  correlation_id: _this36.correlationId,
@@ -6489,14 +6511,14 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6489
6511
  value: function dialInPstn() {
6490
6512
  var _this38 = this;
6491
6513
  if (this.isPhoneProvisioned(this.dialInDeviceStatus)) return _promise.default.resolve(); // prevent multiple dial in devices from being provisioned
6492
-
6493
- var correlationId = this.correlationId,
6514
+ this.pstnCorrelationId = _uuid.default.v4();
6515
+ var pstnCorrelationId = this.pstnCorrelationId,
6494
6516
  locusUrl = this.locusUrl;
6495
6517
  if (!this.dialInUrl) this.dialInUrl = "dialin:///".concat(_uuid.default.v4());
6496
6518
  return this.meetingRequest
6497
6519
  // @ts-ignore
6498
6520
  .dialIn({
6499
- correlationId: correlationId,
6521
+ correlationId: pstnCorrelationId,
6500
6522
  dialInUrl: this.dialInUrl,
6501
6523
  locusUrl: locusUrl,
6502
6524
  clientUrl: this.deviceUrl
@@ -6505,11 +6527,15 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6505
6527
  _metrics.default.sendBehavioralMetric(_constants2.default.ADD_DIAL_IN_FAILURE, {
6506
6528
  correlation_id: _this38.correlationId,
6507
6529
  dial_in_url: _this38.dialInUrl,
6530
+ dial_in_correlation_id: pstnCorrelationId,
6508
6531
  locus_id: locusUrl.split('/').pop(),
6509
6532
  client_url: _this38.deviceUrl,
6510
6533
  reason: (_error$error2 = error.error) === null || _error$error2 === void 0 ? void 0 : _error$error2.message,
6511
6534
  stack: error.stack
6512
6535
  });
6536
+ if (_this38.pstnCorrelationId === pstnCorrelationId) {
6537
+ _this38.pstnCorrelationId = undefined;
6538
+ }
6513
6539
  return _promise.default.reject(error);
6514
6540
  });
6515
6541
  }
@@ -6526,14 +6552,14 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6526
6552
  value: function dialOutPstn(phoneNumber) {
6527
6553
  var _this39 = this;
6528
6554
  if (this.isPhoneProvisioned(this.dialOutDeviceStatus)) return _promise.default.resolve(); // prevent multiple dial out devices from being provisioned
6529
-
6530
- var correlationId = this.correlationId,
6531
- locusUrl = this.locusUrl;
6555
+ this.pstnCorrelationId = _uuid.default.v4();
6556
+ var locusUrl = this.locusUrl,
6557
+ pstnCorrelationId = this.pstnCorrelationId;
6532
6558
  if (!this.dialOutUrl) this.dialOutUrl = "dialout:///".concat(_uuid.default.v4());
6533
6559
  return this.meetingRequest
6534
6560
  // @ts-ignore
6535
6561
  .dialOut({
6536
- correlationId: correlationId,
6562
+ correlationId: pstnCorrelationId,
6537
6563
  dialOutUrl: this.dialOutUrl,
6538
6564
  phoneNumber: phoneNumber,
6539
6565
  locusUrl: locusUrl,
@@ -6543,11 +6569,15 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6543
6569
  _metrics.default.sendBehavioralMetric(_constants2.default.ADD_DIAL_OUT_FAILURE, {
6544
6570
  correlation_id: _this39.correlationId,
6545
6571
  dial_out_url: _this39.dialOutUrl,
6572
+ dial_out_correlation_id: pstnCorrelationId,
6546
6573
  locus_id: locusUrl.split('/').pop(),
6547
6574
  client_url: _this39.deviceUrl,
6548
6575
  reason: (_error$error3 = error.error) === null || _error$error3 === void 0 ? void 0 : _error$error3.message,
6549
6576
  stack: error.stack
6550
6577
  });
6578
+ if (_this39.pstnCorrelationId === pstnCorrelationId) {
6579
+ _this39.pstnCorrelationId = undefined;
6580
+ }
6551
6581
  return _promise.default.reject(error);
6552
6582
  });
6553
6583
  }
@@ -6562,7 +6592,13 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6562
6592
  }, {
6563
6593
  key: "disconnectPhoneAudio",
6564
6594
  value: function disconnectPhoneAudio() {
6565
- return _promise.default.all([this.isPhoneProvisioned(this.dialInDeviceStatus) ? _util2.default.disconnectPhoneAudio(this, this.dialInUrl) : _promise.default.resolve(), this.isPhoneProvisioned(this.dialOutDeviceStatus) ? _util2.default.disconnectPhoneAudio(this, this.dialOutUrl) : _promise.default.resolve()]);
6595
+ var _this40 = this;
6596
+ var correlationToClear = this.pstnCorrelationId;
6597
+ return _promise.default.all([this.isPhoneProvisioned(this.dialInDeviceStatus) ? _util2.default.disconnectPhoneAudio(this, this.dialInUrl) : _promise.default.resolve(), this.isPhoneProvisioned(this.dialOutDeviceStatus) ? _util2.default.disconnectPhoneAudio(this, this.dialOutUrl) : _promise.default.resolve()]).then(function () {
6598
+ if (_this40.pstnCorrelationId === correlationToClear) {
6599
+ _this40.pstnCorrelationId = undefined;
6600
+ }
6601
+ });
6566
6602
  }
6567
6603
 
6568
6604
  /**
@@ -6575,7 +6611,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6575
6611
  }, {
6576
6612
  key: "moveTo",
6577
6613
  value: function moveTo(resourceId) {
6578
- var _this40 = this;
6614
+ var _this41 = this;
6579
6615
  if (!resourceId) {
6580
6616
  throw new _parameter.default('Cannot move call without a resourceId.');
6581
6617
  }
@@ -6619,12 +6655,12 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6619
6655
  while (1) switch (_context21.prev = _context21.next) {
6620
6656
  case 0:
6621
6657
  _context21.prev = 0;
6622
- if (!(_this40.screenShareFloorState === ScreenShareFloorStatus.GRANTED)) {
6658
+ if (!(_this41.screenShareFloorState === ScreenShareFloorStatus.GRANTED)) {
6623
6659
  _context21.next = 4;
6624
6660
  break;
6625
6661
  }
6626
6662
  _context21.next = 4;
6627
- return _this40.releaseScreenShareFloor();
6663
+ return _this41.releaseScreenShareFloor();
6628
6664
  case 4:
6629
6665
  mediaSettings = {
6630
6666
  mediaDirection: {
@@ -6636,37 +6672,37 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6636
6672
  receiveShare: true
6637
6673
  }
6638
6674
  };
6639
- _this40.mediaProperties.setMediaDirection(mediaSettings.mediaDirection);
6640
- _this40.mediaProperties.unsetRemoteMedia();
6675
+ _this41.mediaProperties.setMediaDirection(mediaSettings.mediaDirection);
6676
+ _this41.mediaProperties.unsetRemoteMedia();
6641
6677
 
6642
6678
  // when a move to is intiated by the client , Locus delets the existing media node from the server as soon the device answers the meeting
6643
6679
  // once the device answers we close the old connection and create new media server connection with only share enabled
6644
- if (!_this40.statsAnalyzer) {
6680
+ if (!_this41.statsAnalyzer) {
6645
6681
  _context21.next = 10;
6646
6682
  break;
6647
6683
  }
6648
6684
  _context21.next = 10;
6649
- return _this40.statsAnalyzer.stopAnalyzer();
6685
+ return _this41.statsAnalyzer.stopAnalyzer();
6650
6686
  case 10:
6651
6687
  _context21.next = 12;
6652
- return _this40.closeRemoteStreams();
6688
+ return _this41.closeRemoteStreams();
6653
6689
  case 12:
6654
6690
  _context21.next = 14;
6655
- return _this40.closePeerConnections();
6691
+ return _this41.closePeerConnections();
6656
6692
  case 14:
6657
- _this40.cleanupLocalStreams();
6658
- _this40.unsetRemoteStreams();
6659
- _this40.unsetPeerConnections();
6660
- _this40.reconnectionManager.cleanUp();
6693
+ _this41.cleanupLocalStreams();
6694
+ _this41.unsetRemoteStreams();
6695
+ _this41.unsetPeerConnections();
6696
+ _this41.reconnectionManager.cleanUp();
6661
6697
  _context21.next = 20;
6662
- return _this40.addMedia({
6698
+ return _this41.addMedia({
6663
6699
  audioEnabled: false,
6664
6700
  videoEnabled: false,
6665
6701
  shareVideoEnabled: true
6666
6702
  });
6667
6703
  case 20:
6668
6704
  _metrics.default.sendBehavioralMetric(_constants2.default.MOVE_TO_SUCCESS);
6669
- _this40.isMoveToInProgress = false;
6705
+ _this41.isMoveToInProgress = false;
6670
6706
  _context21.next = 29;
6671
6707
  break;
6672
6708
  case 24:
@@ -6674,12 +6710,12 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6674
6710
  _context21.t0 = _context21["catch"](0);
6675
6711
  _loggerProxy.default.logger.error('Meeting:index#moveTo --> Failed to moveTo resourceId', _context21.t0);
6676
6712
  _metrics.default.sendBehavioralMetric(_constants2.default.MOVE_TO_FAILURE, {
6677
- correlation_id: _this40.correlationId,
6678
- locus_id: _this40.locusUrl.split('/').pop(),
6713
+ correlation_id: _this41.correlationId,
6714
+ locus_id: _this41.locusUrl.split('/').pop(),
6679
6715
  reason: _context21.t0.message,
6680
6716
  stack: _context21.t0.stack
6681
6717
  });
6682
- _this40.isMoveToInProgress = false;
6718
+ _this41.isMoveToInProgress = false;
6683
6719
  case 29:
6684
6720
  case "end":
6685
6721
  return _context21.stop();
@@ -6695,17 +6731,17 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6695
6731
  resourceId: resourceId,
6696
6732
  moveToResource: true
6697
6733
  }).then(function () {
6698
- _this40.meetingFiniteStateMachine.join();
6734
+ _this41.meetingFiniteStateMachine.join();
6699
6735
  }).catch(function (error) {
6700
- _this40.meetingFiniteStateMachine.fail(error);
6736
+ _this41.meetingFiniteStateMachine.fail(error);
6701
6737
  _metrics.default.sendBehavioralMetric(_constants2.default.MOVE_TO_FAILURE, {
6702
- correlation_id: _this40.correlationId,
6703
- locus_id: _this40.locusUrl.split('/').pop(),
6738
+ correlation_id: _this41.correlationId,
6739
+ locus_id: _this41.locusUrl.split('/').pop(),
6704
6740
  reason: error.message,
6705
6741
  stack: error.stack
6706
6742
  });
6707
6743
  _loggerProxy.default.logger.error('Meeting:index#moveTo --> Failed to moveTo resourceId', error);
6708
- _this40.isMoveToInProgress = false;
6744
+ _this41.isMoveToInProgress = false;
6709
6745
  return _promise.default.reject(error);
6710
6746
  });
6711
6747
  }
@@ -6720,7 +6756,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6720
6756
  }, {
6721
6757
  key: "moveFrom",
6722
6758
  value: function moveFrom(resourceId) {
6723
- var _this41 = this;
6759
+ var _this42 = this;
6724
6760
  // On moveFrom ask the developer to re capture it moveFrom then updateMedia
6725
6761
  if (!resourceId) {
6726
6762
  throw new _parameter.default('Cannot move call without a resourceId.');
@@ -6735,19 +6771,19 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6735
6771
  }
6736
6772
  });
6737
6773
  return _util2.default.joinMeetingOptions(this).then(function () {
6738
- return _util2.default.leaveMeeting(_this41, {
6774
+ return _util2.default.leaveMeeting(_this42, {
6739
6775
  resourceId: resourceId,
6740
6776
  correlationId: oldCorrelationId,
6741
6777
  moveMeeting: true
6742
6778
  }).then(function () {
6743
- _this41.resourceId = '';
6779
+ _this42.resourceId = '';
6744
6780
  _metrics.default.sendBehavioralMetric(_constants2.default.MOVE_FROM_SUCCESS);
6745
6781
  });
6746
6782
  }).catch(function (error) {
6747
- _this41.meetingFiniteStateMachine.fail(error);
6783
+ _this42.meetingFiniteStateMachine.fail(error);
6748
6784
  _metrics.default.sendBehavioralMetric(_constants2.default.MOVE_FROM_FAILURE, {
6749
- correlation_id: _this41.correlationId,
6750
- locus_id: _this41.locusUrl.split('/').pop(),
6785
+ correlation_id: _this42.correlationId,
6786
+ locus_id: _this42.locusUrl.split('/').pop(),
6751
6787
  reason: error.message,
6752
6788
  stack: error.stack
6753
6789
  });
@@ -6870,9 +6906,9 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6870
6906
  }, {
6871
6907
  key: "forwardEvent",
6872
6908
  value: function forwardEvent(eventEmitter, eventTypeToForward, meetingEventType) {
6873
- var _this42 = this;
6909
+ var _this43 = this;
6874
6910
  eventEmitter.on(eventTypeToForward, function (data) {
6875
- return _triggerProxy.default.trigger(_this42, {
6911
+ return _triggerProxy.default.trigger(_this43, {
6876
6912
  file: 'meetings',
6877
6913
  function: 'addMedia'
6878
6914
  }, meetingEventType, data);
@@ -7058,7 +7094,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7058
7094
  key: "waitForRemoteSDPAnswer",
7059
7095
  value: (function () {
7060
7096
  var _waitForRemoteSDPAnswer = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee25() {
7061
- var _this43 = this;
7097
+ var _this44 = this;
7062
7098
  var LOG_HEADER, deferSDPAnswer;
7063
7099
  return _regenerator.default.wrap(function _callee25$(_context25) {
7064
7100
  while (1) switch (_context25.prev = _context25.next) {
@@ -7077,18 +7113,18 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7077
7113
  var error = new Error('Timed out waiting for REMOTE SDP ANSWER');
7078
7114
 
7079
7115
  // @ts-ignore
7080
- _this43.webex.internal.newMetrics.submitClientEvent({
7116
+ _this44.webex.internal.newMetrics.submitClientEvent({
7081
7117
  name: 'client.media-engine.remote-sdp-received',
7082
7118
  payload: {
7083
7119
  canProceed: false,
7084
7120
  errors: [
7085
7121
  // @ts-ignore
7086
- _this43.webex.internal.newMetrics.callDiagnosticMetrics.getErrorPayloadForClientErrorCode({
7122
+ _this44.webex.internal.newMetrics.callDiagnosticMetrics.getErrorPayloadForClientErrorCode({
7087
7123
  clientErrorCode: _internalPluginMetrics.CALL_DIAGNOSTIC_CONFIG.MISSING_ROAP_ANSWER_CLIENT_CODE
7088
7124
  })]
7089
7125
  },
7090
7126
  options: {
7091
- meetingId: _this43.id,
7127
+ meetingId: _this44.id,
7092
7128
  rawError: error
7093
7129
  }
7094
7130
  });
@@ -7595,10 +7631,10 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7595
7631
  }, {
7596
7632
  key: "addMedia",
7597
7633
  value: function addMedia() {
7598
- var _this44 = this;
7634
+ var _this45 = this;
7599
7635
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
7600
7636
  return this.addMediaInternal(function () {
7601
- return _this44.turnServerUsed ? 'JOIN_MEETING_FINAL' : 'JOIN_MEETING_RETRY';
7637
+ return _this45.turnServerUsed ? 'JOIN_MEETING_FINAL' : 'JOIN_MEETING_RETRY';
7602
7638
  }, undefined, false, options);
7603
7639
  }
7604
7640
 
@@ -7924,7 +7960,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7924
7960
  * @memberof Meeting
7925
7961
  */
7926
7962
  function enqueueMediaUpdate(mediaUpdateType) {
7927
- var _this45 = this;
7963
+ var _this46 = this;
7928
7964
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
7929
7965
  var canUpdateMediaNow = this.canUpdateMedia();
7930
7966
  return new _promise.default(function (resolve, reject) {
@@ -7935,9 +7971,9 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7935
7971
  options: options
7936
7972
  };
7937
7973
  _loggerProxy.default.logger.log("Meeting:index#enqueueMediaUpdate --> enqueuing media update type=".concat(mediaUpdateType));
7938
- _this45.queuedMediaUpdates.push(queueItem);
7974
+ _this46.queuedMediaUpdates.push(queueItem);
7939
7975
  if (canUpdateMediaNow) {
7940
- _this45.processNextQueuedMediaUpdate();
7976
+ _this46.processNextQueuedMediaUpdate();
7941
7977
  }
7942
7978
  });
7943
7979
  }
@@ -8042,7 +8078,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8042
8078
  }, {
8043
8079
  key: "acknowledge",
8044
8080
  value: function acknowledge(type) {
8045
- var _this46 = this;
8081
+ var _this47 = this;
8046
8082
  if (!type) {
8047
8083
  return _promise.default.reject(new _parameter.default('Type must be set to acknowledge the meeting.'));
8048
8084
  }
@@ -8054,12 +8090,12 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8054
8090
  }).then(function (response) {
8055
8091
  return _promise.default.resolve(response);
8056
8092
  }).then(function (response) {
8057
- _this46.meetingFiniteStateMachine.ring(type);
8093
+ _this47.meetingFiniteStateMachine.ring(type);
8058
8094
  // @ts-ignore
8059
- _this46.webex.internal.newMetrics.submitClientEvent({
8095
+ _this47.webex.internal.newMetrics.submitClientEvent({
8060
8096
  name: 'client.alert.displayed',
8061
8097
  options: {
8062
- meetingId: _this46.id
8098
+ meetingId: _this47.id
8063
8099
  }
8064
8100
  });
8065
8101
  return _promise.default.resolve({
@@ -8084,12 +8120,12 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8084
8120
  }, {
8085
8121
  key: "decline",
8086
8122
  value: function decline(reason) {
8087
- var _this47 = this;
8123
+ var _this48 = this;
8088
8124
  return _util2.default.declineMeeting(this, reason).then(function (decline) {
8089
- _this47.meetingFiniteStateMachine.decline();
8125
+ _this48.meetingFiniteStateMachine.decline();
8090
8126
  return _promise.default.resolve(decline);
8091
8127
  }).catch(function (error) {
8092
- _this47.meetingFiniteStateMachine.fail(error);
8128
+ _this48.meetingFiniteStateMachine.fail(error);
8093
8129
  return _promise.default.reject(error);
8094
8130
  });
8095
8131
  }
@@ -8140,7 +8176,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8140
8176
  }, {
8141
8177
  key: "leave",
8142
8178
  value: function leave() {
8143
- var _this48 = this;
8179
+ var _this49 = this;
8144
8180
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
8145
8181
  var leaveReason = options.reason || _constants.MEETING_REMOVED_REASON.CLIENT_LEAVE_REQUEST;
8146
8182
 
@@ -8152,7 +8188,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8152
8188
  var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
8153
8189
  return (
8154
8190
  // @ts-ignore
8155
- _this48.webex.internal.newMetrics.submitClientEvent({
8191
+ _this49.webex.internal.newMetrics.submitClientEvent({
8156
8192
  name: 'client.call.leave',
8157
8193
  payload: _objectSpread({
8158
8194
  trigger: 'user-interaction',
@@ -8160,7 +8196,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8160
8196
  leaveReason: options.clientEventLeaveReason
8161
8197
  }, payload),
8162
8198
  options: {
8163
- meetingId: _this48.id
8199
+ meetingId: _this49.id
8164
8200
  }
8165
8201
  })
8166
8202
  );
@@ -8169,24 +8205,24 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8169
8205
  return _util2.default.leaveMeeting(this, options).then(function (leave) {
8170
8206
  // CA team recommends submitting this *after* locus /leave
8171
8207
  submitLeaveMetric();
8172
- _this48.meetingFiniteStateMachine.leave();
8173
- _this48.clearMeetingData();
8208
+ _this49.meetingFiniteStateMachine.leave();
8209
+ _this49.clearMeetingData();
8174
8210
 
8175
8211
  // upload logs on leave irrespective of meeting delete
8176
- _triggerProxy.default.trigger(_this48, {
8212
+ _triggerProxy.default.trigger(_this49, {
8177
8213
  file: 'meeting/index',
8178
8214
  function: 'leave'
8179
- }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this48);
8215
+ }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this49);
8180
8216
 
8181
8217
  // TODO: more testing before we remove this code, we are not sure the scenarios for destroy here
8182
- if (_this48.wirelessShare || _this48.guest) {
8218
+ if (_this49.wirelessShare || _this49.guest) {
8183
8219
  // If screen sharing clean the meeting object
8184
- _triggerProxy.default.trigger(_this48, {
8220
+ _triggerProxy.default.trigger(_this49, {
8185
8221
  file: 'meeting/index',
8186
8222
  function: 'leave'
8187
8223
  }, _constants.EVENTS.DESTROY_MEETING, {
8188
8224
  reason: options.reason,
8189
- meetingId: _this48.id
8225
+ meetingId: _this49.id
8190
8226
  });
8191
8227
  }
8192
8228
  _loggerProxy.default.logger.log('Meeting:index#leave --> LEAVE REASON ', leaveReason);
@@ -8203,16 +8239,16 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8203
8239
  shownToUser: false
8204
8240
  }]
8205
8241
  });
8206
- _this48.meetingFiniteStateMachine.fail(error);
8242
+ _this49.meetingFiniteStateMachine.fail(error);
8207
8243
  _loggerProxy.default.logger.error('Meeting:index#leave --> Failed to leave ', error);
8208
8244
  // upload logs on leave irrespective of meeting delete
8209
- _triggerProxy.default.trigger(_this48, {
8245
+ _triggerProxy.default.trigger(_this49, {
8210
8246
  file: 'meeting/index',
8211
8247
  function: 'leave'
8212
- }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this48);
8248
+ }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this49);
8213
8249
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_LEAVE_FAILURE, {
8214
- correlation_id: _this48.correlationId,
8215
- locus_id: _this48.locusUrl.split('/').pop(),
8250
+ correlation_id: _this49.correlationId,
8251
+ locus_id: _this49.locusUrl.split('/').pop(),
8216
8252
  reason: error.message,
8217
8253
  stack: error.stack,
8218
8254
  code: error.code
@@ -8232,7 +8268,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8232
8268
  }, {
8233
8269
  key: "startWhiteboardShare",
8234
8270
  value: function startWhiteboardShare(channelUrl, resourceToken) {
8235
- var _this49 = this;
8271
+ var _this50 = this;
8236
8272
  var whiteboard = this.locusInfo.mediaShares.find(function (element) {
8237
8273
  return element.name === 'whiteboard';
8238
8274
  });
@@ -8240,6 +8276,10 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8240
8276
  return _promise.default.reject(new _parameter.default('Cannot share without channelUrl.'));
8241
8277
  }
8242
8278
  if (whiteboard) {
8279
+ // @ts-ignore
8280
+ this.webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp({
8281
+ key: 'internal.client.share.initiated'
8282
+ });
8243
8283
  // @ts-ignore
8244
8284
  this.webex.internal.newMetrics.submitClientEvent({
8245
8285
  name: 'client.share.initiated',
@@ -8261,13 +8301,13 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8261
8301
  body.resourceToken = resourceToken;
8262
8302
  }
8263
8303
  return this.meetingRequest.changeMeetingFloor(body).then(function () {
8264
- _this49.screenShareFloorState = ScreenShareFloorStatus.RELEASED;
8304
+ _this50.screenShareFloorState = ScreenShareFloorStatus.RELEASED;
8265
8305
  return _promise.default.resolve();
8266
8306
  }).catch(function (error) {
8267
8307
  _loggerProxy.default.logger.error('Meeting:index#startWhiteboardShare --> Error ', error);
8268
8308
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_START_WHITEBOARD_SHARE_FAILURE, {
8269
- correlation_id: _this49.correlationId,
8270
- locus_id: _this49.locusUrl.split('/').pop(),
8309
+ correlation_id: _this50.correlationId,
8310
+ locus_id: _this50.locusUrl.split('/').pop(),
8271
8311
  reason: error.message,
8272
8312
  stack: error.stack,
8273
8313
  board: {
@@ -8290,16 +8330,22 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8290
8330
  }, {
8291
8331
  key: "stopWhiteboardShare",
8292
8332
  value: function stopWhiteboardShare(channelUrl) {
8293
- var _this50 = this;
8333
+ var _this51 = this;
8294
8334
  var whiteboard = this.locusInfo.mediaShares.find(function (element) {
8295
8335
  return element.name === 'whiteboard';
8296
8336
  });
8297
8337
  if (whiteboard) {
8338
+ // @ts-ignore
8339
+ this.webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp({
8340
+ key: 'internal.client.share.stopped'
8341
+ });
8298
8342
  // @ts-ignore
8299
8343
  this.webex.internal.newMetrics.submitClientEvent({
8300
8344
  name: 'client.share.stopped',
8301
8345
  payload: {
8302
- mediaType: 'whiteboard'
8346
+ mediaType: 'whiteboard',
8347
+ // @ts-ignore
8348
+ shareDuration: this.webex.internal.newMetrics.callDiagnosticLatencies.getShareDuration()
8303
8349
  },
8304
8350
  options: {
8305
8351
  meetingId: this.id
@@ -8313,8 +8359,8 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8313
8359
  }).catch(function (error) {
8314
8360
  _loggerProxy.default.logger.error('Meeting:index#stopWhiteboardShare --> Error ', error);
8315
8361
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_STOP_WHITEBOARD_SHARE_FAILURE, {
8316
- correlation_id: _this50.correlationId,
8317
- locus_id: _this50.locusUrl.split('/').pop(),
8362
+ correlation_id: _this51.correlationId,
8363
+ locus_id: _this51.locusUrl.split('/').pop(),
8318
8364
  reason: error.message,
8319
8365
  stack: error.stack,
8320
8366
  board: {
@@ -8336,7 +8382,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8336
8382
  }, {
8337
8383
  key: "requestScreenShareFloor",
8338
8384
  value: function requestScreenShareFloor() {
8339
- var _this51 = this;
8385
+ var _this52 = this;
8340
8386
  if (!this.mediaProperties.hasLocalShareStream() || !this.mediaProperties.mediaDirection.sendShare) {
8341
8387
  _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, ")"));
8342
8388
  this.screenShareFloorState = ScreenShareFloorStatus.RELEASED;
@@ -8367,34 +8413,34 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8367
8413
  resourceUrl: this.resourceUrl,
8368
8414
  shareInstanceId: this.localShareInstanceId
8369
8415
  }).then(function () {
8370
- _this51.screenShareFloorState = ScreenShareFloorStatus.GRANTED;
8416
+ _this52.screenShareFloorState = ScreenShareFloorStatus.GRANTED;
8371
8417
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_SHARE_SUCCESS, {
8372
- correlation_id: _this51.correlationId,
8373
- locus_id: _this51.locusUrl.split('/').pop()
8418
+ correlation_id: _this52.correlationId,
8419
+ locus_id: _this52.locusUrl.split('/').pop()
8374
8420
  });
8375
8421
  return _promise.default.resolve();
8376
8422
  }).catch(function (error) {
8377
8423
  _loggerProxy.default.logger.error('Meeting:index#share --> Error ', error);
8378
8424
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_SHARE_FAILURE, {
8379
- correlation_id: _this51.correlationId,
8380
- locus_id: _this51.locusUrl.split('/').pop(),
8425
+ correlation_id: _this52.correlationId,
8426
+ locus_id: _this52.locusUrl.split('/').pop(),
8381
8427
  reason: error.message,
8382
8428
  stack: error.stack
8383
8429
  });
8384
8430
 
8385
8431
  // @ts-ignore
8386
- _this51.webex.internal.newMetrics.submitClientEvent({
8432
+ _this52.webex.internal.newMetrics.submitClientEvent({
8387
8433
  name: 'client.share.floor-granted.local',
8388
8434
  payload: {
8389
8435
  mediaType: 'share',
8390
8436
  errors: _util2.default.getChangeMeetingFloorErrorPayload(error.message),
8391
- shareInstanceId: _this51.localShareInstanceId
8437
+ shareInstanceId: _this52.localShareInstanceId
8392
8438
  },
8393
8439
  options: {
8394
- meetingId: _this51.id
8440
+ meetingId: _this52.id
8395
8441
  }
8396
8442
  });
8397
- _this51.screenShareFloorState = ScreenShareFloorStatus.RELEASED;
8443
+ _this52.screenShareFloorState = ScreenShareFloorStatus.RELEASED;
8398
8444
  return _promise.default.reject(error);
8399
8445
  });
8400
8446
  }
@@ -8417,10 +8463,10 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8417
8463
  }, {
8418
8464
  key: "requestScreenShareFloorIfPending",
8419
8465
  value: function requestScreenShareFloorIfPending() {
8420
- var _this52 = this;
8466
+ var _this53 = this;
8421
8467
  if (this.floorGrantPending && this.state === _constants.MEETING_STATE.STATES.JOINED) {
8422
8468
  this.requestScreenShareFloor().then(function () {
8423
- _this52.floorGrantPending = false;
8469
+ _this53.floorGrantPending = false;
8424
8470
  });
8425
8471
  }
8426
8472
  }
@@ -8434,7 +8480,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8434
8480
  }, {
8435
8481
  key: "releaseScreenShareFloor",
8436
8482
  value: function releaseScreenShareFloor() {
8437
- var _this53 = this;
8483
+ var _this54 = this;
8438
8484
  var content = this.locusInfo.mediaShares.find(function (element) {
8439
8485
  return element.name === _constants.CONTENT;
8440
8486
  });
@@ -8445,11 +8491,17 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8445
8491
  if (content) {
8446
8492
  var _content$floor;
8447
8493
  // @ts-ignore
8494
+ this.webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp({
8495
+ key: 'internal.client.share.stopped'
8496
+ });
8497
+ // @ts-ignore
8448
8498
  this.webex.internal.newMetrics.submitClientEvent({
8449
8499
  name: 'client.share.stopped',
8450
8500
  payload: {
8451
8501
  mediaType: 'share',
8452
- shareInstanceId: this.localShareInstanceId
8502
+ shareInstanceId: this.localShareInstanceId,
8503
+ // @ts-ignore
8504
+ shareDuration: this.webex.internal.newMetrics.callDiagnosticLatencies.getShareDuration()
8453
8505
  },
8454
8506
  options: {
8455
8507
  meetingId: this.id
@@ -8469,8 +8521,8 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8469
8521
  }).catch(function (error) {
8470
8522
  _loggerProxy.default.logger.error('Meeting:index#releaseScreenShareFloor --> Error ', error);
8471
8523
  _metrics.default.sendBehavioralMetric(_constants2.default.STOP_FLOOR_REQUEST_FAILURE, {
8472
- correlation_id: _this53.correlationId,
8473
- locus_id: _this53.locusUrl.split('/').pop(),
8524
+ correlation_id: _this54.correlationId,
8525
+ locus_id: _this54.locusUrl.split('/').pop(),
8474
8526
  reason: error.message,
8475
8527
  stack: error.stack
8476
8528
  });
@@ -8650,7 +8702,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8650
8702
  }, {
8651
8703
  key: "changeVideoLayout",
8652
8704
  value: function changeVideoLayout(layoutType) {
8653
- var _this54 = this;
8705
+ var _this55 = this;
8654
8706
  var renderInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
8655
8707
  var main = renderInfo.main,
8656
8708
  content = renderInfo.content;
@@ -8704,7 +8756,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8704
8756
  }
8705
8757
  this.lastVideoLayoutInfo = (0, _lodash.cloneDeep)(layoutInfo);
8706
8758
  this.locusInfo.once(_constants.LOCUSINFO.EVENTS.CONTROLS_MEETING_LAYOUT_UPDATED, function (envelope) {
8707
- _triggerProxy.default.trigger(_this54, {
8759
+ _triggerProxy.default.trigger(_this55, {
8708
8760
  file: 'meeting/index',
8709
8761
  function: 'changeVideoLayout'
8710
8762
  }, _constants.EVENT_TRIGGERS.MEETING_CONTROLS_LAYOUT_UPDATE, {
@@ -8820,7 +8872,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8820
8872
  }, {
8821
8873
  key: "endMeetingForAll",
8822
8874
  value: function endMeetingForAll() {
8823
- var _this55 = this;
8875
+ var _this56 = this;
8824
8876
  // @ts-ignore
8825
8877
  this.webex.internal.newMetrics.submitClientEvent({
8826
8878
  name: 'client.call.leave',
@@ -8838,25 +8890,25 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8838
8890
  locus_id: this.locusId
8839
8891
  });
8840
8892
  return _util2.default.endMeetingForAll(this).then(function (end) {
8841
- _this55.meetingFiniteStateMachine.end();
8842
- _this55.clearMeetingData();
8893
+ _this56.meetingFiniteStateMachine.end();
8894
+ _this56.clearMeetingData();
8843
8895
  // upload logs on leave irrespective of meeting delete
8844
- _triggerProxy.default.trigger(_this55, {
8896
+ _triggerProxy.default.trigger(_this56, {
8845
8897
  file: 'meeting/index',
8846
8898
  function: 'endMeetingForAll'
8847
- }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this55);
8899
+ }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this56);
8848
8900
  return end;
8849
8901
  }).catch(function (error) {
8850
- _this55.meetingFiniteStateMachine.fail(error);
8902
+ _this56.meetingFiniteStateMachine.fail(error);
8851
8903
  _loggerProxy.default.logger.error('Meeting:index#endMeetingForAll --> Failed to end meeting ', error);
8852
8904
  // upload logs on leave irrespective of meeting delete
8853
- _triggerProxy.default.trigger(_this55, {
8905
+ _triggerProxy.default.trigger(_this56, {
8854
8906
  file: 'meeting/index',
8855
8907
  function: 'endMeetingForAll'
8856
- }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this55);
8908
+ }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this56);
8857
8909
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_END_ALL_FAILURE, {
8858
- correlation_id: _this55.correlationId,
8859
- locus_id: _this55.locusUrl.split('/').pop(),
8910
+ correlation_id: _this56.correlationId,
8911
+ locus_id: _this56.locusUrl.split('/').pop(),
8860
8912
  reason: error.message,
8861
8913
  stack: error.stack,
8862
8914
  code: error.code
@@ -9017,7 +9069,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
9017
9069
  _this$mediaProperties43,
9018
9070
  _this$mediaProperties44,
9019
9071
  _this$mediaProperties45,
9020
- _this56 = this;
9072
+ _this57 = this;
9021
9073
  var LOG_HEADER = 'Meeting:index#updateTranscodedMediaConnection -->';
9022
9074
  _loggerProxy.default.logger.info("".concat(LOG_HEADER, " starting"));
9023
9075
  if (!this.canUpdateMedia()) {
@@ -9042,8 +9094,8 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
9042
9094
  }).catch(function (error) {
9043
9095
  _loggerProxy.default.logger.error("".concat(LOG_HEADER, " Error: "), error);
9044
9096
  _metrics.default.sendBehavioralMetric(_constants2.default.UPDATE_MEDIA_FAILURE, {
9045
- correlation_id: _this56.correlationId,
9046
- locus_id: _this56.locusUrl.split('/').pop(),
9097
+ correlation_id: _this57.correlationId,
9098
+ locus_id: _this57.locusUrl.split('/').pop(),
9047
9099
  reason: error.message,
9048
9100
  stack: error.stack
9049
9101
  });
@@ -9265,13 +9317,18 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
9265
9317
  return this.updateTranscodedMediaConnection();
9266
9318
  case 31:
9267
9319
  if (!floorRequestNeeded) {
9268
- _context40.next = 39;
9320
+ _context40.next = 40;
9269
9321
  break;
9270
9322
  }
9271
9323
  this.localShareInstanceId = _uuid.default.v4();
9272
9324
  this.shareCAEventSentStatus.transmitStart = false;
9273
9325
  this.shareCAEventSentStatus.transmitStop = false;
9274
9326
 
9327
+ // @ts-ignore
9328
+ this.webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp({
9329
+ key: 'internal.client.share.initiated'
9330
+ });
9331
+
9275
9332
  // @ts-ignore
9276
9333
  this.webex.internal.newMetrics.submitClientEvent({
9277
9334
  name: 'client.share.initiated',
@@ -9291,9 +9348,9 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
9291
9348
  // we're sending the http request to Locus to request the screen share floor
9292
9349
  // only after the SDP update, because that's how it's always been done for transcoded meetings
9293
9350
  // and also if sharing from the start, we need confluence to have been created
9294
- _context40.next = 39;
9351
+ _context40.next = 40;
9295
9352
  return this.enqueueScreenShareFloorRequest();
9296
- case 39:
9353
+ case 40:
9297
9354
  case "end":
9298
9355
  return _context40.stop();
9299
9356
  }
@@ -9481,7 +9538,84 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
9481
9538
  return _getMediaReachabilityMetricFields.apply(this, arguments);
9482
9539
  }
9483
9540
  return getMediaReachabilityMetricFields;
9484
- }())
9541
+ }()
9542
+ /**
9543
+ * Set the stage for the meeting
9544
+ *
9545
+ * @param {SetStageOptions} options Options to use when setting the stage
9546
+ * @returns {Promise} The locus request
9547
+ */
9548
+ )
9549
+ }, {
9550
+ key: "setStage",
9551
+ 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;
9563
+ var videoLayout = {
9564
+ overrideDefault: true,
9565
+ lockAttendeeViewOnStageOnly: lockAttendeeViewOnStage,
9566
+ stageParameters: {
9567
+ activeSpeakerProportion: activeSpeakerProportion,
9568
+ showActiveSpeaker: {
9569
+ show: showActiveSpeaker,
9570
+ order: 0
9571
+ },
9572
+ stageManagerType: 0
9573
+ }
9574
+ };
9575
+ if (importantParticipants !== null && importantParticipants !== void 0 && importantParticipants.length) {
9576
+ videoLayout.stageParameters.importantParticipants = importantParticipants.map(function (importantParticipant, index) {
9577
+ return _objectSpread(_objectSpread({}, importantParticipant), {}, {
9578
+ order: index + 1
9579
+ });
9580
+ });
9581
+ }
9582
+ if (customLogo) {
9583
+ if (!videoLayout.customLayouts) {
9584
+ videoLayout.customLayouts = {};
9585
+ }
9586
+ videoLayout.customLayouts.logo = customLogo;
9587
+ // eslint-disable-next-line no-bitwise
9588
+ videoLayout.stageParameters.stageManagerType |= _constants.STAGE_MANAGER_TYPE.LOGO;
9589
+ }
9590
+ if (customBackground) {
9591
+ if (!videoLayout.customLayouts) {
9592
+ videoLayout.customLayouts = {};
9593
+ }
9594
+ videoLayout.customLayouts.background = customBackground;
9595
+ // eslint-disable-next-line no-bitwise
9596
+ videoLayout.stageParameters.stageManagerType |= _constants.STAGE_MANAGER_TYPE.BACKGROUND;
9597
+ }
9598
+ if (customNameLabel) {
9599
+ videoLayout.nameLabelStyle = customNameLabel;
9600
+ // eslint-disable-next-line no-bitwise
9601
+ videoLayout.stageParameters.stageManagerType |= _constants.STAGE_MANAGER_TYPE.NAME_LABEL;
9602
+ }
9603
+ return this.meetingRequest.synchronizeStage(this.locusUrl, videoLayout);
9604
+ }
9605
+
9606
+ /**
9607
+ * Unset the stage for the meeting
9608
+ *
9609
+ * @returns {Promise} The locus request
9610
+ */
9611
+ }, {
9612
+ key: "unsetStage",
9613
+ value: function unsetStage() {
9614
+ var videoLayout = {
9615
+ overrideDefault: false
9616
+ };
9617
+ return this.meetingRequest.synchronizeStage(this.locusUrl, videoLayout);
9618
+ }
9485
9619
  }]);
9486
9620
  return Meeting;
9487
9621
  }(_webexCore.StatelessWebexPlugin);