@webex/plugin-meetings 3.5.0-wxcc.1 → 3.6.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 (201) hide show
  1. package/dist/annotation/annotation.types.d.ts +42 -0
  2. package/dist/annotation/constants.d.ts +31 -0
  3. package/dist/annotation/index.d.ts +117 -0
  4. package/dist/breakouts/breakout.d.ts +8 -0
  5. package/dist/breakouts/breakout.js +1 -1
  6. package/dist/breakouts/collection.d.ts +5 -0
  7. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  8. package/dist/breakouts/events.d.ts +8 -0
  9. package/dist/breakouts/index.d.ts +5 -0
  10. package/dist/breakouts/index.js +1 -1
  11. package/dist/breakouts/request.d.ts +22 -0
  12. package/dist/breakouts/utils.d.ts +15 -0
  13. package/dist/common/browser-detection.d.ts +9 -0
  14. package/dist/common/collection.d.ts +48 -0
  15. package/dist/common/config.d.ts +2 -0
  16. package/dist/common/errors/captcha-error.d.ts +15 -0
  17. package/dist/common/errors/intent-to-join.d.ts +16 -0
  18. package/dist/common/errors/join-meeting.d.ts +17 -0
  19. package/dist/common/errors/media.d.ts +15 -0
  20. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  21. package/dist/common/errors/parameter.d.ts +15 -0
  22. package/dist/common/errors/password-error.d.ts +15 -0
  23. package/dist/common/errors/permission.d.ts +14 -0
  24. package/dist/common/errors/reclaim-host-role-error.js +149 -0
  25. package/dist/common/errors/reclaim-host-role-error.js.map +1 -0
  26. package/dist/common/errors/reclaim-host-role-errors.d.ts +60 -0
  27. package/dist/common/errors/reconnection-in-progress.d.ts +9 -0
  28. package/dist/common/errors/reconnection-in-progress.js +33 -0
  29. package/dist/common/errors/reconnection-in-progress.js.map +1 -0
  30. package/dist/common/errors/reconnection.d.ts +15 -0
  31. package/dist/common/errors/stats.d.ts +15 -0
  32. package/dist/common/errors/webex-errors.d.ts +93 -0
  33. package/dist/common/errors/webex-meetings-error.d.ts +20 -0
  34. package/dist/common/events/events-scope.d.ts +17 -0
  35. package/dist/common/events/events.d.ts +12 -0
  36. package/dist/common/events/trigger-proxy.d.ts +2 -0
  37. package/dist/common/events/util.d.ts +2 -0
  38. package/dist/common/logs/logger-config.d.ts +2 -0
  39. package/dist/common/logs/logger-proxy.d.ts +2 -0
  40. package/dist/common/logs/request.d.ts +36 -0
  41. package/dist/common/queue.d.ts +34 -0
  42. package/dist/config.d.ts +72 -0
  43. package/dist/config.js +3 -1
  44. package/dist/config.js.map +1 -1
  45. package/dist/constants.d.ts +1088 -0
  46. package/dist/constants.js +1 -0
  47. package/dist/constants.js.map +1 -1
  48. package/dist/controls-options-manager/constants.d.ts +4 -0
  49. package/dist/controls-options-manager/enums.d.ts +15 -0
  50. package/dist/controls-options-manager/index.d.ts +136 -0
  51. package/dist/controls-options-manager/types.d.ts +43 -0
  52. package/dist/controls-options-manager/util.d.ts +1 -0
  53. package/dist/index.d.ts +7 -0
  54. package/dist/interceptors/index.d.ts +2 -0
  55. package/dist/interceptors/locusRetry.d.ts +27 -0
  56. package/dist/interpretation/collection.d.ts +5 -0
  57. package/dist/interpretation/index.d.ts +5 -0
  58. package/dist/interpretation/index.js +1 -1
  59. package/dist/interpretation/siLanguage.d.ts +5 -0
  60. package/dist/interpretation/siLanguage.js +1 -1
  61. package/dist/locus-info/controlsUtils.d.ts +2 -0
  62. package/dist/locus-info/embeddedAppsUtils.d.ts +2 -0
  63. package/dist/locus-info/fullState.d.ts +2 -0
  64. package/dist/locus-info/hostUtils.d.ts +2 -0
  65. package/dist/locus-info/index.d.ts +322 -0
  66. package/dist/locus-info/infoUtils.d.ts +2 -0
  67. package/dist/locus-info/mediaSharesUtils.d.ts +2 -0
  68. package/dist/locus-info/parser.d.ts +272 -0
  69. package/dist/locus-info/selfUtils.d.ts +2 -0
  70. package/dist/media/index.d.ts +34 -0
  71. package/dist/media/index.js +3 -1
  72. package/dist/media/index.js.map +1 -1
  73. package/dist/media/properties.d.ts +93 -0
  74. package/dist/media/util.d.ts +2 -0
  75. package/dist/mediaQualityMetrics/config.d.ts +241 -0
  76. package/dist/mediaQualityMetrics/config.js +502 -0
  77. package/dist/mediaQualityMetrics/config.js.map +1 -0
  78. package/dist/meeting/effectsState.js +260 -0
  79. package/dist/meeting/effectsState.js.map +1 -0
  80. package/dist/meeting/in-meeting-actions.d.ts +167 -0
  81. package/dist/meeting/in-meeting-actions.js +3 -1
  82. package/dist/meeting/in-meeting-actions.js.map +1 -1
  83. package/dist/meeting/index.d.ts +1825 -0
  84. package/dist/meeting/index.js +39 -4
  85. package/dist/meeting/index.js.map +1 -1
  86. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  87. package/dist/meeting/muteState.d.ts +178 -0
  88. package/dist/meeting/request.d.ts +295 -0
  89. package/dist/meeting/request.type.d.ts +11 -0
  90. package/dist/meeting/state.d.ts +9 -0
  91. package/dist/meeting/util.d.ts +119 -0
  92. package/dist/meeting/util.js +5 -8
  93. package/dist/meeting/util.js.map +1 -1
  94. package/dist/meeting/voicea-meeting.d.ts +16 -0
  95. package/dist/meeting-info/collection.d.ts +20 -0
  96. package/dist/meeting-info/index.d.ts +69 -0
  97. package/dist/meeting-info/meeting-info-v2.d.ts +123 -0
  98. package/dist/meeting-info/request.d.ts +22 -0
  99. package/dist/meeting-info/util.d.ts +2 -0
  100. package/dist/meeting-info/utilv2.d.ts +2 -0
  101. package/dist/meetings/collection.d.ts +40 -0
  102. package/dist/meetings/index.d.ts +390 -0
  103. package/dist/meetings/index.js +79 -26
  104. package/dist/meetings/index.js.map +1 -1
  105. package/dist/meetings/meetings.types.d.ts +4 -0
  106. package/dist/meetings/request.d.ts +27 -0
  107. package/dist/meetings/util.d.ts +18 -0
  108. package/dist/member/index.d.ts +160 -0
  109. package/dist/member/member.types.js +17 -0
  110. package/dist/member/member.types.js.map +1 -0
  111. package/dist/member/types.d.ts +32 -0
  112. package/dist/member/util.d.ts +2 -0
  113. package/dist/members/collection.d.ts +29 -0
  114. package/dist/members/index.d.ts +353 -0
  115. package/dist/members/request.d.ts +114 -0
  116. package/dist/members/types.d.ts +25 -0
  117. package/dist/members/util.d.ts +215 -0
  118. package/dist/metrics/config.js +276 -0
  119. package/dist/metrics/config.js.map +1 -0
  120. package/dist/metrics/constants.d.ts +70 -0
  121. package/dist/metrics/index.d.ts +45 -0
  122. package/dist/multistream/mediaRequestManager.d.ts +119 -0
  123. package/dist/multistream/receiveSlot.d.ts +68 -0
  124. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  125. package/dist/multistream/remoteMedia.d.ts +72 -0
  126. package/dist/multistream/remoteMediaGroup.d.ts +49 -0
  127. package/dist/multistream/remoteMediaManager.d.ts +300 -0
  128. package/dist/multistream/sendSlotManager.d.ts +69 -0
  129. package/dist/networkQualityMonitor/index.d.ts +70 -0
  130. package/dist/networkQualityMonitor/index.js +13 -19
  131. package/dist/networkQualityMonitor/index.js.map +1 -1
  132. package/dist/peer-connection-manager/index.js +671 -0
  133. package/dist/peer-connection-manager/index.js.map +1 -0
  134. package/dist/peer-connection-manager/util.js +109 -0
  135. package/dist/peer-connection-manager/util.js.map +1 -0
  136. package/dist/personal-meeting-room/index.d.ts +47 -0
  137. package/dist/personal-meeting-room/request.d.ts +14 -0
  138. package/dist/personal-meeting-room/util.d.ts +2 -0
  139. package/dist/reachability/clusterReachability.d.ts +109 -0
  140. package/dist/reachability/index.d.ts +105 -0
  141. package/dist/reachability/request.d.ts +39 -0
  142. package/dist/reachability/util.d.ts +8 -0
  143. package/dist/reactions/constants.d.ts +3 -0
  144. package/dist/reactions/reactions.d.ts +4 -0
  145. package/dist/reactions/reactions.type.d.ts +52 -0
  146. package/dist/reconnection-manager/index.d.ts +136 -0
  147. package/dist/recording-controller/enums.d.ts +7 -0
  148. package/dist/recording-controller/index.d.ts +207 -0
  149. package/dist/recording-controller/util.d.ts +14 -0
  150. package/dist/roap/collection.js +62 -0
  151. package/dist/roap/collection.js.map +1 -0
  152. package/dist/roap/handler.js +275 -0
  153. package/dist/roap/handler.js.map +1 -0
  154. package/dist/roap/index.d.ts +86 -0
  155. package/dist/roap/request.d.ts +39 -0
  156. package/dist/roap/state.js +126 -0
  157. package/dist/roap/state.js.map +1 -0
  158. package/dist/roap/turnDiscovery.d.ts +155 -0
  159. package/dist/roap/util.js +75 -0
  160. package/dist/roap/util.js.map +1 -0
  161. package/dist/rtcMetrics/constants.d.ts +4 -0
  162. package/dist/rtcMetrics/index.d.ts +61 -0
  163. package/dist/statsAnalyzer/global.d.ts +36 -0
  164. package/dist/statsAnalyzer/global.js +126 -0
  165. package/dist/statsAnalyzer/global.js.map +1 -0
  166. package/dist/statsAnalyzer/index.d.ts +217 -0
  167. package/dist/statsAnalyzer/index.js +1013 -0
  168. package/dist/statsAnalyzer/index.js.map +1 -0
  169. package/dist/statsAnalyzer/mqaUtil.d.ts +48 -0
  170. package/dist/statsAnalyzer/mqaUtil.js +179 -0
  171. package/dist/statsAnalyzer/mqaUtil.js.map +1 -0
  172. package/dist/transcription/index.d.ts +64 -0
  173. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  174. package/dist/types/config.d.ts +1 -0
  175. package/dist/types/constants.d.ts +2 -1
  176. package/dist/types/mediaQualityMetrics/config.d.ts +241 -0
  177. package/dist/types/meeting/in-meeting-actions.d.ts +2 -0
  178. package/dist/types/meeting/index.d.ts +11 -0
  179. package/dist/types/meetings/index.d.ts +34 -2
  180. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  181. package/dist/types/statsAnalyzer/index.d.ts +217 -0
  182. package/dist/types/statsAnalyzer/mqaUtil.d.ts +48 -0
  183. package/dist/webinar/collection.d.ts +16 -0
  184. package/dist/webinar/index.d.ts +5 -0
  185. package/dist/webinar/index.js +1 -1
  186. package/package.json +22 -22
  187. package/src/config.ts +2 -0
  188. package/src/constants.ts +1 -0
  189. package/src/media/index.ts +4 -1
  190. package/src/meeting/in-meeting-actions.ts +3 -0
  191. package/src/meeting/index.ts +42 -2
  192. package/src/meeting/util.ts +21 -29
  193. package/src/meetings/index.ts +107 -37
  194. package/test/unit/spec/media/index.ts +4 -0
  195. package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
  196. package/test/unit/spec/meeting/index.js +58 -17
  197. package/test/unit/spec/meeting/utils.js +34 -84
  198. package/test/unit/spec/meetings/index.js +112 -13
  199. package/src/rtcMetrics/constants.ts +0 -3
  200. package/src/rtcMetrics/index.ts +0 -186
  201. package/test/unit/spec/rtcMetrics/index.ts +0 -154
