@webex/plugin-meetings 3.0.0-beta.326 → 3.0.0-beta.328

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.
@@ -308,6 +308,7 @@ describe('plugin-meetings', () => {
308
308
  assert.equal(meeting.resource, uuid2);
309
309
  assert.equal(meeting.deviceUrl, uuid3);
310
310
  assert.equal(meeting.correlationId, correlationId);
311
+ assert.deepEqual(meeting.callStateForMetrics, {correlationId});
311
312
  assert.deepEqual(meeting.meetingInfo, {});
312
313
  assert.instanceOf(meeting.members, Members);
313
314
  assert.calledOnceWithExactly(
@@ -375,6 +376,34 @@ describe('plugin-meetings', () => {
375
376
  }
376
377
  );
377
378
  assert.equal(newMeeting.correlationId, newMeeting.id);
379
+ assert.deepEqual(newMeeting.callStateForMetrics, {correlationId: newMeeting.id});
380
+ });
381
+
382
+ it('correlationId can be provided in callStateForMetrics', () => {
383
+ const newMeeting = new Meeting(
384
+ {
385
+ userId: uuid1,
386
+ resource: uuid2,
387
+ deviceUrl: uuid3,
388
+ locus: {url: url1},
389
+ destination: testDestination,
390
+ destinationType: _MEETING_ID_,
391
+ callStateForMetrics: {
392
+ correlationId: uuid4,
393
+ joinTrigger: 'fake-join-trigger',
394
+ loginType: 'fake-login-type',
395
+ }
396
+ },
397
+ {
398
+ parent: webex,
399
+ }
400
+ );
401
+ assert.equal(newMeeting.correlationId, uuid4);
402
+ assert.deepEqual(newMeeting.callStateForMetrics, {
403
+ correlationId: uuid4,
404
+ joinTrigger: 'fake-join-trigger',
405
+ loginType: 'fake-login-type',
406
+ });
378
407
  });
379
408
 
380
409
  describe('creates ReceiveSlot manager instance', () => {
@@ -844,6 +873,17 @@ describe('plugin-meetings', () => {
844
873
  assert.equal(result, joinMeetingResult);
845
874
  });
846
875
 
876
+ it('should take trigger from meeting joinTrigger if available', () => {
877
+ meeting.updateCallStateForMetrics({joinTrigger: 'fake-join-trigger'});
878
+ const join = meeting.join();
879
+
880
+ assert.calledWithMatch(webex.internal.newMetrics.submitClientEvent, {
881
+ name: 'client.call.initiated',
882
+ payload: {trigger: 'fake-join-trigger', isRoapCallEnabled: true},
883
+ options: {meetingId: meeting.id},
884
+ });
885
+ });
886
+
847
887
  it('should not create new correlation ID on join immediately after create', async () => {
848
888
  await meeting.join();
849
889
  sinon.assert.notCalled(setCorrelationIdSpy);
@@ -4566,7 +4606,7 @@ describe('plugin-meetings', () => {
4566
4606
  };
4567
4607
  const FAKE_MEETING_INFO_LOOKUP_URL = 'meetingLookupUrl';
4568
4608
  const FAKE_PERMISSION_TOKEN = {someField: 'some value'};
4569
- const FAKE_TTL = 13;
4609
+ const FAKE_TIMESTAMPS = {timeLeft: 13, expiryTime: 123456, currentTime: 123478};
4570
4610
 
4571
4611
  beforeEach(() => {
4572
4612
  meeting.locusId = 'locus-id';
@@ -4576,7 +4616,7 @@ describe('plugin-meetings', () => {
4576
4616
  meeting.destination = 'meeting-destination';
4577
4617
  meeting.destinationType = 'meeting-destination-type';
4578
4618
  meeting.updateMeetingActions = sinon.stub().returns(undefined);
4579
- meeting.getPermissionTokenTimeLeftInSec = sinon.stub().returns(FAKE_TTL);
4619
+ meeting.getPermissionTokenExpiryInfo = sinon.stub().returns(FAKE_TIMESTAMPS);
4580
4620
  meeting.meetingInfoExtraParams = {
4581
4621
  extraParam1: 'value1'
4582
4622
  };
@@ -4629,7 +4669,9 @@ describe('plugin-meetings', () => {
4629
4669
  assert.calledWith(
4630
4670
  Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.PERMISSION_TOKEN_REFRESH, {
4631
4671
  correlationId: meeting.correlationId,
4632
- timeLeft: FAKE_TTL,
4672
+ timeLeft: FAKE_TIMESTAMPS.timeLeft,
4673
+ expiryTime: FAKE_TIMESTAMPS.expiryTime,
4674
+ currentTime: FAKE_TIMESTAMPS.currentTime,
4633
4675
  reason: 'fake reason',
4634
4676
  destinationType: 'meeting-destination-type',
4635
4677
  }
@@ -4678,7 +4720,9 @@ describe('plugin-meetings', () => {
4678
4720
  assert.calledWith(
4679
4721
  Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.PERMISSION_TOKEN_REFRESH, {
4680
4722
  correlationId: meeting.correlationId,
4681
- timeLeft: FAKE_TTL,
4723
+ timeLeft: FAKE_TIMESTAMPS.timeLeft,
4724
+ expiryTime: FAKE_TIMESTAMPS.expiryTime,
4725
+ currentTime: FAKE_TIMESTAMPS.currentTime,
4682
4726
  reason: 'some reason',
4683
4727
  destinationType: 'MEETING_LINK',
4684
4728
  }
@@ -5171,6 +5215,31 @@ describe('plugin-meetings', () => {
5171
5215
  }
5172
5216
  });
5173
5217
  });
5218
+
5219
+ describe('#setCorrelationId', () => {
5220
+ it('should set the correlationId and return undefined', () => {
5221
+ assert.equal(meeting.correlationId, correlationId);
5222
+ assert.deepEqual(meeting.callStateForMetrics, {correlationId});
5223
+ meeting.setCorrelationId(uuid1);
5224
+ assert.equal(meeting.correlationId, uuid1);
5225
+ assert.deepEqual(meeting.callStateForMetrics, {correlationId: uuid1});
5226
+ });
5227
+ });
5228
+
5229
+ describe('#updateCallStateForMetrics', () => {
5230
+ it('should update the callState, overriding existing values', () => {
5231
+ assert.deepEqual(meeting.callStateForMetrics, {correlationId});
5232
+ meeting.updateCallStateForMetrics({correlationId: uuid1, joinTrigger: 'jt', loginType: 'lt'});
5233
+ assert.deepEqual(meeting.callStateForMetrics, {correlationId: uuid1, joinTrigger: 'jt', loginType: 'lt'});
5234
+ });
5235
+
5236
+ it('should update the callState, keeping non-supplied values', () => {
5237
+ assert.deepEqual(meeting.callStateForMetrics, {correlationId});
5238
+ meeting.updateCallStateForMetrics({joinTrigger: 'jt', loginType: 'lt'});
5239
+ assert.deepEqual(meeting.callStateForMetrics, {correlationId, joinTrigger: 'jt', loginType: 'lt'});
5240
+ });
5241
+ });
5242
+
5174
5243
  describe('Local tracks publishing', () => {
5175
5244
  let audioStream;
5176
5245
  let videoStream;
@@ -7475,14 +7544,6 @@ describe('plugin-meetings', () => {
7475
7544
  });
7476
7545
  });
7477
7546
 
7478
- describe('#setCorrelationId', () => {
7479
- it('should set the correlationId and return undefined', () => {
7480
- assert.ok(meeting.correlationId);
7481
- meeting.setCorrelationId(uuid1);
7482
- assert.equal(meeting.correlationId, uuid1);
7483
- });
7484
- });
7485
-
7486
7547
  describe('#setUpLocusInfoAssignHostListener', () => {
7487
7548
  let locusInfoOnSpy;
7488
7549
  let inMeetingActionsSetSpy;
@@ -9698,7 +9759,7 @@ describe('plugin-meetings', () => {
9698
9759
  });
9699
9760
  });
9700
9761
 
9701
- describe('#getPermissionTokenTimeLeftInSec', () => {
9762
+ describe('#getPermissionTokenExpiryInfo', () => {
9702
9763
  let now;
9703
9764
  let clock;
9704
9765
 
@@ -9714,63 +9775,65 @@ describe('plugin-meetings', () => {
9714
9775
  })
9715
9776
 
9716
9777
  it('should return undefined if exp is undefined', () => {
9717
- assert.equal(meeting.getPermissionTokenTimeLeftInSec(), undefined)
9778
+ assert.equal(meeting.getPermissionTokenExpiryInfo(), undefined)
9718
9779
  });
9719
9780
 
9720
9781
  it('should return the expected positive exp', () => {
9721
9782
  // set permission token as now + 1 sec
9722
- meeting.permissionTokenPayload = {exp: (now + 1000).toString()};
9723
- assert.equal(meeting.getPermissionTokenTimeLeftInSec(), 1);
9783
+ const expiryTime = now + 1000;
9784
+ meeting.permissionTokenPayload = {exp: (expiryTime).toString()};
9785
+ assert.deepEqual(meeting.getPermissionTokenExpiryInfo(), {timeLeft: 1, expiryTime: Number(expiryTime), currentTime: now});
9724
9786
  });
9725
9787
 
9726
9788
  it('should return the expected negative exp', () => {
9727
9789
  // set permission token as now - 1 sec
9728
- meeting.permissionTokenPayload = {exp: (now - 1000).toString()};
9729
- assert.equal(meeting.getPermissionTokenTimeLeftInSec(), -1);
9790
+ const expiryTime = now - 1000;
9791
+ meeting.permissionTokenPayload = {exp: (expiryTime).toString()};
9792
+ assert.deepEqual(meeting.getPermissionTokenExpiryInfo(), {timeLeft: -1, expiryTime: Number(expiryTime), currentTime: now});
9730
9793
  });
9731
9794
  });
9732
9795
 
9733
9796
  describe('#checkAndRefreshPermissionToken', () => {
9734
9797
  it('should not fire refreshPermissionToken if permissionToken is not defined', async() => {
9735
- meeting.getPermissionTokenTimeLeftInSec = sinon.stub().returns(undefined)
9798
+ meeting.getPermissionTokenExpiryInfo = sinon.stub().returns({timeLeft: undefined, expiryTime: undefined, currentTime: Date.now()})
9736
9799
  meeting.refreshPermissionToken = sinon.stub().returns(Promise.resolve('test return value'));
9737
9800
 
9738
9801
  const returnValue = await meeting.checkAndRefreshPermissionToken(10, 'ttl-join');
9739
9802
 
9740
- assert.calledOnce(meeting.getPermissionTokenTimeLeftInSec);
9803
+ assert.calledOnce(meeting.getPermissionTokenExpiryInfo);
9741
9804
  assert.notCalled(meeting.refreshPermissionToken);
9742
9805
  assert.equal(returnValue, undefined);
9743
9806
  });
9744
9807
 
9745
9808
  it('should fire refreshPermissionToken if time left is below 10sec', async() => {
9746
- meeting.getPermissionTokenTimeLeftInSec = sinon.stub().returns(9)
9809
+ meeting.getPermissionTokenExpiryInfo = sinon.stub().returns({timeLeft: 9, expiryTime: 122132, currentTime: Date.now()})
9747
9810
  meeting.refreshPermissionToken = sinon.stub().returns(Promise.resolve('test return value'));
9748
9811
 
9749
9812
  const returnValue = await meeting.checkAndRefreshPermissionToken(10, 'ttl-join');
9750
9813
 
9751
- assert.calledOnce(meeting.getPermissionTokenTimeLeftInSec);
9814
+ assert.calledOnce(meeting.getPermissionTokenExpiryInfo);
9752
9815
  assert.calledOnceWithExactly(meeting.refreshPermissionToken, 'ttl-join');
9753
9816
  assert.equal(returnValue, 'test return value');
9754
9817
  });
9755
9818
 
9756
9819
  it('should fire refreshPermissionToken if time left is equal 10sec', async () => {
9757
- meeting.getPermissionTokenTimeLeftInSec = sinon.stub().returns(10)
9820
+ meeting.getPermissionTokenExpiryInfo = sinon.stub().returns({timeLeft: 10, expiryTime: 122132, currentTime: Date.now()})
9758
9821
  meeting.refreshPermissionToken = sinon.stub().returns(Promise.resolve('test return value'));
9759
9822
 
9760
9823
  const returnValue = await meeting.checkAndRefreshPermissionToken(10, 'ttl-join');
9761
9824
 
9762
- assert.calledOnce(meeting.getPermissionTokenTimeLeftInSec);
9825
+ assert.calledOnce(meeting.getPermissionTokenExpiryInfo);
9763
9826
  assert.calledOnceWithExactly(meeting.refreshPermissionToken, 'ttl-join');
9764
9827
  assert.equal(returnValue, 'test return value');
9765
9828
  });
9766
9829
 
9767
9830
  it('should not fire refreshPermissionToken if time left is higher than 10sec', async () => {
9768
- meeting.getPermissionTokenTimeLeftInSec = sinon.stub().returns(11)
9831
+ meeting.getPermissionTokenExpiryInfo = sinon.stub().returns({timeLeft: 11, expiryTime: 122132, currentTime: Date.now()})
9769
9832
  meeting.refreshPermissionToken = sinon.stub().returns(Promise.resolve('test return value'));
9770
9833
 
9771
9834
  const returnValue = await meeting.checkAndRefreshPermissionToken(10, 'ttl-join');
9772
9835
 
9773
- assert.calledOnce(meeting.getPermissionTokenTimeLeftInSec);
9836
+ assert.calledOnce(meeting.getPermissionTokenExpiryInfo);
9774
9837
  assert.notCalled(meeting.refreshPermissionToken);
9775
9838
  assert.equal(returnValue, undefined);
9776
9839
  });
@@ -637,6 +637,29 @@ describe('plugin-meetings', () => {
637
637
 
638
638
  const FAKE_USE_RANDOM_DELAY = true;
639
639
  const correlationId = 'my-correlationId';
640
+ const callStateForMetrics = {
641
+ correlationId: 'my-correlationId2',
642
+ joinTrigger: 'my-join-trigger',
643
+ loginType: 'my-login-type',
644
+ };
645
+
646
+ it('should call setCallStateForMetrics on any pre-existing meeting', async () => {
647
+ const fakeMeeting = {setCallStateForMetrics: sinon.mock()};
648
+ webex.meetings.meetingCollection.getByKey = sinon.stub().returns(fakeMeeting);
649
+ await webex.meetings.create(
650
+ test1,
651
+ test2,
652
+ FAKE_USE_RANDOM_DELAY,
653
+ {},
654
+ correlationId,
655
+ true,
656
+ callStateForMetrics
657
+ );
658
+ assert.calledOnceWithExactly(fakeMeeting.setCallStateForMetrics, {
659
+ ...callStateForMetrics,
660
+ correlationId,
661
+ });
662
+ });
640
663
 
641
664
  const checkCallCreateMeeting = async (createParameters, createMeetingParameters) => {
642
665
  const create = webex.meetings.create(...createParameters);
@@ -648,23 +671,37 @@ describe('plugin-meetings', () => {
648
671
  };
649
672
 
650
673
  it('calls createMeeting and returns its promise', async () => {
651
- checkCallCreateMeeting(
674
+ await checkCallCreateMeeting(
652
675
  [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, true],
653
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, true]
676
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, true]
654
677
  );
655
678
  });
656
679
 
657
680
  it('calls createMeeting when failOnMissingMeetinginfo is undefined and returns its promise', async () => {
658
- checkCallCreateMeeting(
681
+ await checkCallCreateMeeting(
659
682
  [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, undefined],
660
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, false]
683
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, false]
661
684
  );
662
685
  });
663
686
 
664
687
  it('calls createMeeting when failOnMissingMeetinginfo is false and returns its promise', async () => {
665
- checkCallCreateMeeting(
688
+ await checkCallCreateMeeting(
666
689
  [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, false],
667
- [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, false]
690
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, false]
691
+ );
692
+ });
693
+
694
+ it('calls createMeeting with callStateForMetrics and returns its promise', async () => {
695
+ await checkCallCreateMeeting(
696
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, undefined, true, callStateForMetrics],
697
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, callStateForMetrics, true]
698
+ );
699
+ });
700
+
701
+ it('calls createMeeting with callStateForMetrics overwritten with correlationId and returns its promise', async () => {
702
+ await checkCallCreateMeeting(
703
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, true, callStateForMetrics],
704
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, {...callStateForMetrics, correlationId}, true]
668
705
  );
669
706
  });
670
707
 
@@ -693,7 +730,8 @@ describe('plugin-meetings', () => {
693
730
  test2,
694
731
  FAKE_USE_RANDOM_DELAY,
695
732
  FAKE_INFO_EXTRA_PARAMS,
696
- correlationId
733
+ {correlationId},
734
+ false
697
735
  );
698
736
  });
699
737
 
@@ -1122,6 +1160,12 @@ describe('plugin-meetings', () => {
1122
1160
  if (expectedMeetingData.correlationId) {
1123
1161
  assert.equal(meeting.correlationId, expectedMeetingData.correlationId);
1124
1162
  }
1163
+ if (expectedMeetingData.callStateForMetrics) {
1164
+ assert.deepEqual(
1165
+ meeting.callStateForMetrics,
1166
+ expectedMeetingData.callStateForMetrics
1167
+ );
1168
+ }
1125
1169
  assert.equal(meeting.destination, destination);
1126
1170
  assert.equal(meeting.destinationType, type);
1127
1171
  assert.calledWith(
@@ -1390,7 +1434,7 @@ describe('plugin-meetings', () => {
1390
1434
  'test type',
1391
1435
  false,
1392
1436
  {},
1393
- 'my-correlationId'
1437
+ {correlationId: 'my-correlationId'}
1394
1438
  );
1395
1439
 
1396
1440
  const expectedMeetingData = {
@@ -1406,6 +1450,38 @@ describe('plugin-meetings', () => {
1406
1450
  true
1407
1451
  );
1408
1452
  });
1453
+
1454
+ it('creates meeting with the callStateForMetrics provided', async () => {
1455
+ const meeting = await webex.meetings.createMeeting(
1456
+ 'test destination',
1457
+ 'test type',
1458
+ false,
1459
+ {},
1460
+ {
1461
+ correlationId: 'my-correlationId',
1462
+ joinTrigger: 'my-join-trigger',
1463
+ loginType: 'my-login-type',
1464
+ }
1465
+ );
1466
+
1467
+ const expectedMeetingData = {
1468
+ correlationId: 'my-correlationId',
1469
+ callStateForMetrics: {
1470
+ correlationId: 'my-correlationId',
1471
+ joinTrigger: 'my-join-trigger',
1472
+ loginType: 'my-login-type',
1473
+ },
1474
+ };
1475
+
1476
+ checkCreateWithoutDelay(
1477
+ meeting,
1478
+ 'test destination',
1479
+ 'test type',
1480
+ {},
1481
+ expectedMeetingData,
1482
+ true
1483
+ );
1484
+ });
1409
1485
  });
1410
1486
 
1411
1487
  describe('rejected MeetingInfo.#fetchMeetingInfo', () => {