@webex/plugin-meetings 2.60.1-next.16 → 2.60.1-next.18

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 (35) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/constants.d.ts +1 -0
  4. package/dist/constants.js +1 -0
  5. package/dist/constants.js.map +1 -1
  6. package/dist/interpretation/index.js +1 -1
  7. package/dist/interpretation/siLanguage.js +1 -1
  8. package/dist/locus-info/index.js +4 -1
  9. package/dist/locus-info/index.js.map +1 -1
  10. package/dist/meeting/index.js +27 -8
  11. package/dist/meeting/index.js.map +1 -1
  12. package/dist/meetings/index.d.ts +1 -1
  13. package/dist/meetings/index.js +6 -20
  14. package/dist/meetings/index.js.map +1 -1
  15. package/dist/reconnection-manager/index.js +22 -26
  16. package/dist/reconnection-manager/index.js.map +1 -1
  17. package/dist/statsAnalyzer/index.d.ts +5 -1
  18. package/dist/statsAnalyzer/index.js +75 -88
  19. package/dist/statsAnalyzer/index.js.map +1 -1
  20. package/dist/webinar/index.js +1 -1
  21. package/package.json +22 -23
  22. package/src/constants.ts +1 -0
  23. package/src/locus-info/index.ts +4 -1
  24. package/src/meeting/index.ts +25 -1
  25. package/src/meetings/index.ts +10 -23
  26. package/src/reconnection-manager/index.ts +11 -13
  27. package/src/statsAnalyzer/index.ts +131 -153
  28. package/test/integration/spec/journey.js +2 -2
  29. package/test/integration/spec/space-meeting.js +1 -1
  30. package/test/unit/spec/locus-info/index.js +13 -6
  31. package/test/unit/spec/meeting/index.js +49 -1
  32. package/test/unit/spec/meetings/index.js +21 -0
  33. package/test/unit/spec/metrics/index.js +1 -2
  34. package/test/unit/spec/reconnection-manager/index.js +1 -11
  35. package/test/unit/spec/stats-analyzer/index.js +686 -493
