@webex/plugin-meetings 3.9.0-webinar5k.1 → 3.9.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 (83) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/constants.js +16 -0
  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 +40 -328
  8. package/dist/locus-info/index.js.map +1 -1
  9. package/dist/meeting/in-meeting-actions.js +6 -0
  10. package/dist/meeting/in-meeting-actions.js.map +1 -1
  11. package/dist/meeting/index.js +196 -160
  12. package/dist/meeting/index.js.map +1 -1
  13. package/dist/meeting/muteState.js +5 -2
  14. package/dist/meeting/muteState.js.map +1 -1
  15. package/dist/meeting/type.js +7 -0
  16. package/dist/meeting/type.js.map +1 -0
  17. package/dist/meeting/util.js +79 -10
  18. package/dist/meeting/util.js.map +1 -1
  19. package/dist/meetings/index.js +37 -39
  20. package/dist/meetings/index.js.map +1 -1
  21. package/dist/member/types.js.map +1 -1
  22. package/dist/members/collection.js +0 -13
  23. package/dist/members/collection.js.map +1 -1
  24. package/dist/members/index.js +21 -40
  25. package/dist/members/index.js.map +1 -1
  26. package/dist/members/util.js.map +1 -1
  27. package/dist/multistream/mediaRequestManager.js +1 -1
  28. package/dist/multistream/mediaRequestManager.js.map +1 -1
  29. package/dist/multistream/remoteMedia.js +34 -5
  30. package/dist/multistream/remoteMedia.js.map +1 -1
  31. package/dist/multistream/remoteMediaGroup.js +42 -2
  32. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  33. package/dist/types/constants.d.ts +16 -0
  34. package/dist/types/locus-info/index.d.ts +3 -102
  35. package/dist/types/meeting/in-meeting-actions.d.ts +6 -0
  36. package/dist/types/meeting/index.d.ts +23 -28
  37. package/dist/types/meeting/type.d.ts +9 -0
  38. package/dist/types/meeting/util.d.ts +6 -3
  39. package/dist/types/member/types.d.ts +0 -1
  40. package/dist/types/members/collection.d.ts +0 -6
  41. package/dist/types/members/index.d.ts +7 -16
  42. package/dist/types/members/util.d.ts +2 -1
  43. package/dist/types/multistream/remoteMedia.d.ts +20 -1
  44. package/dist/types/multistream/remoteMediaGroup.d.ts +11 -0
  45. package/dist/webinar/index.js +1 -1
  46. package/package.json +22 -24
  47. package/src/constants.ts +16 -2
  48. package/src/locus-info/index.ts +39 -409
  49. package/src/meeting/in-meeting-actions.ts +13 -0
  50. package/src/meeting/index.ts +92 -63
  51. package/src/meeting/muteState.ts +6 -2
  52. package/src/meeting/type.ts +9 -0
  53. package/src/meeting/util.ts +93 -19
  54. package/src/meetings/index.ts +6 -19
  55. package/src/member/types.ts +0 -1
  56. package/src/members/collection.ts +0 -11
  57. package/src/members/index.ts +10 -33
  58. package/src/members/util.ts +2 -1
  59. package/src/multistream/mediaRequestManager.ts +7 -7
  60. package/src/multistream/remoteMedia.ts +34 -4
  61. package/src/multistream/remoteMediaGroup.ts +37 -2
  62. package/test/unit/spec/locus-info/index.js +8 -365
  63. package/test/unit/spec/meeting/in-meeting-actions.ts +6 -0
  64. package/test/unit/spec/meeting/index.js +254 -38
  65. package/test/unit/spec/meeting/utils.js +122 -1
  66. package/test/unit/spec/meetings/index.js +2 -0
  67. package/test/unit/spec/members/index.js +37 -1
  68. package/test/unit/spec/multistream/mediaRequestManager.ts +19 -6
  69. package/test/unit/spec/multistream/remoteMedia.ts +66 -2
  70. package/dist/hashTree/constants.js +0 -23
  71. package/dist/hashTree/constants.js.map +0 -1
  72. package/dist/hashTree/hashTree.js +0 -516
  73. package/dist/hashTree/hashTree.js.map +0 -1
  74. package/dist/hashTree/hashTreeParser.js +0 -521
  75. package/dist/hashTree/hashTreeParser.js.map +0 -1
  76. package/dist/types/hashTree/constants.d.ts +0 -8
  77. package/dist/types/hashTree/hashTree.d.ts +0 -128
  78. package/dist/types/hashTree/hashTreeParser.d.ts +0 -152
  79. package/src/hashTree/constants.ts +0 -12
  80. package/src/hashTree/hashTree.ts +0 -460
  81. package/src/hashTree/hashTreeParser.ts +0 -556
  82. package/test/unit/spec/hashTree/hashTree.ts +0 -394
  83. package/test/unit/spec/hashTree/hashTreeParser.ts +0 -156
@@ -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);
@@ -563,18 +564,6 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
563
564
  (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "uploadLogsTimer", void 0);
564
565
  (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "logUploadIntervalIndex", void 0);
565
566
  (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "mediaServerIp", void 0);
566
- /** Handles Locus LLM events
567
- *
568
- * @param {LocusLLMEvent} event - The Locus LLM event to process
569
- * @returns {void}
570
- */
571
- (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "processLocusLLMEvent", function (event) {
572
- if (event.data.eventType === 'locus.state_message') {
573
- _this.locusInfo.parse((0, _assertThisInitialized2.default)(_this), event.data);
574
- } else {
575
- _loggerProxy.default.logger.warn("Meeting:index#processLocusLLMEvent --> Unknown event type: ".concat(event.data.eventType));
576
- }
577
- });
578
567
  /**
579
568
  * Callback called when a relay event is received from meeting LLM Connection
580
569
  * @param {RelayEvent} e Event object coming from LLM Connection
@@ -1434,8 +1423,6 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
1434
1423
 
1435
1424
  // @ts-ignore - fix types
1436
1425
  _this.webex.internal.llm.off('event:relay.event', _this.processRelayEvent);
1437
- // @ts-ignore - Fix type
1438
- _this.webex.internal.llm.off('event:locus.state_message', _this.processLocusLLMEvent);
1439
1426
  });
1440
1427
  /**
1441
1428
  * starts keepAlives being sent
@@ -1503,6 +1490,10 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
1503
1490
  * @memberof Meeting
1504
1491
  */