@@ -5,7 +5,6 @@ import 'jsdom-global/register';
5
5
  import {cloneDeep, forEach, isEqual, isUndefined} from 'lodash';
6
6
  import sinon from 'sinon';
7
7
  import * as InternalMediaCoreModule from '@webex/internal-media-core';
8
- import * as RtcMetricsModule from '@webex/plugin-meetings/src/rtcMetrics';
9
8
  import * as RemoteMediaManagerModule from '@webex/plugin-meetings/src/multistream/remoteMediaManager';
10
9
  import StateMachine from 'javascript-state-machine';
11
10
  import uuid from 'uuid';
@@ -307,7 +306,7 @@ describe('plugin-meetings', () => {
307
306
  assert.equal(meeting.resource, uuid2);
308
307
  assert.equal(meeting.deviceUrl, uuid3);
309
308
  assert.equal(meeting.correlationId, correlationId);
310
- assert.deepEqual(meeting.callStateForMetrics, {correlationId});
309
+ assert.deepEqual(meeting.callStateForMetrics, {correlationId, sessionCorrelationId: ''});
311
310
  assert.deepEqual(meeting.meetingInfo, {});
312
311
  assert.instanceOf(meeting.members, Members);
313
312
  assert.calledOnceWithExactly(
@@ -376,7 +375,7 @@ describe('plugin-meetings', () => {
376
375
  }
377
376
  );
378
377
  assert.equal(newMeeting.correlationId, newMeeting.id);
379
- assert.deepEqual(newMeeting.callStateForMetrics, {correlationId: newMeeting.id});
378
+ assert.deepEqual(newMeeting.callStateForMetrics, {correlationId: newMeeting.id, sessionCorrelationId: ''});
380
379
  });
381
380
 
382
381
  it('correlationId can be provided in callStateForMetrics', () => {
@@ -403,6 +402,37 @@ describe('plugin-meetings', () => {
403
402
  correlationId: uuid4,
404
403
  joinTrigger: 'fake-join-trigger',
405
404
  loginType: 'fake-login-type',
405
+ sessionCorrelationId: '',
406
+ });
407
+ });
408
+
409
+ it('sessionCorrelationId can be provided in callStateForMetrics', () => {
410
+ const newMeeting = new Meeting(
411
+ {
412
+ userId: uuid1,
413
+ resource: uuid2,
414
+ deviceUrl: uuid3,
415
+ locus: {url: url1},
416
+ destination: testDestination,
417
+ destinationType: DESTINATION_TYPE.MEETING_ID,
418
+ callStateForMetrics: {
419
+ correlationId: uuid4,
420
+ sessionCorrelationId: uuid1,
421
+ joinTrigger: 'fake-join-trigger',
422
+ loginType: 'fake-login-type',
423
+ },
424
+ },
425
+ {
426
+ parent: webex,
427
+ }
428
+ );
429
+ assert.exists(newMeeting.sessionCorrelationId);
430
+ assert.equal(newMeeting.sessionCorrelationId, uuid1);
431
+ assert.deepEqual(newMeeting.callStateForMetrics, {
432
+ correlationId: uuid4,
433
+ sessionCorrelationId: uuid1,
434
+ joinTrigger: 'fake-join-trigger',
435
+ loginType: 'fake-login-type',
406
436
  });
407
437
  });
408
438
 
@@ -1611,7 +1641,6 @@ describe('plugin-meetings', () => {
1611
1641
 
1612
1642
  assert.calledOnce(MeetingUtil.joinMeeting);
1613
1643
  assert.calledOnce(webex.internal.device.meetingStarted);
1614
- assert.calledOnce(meeting.setLocus);
1615
1644
  assert.equal(result, joinMeetingResult);
1616
1645
  assert.calledWith(webex.internal.llm.on, 'online', meeting.handleLLMOnline);
1617
1646
  });
@@ -2456,8 +2485,8 @@ describe('plugin-meetings', () => {
2456
2485
  });
2457
2486
 
2458
2487
  it('should create rtcMetrics and pass them to Media.createMediaConnection()', async () => {
2459
- const fakeRtcMetrics = {id: 'fake rtc metrics object'};
2460
- const rtcMetricsCtor = sinon.stub(RtcMetricsModule, 'default').returns(fakeRtcMetrics);
2488
+ const setIntervalOriginal = window.setInterval;
2489
+ window.setInterval = sinon.stub().returns(1);
2461
2490
 
2462
2491
  // setup the minimum mocks required for multistream connection
2463
2492
  fakeMediaConnection.createSendSlot = sinon.stub().returns({
@@ -2478,8 +2507,6 @@ describe('plugin-meetings', () => {
2478
2507
  mediaSettings: {},
2479
2508
  });
2480
2509
 
2481
- assert.calledOnceWithExactly(rtcMetricsCtor, webex, meeting.id, meeting.correlationId);
2482
-
2483
2510
  // check that rtcMetrics was passed to Media.createMediaConnection
2484
2511
  assert.calledOnce(Media.createMediaConnection);
2485
2512
  assert.calledWith(
@@ -2487,10 +2514,10 @@ describe('plugin-meetings', () => {
2487
2514
  true,
2488
2515
  meeting.getMediaConnectionDebugId(),
2489
2516
  meeting.id,
2490
- sinon.match({
2491
- rtcMetrics: fakeRtcMetrics,
2492
- })
2517
+ sinon.match.hasNested('rtcMetrics.webex', webex)
2493
2518
  );
2519
+
2520
+ window.setInterval = setIntervalOriginal;
2494
2521
  });
2495
2522
 
2496
2523
  it('should pass the turn server info to the peer connection', async () => {
@@ -3677,6 +3704,7 @@ describe('plugin-meetings', () => {
3677
3704
  credential: 'turn password',
3678
3705
  },
3679
3706
  ],
3707
+ iceCandidatesTimeout: meeting.config.iceCandidatesGatheringTimeout,
3680
3708
  skipInactiveTransceivers: false,
3681
3709
  requireH264: true,
3682
3710
  sdpMunging: {
@@ -3761,11 +3789,16 @@ describe('plugin-meetings', () => {
3761
3789
  // that's being tested in these tests)
3762
3790
  meeting.webex.meetings.registered = true;
3763
3791
  meeting.webex.internal.device.config = {};
3764
- sinon.stub(MeetingUtil, 'joinMeeting').resolves({
3792
+ sinon.stub(MeetingUtil, 'parseLocusJoin').returns({
3765
3793
  id: 'fake locus from mocked join request',
3766
3794
  locusUrl: 'fake locus url',
3767
3795
  mediaId: 'fake media id',
3768
- });
3796
+ })
3797
+ sinon.stub(meeting.meetingRequest, 'joinMeeting').resolves({
3798
+ headers: {
3799
+ trackingid: 'fake tracking id',
3800
+ }
3801
+ })
3769
3802
  await meeting.join({enableMultistream: isMultistream});
3770
3803
  });
3771
3804
 
@@ -6927,33 +6960,36 @@ describe('plugin-meetings', () => {
6927
6960
  describe('#setCorrelationId', () => {
6928
6961
  it('should set the correlationId and return undefined', () => {
6929
6962
  assert.equal(meeting.correlationId, correlationId);
6930
- assert.deepEqual(meeting.callStateForMetrics, {correlationId});
6963
+ assert.deepEqual(meeting.callStateForMetrics, {correlationId, sessionCorrelationId: ''});
6931
6964
  meeting.setCorrelationId(uuid1);
6932
6965
  assert.equal(meeting.correlationId, uuid1);
6933
- assert.deepEqual(meeting.callStateForMetrics, {correlationId: uuid1});
6966
+ assert.deepEqual(meeting.callStateForMetrics, {correlationId: uuid1, sessionCorrelationId: ''});
6934
6967
  });
6935
6968
  });
6936
6969
 
6937
6970
  describe('#updateCallStateForMetrics', () => {
6938
6971
  it('should update the callState, overriding existing values', () => {
6939
- assert.deepEqual(meeting.callStateForMetrics, {correlationId});
6972
+ assert.deepEqual(meeting.callStateForMetrics, {correlationId, sessionCorrelationId: ''});
6940
6973
  meeting.updateCallStateForMetrics({
6941
6974
  correlationId: uuid1,
6975
+ sessionCorrelationId: uuid3,
6942
6976
  joinTrigger: 'jt',
6943
6977
  loginType: 'lt',
6944
6978
  });
6945
6979
  assert.deepEqual(meeting.callStateForMetrics, {
6946
6980
  correlationId: uuid1,
6981
+ sessionCorrelationId: uuid3,
6947
6982
  joinTrigger: 'jt',
6948
6983
  loginType: 'lt',
6949
6984
  });
6950
6985
  });
6951
6986
 
6952
6987
  it('should update the callState, keeping non-supplied values', () => {
6953
- assert.deepEqual(meeting.callStateForMetrics, {correlationId});
6988
+ assert.deepEqual(meeting.callStateForMetrics, {correlationId, sessionCorrelationId: ''});
6954
6989
  meeting.updateCallStateForMetrics({joinTrigger: 'jt', loginType: 'lt'});
6955
6990
  assert.deepEqual(meeting.callStateForMetrics, {
6956
6991
  correlationId,
6992
+ sessionCorrelationId: '',
6957
6993
  joinTrigger: 'jt',
6958
6994
  loginType: 'lt',
6959
6995
  });
@@ -9837,6 +9873,11 @@ describe('plugin-meetings', () => {
9837
9873
  requiredDisplayHints: [],
9838
9874
  requiredPolicies: [SELF_POLICY.SUPPORT_ANNOTATION],
9839
9875
  },
9876
+ {
9877
+ actionName: 'canPollingAndQA',
9878
+ requiredDisplayHints: [],
9879
+ requiredPolicies: [SELF_POLICY.SUPPORT_POLLING_AND_QA],
9880
+ },
9840
9881
  ],
9841
9882
  ({
9842
9883
  actionName,
@@ -378,24 +378,36 @@ describe('plugin-meetings', () => {
378
378
  });
379
379
 
380
380
  describe('joinMeeting', () => {
381
- it('#Should call `meetingRequest.joinMeeting', async () => {
382
- const meeting = {
381
+ const joinMeetingResponse = {
382
+ body: {
383
+ mediaConnections: [],
384
+ locus: {
385
+ url: 'differentLocusUrl',
386
+ self: {
387
+ id: 'selfId',
388
+ },
389
+ },
390
+ },
391
+ headers: {
392
+ trackingid: 'trackingId',
393
+ },
394
+ };
395
+ let meeting;
396
+
397
+ beforeEach(() => {
398
+ meeting = {
383
399
  meetingJoinUrl: 'meetingJoinUrl',
384
400
  locusUrl: 'locusUrl',
385
401
  meetingRequest: {
386
402
  joinMeeting: sinon.stub().returns(
387
- Promise.resolve({
388
- body: {mediaConnections: 'mediaConnections'},
389
- headers: {
390
- trackingid: 'trackingId',
391
- },
392
- })
393
- ),
403
+ Promise.resolve(joinMeetingResponse)),
394
404
  },
395
405
  getWebexObject: sinon.stub().returns(webex),
406
+ setLocus: sinon.stub(),
396
407
  };
408
+ });
397
409
 
398
- const parseLocusJoinSpy = sinon.stub(MeetingUtil, 'parseLocusJoin');
410
+ it('#Should call `meetingRequest.joinMeeting', async () => {
399
411
  await MeetingUtil.joinMeeting(meeting, {
400
412
  reachability: 'reachability',
401
413
  roapMessage: 'roapMessage',
@@ -409,6 +421,10 @@ describe('plugin-meetings', () => {
409
421
  assert.equal(parameter.reachability, 'reachability');
410
422
  assert.equal(parameter.roapMessage, 'roapMessage');
411
423
 
424
+ assert.calledOnce(meeting.setLocus)
425
+ const setLocusParameter = meeting.setLocus.getCall(0).args[0];
426
+ assert.deepEqual(setLocusParameter, MeetingUtil.parseLocusJoin(joinMeetingResponse))
427
+
412
428
  assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
413
429
  name: 'client.locus.join.request',
414
430
  options: {meetingId: meeting.id},
@@ -424,21 +440,12 @@ describe('plugin-meetings', () => {
424
440
  },
425
441
  options: {
426
442
  meetingId: meeting.id,
427
- mediaConnections: 'mediaConnections',
443
+ mediaConnections: [],
428
444
  },
429
445
  });
430
- parseLocusJoinSpy.restore();
431
446
  });
432
447
 
433
448
  it('#Should call meetingRequest.joinMeeting with breakoutsSupported=true when passed in as true', async () => {
434
- const meeting = {
435
- meetingRequest: {
436
- joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
437
- },
438
- getWebexObject: sinon.stub().returns(webex),
439
- };
440
-
441
- const parseLocusJoinSpy = sinon.stub(MeetingUtil, 'parseLocusJoin');
442
449
  await MeetingUtil.joinMeeting(meeting, {
443
450
  breakoutsSupported: true,
444
451
  });
@@ -447,18 +454,9 @@ describe('plugin-meetings', () => {
447
454
  const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
448
455
 
449
456
  assert.equal(parameter.breakoutsSupported, true);
450
- parseLocusJoinSpy.restore();
451
457
  });
452
458
 
453
459
  it('#Should call meetingRequest.joinMeeting with liveAnnotationSupported=true when passed in as true', async () => {
454
- const meeting = {
455
- meetingRequest: {
456
- joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
457
- },
458
- getWebexObject: sinon.stub().returns(webex),
459
- };
460
-
461
- const parseLocusJoinSpy = sinon.stub(MeetingUtil, 'parseLocusJoin');
462
460
  await MeetingUtil.joinMeeting(meeting, {
463
461
  liveAnnotationSupported: true,
464
462
  });
@@ -467,18 +465,9 @@ describe('plugin-meetings', () => {
467
465
  const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
468
466
 
469
467
  assert.equal(parameter.liveAnnotationSupported, true);
470
- parseLocusJoinSpy.restore();
471
468
  });
472
469
 
473
470
  it('#Should call meetingRequest.joinMeeting with locale=en_UK, deviceCapabilities=["TEST"] when they are passed in as those values', async () => {
474
- const meeting = {
475
- meetingRequest: {
476
- joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
477
- },
478
- getWebexObject: sinon.stub().returns(webex),
479
- };
480
-
481
- const parseLocusJoinSpy = sinon.stub(MeetingUtil, 'parseLocusJoin');
482
471
  await MeetingUtil.joinMeeting(meeting, {
483
472
  locale: 'en_UK',
484
473
  deviceCapabilities: ['TEST'],
@@ -489,21 +478,10 @@ describe('plugin-meetings', () => {
489
478
 
490
479
  assert.equal(parameter.locale, 'en_UK');
491
480
  assert.deepEqual(parameter.deviceCapabilities, ['TEST']);
492
- parseLocusJoinSpy.restore();
493
481
  });
494
482
 
495
483
  it('#Should call meetingRequest.joinMeeting with preferTranscoding=false when multistream is enabled', async () => {
496
- const meeting = {
497
- isMultistream: true,
498
- meetingJoinUrl: 'meetingJoinUrl',
499
- locusUrl: 'locusUrl',
500
- meetingRequest: {
501
- joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
502
- },
503
- getWebexObject: sinon.stub().returns(webex),
504
- };
505
-
506
- const parseLocusJoinSpy = sinon.stub(MeetingUtil, 'parseLocusJoin');
484
+ meeting.isMultistream = true;
507
485
  await MeetingUtil.joinMeeting(meeting, {});
508
486
 
509
487
  assert.calledOnce(meeting.meetingRequest.joinMeeting);
@@ -511,40 +489,22 @@ describe('plugin-meetings', () => {
511
489
 
512
490
  assert.equal(parameter.inviteeAddress, 'meetingJoinUrl');
513
491
  assert.equal(parameter.preferTranscoding, false);
514
- parseLocusJoinSpy.restore();
515
492
  });
516
493
 
517
494
  it('#Should fallback sipUrl if meetingJoinUrl does not exists', async () => {
518
- const meeting = {
519
- sipUri: 'sipUri',
520
- locusUrl: 'locusUrl',
521
- meetingRequest: {
522
- joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
523
- },
524
- getWebexObject: sinon.stub().returns(webex),
525
- };
526
-
527
- const parseLocusJoinSpy = sinon.stub(MeetingUtil, 'parseLocusJoin');
495
+ meeting.meetingJoinUrl = undefined;
496
+ meeting.sipUri = 'sipUri';
528
497
  await MeetingUtil.joinMeeting(meeting, {});
529
498
 
530
499
  assert.calledOnce(meeting.meetingRequest.joinMeeting);
531
500
  const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
532
501
 
533
502
  assert.equal(parameter.inviteeAddress, 'sipUri');
534
- parseLocusJoinSpy.restore();
535
503
  });
536
504
 
537
505
  it('#Should fallback to meetingNumber if meetingJoinUrl/sipUrl does not exists', async () => {
538
- const meeting = {
539
- meetingNumber: 'meetingNumber',
540
- locusUrl: 'locusUrl',
541
- meetingRequest: {
542
- joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
543
- },
544
- getWebexObject: sinon.stub().returns(webex),
545
- };
546
-
547
- const parseLocusJoinSpy = sinon.stub(MeetingUtil, 'parseLocusJoin');
506
+ meeting.meetingJoinUrl = undefined;
507
+ meeting.meetingNumber = 'meetingNumber';
548
508
  await MeetingUtil.joinMeeting(meeting, {});
549
509
 
550
510
  assert.calledOnce(meeting.meetingRequest.joinMeeting);
@@ -552,28 +512,18 @@ describe('plugin-meetings', () => {
552
512
 
553
513
  assert.isUndefined(parameter.inviteeAddress);
554
514
  assert.equal(parameter.meetingNumber, 'meetingNumber');
555
- parseLocusJoinSpy.restore();
556
515
  });
557
516
 
558
517
  it('should pass in the locusClusterUrl from meetingInfo', async () => {
559
- const meeting = {
560
- meetingInfo: {
561
- locusClusterUrl: 'locusClusterUrl',
562
- },
563
- meetingRequest: {
564
- joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
565
- },
566
- getWebexObject: sinon.stub().returns(webex),
518
+ meeting.meetingInfo = {
519
+ locusClusterUrl: 'locusClusterUrl',
567
520
  };
568
-
569
- const parseLocusJoinSpy = sinon.stub(MeetingUtil, 'parseLocusJoin');
570
521
  await MeetingUtil.joinMeeting(meeting, {});
571
522
 
572
523
  assert.calledOnce(meeting.meetingRequest.joinMeeting);
573
524
  const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
574
525
 
575
526
  assert.equal(parameter.locusClusterUrl, 'locusClusterUrl');
576
- parseLocusJoinSpy.restore();
577
527
  });
578
528
  });
579
529
 
@@ -8,6 +8,7 @@ import {Crypto} from '@peculiar/webcrypto';
8
8
  global.crypto = new Crypto();
9
9
 
10
10
  import Device from '@webex/internal-plugin-device';
11
+ import {CatalogDetails} from '@webex/internal-plugin-device';
11
12
  import Mercury from '@webex/internal-plugin-mercury';
12
13
  import {assert} from '@webex/test-helper-chai';
13
14
  import MockWebex from '@webex/test-helper-mock-webex';
@@ -128,6 +129,11 @@ describe('plugin-meetings', () => {
128
129
 
129
130
  Object.assign(webex, {
130
131
  logger,
132
+ people: {
133
+ _getMe: sinon.stub().resolves({
134
+ type: 'validuser',
135
+ }),
136
+ }
131
137
  });
132
138
 
133
139
  startReachabilityStub = sinon.stub(webex.meetings, 'startReachability').resolves();
@@ -196,6 +202,43 @@ describe('plugin-meetings', () => {
196
202
  assert.calledOnce(MeetingsUtil.checkH264Support);
197
203
  });
198
204
 
205
+ describe('#getBasicMeetingInformation', () => {
206
+ beforeEach(() => {
207
+ sinon.stub(MeetingUtil, 'cleanUp');
208
+ });
209
+
210
+ it('returns correct meeting information', async () => {
211
+ const meeting = await webex.meetings.createMeeting('test', 'test');
212
+
213
+ const meetingIds = {
214
+ meetingId: meeting.id,
215
+ correlationId: meeting.correlationId,
216
+ };
217
+
218
+ // before meeting is destroyed - it should return information from the meetingCollection
219
+ assert.equal(
220
+ webex.meetings.getBasicMeetingInformation(meetingIds.meetingId).id,
221
+ meetingIds.meetingId
222
+ );
223
+ assert.equal(
224
+ webex.meetings.getBasicMeetingInformation(meetingIds.meetingId).correlationId,
225
+ meetingIds.correlationId
226
+ );
227
+
228
+ webex.meetings.destroy(meeting, test1);
229
+
230
+ // and it should still return the information after the meeting is destroyed
231
+ assert.equal(
232
+ webex.meetings.getBasicMeetingInformation(meetingIds.meetingId).id,
233
+ meetingIds.meetingId
234
+ );
235
+ assert.equal(
236
+ webex.meetings.getBasicMeetingInformation(meetingIds.meetingId).correlationId,
237
+ meetingIds.correlationId
238
+ );
239
+ });
240
+ });
241
+
199
242
  describe('#startReachability', () => {
200
243
  let gatherReachabilitySpy;
201
244
  let fakeResult = {id: 'fake-result'};
@@ -346,12 +389,21 @@ describe('plugin-meetings', () => {
346
389
  webex.canAuthorize = true;
347
390
  webex.meetings.registered = false;
348
391
  await webex.meetings.register();
349
- assert.called(webex.internal.device.register);
392
+ assert.calledOnceWithExactly(webex.internal.device.register, undefined);
350
393
  assert.called(webex.internal.services.getMeetingPreferences);
351
394
  assert.called(webex.internal.services.fetchClientRegionInfo);
352
395
  assert.called(webex.internal.mercury.connect);
353
396
  assert.isTrue(webex.meetings.registered);
354
397
  });
398
+
399
+ it('passes on the device registration options', async () => {
400
+ webex.canAuthorize = true;
401
+ webex.meetings.registered = false;
402
+ await webex.meetings.register({includeDetails: CatalogDetails.features});
403
+ assert.calledOnceWithExactly(webex.internal.device.register, {
404
+ includeDetails: CatalogDetails.features,
405
+ });
406
+ });
355
407
  });
356
408
 
357
409
  describe('#unregister', () => {
@@ -753,14 +805,16 @@ describe('plugin-meetings', () => {
753
805
 
754
806
  const FAKE_USE_RANDOM_DELAY = true;
755
807
  const correlationId = 'my-correlationId';
808
+ const sessionCorrelationId = 'my-session-correlationId';
756
809
  const callStateForMetrics = {
810
+ sessionCorrelationId: 'my-session-correlationId2',
757
811
  correlationId: 'my-correlationId2',
758
812
  joinTrigger: 'my-join-trigger',
759
813
  loginType: 'my-login-type',
760
814
  };
761
815
 
762
- it('should call setCallStateForMetrics on any pre-existing meeting', async () => {
763
- const fakeMeeting = {setCallStateForMetrics: sinon.mock()};
816
+ it('should call updateCallStateForMetrics on any pre-existing meeting', async () => {
817
+ const fakeMeeting = {updateCallStateForMetrics: sinon.mock()};
764
818
  webex.meetings.meetingCollection.getByKey = sinon.stub().returns(fakeMeeting);
765
819
  await webex.meetings.create(
766
820
  test1,
@@ -769,11 +823,15 @@ describe('plugin-meetings', () => {
769
823
  {},
770
824
  correlationId,
771
825
  true,
772
- callStateForMetrics
826
+ callStateForMetrics,
827
+ undefined,
828
+ undefined,
829
+ sessionCorrelationId
773
830
  );
774
- assert.calledOnceWithExactly(fakeMeeting.setCallStateForMetrics, {
831
+ assert.calledOnceWithExactly(fakeMeeting.updateCallStateForMetrics, {
775
832
  ...callStateForMetrics,
776
833
  correlationId,
834
+ sessionCorrelationId,
777
835
  });
778
836
  });
779
837
 
@@ -814,13 +872,14 @@ describe('plugin-meetings', () => {
814
872
  undefined,
815
873
  meetingInfo,
816
874
  'meetingLookupURL',
875
+ sessionCorrelationId,
817
876
  ],
818
877
  [
819
878
  test1,
820
879
  test2,
821
880
  FAKE_USE_RANDOM_DELAY,
822
881
  {},
823
- {correlationId},
882
+ {correlationId, sessionCorrelationId},
824
883
  true,
825
884
  meetingInfo,
826
885
  'meetingLookupURL',
@@ -1719,6 +1778,7 @@ describe('plugin-meetings', () => {
1719
1778
  const expectedMeetingData = {
1720
1779
  correlationId: 'my-correlationId',
1721
1780
  callStateForMetrics: {
1781
+ sessionCorrelationId: '',
1722
1782
  correlationId: 'my-correlationId',
1723
1783
  joinTrigger: 'my-join-trigger',
1724
1784
  loginType: 'my-login-type',
@@ -1812,7 +1872,10 @@ describe('plugin-meetings', () => {
1812
1872
  });
1813
1873
 
1814
1874
  it('creates the meeting avoiding meeting info fetch by passing type as DESTINATION_TYPE.ONE_ON_ONE_CALL', async () => {
1815
- const meeting = await webex.meetings.createMeeting('test destination', DESTINATION_TYPE.ONE_ON_ONE_CALL);
1875
+ const meeting = await webex.meetings.createMeeting(
1876
+ 'test destination',
1877
+ DESTINATION_TYPE.ONE_ON_ONE_CALL
1878
+ );
1816
1879
 
1817
1880
  assert.instanceOf(
1818
1881
  meeting,
@@ -1822,7 +1885,6 @@ describe('plugin-meetings', () => {
1822
1885
 
1823
1886
  assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
1824
1887
  });
1825
-
1826
1888
  });
1827
1889
 
1828
1890
  describe('rejected MeetingInfo.#fetchMeetingInfo - does not log for known Error types', () => {
@@ -1896,17 +1958,23 @@ describe('plugin-meetings', () => {
1896
1958
  assert.exists(webex.meetings.destroy);
1897
1959
  });
1898
1960
  describe('correctly established meeting', () => {
1961
+ let deleteSpy;
1899
1962
  beforeEach(() => {
1900
- webex.meetings.meetingCollection.delete = sinon.stub().returns(true);
1963
+ deleteSpy = sinon.spy(webex.meetings.meetingCollection, 'delete');
1901
1964
  });
1902
1965
 
1903
- it('tests the destroy removal from the collection', async () => {
1966
+ it('tests the destroy removal from the collection and storing basic info in deletedMeetings', async () => {
1904
1967
  const meeting = await webex.meetings.createMeeting('test', 'test');
1905
1968
 
1969
+ const meetingIds = {
1970
+ meetingId: meeting.id,
1971
+ correlationId: meeting.correlationId,
1972
+ };
1973
+
1906
1974
  webex.meetings.destroy(meeting, test1);
1907
1975
 
1908
- assert.calledOnce(webex.meetings.meetingCollection.delete);
1909
- assert.calledWith(webex.meetings.meetingCollection.delete, meeting.id);
1976
+ assert.calledOnce(deleteSpy);
1977
+ assert.calledWith(deleteSpy, meeting.id);
1910
1978
  assert.calledWith(
1911
1979
  TriggerProxy.trigger,
1912
1980
  sinon.match.instanceOf(Meetings),
@@ -1920,6 +1988,23 @@ describe('plugin-meetings', () => {
1920
1988
  reason: test1,
1921
1989
  }
1922
1990
  );
1991
+
1992
+ // check that the meeting is stored in deletedMeetings and removed from meetingCollection
1993
+ assert.equal(webex.meetings.deletedMeetings.get(meeting.id).id, meetingIds.meetingId);
1994
+ assert.equal(
1995
+ webex.meetings.deletedMeetings.get(meeting.id).correlationId,
1996
+ meetingIds.correlationId
1997
+ );
1998
+
1999
+ assert.equal(webex.meetings.meetingCollection.get(meeting.id), undefined);
2000
+
2001
+ // and that getBasicMeetingInformation() still returns the meeting info
2002
+ const deletedMeetingInfo = webex.meetings.getBasicMeetingInformation(
2003
+ meetingIds.meetingId
2004
+ );
2005
+
2006
+ assert.equal(deletedMeetingInfo.id, meetingIds.meetingId);
2007
+ assert.equal(deletedMeetingInfo.correlationId, meetingIds.correlationId);
1923
2008
  });
1924
2009
  });
1925
2010
 
@@ -1976,7 +2061,7 @@ describe('plugin-meetings', () => {
1976
2061
  ]);
1977
2062
  });
1978
2063
 
1979
- const setup = ({user} = {}) => {
2064
+ const setup = ({me = { type: 'validuser'}, user} = {}) => {
1980
2065
  loggerProxySpy = sinon.spy(LoggerProxy.logger, 'error');
1981
2066
  assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), []);
1982
2067
 
@@ -1989,8 +2074,22 @@ describe('plugin-meetings', () => {
1989
2074
  Object.assign(webex.internal.services, {
1990
2075
  getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
1991
2076
  });
2077
+
2078
+ Object.assign(webex.people, {
2079
+ _getMe: sinon.stub().returns(Promise.resolve(me)),
2080
+ });
1992
2081
  };
1993
2082
 
2083
+ it('should not call request.getMeetingPreferences if user is a guest', async () => {
2084
+ setup({me: {type: 'appuser'}});
2085
+
2086
+ await webex.meetings.fetchUserPreferredWebexSite();
2087
+
2088
+ assert.equal(webex.meetings.preferredWebexSite, '');
2089
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), []);
2090
+ assert.notCalled(webex.internal.services.getMeetingPreferences);
2091
+ });
2092
+
1994
2093
  it('should not fail if UserPreferred info is not fetched ', async () => {
1995
2094
  setup();
1996
2095
 
@@ -1,3 +0,0 @@
1
- const RTC_METRICS = {APP_ID: 'FFB51ED5-4319-4C55-8303-B1F2FCCDE231'};
2
-
3
- export {RTC_METRICS as default};