@@ -2717,6 +2717,7 @@ describe('plugin-meetings', () => {
2717
2717
  clientErrorCode: ICE_FAILED_WITH_TURN_TLS_CLIENT_CODE,
2718
2718
  expectedErrorPayload: {
2719
2719
  errorDescription: ERROR_DESCRIPTIONS.ICE_FAILED_WITH_TURN_TLS,
2720
+ category: 'network',
2720
2721
  },
2721
2722
  },
2722
2723
  ].forEach(({clientErrorCode, expectedErrorPayload}) => {
@@ -5986,6 +5987,7 @@ describe('plugin-meetings', () => {
5986
5987
  meeting.mediaProperties.webrtcMediaConnection = {};
5987
5988
  meeting.audio = {handleLocalStreamChange: sinon.stub()};
5988
5989
  meeting.video = {handleLocalStreamChange: sinon.stub()};
5990
+ meeting.statsAnalyzer = {updateMediaStatus: sinon.stub()};
5989
5991
  fakeMultistreamRoapMediaConnection = {
5990
5992
  createSendSlot: () => {
5991
5993
  return {
@@ -6052,6 +6054,10 @@ describe('plugin-meetings', () => {
6052
6054
  options: {meetingId: meeting.id},
6053
6055
  });
6054
6056
  assert.equal(meeting.mediaProperties.mediaDirection.sendShare, true);
6057
+
6058
+ assert.calledWith(meeting.statsAnalyzer.updateMediaStatus, {
6059
+ expected: {sendShare: true},
6060
+ });
6055
6061
  };
6056
6062
 
6057
6063
  const checkScreenShareAudioPublished = (stream) => {
@@ -6068,6 +6074,10 @@ describe('plugin-meetings', () => {
6068
6074
  );
6069
6075
  assert.equal(meeting.mediaProperties.shareAudioStream, stream);
6070
6076
  assert.equal(meeting.mediaProperties.mediaDirection.sendShare, true);
6077
+
6078
+ assert.calledWith(meeting.statsAnalyzer.updateMediaStatus, {
6079
+ expected: {sendShare: true},
6080
+ });
6071
6081
  };
6072
6082
 
6073
6083
  it('requests screen share floor and publishes the screen share video stream', async () => {
@@ -6162,6 +6172,11 @@ describe('plugin-meetings', () => {
6162
6172
 
6163
6173
  assert.equal(meeting.mediaProperties.shareVideoStream, null);
6164
6174
  assert.equal(meeting.mediaProperties.mediaDirection.sendShare, shareDirection);
6175
+ if (!shareDirection) {
6176
+ assert.calledWith(meeting.statsAnalyzer.updateMediaStatus, {
6177
+ expected: {sendShare: false},
6178
+ });
6179
+ }
6165
6180
  };
6166
6181
 
6167
6182
  // share direction will remain true if only one of the two share streams are unpublished
@@ -6174,6 +6189,11 @@ describe('plugin-meetings', () => {
6174
6189
 
6175
6190
  assert.equal(meeting.mediaProperties.shareAudioStream, null);
6176
6191
  assert.equal(meeting.mediaProperties.mediaDirection.sendShare, shareDirection);
6192
+ if (!shareDirection) {
6193
+ assert.calledWith(meeting.statsAnalyzer.updateMediaStatus, {
6194
+ expected: {sendShare: false},
6195
+ });
6196
+ }
6177
6197
  };
6178
6198
 
6179
6199
  it('fails if there is no media connection', async () => {
@@ -8382,13 +8402,41 @@ describe('plugin-meetings', () => {
8382
8402
  assert.equal(locusInfoOnSpy.thirdCall.args[0], 'MEETING_INFO_UPDATED');
8383
8403
  const callback = locusInfoOnSpy.thirdCall.args[1];
8384
8404
 
8385
- callback();
8405
+ callback({isInitializing: true});
8386
8406
 
8387
8407
  assert.calledWith(updateMeetingActionsSpy);
8388
8408
  assert.calledWith(setRecordingDisplayHintsSpy, userDisplayHints);
8389
8409
  assert.calledWith(setUserPolicySpy, userDisplayPolicy);
8390
8410
  assert.calledWith(setControlsDisplayHintsSpy, userDisplayHints);
8391
8411
  assert.calledWith(handleDataChannelUrlChangeSpy, datachannelUrl);
8412
+
8413
+ assert.neverCalledWith(
8414
+ TriggerProxy.trigger,
8415
+ meeting,
8416
+ {
8417
+ file: 'meetings',
8418
+ function: 'setUpLocusInfoMeetingInfoListener',
8419
+ },
8420
+ 'meeting:meetingInfoUpdated'
8421
+ );
8422
+
8423
+ callback({isIntialized: false});
8424
+
8425
+ assert.calledWith(updateMeetingActionsSpy);
8426
+ assert.calledWith(setRecordingDisplayHintsSpy, userDisplayHints);
8427
+ assert.calledWith(setUserPolicySpy, userDisplayPolicy);
8428
+ assert.calledWith(setControlsDisplayHintsSpy, userDisplayHints);
8429
+ assert.calledWith(handleDataChannelUrlChangeSpy, datachannelUrl);
8430
+
8431
+ assert.calledWith(
8432
+ TriggerProxy.trigger,
8433
+ meeting,
8434
+ {
8435
+ file: 'meetings',
8436
+ function: 'setUpLocusInfoMeetingInfoListener',
8437
+ },
8438
+ 'meeting:meetingInfoUpdated'
8439
+ );
8392
8440
  });
8393
8441
  });
8394
8442
 
@@ -511,6 +511,27 @@ describe('plugin-meetings', () => {
511
511
  it('should have #syncMeetings', () => {
512
512
  assert.exists(webex.meetings.syncMeetings);
513
513
  });
514
+ it('should do nothing and return a resolved promise if unverified guest', async () => {
515
+ webex.meetings.request.getActiveMeetings = sinon.stub().returns(
516
+ Promise.resolve({
517
+ loci: [
518
+ {
519
+ url: url1,
520
+ },
521
+ ],
522
+ })
523
+ );
524
+ webex.credentials.isUnverifiedGuest = true;
525
+ LoggerProxy.logger.info = sinon.stub();
526
+
527
+ await webex.meetings.syncMeetings();
528
+
529
+ assert.notCalled(webex.meetings.request.getActiveMeetings);
530
+ assert.calledWith(
531
+ LoggerProxy.logger.info,
532
+ 'Meetings:index#syncMeetings --> skipping meeting sync as unverified guest'
533
+ );
534
+ });
514
535
  describe('succesful requests', () => {
515
536
  beforeEach(() => {
516
537
  webex.meetings.request.getActiveMeetings = sinon.stub().returns(
@@ -5,7 +5,6 @@ import 'jsdom-global/register';
5
5
  import sinon from 'sinon';
6
6
  import Metrics from '@webex/internal-plugin-metrics';
7
7
  import MockWebex from '@webex/test-helper-mock-webex';
8
- import {browserOnly} from '@webex/test-helper-mocha';
9
8
  import {assert} from '@webex/test-helper-chai';
10
9
 
11
10
  import metrics from '@webex/plugin-meetings/src/metrics';
@@ -14,7 +13,7 @@ import metrics from '@webex/plugin-meetings/src/metrics';
14
13
  * Meeting can only run in a browser, so we can only send metrics for
15
14
  * browser usage.
16
15
  */
17
- browserOnly(describe)('Meeting metrics', () => {
16
+ describe('Meeting metrics', () => {
18
17
  let webex, mockSubmitMetric, sandbox;
19
18
 
20
19
  beforeEach(() => {
@@ -90,7 +90,7 @@ describe('plugin-meetings', () => {
90
90
  sandbox.reset();
91
91
  });
92
92
 
93
- it('syncs meetings if it is not an unverified guest', async () => {
93
+ it('calls syncMeetings', async () => {
94
94
  const rm = new ReconnectionManager(fakeMeeting);
95
95
 
96
96
  await rm.reconnect();
@@ -99,16 +99,6 @@ describe('plugin-meetings', () => {
99
99
  assert.calledWith(rm.webex.meetings.syncMeetings, {keepOnlyLocusMeetings: false});
100
100
  });
101
101
 
102
- it('does not sync meetings if it is an unverified guest', async () => {
103
- const rm = new ReconnectionManager(fakeMeeting);
104
-
105
- rm.webex.credentials.isUnverifiedGuest = true;
106
-
107
- await rm.reconnect();
108
-
109
- assert.notCalled(rm.webex.meetings.syncMeetings);
110
- });
111
-
112
102
  it('calls startReachability on reconnect', async () => {
113
103
  const rm = new ReconnectionManager(fakeMeeting);
114
104