1505
1492
  _this.id = _uuid.default.v4();
1493
+ if (callback) {
1494
+ callback((0, _assertThisInitialized2.default)(_this));
1495
+ }
1496
+
1506
1497
  /**
1507
1498
  * Call state used for metrics
1508
1499
  * @instance
@@ -2391,6 +2382,24 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
2391
2382
  this.callStateForMetrics.correlationId = correlationId;
2392
2383
  }
2393
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
+
2394
2403
  /**
2395
2404
  * Getter - Returns callStateForMetrics.userNameInput
2396
2405
  * @returns {string}
@@ -3669,9 +3678,16 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
3669
3678
  // There is no concept of local/remote share for whiteboard
3670
3679
  // It does not matter who requested to share the whiteboard, everyone gets the same view
3671
3680
  else if (whiteboardShare.disposition === _constants.FLOOR_ACTION.GRANTED) {
3672
- // WHITEBOARD - sharing whiteboard
3673
- // Webinar attendee should receive whiteboard as remote share
3674
- 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
+ }
3675
3691
  }
3676
3692
  // or if content share is either released or null and whiteboard share is either released or null, no one is sharing
3677
3693
  else if ((previousContentShare && contentShare.disposition === _constants.FLOOR_ACTION.RELEASED || contentShare.disposition === null) && (previousWhiteboardShare && whiteboardShare.disposition === _constants.FLOOR_ACTION.RELEASED || whiteboardShare.disposition === null)) {
@@ -4332,11 +4348,13 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
4332
4348
 
4333
4349
  /**
4334
4350
  * Invite a guest to the call that isn't normally part of this call
4335
- * @param {Object} invitee
4351
+ * @param {Invitee} invitee
4336
4352
  * @param {String} invitee.emailAddress
4337
4353
  * @param {String} invitee.email
4338
4354
  * @param {String} invitee.phoneNumber
4339
4355
  * @param {Boolean} [alertIfActive]
4356
+ * @param {Boolean} [invitee.skipEmailValidation]
4357
+ * @param {Boolean} [invitee.isInternalNumber]
4340
4358
  * @returns {Promise} see #members.addMember
4341
4359
  * @public
4342
4360
  * @memberof Meeting
@@ -4350,7 +4368,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
4350
4368
 
4351
4369
  /**
4352
4370
  * Cancel an outgoing phone call invitation made during a meeting
4353
- * @param {Object} invitee
4371
+ * @param {Invitee} invitee
4354
4372
  * @param {String} invitee.phoneNumber
4355
4373
  * @returns {Promise} see #members.cancelPhoneInvite
4356
4374
  * @public
@@ -4364,7 +4382,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
4364
4382
 
4365
4383
  /**
4366
4384
  * Cancel an SIP/phone call invitation made during a meeting
4367
- * @param {Object} invitee
4385
+ * @param {Invitee} invitee
4368
4386
  * @param {String} invitee.memberId
4369
4387
  * @param {Boolean} [invitee.isInternalNumber] - When cancel phone invitation, if the number is internal
4370
4388
  * @returns {Promise} see #members.cancelInviteByMemberId
@@ -4659,6 +4677,9 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
4659
4677
  isClosedCaptionActive: _util2.default.isClosedCaptionActive(this.userDisplayHints),
4660
4678
  canStartManualCaption: _util2.default.canStartManualCaption(this.userDisplayHints),
4661
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),
4662
4683
  isManualCaptionActive: _util2.default.isManualCaptionActive(this.userDisplayHints),
4663
4684
  isSaveTranscriptsEnabled: _util2.default.isSaveTranscriptsEnabled(this.userDisplayHints),
4664
4685
  isWebexAssistantActive: _util2.default.isWebexAssistantActive(this.userDisplayHints),
@@ -4953,7 +4974,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
4953
4974
  this.selfId = locus.selfId;
4954
4975
  this.mediaId = locus.mediaId;
4955
4976
  this.hostId = mtgLocus.host ? mtgLocus.host.id : this.hostId;
4956
- this.locusInfo.initialSetup(mtgLocus, locus.dataSets);
4977
+ this.locusInfo.initialSetup(mtgLocus);
4957
4978
  }
4958
4979
 
4959
4980
  /**
@@ -6333,24 +6354,10 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6333
6354
  _this36.deferJoin = undefined;
6334
6355
  return join;
6335
6356
  }).catch(function (error) {
6336
- var _this36$meetingInfo, _error$error;
6357
+ var _error$error;
6337
6358
  _this36.meetingFiniteStateMachine.fail(error);
6338
6359
  _loggerProxy.default.logger.error('Meeting:index#join --> Failed', error);
6339
6360
 
6340
- // @ts-ignore
6341
- _this36.webex.internal.newMetrics.submitClientEvent({
6342
- name: 'client.locus.join.response',
6343
- payload: {
6344
- identifiers: {
6345
- meetingLookupUrl: (_this36$meetingInfo = _this36.meetingInfo) === null || _this36$meetingInfo === void 0 ? void 0 : _this36$meetingInfo.meetingLookupUrl
6346
- }
6347
- },
6348
- options: {
6349
- meetingId: _this36.id,
6350
- rawError: error
6351
- }
6352
- });
6353
-
6354
6361
  // TODO: change this to error codes and pre defined dictionary
6355
6362
  _metrics.default.sendBehavioralMetric(_constants2.default.JOIN_FAILURE, {
6356
6363
  correlation_id: _this36.correlationId,
@@ -6416,7 +6423,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6416
6423
  isJoined = this.isJoined(); // webinar panelist should use new data channel in practice session
6417
6424
  dataChannelUrl = this.webinar.isJoinPracticeSessionDataChannel() && practiceSessionDatachannelUrl ? practiceSessionDatachannelUrl : datachannelUrl; // @ts-ignore - Fix type
6418
6425
  if (!this.webex.internal.llm.isConnected()) {
6419
- _context20.next = 10;
6426
+ _context20.next = 9;
6420
6427
  break;
6421
6428
  }
6422
6429
  if (!(
@@ -6437,28 +6444,22 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6437
6444
  case 8:
6438
6445
  // @ts-ignore - Fix type
6439
6446
  this.webex.internal.llm.off('event:relay.event', this.processRelayEvent);
6440
- // @ts-ignore - Fix type
6441
- this.webex.internal.llm.off('event:locus.state_message', this.processLocusLLMEvent);
6442
- case 10:
6447
+ case 9:
6443
6448
  if (isJoined) {
6444
- _context20.next = 12;
6449
+ _context20.next = 11;
6445
6450
  break;
6446
6451
  }
6447
6452
  return _context20.abrupt("return", undefined);
6448
- case 12:
6453
+ case 11:
6449
6454
  return _context20.abrupt("return", this.webex.internal.llm.registerAndConnect(url, dataChannelUrl).then(function (registerAndConnectResult) {
6450
6455
  // @ts-ignore - Fix type
6451
6456
  _this37.webex.internal.llm.off('event:relay.event', _this37.processRelayEvent);
6452
6457
  // @ts-ignore - Fix type
6453
6458
  _this37.webex.internal.llm.on('event:relay.event', _this37.processRelayEvent);
6454
- // @ts-ignore - Fix type
6455
- _this37.webex.internal.llm.off('event:locus.state_message', _this37.processLocusLLMEvent);
6456
- // @ts-ignore - Fix type
6457
- _this37.webex.internal.llm.on('event:locus.state_message', _this37.processLocusLLMEvent);
6458
6459
  _loggerProxy.default.logger.info('Meeting:index#updateLLMConnection --> enabled to receive relay events!');
6459
6460
  return _promise.default.resolve(registerAndConnectResult);
6460
6461
  }));
6461
- case 13:
6462
+ case 12:
6462
6463
  case "end":
6463
6464
  return _context20.stop();
6464
6465
  }
@@ -6510,14 +6511,14 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6510
6511
  value: function dialInPstn() {
6511
6512
  var _this38 = this;
6512
6513
  if (this.isPhoneProvisioned(this.dialInDeviceStatus)) return _promise.default.resolve(); // prevent multiple dial in devices from being provisioned
6513
-
6514
- var correlationId = this.correlationId,
6514
+ this.pstnCorrelationId = _uuid.default.v4();
6515
+ var pstnCorrelationId = this.pstnCorrelationId,
6515
6516
  locusUrl = this.locusUrl;
6516
6517
  if (!this.dialInUrl) this.dialInUrl = "dialin:///".concat(_uuid.default.v4());
6517
6518
  return this.meetingRequest
6518
6519
  // @ts-ignore
6519
6520
  .dialIn({
6520
- correlationId: correlationId,
6521
+ correlationId: pstnCorrelationId,
6521
6522
  dialInUrl: this.dialInUrl,
6522
6523
  locusUrl: locusUrl,
6523
6524
  clientUrl: this.deviceUrl
@@ -6526,11 +6527,15 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6526
6527
  _metrics.default.sendBehavioralMetric(_constants2.default.ADD_DIAL_IN_FAILURE, {
6527
6528
  correlation_id: _this38.correlationId,
6528
6529
  dial_in_url: _this38.dialInUrl,
6530
+ dial_in_correlation_id: pstnCorrelationId,
6529
6531
  locus_id: locusUrl.split('/').pop(),
6530
6532
  client_url: _this38.deviceUrl,
6531
6533
  reason: (_error$error2 = error.error) === null || _error$error2 === void 0 ? void 0 : _error$error2.message,
6532
6534
  stack: error.stack
6533
6535
  });
6536
+ if (_this38.pstnCorrelationId === pstnCorrelationId) {
6537
+ _this38.pstnCorrelationId = undefined;
6538
+ }
6534
6539
  return _promise.default.reject(error);
6535
6540
  });
6536
6541
  }
@@ -6547,14 +6552,14 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6547
6552
  value: function dialOutPstn(phoneNumber) {
6548
6553
  var _this39 = this;
6549
6554
  if (this.isPhoneProvisioned(this.dialOutDeviceStatus)) return _promise.default.resolve(); // prevent multiple dial out devices from being provisioned
6550
-
6551
- var correlationId = this.correlationId,
6552
- locusUrl = this.locusUrl;
6555
+ this.pstnCorrelationId = _uuid.default.v4();
6556
+ var locusUrl = this.locusUrl,
6557
+ pstnCorrelationId = this.pstnCorrelationId;
6553
6558
  if (!this.dialOutUrl) this.dialOutUrl = "dialout:///".concat(_uuid.default.v4());
6554
6559
  return this.meetingRequest
6555
6560
  // @ts-ignore
6556
6561
  .dialOut({
6557
- correlationId: correlationId,
6562
+ correlationId: pstnCorrelationId,
6558
6563
  dialOutUrl: this.dialOutUrl,
6559
6564
  phoneNumber: phoneNumber,
6560
6565
  locusUrl: locusUrl,
@@ -6564,11 +6569,15 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6564
6569
  _metrics.default.sendBehavioralMetric(_constants2.default.ADD_DIAL_OUT_FAILURE, {
6565
6570
  correlation_id: _this39.correlationId,
6566
6571
  dial_out_url: _this39.dialOutUrl,
6572
+ dial_out_correlation_id: pstnCorrelationId,
6567
6573
  locus_id: locusUrl.split('/').pop(),
6568
6574
  client_url: _this39.deviceUrl,
6569
6575
  reason: (_error$error3 = error.error) === null || _error$error3 === void 0 ? void 0 : _error$error3.message,
6570
6576
  stack: error.stack
6571
6577
  });
6578
+ if (_this39.pstnCorrelationId === pstnCorrelationId) {
6579
+ _this39.pstnCorrelationId = undefined;
6580
+ }
6572
6581
  return _promise.default.reject(error);
6573
6582
  });
6574
6583
  }
@@ -6583,7 +6592,13 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6583
6592
  }, {
6584
6593
  key: "disconnectPhoneAudio",
6585
6594
  value: function disconnectPhoneAudio() {
6586
- 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
+ });
6587
6602
  }
6588
6603
 
6589
6604
  /**
@@ -6596,7 +6611,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6596
6611
  }, {
6597
6612
  key: "moveTo",
6598
6613
  value: function moveTo(resourceId) {
6599
- var _this40 = this;
6614
+ var _this41 = this;
6600
6615
  if (!resourceId) {
6601
6616
  throw new _parameter.default('Cannot move call without a resourceId.');
6602
6617
  }
@@ -6640,12 +6655,12 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6640
6655
  while (1) switch (_context21.prev = _context21.next) {
6641
6656
  case 0:
6642
6657
  _context21.prev = 0;
6643
- if (!(_this40.screenShareFloorState === ScreenShareFloorStatus.GRANTED)) {
6658
+ if (!(_this41.screenShareFloorState === ScreenShareFloorStatus.GRANTED)) {
6644
6659
  _context21.next = 4;
6645
6660
  break;
6646
6661
  }
6647
6662
  _context21.next = 4;
6648
- return _this40.releaseScreenShareFloor();
6663
+ return _this41.releaseScreenShareFloor();
6649
6664
  case 4:
6650
6665
  mediaSettings = {
6651
6666
  mediaDirection: {
@@ -6657,37 +6672,37 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6657
6672
  receiveShare: true
6658
6673
  }
6659
6674
  };
6660
- _this40.mediaProperties.setMediaDirection(mediaSettings.mediaDirection);
6661
- _this40.mediaProperties.unsetRemoteMedia();
6675
+ _this41.mediaProperties.setMediaDirection(mediaSettings.mediaDirection);
6676
+ _this41.mediaProperties.unsetRemoteMedia();
6662
6677
 
6663
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
6664
6679
  // once the device answers we close the old connection and create new media server connection with only share enabled
6665
- if (!_this40.statsAnalyzer) {
6680
+ if (!_this41.statsAnalyzer) {
6666
6681
  _context21.next = 10;
6667
6682
  break;
6668
6683
  }
6669
6684
  _context21.next = 10;
6670
- return _this40.statsAnalyzer.stopAnalyzer();
6685
+ return _this41.statsAnalyzer.stopAnalyzer();
6671
6686
  case 10:
6672
6687
  _context21.next = 12;
6673
- return _this40.closeRemoteStreams();
6688
+ return _this41.closeRemoteStreams();
6674
6689
  case 12:
6675
6690
  _context21.next = 14;
6676
- return _this40.closePeerConnections();
6691
+ return _this41.closePeerConnections();
6677
6692
  case 14:
6678
- _this40.cleanupLocalStreams();
6679
- _this40.unsetRemoteStreams();
6680
- _this40.unsetPeerConnections();
6681
- _this40.reconnectionManager.cleanUp();
6693
+ _this41.cleanupLocalStreams();
6694
+ _this41.unsetRemoteStreams();
6695
+ _this41.unsetPeerConnections();
6696
+ _this41.reconnectionManager.cleanUp();
6682
6697
  _context21.next = 20;
6683
- return _this40.addMedia({
6698
+ return _this41.addMedia({
6684
6699
  audioEnabled: false,
6685
6700
  videoEnabled: false,
6686
6701
  shareVideoEnabled: true
6687
6702
  });
6688
6703
  case 20:
6689
6704
  _metrics.default.sendBehavioralMetric(_constants2.default.MOVE_TO_SUCCESS);
6690
- _this40.isMoveToInProgress = false;
6705
+ _this41.isMoveToInProgress = false;
6691
6706
  _context21.next = 29;
6692
6707
  break;
6693
6708
  case 24:
@@ -6695,12 +6710,12 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6695
6710
  _context21.t0 = _context21["catch"](0);
6696
6711
  _loggerProxy.default.logger.error('Meeting:index#moveTo --> Failed to moveTo resourceId', _context21.t0);
6697
6712
  _metrics.default.sendBehavioralMetric(_constants2.default.MOVE_TO_FAILURE, {
6698
- correlation_id: _this40.correlationId,
6699
- locus_id: _this40.locusUrl.split('/').pop(),
6713
+ correlation_id: _this41.correlationId,
6714
+ locus_id: _this41.locusUrl.split('/').pop(),
6700
6715
  reason: _context21.t0.message,
6701
6716
  stack: _context21.t0.stack
6702
6717
  });
6703
- _this40.isMoveToInProgress = false;
6718
+ _this41.isMoveToInProgress = false;
6704
6719
  case 29:
6705
6720
  case "end":
6706
6721
  return _context21.stop();
@@ -6716,17 +6731,17 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6716
6731
  resourceId: resourceId,
6717
6732
  moveToResource: true
6718
6733
  }).then(function () {
6719
- _this40.meetingFiniteStateMachine.join();
6734
+ _this41.meetingFiniteStateMachine.join();
6720
6735
  }).catch(function (error) {
6721
- _this40.meetingFiniteStateMachine.fail(error);
6736
+ _this41.meetingFiniteStateMachine.fail(error);
6722
6737
  _metrics.default.sendBehavioralMetric(_constants2.default.MOVE_TO_FAILURE, {
6723
- correlation_id: _this40.correlationId,
6724
- locus_id: _this40.locusUrl.split('/').pop(),
6738
+ correlation_id: _this41.correlationId,
6739
+ locus_id: _this41.locusUrl.split('/').pop(),
6725
6740
  reason: error.message,
6726
6741
  stack: error.stack
6727
6742
  });
6728
6743
  _loggerProxy.default.logger.error('Meeting:index#moveTo --> Failed to moveTo resourceId', error);
6729
- _this40.isMoveToInProgress = false;
6744
+ _this41.isMoveToInProgress = false;
6730
6745
  return _promise.default.reject(error);
6731
6746
  });
6732
6747
  }
@@ -6741,7 +6756,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6741
6756
  }, {
6742
6757
  key: "moveFrom",
6743
6758
  value: function moveFrom(resourceId) {
6744
- var _this41 = this;
6759
+ var _this42 = this;
6745
6760
  // On moveFrom ask the developer to re capture it moveFrom then updateMedia
6746
6761
  if (!resourceId) {
6747
6762
  throw new _parameter.default('Cannot move call without a resourceId.');
@@ -6756,19 +6771,19 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6756
6771
  }
6757
6772
  });
6758
6773
  return _util2.default.joinMeetingOptions(this).then(function () {
6759
- return _util2.default.leaveMeeting(_this41, {
6774
+ return _util2.default.leaveMeeting(_this42, {
6760
6775
  resourceId: resourceId,
6761
6776
  correlationId: oldCorrelationId,
6762
6777
  moveMeeting: true
6763
6778
  }).then(function () {
6764
- _this41.resourceId = '';
6779
+ _this42.resourceId = '';
6765
6780
  _metrics.default.sendBehavioralMetric(_constants2.default.MOVE_FROM_SUCCESS);
6766
6781
  });
6767
6782
  }).catch(function (error) {
6768
- _this41.meetingFiniteStateMachine.fail(error);
6783
+ _this42.meetingFiniteStateMachine.fail(error);
6769
6784
  _metrics.default.sendBehavioralMetric(_constants2.default.MOVE_FROM_FAILURE, {
6770
- correlation_id: _this41.correlationId,
6771
- locus_id: _this41.locusUrl.split('/').pop(),
6785
+ correlation_id: _this42.correlationId,
6786
+ locus_id: _this42.locusUrl.split('/').pop(),
6772
6787
  reason: error.message,
6773
6788
  stack: error.stack
6774
6789
  });
@@ -6891,9 +6906,9 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
6891
6906
  }, {
6892
6907
  key: "forwardEvent",
6893
6908
  value: function forwardEvent(eventEmitter, eventTypeToForward, meetingEventType) {
6894
- var _this42 = this;
6909
+ var _this43 = this;
6895
6910
  eventEmitter.on(eventTypeToForward, function (data) {
6896
- return _triggerProxy.default.trigger(_this42, {
6911
+ return _triggerProxy.default.trigger(_this43, {
6897
6912
  file: 'meetings',
6898
6913
  function: 'addMedia'
6899
6914
  }, meetingEventType, data);
@@ -7079,7 +7094,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7079
7094
  key: "waitForRemoteSDPAnswer",
7080
7095
  value: (function () {
7081
7096
  var _waitForRemoteSDPAnswer = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee25() {
7082
- var _this43 = this;
7097
+ var _this44 = this;
7083
7098
  var LOG_HEADER, deferSDPAnswer;
7084
7099
  return _regenerator.default.wrap(function _callee25$(_context25) {
7085
7100
  while (1) switch (_context25.prev = _context25.next) {
@@ -7098,18 +7113,18 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7098
7113
  var error = new Error('Timed out waiting for REMOTE SDP ANSWER');
7099
7114
 
7100
7115
  // @ts-ignore
7101
- _this43.webex.internal.newMetrics.submitClientEvent({
7116
+ _this44.webex.internal.newMetrics.submitClientEvent({
7102
7117
  name: 'client.media-engine.remote-sdp-received',
7103
7118
  payload: {
7104
7119
  canProceed: false,
7105
7120
  errors: [
7106
7121
  // @ts-ignore
7107
- _this43.webex.internal.newMetrics.callDiagnosticMetrics.getErrorPayloadForClientErrorCode({
7122
+ _this44.webex.internal.newMetrics.callDiagnosticMetrics.getErrorPayloadForClientErrorCode({
7108
7123
  clientErrorCode: _internalPluginMetrics.CALL_DIAGNOSTIC_CONFIG.MISSING_ROAP_ANSWER_CLIENT_CODE
7109
7124
  })]
7110
7125
  },
7111
7126
  options: {
7112
- meetingId: _this43.id,
7127
+ meetingId: _this44.id,
7113
7128
  rawError: error
7114
7129
  }
7115
7130
  });
@@ -7616,10 +7631,10 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7616
7631
  }, {
7617
7632
  key: "addMedia",
7618
7633
  value: function addMedia() {
7619
- var _this44 = this;
7634
+ var _this45 = this;
7620
7635
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
7621
7636
  return this.addMediaInternal(function () {
7622
- return _this44.turnServerUsed ? 'JOIN_MEETING_FINAL' : 'JOIN_MEETING_RETRY';
7637
+ return _this45.turnServerUsed ? 'JOIN_MEETING_FINAL' : 'JOIN_MEETING_RETRY';
7623
7638
  }, undefined, false, options);
7624
7639
  }
7625
7640
 
@@ -7945,7 +7960,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7945
7960
  * @memberof Meeting
7946
7961
  */
