@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.
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/index.js +4 -1
- package/dist/locus-info/index.js.map +1 -1
- package/dist/meeting/index.js +27 -8
- package/dist/meeting/index.js.map +1 -1
- package/dist/meetings/index.d.ts +1 -1
- package/dist/meetings/index.js +6 -20
- package/dist/meetings/index.js.map +1 -1
- package/dist/reconnection-manager/index.js +22 -26
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/statsAnalyzer/index.d.ts +5 -1
- package/dist/statsAnalyzer/index.js +75 -88
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/webinar/index.js +1 -1
- package/package.json +22 -23
- package/src/constants.ts +1 -0
- package/src/locus-info/index.ts +4 -1
- package/src/meeting/index.ts +25 -1
- package/src/meetings/index.ts +10 -23
- package/src/reconnection-manager/index.ts +11 -13
- package/src/statsAnalyzer/index.ts +131 -153
- package/test/integration/spec/journey.js +2 -2
- package/test/integration/spec/space-meeting.js +1 -1
- package/test/unit/spec/locus-info/index.js +13 -6
- package/test/unit/spec/meeting/index.js +49 -1
- package/test/unit/spec/meetings/index.js +21 -0
- package/test/unit/spec/metrics/index.js +1 -2
- package/test/unit/spec/reconnection-manager/index.js +1 -11
- 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
|
-
|
|
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('
|
|
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
|
|