7947
7962
  function enqueueMediaUpdate(mediaUpdateType) {
7948
- var _this45 = this;
7963
+ var _this46 = this;
7949
7964
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
7950
7965
  var canUpdateMediaNow = this.canUpdateMedia();
7951
7966
  return new _promise.default(function (resolve, reject) {
@@ -7956,9 +7971,9 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
7956
7971
  options: options
7957
7972
  };
7958
7973
  _loggerProxy.default.logger.log("Meeting:index#enqueueMediaUpdate --> enqueuing media update type=".concat(mediaUpdateType));
7959
- _this45.queuedMediaUpdates.push(queueItem);
7974
+ _this46.queuedMediaUpdates.push(queueItem);
7960
7975
  if (canUpdateMediaNow) {
7961
- _this45.processNextQueuedMediaUpdate();
7976
+ _this46.processNextQueuedMediaUpdate();
7962
7977
  }
7963
7978
  });
7964
7979
  }
@@ -8063,7 +8078,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8063
8078
  }, {
8064
8079
  key: "acknowledge",
8065
8080
  value: function acknowledge(type) {
8066
- var _this46 = this;
8081
+ var _this47 = this;
8067
8082
  if (!type) {
8068
8083
  return _promise.default.reject(new _parameter.default('Type must be set to acknowledge the meeting.'));
8069
8084
  }
@@ -8075,12 +8090,12 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8075
8090
  }).then(function (response) {
8076
8091
  return _promise.default.resolve(response);
8077
8092
  }).then(function (response) {
8078
- _this46.meetingFiniteStateMachine.ring(type);
8093
+ _this47.meetingFiniteStateMachine.ring(type);
8079
8094
  // @ts-ignore
8080
- _this46.webex.internal.newMetrics.submitClientEvent({
8095
+ _this47.webex.internal.newMetrics.submitClientEvent({
8081
8096
  name: 'client.alert.displayed',
8082
8097
  options: {
8083
- meetingId: _this46.id
8098
+ meetingId: _this47.id
8084
8099
  }
8085
8100
  });
8086
8101
  return _promise.default.resolve({
@@ -8105,12 +8120,12 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8105
8120
  }, {
8106
8121
  key: "decline",
8107
8122
  value: function decline(reason) {
8108
- var _this47 = this;
8123
+ var _this48 = this;
8109
8124
  return _util2.default.declineMeeting(this, reason).then(function (decline) {
8110
- _this47.meetingFiniteStateMachine.decline();
8125
+ _this48.meetingFiniteStateMachine.decline();
8111
8126
  return _promise.default.resolve(decline);
8112
8127
  }).catch(function (error) {
8113
- _this47.meetingFiniteStateMachine.fail(error);
8128
+ _this48.meetingFiniteStateMachine.fail(error);
8114
8129
  return _promise.default.reject(error);
8115
8130
  });
8116
8131
  }
@@ -8161,7 +8176,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8161
8176
  }, {
8162
8177
  key: "leave",
8163
8178
  value: function leave() {
8164
- var _this48 = this;
8179
+ var _this49 = this;
8165
8180
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
8166
8181
  var leaveReason = options.reason || _constants.MEETING_REMOVED_REASON.CLIENT_LEAVE_REQUEST;
8167
8182
 
@@ -8173,7 +8188,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8173
8188
  var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
8174
8189
  return (
8175
8190
  // @ts-ignore
8176
- _this48.webex.internal.newMetrics.submitClientEvent({
8191
+ _this49.webex.internal.newMetrics.submitClientEvent({
8177
8192
  name: 'client.call.leave',
8178
8193
  payload: _objectSpread({
8179
8194
  trigger: 'user-interaction',
@@ -8181,7 +8196,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8181
8196
  leaveReason: options.clientEventLeaveReason
8182
8197
  }, payload),
8183
8198
  options: {
8184
- meetingId: _this48.id
8199
+ meetingId: _this49.id
8185
8200
  }
8186
8201
  })
8187
8202
  );
@@ -8190,24 +8205,24 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8190
8205
  return _util2.default.leaveMeeting(this, options).then(function (leave) {
8191
8206
  // CA team recommends submitting this *after* locus /leave
8192
8207
  submitLeaveMetric();
8193
- _this48.meetingFiniteStateMachine.leave();
8194
- _this48.clearMeetingData();
8208
+ _this49.meetingFiniteStateMachine.leave();
8209
+ _this49.clearMeetingData();
8195
8210
 
8196
8211
  // upload logs on leave irrespective of meeting delete
8197
- _triggerProxy.default.trigger(_this48, {
8212
+ _triggerProxy.default.trigger(_this49, {
8198
8213
  file: 'meeting/index',
8199
8214
  function: 'leave'
8200
- }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this48);
8215
+ }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this49);
8201
8216
 
8202
8217
  // TODO: more testing before we remove this code, we are not sure the scenarios for destroy here
8203
- if (_this48.wirelessShare || _this48.guest) {
8218
+ if (_this49.wirelessShare || _this49.guest) {
8204
8219
  // If screen sharing clean the meeting object
8205
- _triggerProxy.default.trigger(_this48, {
8220
+ _triggerProxy.default.trigger(_this49, {
8206
8221
  file: 'meeting/index',
8207
8222
  function: 'leave'
8208
8223
  }, _constants.EVENTS.DESTROY_MEETING, {
8209
8224
  reason: options.reason,
8210
- meetingId: _this48.id
8225
+ meetingId: _this49.id
8211
8226
  });
8212
8227
  }
8213
8228
  _loggerProxy.default.logger.log('Meeting:index#leave --> LEAVE REASON ', leaveReason);
@@ -8224,16 +8239,16 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8224
8239
  shownToUser: false
8225
8240
  }]
8226
8241
  });
8227
- _this48.meetingFiniteStateMachine.fail(error);
8242
+ _this49.meetingFiniteStateMachine.fail(error);
8228
8243
  _loggerProxy.default.logger.error('Meeting:index#leave --> Failed to leave ', error);
8229
8244
  // upload logs on leave irrespective of meeting delete
8230
- _triggerProxy.default.trigger(_this48, {
8245
+ _triggerProxy.default.trigger(_this49, {
8231
8246
  file: 'meeting/index',
8232
8247
  function: 'leave'
8233
- }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this48);
8248
+ }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this49);
8234
8249
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_LEAVE_FAILURE, {
8235
- correlation_id: _this48.correlationId,
8236
- locus_id: _this48.locusUrl.split('/').pop(),
8250
+ correlation_id: _this49.correlationId,
8251
+ locus_id: _this49.locusUrl.split('/').pop(),
8237
8252
  reason: error.message,
8238
8253
  stack: error.stack,
8239
8254
  code: error.code
@@ -8253,7 +8268,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8253
8268
  }, {
8254
8269
  key: "startWhiteboardShare",
8255
8270
  value: function startWhiteboardShare(channelUrl, resourceToken) {
8256
- var _this49 = this;
8271
+ var _this50 = this;
8257
8272
  var whiteboard = this.locusInfo.mediaShares.find(function (element) {
8258
8273
  return element.name === 'whiteboard';
8259
8274
  });
@@ -8261,6 +8276,10 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8261
8276
  return _promise.default.reject(new _parameter.default('Cannot share without channelUrl.'));
8262
8277
  }
8263
8278
  if (whiteboard) {
8279
+ // @ts-ignore
8280
+ this.webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp({
8281
+ key: 'internal.client.share.initiated'
8282
+ });
8264
8283
  // @ts-ignore
8265
8284
  this.webex.internal.newMetrics.submitClientEvent({
8266
8285
  name: 'client.share.initiated',
@@ -8282,13 +8301,13 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8282
8301
  body.resourceToken = resourceToken;
8283
8302
  }
8284
8303
  return this.meetingRequest.changeMeetingFloor(body).then(function () {
8285
- _this49.screenShareFloorState = ScreenShareFloorStatus.RELEASED;
8304
+ _this50.screenShareFloorState = ScreenShareFloorStatus.RELEASED;
8286
8305
  return _promise.default.resolve();
8287
8306
  }).catch(function (error) {
8288
8307
  _loggerProxy.default.logger.error('Meeting:index#startWhiteboardShare --> Error ', error);
8289
8308
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_START_WHITEBOARD_SHARE_FAILURE, {
8290
- correlation_id: _this49.correlationId,
8291
- locus_id: _this49.locusUrl.split('/').pop(),
8309
+ correlation_id: _this50.correlationId,
8310
+ locus_id: _this50.locusUrl.split('/').pop(),
8292
8311
  reason: error.message,
8293
8312
  stack: error.stack,
8294
8313
  board: {
@@ -8311,16 +8330,22 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8311
8330
  }, {
8312
8331
  key: "stopWhiteboardShare",
8313
8332
  value: function stopWhiteboardShare(channelUrl) {
8314
- var _this50 = this;
8333
+ var _this51 = this;
8315
8334
  var whiteboard = this.locusInfo.mediaShares.find(function (element) {
8316
8335
  return element.name === 'whiteboard';
8317
8336
  });
8318
8337
  if (whiteboard) {
8338
+ // @ts-ignore
8339
+ this.webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp({
8340
+ key: 'internal.client.share.stopped'
8341
+ });
8319
8342
  // @ts-ignore
8320
8343
  this.webex.internal.newMetrics.submitClientEvent({
8321
8344
  name: 'client.share.stopped',
8322
8345
  payload: {
8323
- mediaType: 'whiteboard'
8346
+ mediaType: 'whiteboard',
8347
+ // @ts-ignore
8348
+ shareDuration: this.webex.internal.newMetrics.callDiagnosticLatencies.getShareDuration()
8324
8349
  },
8325
8350
  options: {
8326
8351
  meetingId: this.id
@@ -8334,8 +8359,8 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8334
8359
  }).catch(function (error) {
8335
8360
  _loggerProxy.default.logger.error('Meeting:index#stopWhiteboardShare --> Error ', error);
8336
8361
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_STOP_WHITEBOARD_SHARE_FAILURE, {
8337
- correlation_id: _this50.correlationId,
8338
- locus_id: _this50.locusUrl.split('/').pop(),
8362
+ correlation_id: _this51.correlationId,
8363
+ locus_id: _this51.locusUrl.split('/').pop(),
8339
8364
  reason: error.message,
8340
8365
  stack: error.stack,
8341
8366
  board: {
@@ -8357,7 +8382,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8357
8382
  }, {
8358
8383
  key: "requestScreenShareFloor",
8359
8384
  value: function requestScreenShareFloor() {
8360
- var _this51 = this;
8385
+ var _this52 = this;
8361
8386
  if (!this.mediaProperties.hasLocalShareStream() || !this.mediaProperties.mediaDirection.sendShare) {
8362
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, ")"));
8363
8388
  this.screenShareFloorState = ScreenShareFloorStatus.RELEASED;
@@ -8388,34 +8413,34 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8388
8413
  resourceUrl: this.resourceUrl,
8389
8414
  shareInstanceId: this.localShareInstanceId
8390
8415
  }).then(function () {
8391
- _this51.screenShareFloorState = ScreenShareFloorStatus.GRANTED;
8416
+ _this52.screenShareFloorState = ScreenShareFloorStatus.GRANTED;
8392
8417
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_SHARE_SUCCESS, {
8393
- correlation_id: _this51.correlationId,
8394
- locus_id: _this51.locusUrl.split('/').pop()
8418
+ correlation_id: _this52.correlationId,
8419
+ locus_id: _this52.locusUrl.split('/').pop()
8395
8420
  });
8396
8421
  return _promise.default.resolve();
8397
8422
  }).catch(function (error) {
8398
8423
  _loggerProxy.default.logger.error('Meeting:index#share --> Error ', error);
8399
8424
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_SHARE_FAILURE, {
8400
- correlation_id: _this51.correlationId,
8401
- locus_id: _this51.locusUrl.split('/').pop(),
8425
+ correlation_id: _this52.correlationId,
8426
+ locus_id: _this52.locusUrl.split('/').pop(),
8402
8427
  reason: error.message,
8403
8428
  stack: error.stack
8404
8429
  });
8405
8430
 
8406
8431
  // @ts-ignore
8407
- _this51.webex.internal.newMetrics.submitClientEvent({
8432
+ _this52.webex.internal.newMetrics.submitClientEvent({
8408
8433
  name: 'client.share.floor-granted.local',
8409
8434
  payload: {
8410
8435
  mediaType: 'share',
8411
8436
  errors: _util2.default.getChangeMeetingFloorErrorPayload(error.message),
8412
- shareInstanceId: _this51.localShareInstanceId
8437
+ shareInstanceId: _this52.localShareInstanceId
8413
8438
  },
8414
8439
  options: {
8415
- meetingId: _this51.id
8440
+ meetingId: _this52.id
8416
8441
  }
8417
8442
  });
8418
- _this51.screenShareFloorState = ScreenShareFloorStatus.RELEASED;
8443
+ _this52.screenShareFloorState = ScreenShareFloorStatus.RELEASED;
8419
8444
  return _promise.default.reject(error);
8420
8445
  });
8421
8446
  }
@@ -8438,10 +8463,10 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8438
8463
  }, {
8439
8464
  key: "requestScreenShareFloorIfPending",
8440
8465
  value: function requestScreenShareFloorIfPending() {
8441
- var _this52 = this;
8466
+ var _this53 = this;
8442
8467
  if (this.floorGrantPending && this.state === _constants.MEETING_STATE.STATES.JOINED) {
8443
8468
  this.requestScreenShareFloor().then(function () {
8444
- _this52.floorGrantPending = false;
8469
+ _this53.floorGrantPending = false;
8445
8470
  });
8446
8471
  }
8447
8472
  }
@@ -8455,7 +8480,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8455
8480
  }, {
8456
8481
  key: "releaseScreenShareFloor",
8457
8482
  value: function releaseScreenShareFloor() {
8458
- var _this53 = this;
8483
+ var _this54 = this;
8459
8484
  var content = this.locusInfo.mediaShares.find(function (element) {
8460
8485
  return element.name === _constants.CONTENT;
8461
8486
  });
@@ -8466,11 +8491,17 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8466
8491
  if (content) {
8467
8492
  var _content$floor;
8468
8493
  // @ts-ignore
8494
+ this.webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp({
8495
+ key: 'internal.client.share.stopped'
8496
+ });
8497
+ // @ts-ignore
8469
8498
  this.webex.internal.newMetrics.submitClientEvent({
8470
8499
  name: 'client.share.stopped',
8471
8500
  payload: {
8472
8501
  mediaType: 'share',
8473
- shareInstanceId: this.localShareInstanceId
8502
+ shareInstanceId: this.localShareInstanceId,
8503
+ // @ts-ignore
8504
+ shareDuration: this.webex.internal.newMetrics.callDiagnosticLatencies.getShareDuration()
8474
8505
  },
8475
8506
  options: {
8476
8507
  meetingId: this.id
@@ -8490,8 +8521,8 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8490
8521
  }).catch(function (error) {
8491
8522
  _loggerProxy.default.logger.error('Meeting:index#releaseScreenShareFloor --> Error ', error);
8492
8523
  _metrics.default.sendBehavioralMetric(_constants2.default.STOP_FLOOR_REQUEST_FAILURE, {
8493
- correlation_id: _this53.correlationId,
8494
- locus_id: _this53.locusUrl.split('/').pop(),
8524
+ correlation_id: _this54.correlationId,
8525
+ locus_id: _this54.locusUrl.split('/').pop(),
8495
8526
  reason: error.message,
8496
8527
  stack: error.stack
8497
8528
  });
@@ -8671,7 +8702,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8671
8702
  }, {
8672
8703
  key: "changeVideoLayout",
8673
8704
  value: function changeVideoLayout(layoutType) {
8674
- var _this54 = this;
8705
+ var _this55 = this;
8675
8706
  var renderInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
8676
8707
  var main = renderInfo.main,
8677
8708
  content = renderInfo.content;
@@ -8725,7 +8756,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8725
8756
  }
8726
8757
  this.lastVideoLayoutInfo = (0, _lodash.cloneDeep)(layoutInfo);
8727
8758
  this.locusInfo.once(_constants.LOCUSINFO.EVENTS.CONTROLS_MEETING_LAYOUT_UPDATED, function (envelope) {
8728
- _triggerProxy.default.trigger(_this54, {
8759
+ _triggerProxy.default.trigger(_this55, {
8729
8760
  file: 'meeting/index',
8730
8761
  function: 'changeVideoLayout'
8731
8762
  }, _constants.EVENT_TRIGGERS.MEETING_CONTROLS_LAYOUT_UPDATE, {
@@ -8841,7 +8872,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8841
8872
  }, {
8842
8873
  key: "endMeetingForAll",
8843
8874
  value: function endMeetingForAll() {
8844
- var _this55 = this;
8875
+ var _this56 = this;
8845
8876
  // @ts-ignore
8846
8877
  this.webex.internal.newMetrics.submitClientEvent({
8847
8878
  name: 'client.call.leave',
@@ -8859,25 +8890,25 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
8859
8890
  locus_id: this.locusId
8860
8891
  });
8861
8892
  return _util2.default.endMeetingForAll(this).then(function (end) {
8862
- _this55.meetingFiniteStateMachine.end();
8863
- _this55.clearMeetingData();
8893
+ _this56.meetingFiniteStateMachine.end();
8894
+ _this56.clearMeetingData();
8864
8895
  // upload logs on leave irrespective of meeting delete
8865
- _triggerProxy.default.trigger(_this55, {
8896
+ _triggerProxy.default.trigger(_this56, {
8866
8897
  file: 'meeting/index',
8867
8898
  function: 'endMeetingForAll'
8868
- }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this55);
8899
+ }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this56);
8869
8900
  return end;
8870
8901
  }).catch(function (error) {
8871
- _this55.meetingFiniteStateMachine.fail(error);
8902
+ _this56.meetingFiniteStateMachine.fail(error);
8872
8903
  _loggerProxy.default.logger.error('Meeting:index#endMeetingForAll --> Failed to end meeting ', error);
8873
8904
  // upload logs on leave irrespective of meeting delete
8874
- _triggerProxy.default.trigger(_this55, {
8905
+ _triggerProxy.default.trigger(_this56, {
8875
8906
  file: 'meeting/index',
8876
8907
  function: 'endMeetingForAll'
8877
- }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this55);
8908
+ }, _constants.EVENTS.REQUEST_UPLOAD_LOGS, _this56);
8878
8909
  _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_END_ALL_FAILURE, {
8879
- correlation_id: _this55.correlationId,
8880
- locus_id: _this55.locusUrl.split('/').pop(),
8910
+ correlation_id: _this56.correlationId,
8911
+ locus_id: _this56.locusUrl.split('/').pop(),
8881
8912
  reason: error.message,
8882
8913
  stack: error.stack,
8883
8914
  code: error.code
@@ -9038,7 +9069,7 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
9038
9069
  _this$mediaProperties43,
9039
9070
  _this$mediaProperties44,
9040
9071
  _this$mediaProperties45,
9041
- _this56 = this;
9072
+ _this57 = this;
9042
9073
  var LOG_HEADER = 'Meeting:index#updateTranscodedMediaConnection -->';
9043
9074
  _loggerProxy.default.logger.info("".concat(LOG_HEADER, " starting"));
9044
9075
  if (!this.canUpdateMedia()) {
@@ -9063,8 +9094,8 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
9063
9094
  }).catch(function (error) {
9064
9095
  _loggerProxy.default.logger.error("".concat(LOG_HEADER, " Error: "), error);
9065
9096
  _metrics.default.sendBehavioralMetric(_constants2.default.UPDATE_MEDIA_FAILURE, {
9066
- correlation_id: _this56.correlationId,
9067
- locus_id: _this56.locusUrl.split('/').pop(),
9097
+ correlation_id: _this57.correlationId,
9098
+ locus_id: _this57.locusUrl.split('/').pop(),
9068
9099
  reason: error.message,
9069
9100
  stack: error.stack
9070
9101
  });
@@ -9286,13 +9317,18 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
9286
9317
  return this.updateTranscodedMediaConnection();
9287
9318
  case 31:
9288
9319
  if (!floorRequestNeeded) {
9289
- _context40.next = 39;
9320
+ _context40.next = 40;
9290
9321
  break;
9291
9322
  }
9292
9323
  this.localShareInstanceId = _uuid.default.v4();
9293
9324
  this.shareCAEventSentStatus.transmitStart = false;
9294
9325
  this.shareCAEventSentStatus.transmitStop = false;
9295
9326
 
9327
+ // @ts-ignore
9328
+ this.webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp({
9329
+ key: 'internal.client.share.initiated'
9330
+ });
9331
+
9296
9332
  // @ts-ignore
9297
9333
  this.webex.internal.newMetrics.submitClientEvent({
9298
9334
  name: 'client.share.initiated',
@@ -9312,9 +9348,9 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
9312
9348
  // we're sending the http request to Locus to request the screen share floor
9313
9349
  // only after the SDP update, because that's how it's always been done for transcoded meetings
9314
9350
  // and also if sharing from the start, we need confluence to have been created
9315
- _context40.next = 39;
9351
+ _context40.next = 40;
9316
9352
  return this.enqueueScreenShareFloorRequest();
9317
- case 39:
9353
+ case 40:
9318
9354
  case "end":
9319
9355
  return _context40.stop();
9320
9356
  }