@webex/plugin-meetings 3.0.0-beta.26 → 3.0.0-beta.261
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/README.md +46 -8
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.js +49 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +342 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +114 -14
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/edit-lock-error.js +52 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.js +45 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +841 -19
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/request.js +78 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.js +67 -0
- package/dist/breakouts/utils.js.map +1 -0
- package/dist/common/errors/webex-errors.js +28 -7
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/queue.js +24 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +5 -10
- package/dist/config.js.map +1 -1
- package/dist/constants.js +196 -28
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +14 -2
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.js +109 -15
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/types.js +7 -0
- package/dist/controls-options-manager/types.js.map +1 -0
- package/dist/controls-options-manager/util.js +309 -18
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.js +112 -1
- package/dist/index.js.map +1 -1
- package/dist/interpretation/collection.js +23 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +366 -0
- package/dist/interpretation/index.js.map +1 -0
- package/dist/interpretation/siLanguage.js +25 -0
- package/dist/interpretation/siLanguage.js.map +1 -0
- package/dist/locus-info/controlsUtils.js +91 -2
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +381 -62
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +7 -1
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +43 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +224 -63
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +89 -14
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +58 -116
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +60 -121
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +82 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +3022 -2795
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +292 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +230 -124
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +256 -196
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +601 -417
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js +70 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +189 -51
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/util.js +1 -1
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +36 -36
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +22 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +372 -90
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +7 -0
- package/dist/meetings/meetings.types.js.map +1 -0
- package/dist/meetings/request.js +2 -0
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +88 -1
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +49 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +25 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +121 -25
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +10 -0
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +86 -5
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +106 -38
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +15 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.js +316 -233
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +10 -5
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +1 -468
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +238 -49
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +49 -16
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +52 -34
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +44 -18
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +60 -3
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +209 -59
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +233 -0
- package/dist/multistream/sendSlotManager.js.map +1 -0
- package/dist/reachability/index.js +161 -57
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +17 -8
- package/dist/reachability/request.js.map +1 -1
- package/dist/reconnection-manager/index.js +199 -154
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/index.js +21 -2
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js +9 -8
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.js +23 -29
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +112 -97
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +96 -36
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.js +12 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.js +117 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/index.js +51 -34
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +6 -6
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +42 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +117 -0
- package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +8 -0
- package/dist/types/breakouts/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +15 -0
- package/dist/types/common/errors/webex-errors.d.ts +13 -1
- package/dist/types/common/queue.d.ts +9 -7
- package/dist/types/config.d.ts +1 -6
- package/dist/types/constants.d.ts +155 -21
- package/dist/types/controls-options-manager/enums.d.ts +11 -1
- package/dist/types/controls-options-manager/index.d.ts +17 -1
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -7
- package/dist/types/index.d.ts +6 -4
- package/dist/types/interpretation/collection.d.ts +5 -0
- package/dist/types/interpretation/index.d.ts +5 -0
- package/dist/types/interpretation/siLanguage.d.ts +5 -0
- package/dist/types/locus-info/index.d.ts +57 -4
- package/dist/types/locus-info/parser.d.ts +65 -6
- package/dist/types/media/index.d.ts +2 -0
- package/dist/types/media/properties.d.ts +34 -48
- package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
- package/dist/types/meeting/index.d.ts +344 -506
- package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/types/meeting/muteState.d.ts +99 -23
- package/dist/types/meeting/request.d.ts +72 -43
- package/dist/types/meeting/util.d.ts +101 -1
- package/dist/types/meeting-info/index.d.ts +13 -1
- package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
- package/dist/types/meetings/collection.d.ts +8 -0
- package/dist/types/meetings/index.d.ts +86 -12
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/member/index.d.ts +13 -0
- package/dist/types/member/types.d.ts +32 -0
- package/dist/types/members/collection.d.ts +5 -0
- package/dist/types/members/index.d.ts +35 -2
- package/dist/types/members/request.d.ts +73 -9
- package/dist/types/members/types.d.ts +24 -0
- package/dist/types/members/util.d.ts +209 -1
- package/dist/types/metrics/constants.d.ts +9 -4
- package/dist/types/metrics/index.d.ts +4 -119
- package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
- package/dist/types/multistream/receiveSlot.d.ts +16 -12
- package/dist/types/multistream/receiveSlotManager.d.ts +19 -4
- package/dist/types/multistream/remoteMedia.d.ts +8 -29
- package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
- package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
- package/dist/types/multistream/sendSlotManager.d.ts +61 -0
- package/dist/types/reachability/index.d.ts +44 -7
- package/dist/types/reachability/request.d.ts +7 -3
- package/dist/types/reconnection-manager/index.d.ts +9 -0
- package/dist/types/recording-controller/index.d.ts +15 -1
- package/dist/types/recording-controller/util.d.ts +5 -4
- package/dist/types/roap/request.d.ts +15 -11
- package/dist/types/roap/turnDiscovery.d.ts +18 -1
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +47 -0
- package/dist/types/statsAnalyzer/index.d.ts +6 -1
- package/package.json +23 -20
- package/src/annotation/annotation.types.ts +50 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +328 -0
- package/src/breakouts/README.md +44 -14
- package/src/breakouts/breakout.ts +87 -9
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +710 -10
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/errors/webex-errors.ts +27 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/queue.ts +22 -8
- package/src/config.ts +4 -9
- package/src/constants.ts +178 -18
- package/src/controls-options-manager/enums.ts +12 -0
- package/src/controls-options-manager/index.ts +116 -21
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +294 -14
- package/src/index.ts +40 -0
- package/src/interpretation/README.md +60 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +332 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +108 -0
- package/src/locus-info/index.ts +412 -59
- package/src/locus-info/infoUtils.ts +10 -2
- package/src/locus-info/mediaSharesUtils.ts +48 -0
- package/src/locus-info/parser.ts +231 -39
- package/src/locus-info/selfUtils.ts +81 -5
- package/src/media/index.ts +100 -122
- package/src/media/properties.ts +70 -108
- package/src/meeting/in-meeting-actions.ts +163 -3
- package/src/meeting/index.ts +2471 -2306
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +229 -131
- package/src/meeting/request.ts +172 -121
- package/src/meeting/util.ts +588 -394
- package/src/meeting-info/index.ts +79 -8
- package/src/meeting-info/meeting-info-v2.ts +168 -14
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +23 -23
- package/src/meetings/collection.ts +20 -0
- package/src/meetings/index.ts +414 -108
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +103 -4
- package/src/member/index.ts +49 -0
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +127 -25
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +107 -6
- package/src/members/request.ts +97 -17
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +319 -240
- package/src/metrics/constants.ts +9 -4
- package/src/metrics/index.ts +1 -490
- package/src/multistream/mediaRequestManager.ts +289 -79
- package/src/multistream/receiveSlot.ts +55 -18
- package/src/multistream/receiveSlotManager.ts +46 -24
- package/src/multistream/remoteMedia.ts +27 -2
- package/src/multistream/remoteMediaGroup.ts +59 -0
- package/src/multistream/remoteMediaManager.ts +148 -30
- package/src/multistream/sendSlotManager.ts +170 -0
- package/src/reachability/index.ts +165 -37
- package/src/reachability/request.ts +17 -8
- package/src/reconnection-manager/index.ts +81 -54
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +23 -30
- package/src/roap/request.ts +100 -104
- package/src/roap/turnDiscovery.ts +51 -25
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +100 -0
- package/src/statsAnalyzer/index.ts +73 -35
- package/src/statsAnalyzer/mqaUtil.ts +8 -10
- package/test/integration/spec/converged-space-meetings.js +233 -0
- package/test/integration/spec/journey.js +320 -261
- package/test/integration/spec/space-meeting.js +76 -3
- package/test/unit/spec/annotation/index.ts +418 -0
- package/test/unit/spec/breakouts/breakout.ts +142 -24
- package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1545 -48
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- package/test/unit/spec/common/queue.js +31 -2
- package/test/unit/spec/controls-options-manager/index.js +163 -0
- package/test/unit/spec/controls-options-manager/util.js +576 -60
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +589 -0
- package/test/unit/spec/interpretation/siLanguage.ts +28 -0
- package/test/unit/spec/locus-info/controlsUtils.js +316 -43
- package/test/unit/spec/locus-info/index.js +1283 -33
- package/test/unit/spec/locus-info/infoUtils.js +37 -15
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
- package/test/unit/spec/locus-info/parser.js +62 -22
- package/test/unit/spec/locus-info/selfConstant.js +27 -4
- package/test/unit/spec/locus-info/selfUtils.js +208 -17
- package/test/unit/spec/media/index.ts +104 -37
- package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
- package/test/unit/spec/meeting/index.js +4095 -1913
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +408 -208
- package/test/unit/spec/meeting/request.js +440 -45
- package/test/unit/spec/meeting/utils.js +679 -64
- package/test/unit/spec/meeting-info/index.js +293 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +517 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +14 -0
- package/test/unit/spec/meetings/index.js +941 -151
- package/test/unit/spec/meetings/utils.js +206 -2
- package/test/unit/spec/member/index.js +58 -4
- package/test/unit/spec/member/util.js +479 -35
- package/test/unit/spec/members/index.js +319 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +184 -0
- package/test/unit/spec/metrics/index.js +1 -50
- package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
- package/test/unit/spec/multistream/receiveSlot.ts +72 -13
- package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
- package/test/unit/spec/multistream/remoteMedia.ts +30 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
- package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
- package/test/unit/spec/reachability/index.ts +343 -9
- package/test/unit/spec/reachability/request.js +68 -0
- package/test/unit/spec/reconnection-manager/index.js +84 -9
- package/test/unit/spec/recording-controller/index.js +294 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +31 -51
- package/test/unit/spec/roap/request.ts +203 -85
- package/test/unit/spec/roap/turnDiscovery.ts +48 -13
- package/test/unit/spec/rtcMetrics/index.ts +68 -0
- package/test/unit/spec/stats-analyzer/index.js +29 -2
- package/test/utils/constants.js +9 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -45
- package/test/utils/webex-config.js +4 -0
- package/test/utils/webex-test-users.js +6 -3
- package/dist/meeting/effectsState.js +0 -262
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.js +0 -299
- package/dist/metrics/config.js.map +0 -1
- package/dist/types/meeting/effectsState.d.ts +0 -42
- package/dist/types/metrics/config.d.ts +0 -178
- package/src/index.js +0 -16
- package/src/meeting/effectsState.ts +0 -211
- package/src/metrics/config.ts +0 -495
- package/test/unit/spec/meeting/effectsState.js +0 -285
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
import {assert} from '@webex/test-helper-chai';
|
|
2
2
|
import MockWebex from '@webex/test-helper-mock-webex';
|
|
3
3
|
import sinon from 'sinon';
|
|
4
|
-
import Reachability from '@webex/plugin-meetings/src/reachability/';
|
|
4
|
+
import Reachability, {ICECandidateResult, ReachabilityResults} from '@webex/plugin-meetings/src/reachability/';
|
|
5
|
+
import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
import { IP_VERSION } from '@webex/plugin-meetings/src/constants';
|
|
8
|
+
|
|
9
|
+
describe('isAnyPublicClusterReachable', () => {
|
|
7
10
|
let webex;
|
|
8
11
|
|
|
9
12
|
beforeEach(() => {
|
|
10
13
|
webex = new MockWebex();
|
|
14
|
+
|
|
15
|
+
sinon.stub(MeetingUtil, 'getIpVersion').returns(IP_VERSION.unknown);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
sinon.restore();
|
|
11
20
|
});
|
|
12
21
|
|
|
13
22
|
const checkIsClusterReachable = async (mockStorage: any, expectedValue: boolean) => {
|
|
@@ -20,7 +29,7 @@ describe('isAnyClusterReachable', () => {
|
|
|
20
29
|
}
|
|
21
30
|
const reachability = new Reachability(webex);
|
|
22
31
|
|
|
23
|
-
const result = await reachability.
|
|
32
|
+
const result = await reachability.isAnyPublicClusterReachable();
|
|
24
33
|
|
|
25
34
|
assert.equal(result, expectedValue);
|
|
26
35
|
};
|
|
@@ -48,6 +57,63 @@ describe('isAnyClusterReachable', () => {
|
|
|
48
57
|
it('returns false when reachability.result item is not there', async () => {
|
|
49
58
|
await checkIsClusterReachable(undefined, false);
|
|
50
59
|
});
|
|
60
|
+
|
|
61
|
+
describe('ignores video mesh reachability', () => {
|
|
62
|
+
it('returns false if there are no public cluster results, only video mesh', async () => {
|
|
63
|
+
await checkIsClusterReachable({
|
|
64
|
+
x: {
|
|
65
|
+
udp: {reachable: 'true'},
|
|
66
|
+
tcp: {reachable: 'true'},
|
|
67
|
+
isVideoMesh: true,
|
|
68
|
+
},
|
|
69
|
+
y: {
|
|
70
|
+
udp: {reachable: 'false'},
|
|
71
|
+
tcp: {reachable: 'true'},
|
|
72
|
+
isVideoMesh: true,
|
|
73
|
+
}
|
|
74
|
+
}, false);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('returns false if there public cluster reachability failed, only video mesh succeeded', async () => {
|
|
78
|
+
await checkIsClusterReachable({
|
|
79
|
+
x: {
|
|
80
|
+
udp: {reachable: 'false'},
|
|
81
|
+
tcp: {reachable: 'true'},
|
|
82
|
+
isVideoMesh: true,
|
|
83
|
+
},
|
|
84
|
+
y: {
|
|
85
|
+
udp: {reachable: 'true'},
|
|
86
|
+
tcp: {reachable: 'false'},
|
|
87
|
+
isVideoMesh: true,
|
|
88
|
+
},
|
|
89
|
+
publicOne: {
|
|
90
|
+
udp: {reachable: 'false'},
|
|
91
|
+
tcp: {reachable: 'false'},
|
|
92
|
+
isVideoMesh: false,
|
|
93
|
+
}
|
|
94
|
+
}, false);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('returns true if there is at least 1 public cluster result, while video mesh is not reachable', async () => {
|
|
98
|
+
await checkIsClusterReachable({
|
|
99
|
+
x: {
|
|
100
|
+
udp: {reachable: 'true'},
|
|
101
|
+
tcp: {reachable: 'true'},
|
|
102
|
+
isVideoMesh: true,
|
|
103
|
+
},
|
|
104
|
+
y: {
|
|
105
|
+
udp: {reachable: 'false'},
|
|
106
|
+
tcp: {reachable: 'true'},
|
|
107
|
+
isVideoMesh: true,
|
|
108
|
+
},
|
|
109
|
+
publicOne: {
|
|
110
|
+
udp: {reachable: 'false'},
|
|
111
|
+
tcp: {reachable: 'true'},
|
|
112
|
+
isVideoMesh: false,
|
|
113
|
+
}
|
|
114
|
+
}, true);
|
|
115
|
+
});
|
|
116
|
+
})
|
|
51
117
|
});
|
|
52
118
|
|
|
53
119
|
describe('gatherReachability', () => {
|
|
@@ -66,19 +132,287 @@ describe('gatherReachability', () => {
|
|
|
66
132
|
it('stores the reachability', async () => {
|
|
67
133
|
const reachability = new Reachability(webex);
|
|
68
134
|
|
|
69
|
-
const
|
|
70
|
-
|
|
135
|
+
const reachabilityResults = {
|
|
136
|
+
clusters: {
|
|
137
|
+
clusterId: {
|
|
138
|
+
udp: 'testUDP',
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
const getClustersResult = {
|
|
143
|
+
clusters: {clusterId: 'cluster'},
|
|
144
|
+
joinCookie: {id: 'id'},
|
|
145
|
+
};
|
|
71
146
|
|
|
72
|
-
reachability.reachabilityRequest.getClusters = sinon.stub().returns(
|
|
73
|
-
(reachability as any).performReachabilityCheck = sinon.stub().returns(reachabilityResults)
|
|
147
|
+
reachability.reachabilityRequest.getClusters = sinon.stub().returns(getClustersResult);
|
|
148
|
+
(reachability as any).performReachabilityCheck = sinon.stub().returns(reachabilityResults);
|
|
74
149
|
|
|
75
150
|
const result = await reachability.gatherReachability();
|
|
76
151
|
|
|
77
152
|
assert.equal(result, reachabilityResults);
|
|
78
153
|
|
|
79
|
-
const
|
|
154
|
+
const storedResultForReachabilityResult = await webex.boundedStorage.get(
|
|
155
|
+
'Reachability',
|
|
156
|
+
'reachability.result'
|
|
157
|
+
);
|
|
158
|
+
const storedResultForJoinCookie = await webex.boundedStorage.get(
|
|
159
|
+
'Reachability',
|
|
160
|
+
'reachability.joinCookie'
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
assert.equal(JSON.stringify(result), storedResultForReachabilityResult);
|
|
164
|
+
assert.equal(JSON.stringify(getClustersResult.joinCookie), storedResultForJoinCookie);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it('does reachability only on udp', async () => {
|
|
168
|
+
const reachability = new Reachability(webex);
|
|
169
|
+
|
|
170
|
+
const getClustersResult = {
|
|
171
|
+
clusters: {clusterId: {
|
|
172
|
+
tcp: [
|
|
173
|
+
'stun:170.72.164.1:5004',
|
|
174
|
+
'stun:170.72.165.2:5004'
|
|
175
|
+
],
|
|
176
|
+
udp: [
|
|
177
|
+
'stun:170.72.164.3:5004',
|
|
178
|
+
'stun:170.72.164.3:9000',
|
|
179
|
+
],
|
|
180
|
+
xtls: [
|
|
181
|
+
'stun:external-media101.public.wjfkm-a-4.prod.infra.webex.com:443',
|
|
182
|
+
'stun:external-media94.public.wjfkm-a-8.prod.infra.webex.com:443'
|
|
183
|
+
]
|
|
184
|
+
}},
|
|
185
|
+
joinCookie: {id: 'id'},
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
sinon.stub(reachability.reachabilityRequest, 'getClusters').returns(getClustersResult);
|
|
189
|
+
|
|
190
|
+
const createPeerConnectionStub = sinon.stub(reachability, 'createPeerConnection');
|
|
191
|
+
|
|
192
|
+
await reachability.gatherReachability();
|
|
193
|
+
|
|
194
|
+
// check that a peer connection was created with only the udp urls
|
|
195
|
+
assert.calledOnceWithExactly(createPeerConnectionStub, {
|
|
196
|
+
key: 'clusterId',
|
|
197
|
+
config: {
|
|
198
|
+
iceServers: [
|
|
199
|
+
{
|
|
200
|
+
username: '',
|
|
201
|
+
credential: '',
|
|
202
|
+
urls: ['stun:170.72.164.3:5004'],
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
username: '',
|
|
206
|
+
credential: '',
|
|
207
|
+
urls: ['stun:170.72.164.3:9000'],
|
|
208
|
+
}
|
|
209
|
+
],
|
|
210
|
+
iceCandidatePoolSize: '0',
|
|
211
|
+
iceTransportPolicy: 'all'
|
|
212
|
+
}
|
|
213
|
+
})
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
describe('clientMediaIPs', () => {
|
|
217
|
+
let testingClass: TestReachability;
|
|
218
|
+
|
|
219
|
+
class TestReachability extends Reachability {
|
|
220
|
+
public testParseIceResultsToInternalReachabilityResults(iceResults: Array<ICECandidateResult>) {
|
|
221
|
+
return this.parseIceResultsToInternalReachabilityResults(iceResults);
|
|
222
|
+
}
|
|
223
|
+
public testAddPublicIP(peerConnection: RTCPeerConnection, publicIP?: string | null) {
|
|
224
|
+
return this.addPublicIP(peerConnection, publicIP);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
beforeEach(() => {
|
|
228
|
+
testingClass = new TestReachability({webex});
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
it('calls parseIceResultsToInternalReachabilityResults correctly', () => {
|
|
232
|
+
const res = testingClass.testParseIceResultsToInternalReachabilityResults([
|
|
233
|
+
{
|
|
234
|
+
clusterId: 'id1',
|
|
235
|
+
elapsed: '12312',
|
|
236
|
+
publicIPs: ['1.1.1.1'],
|
|
237
|
+
isVideoMesh: true,
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
clusterId: 'id2',
|
|
241
|
+
elapsed: null,
|
|
242
|
+
publicIPs: ['1.1.1.1'],
|
|
243
|
+
isVideoMesh: false,
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
clusterId: 'id2',
|
|
247
|
+
elapsed: '14123',
|
|
248
|
+
publicIPs: undefined,
|
|
249
|
+
isVideoMesh: false,
|
|
250
|
+
},
|
|
251
|
+
]);
|
|
252
|
+
|
|
253
|
+
assert.deepEqual(res, {
|
|
254
|
+
id1: {
|
|
255
|
+
tcp: {
|
|
256
|
+
untested: 'true',
|
|
257
|
+
},
|
|
258
|
+
xtls: {
|
|
259
|
+
untested: 'true',
|
|
260
|
+
},
|
|
261
|
+
udp: {
|
|
262
|
+
clientMediaIPs: ['1.1.1.1'],
|
|
263
|
+
latencyInMilliseconds: '12312',
|
|
264
|
+
reachable: 'true',
|
|
265
|
+
},
|
|
266
|
+
isVideoMesh: true,
|
|
267
|
+
},
|
|
268
|
+
id2: {
|
|
269
|
+
xtls: {
|
|
270
|
+
untested: 'true',
|
|
271
|
+
},
|
|
272
|
+
tcp: {
|
|
273
|
+
untested: 'true',
|
|
274
|
+
},
|
|
275
|
+
udp: {
|
|
276
|
+
latencyInMilliseconds: '14123',
|
|
277
|
+
reachable: 'true',
|
|
278
|
+
},
|
|
279
|
+
isVideoMesh: false,
|
|
280
|
+
},
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
it('calls addPublicIP correctly with no existing public APIs', () => {
|
|
285
|
+
const peerConnection = {
|
|
286
|
+
connectionState: 'not_closed',
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
testingClass.testAddPublicIP(peerConnection as RTCPeerConnection, '1.1.1.1');
|
|
290
|
+
|
|
291
|
+
assert.deepEqual(peerConnection, {
|
|
292
|
+
connectionState: 'not_closed',
|
|
293
|
+
publicIPs: ['1.1.1.1'],
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
it('calls addPublicIP correctly with existing public APIs', () => {
|
|
298
|
+
const peerConnection = {
|
|
299
|
+
connectionState: 'not_closed',
|
|
300
|
+
publicIPs: ['2.2.2.2'],
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
testingClass.testAddPublicIP(peerConnection as any, '1.1.1.1');
|
|
304
|
+
|
|
305
|
+
assert.deepEqual(peerConnection, {
|
|
306
|
+
connectionState: 'not_closed',
|
|
307
|
+
publicIPs: ['2.2.2.2', '1.1.1.1'],
|
|
308
|
+
});
|
|
309
|
+
});
|
|
80
310
|
|
|
81
|
-
|
|
311
|
+
it('calls addPublicIP correctly null publicAPI', () => {
|
|
312
|
+
const peerConnection = {
|
|
313
|
+
connectionState: 'not_closed',
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
testingClass.testAddPublicIP(peerConnection as RTCPeerConnection, null);
|
|
317
|
+
|
|
318
|
+
assert.deepEqual(peerConnection, {
|
|
319
|
+
connectionState: 'not_closed',
|
|
320
|
+
publicIPs: null,
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
describe('getReachabilityResults', () => {
|
|
327
|
+
let webex;
|
|
328
|
+
|
|
329
|
+
beforeEach(() => {
|
|
330
|
+
webex = new MockWebex();
|
|
331
|
+
|
|
332
|
+
// sinon.stub(MeetingUtil, 'getIpVersion').returns(IP_VERSION.unknown);
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
afterEach(() => {
|
|
336
|
+
sinon.restore();
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
const runCheck = async (mockStorage: any, expectedResult: ReachabilityResults) => {
|
|
340
|
+
if (mockStorage) {
|
|
341
|
+
await webex.boundedStorage.put(
|
|
342
|
+
'Reachability',
|
|
343
|
+
'reachability.result',
|
|
344
|
+
JSON.stringify(mockStorage)
|
|
345
|
+
);
|
|
346
|
+
}
|
|
347
|
+
const reachability = new Reachability(webex);
|
|
348
|
+
|
|
349
|
+
const result = await reachability.getReachabilityResults();
|
|
350
|
+
|
|
351
|
+
assert.deepEqual(result, expectedResult);
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
it('returns undefined if reading from local storage fails', async () => {
|
|
355
|
+
sinon.stub(webex.boundedStorage, 'get').rejects(new Error('fake error'));
|
|
356
|
+
|
|
357
|
+
const reachability = new Reachability(webex);
|
|
358
|
+
|
|
359
|
+
const result = await reachability.getReachabilityResults();
|
|
360
|
+
|
|
361
|
+
assert.isUndefined(result);
|
|
82
362
|
});
|
|
83
363
|
|
|
364
|
+
it('returns results from local storage, stripping any internal data', async () => {
|
|
365
|
+
await runCheck(
|
|
366
|
+
// mock storage:
|
|
367
|
+
{
|
|
368
|
+
cluster1: {
|
|
369
|
+
udp: {reachable: 'true', latencyInMilliseconds: '100'},
|
|
370
|
+
tcp: {reachable: 'false'},
|
|
371
|
+
xtls: {untested: 'true'},
|
|
372
|
+
},
|
|
373
|
+
cluster2: {
|
|
374
|
+
udp: {reachable: 'true', latencyInMilliseconds: '200'},
|
|
375
|
+
tcp: {reachable: 'false'},
|
|
376
|
+
xtls: {untested: 'true'},
|
|
377
|
+
isVideoMesh: true,
|
|
378
|
+
},
|
|
379
|
+
cluster3: {
|
|
380
|
+
udp: {reachable: 'false'},
|
|
381
|
+
tcp: {reachable: 'true', latencyInMilliseconds: '100', clientMediaIPs: ['10.10.10.10']},
|
|
382
|
+
xtls: {untested: 'true'},
|
|
383
|
+
isVideoMesh: true,
|
|
384
|
+
someOtherField: 'any value',
|
|
385
|
+
},
|
|
386
|
+
cluster4: {
|
|
387
|
+
udp: {reachable: 'false', latencyInMilliseconds: '300'},
|
|
388
|
+
tcp: {reachable: 'false', untested: 'true'},
|
|
389
|
+
xtls: {untested: 'true'},
|
|
390
|
+
someOtherField: 'any value',
|
|
391
|
+
},
|
|
392
|
+
},
|
|
393
|
+
// expected result (same as above, but with isVideoMesh and someOtherField stripped out):
|
|
394
|
+
{
|
|
395
|
+
cluster1: {
|
|
396
|
+
udp: {reachable: 'true', latencyInMilliseconds: '100'},
|
|
397
|
+
tcp: {reachable: 'false'},
|
|
398
|
+
xtls: {untested: 'true'},
|
|
399
|
+
},
|
|
400
|
+
cluster2: {
|
|
401
|
+
udp: {reachable: 'true', latencyInMilliseconds: '200'},
|
|
402
|
+
tcp: {reachable: 'false'},
|
|
403
|
+
xtls: {untested: 'true'},
|
|
404
|
+
},
|
|
405
|
+
cluster3: {
|
|
406
|
+
udp: {reachable: 'false'},
|
|
407
|
+
tcp: {reachable: 'true', latencyInMilliseconds: '100', clientMediaIPs: ['10.10.10.10']},
|
|
408
|
+
xtls: {untested: 'true'},
|
|
409
|
+
},
|
|
410
|
+
cluster4: {
|
|
411
|
+
udp: {reachable: 'false', latencyInMilliseconds: '300'},
|
|
412
|
+
tcp: {reachable: 'false', untested: 'true'},
|
|
413
|
+
xtls: {untested: 'true'},
|
|
414
|
+
},
|
|
415
|
+
}
|
|
416
|
+
);
|
|
417
|
+
});
|
|
84
418
|
});
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import sinon from 'sinon';
|
|
2
|
+
import {assert} from '@webex/test-helper-chai';
|
|
3
|
+
import MockWebex from '@webex/test-helper-mock-webex';
|
|
4
|
+
import Meetings from '@webex/plugin-meetings';
|
|
5
|
+
import ReachabilityRequest from '@webex/plugin-meetings/src/reachability/request';
|
|
6
|
+
import {IP_VERSION} from '@webex/plugin-meetings/src/constants';
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
describe('plugin-meetings/reachability', () => {
|
|
10
|
+
let reachabilityRequest;
|
|
11
|
+
let webex;
|
|
12
|
+
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
webex = new MockWebex({
|
|
15
|
+
children: {
|
|
16
|
+
meetings: Meetings,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
webex.meetings.clientRegion = {
|
|
21
|
+
countryCode: 'US',
|
|
22
|
+
regionCode: 'WEST-COAST',
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
webex.internal = {
|
|
26
|
+
services: {
|
|
27
|
+
get: sinon.mock().returns('locusUrl'),
|
|
28
|
+
waitForCatalog: sinon.mock().returns(Promise.resolve({})),
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
reachabilityRequest = new ReachabilityRequest(webex);
|
|
34
|
+
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
describe('#getClusters', () => {
|
|
38
|
+
it('sends a GET request with the correct params', async () => {
|
|
39
|
+
webex.request = sinon.mock().returns(Promise.resolve({
|
|
40
|
+
body: {
|
|
41
|
+
clusterClasses: {
|
|
42
|
+
hybridMedia: ["clusterId"]
|
|
43
|
+
},
|
|
44
|
+
clusters: {"clusterId": {
|
|
45
|
+
udp: "testUDP"
|
|
46
|
+
}},
|
|
47
|
+
joinCookie: {anycastEntryPoint: "aws-eu-west-1"}
|
|
48
|
+
}
|
|
49
|
+
}));
|
|
50
|
+
|
|
51
|
+
const res = await reachabilityRequest.getClusters(IP_VERSION.only_ipv4);
|
|
52
|
+
|
|
53
|
+
const requestParams = webex.request.getCall(0).args[0];
|
|
54
|
+
|
|
55
|
+
assert.equal(requestParams.method, 'GET');
|
|
56
|
+
assert.equal(requestParams.resource, `clusters`);
|
|
57
|
+
assert.equal(requestParams.api, 'calliopeDiscovery');
|
|
58
|
+
assert.equal(requestParams.shouldRefreshAccessToken, false);
|
|
59
|
+
|
|
60
|
+
assert.deepEqual(requestParams.qs, {
|
|
61
|
+
JCSupport: 1,
|
|
62
|
+
ipver: 4,
|
|
63
|
+
});
|
|
64
|
+
assert.deepEqual(res.clusters.clusterId, {udp: "testUDP", isVideoMesh: true})
|
|
65
|
+
assert.deepEqual(res.joinCookie, {anycastEntryPoint: "aws-eu-west-1"})
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
});
|
|
@@ -3,7 +3,6 @@ import chai from 'chai';
|
|
|
3
3
|
import chaiAsPromised from 'chai-as-promised';
|
|
4
4
|
import sinon from 'sinon';
|
|
5
5
|
import ReconnectionManager from '@webex/plugin-meetings/src/reconnection-manager';
|
|
6
|
-
import Metrics from '@webex/plugin-meetings/src/metrics';
|
|
7
6
|
|
|
8
7
|
const {assert} = chai;
|
|
9
8
|
|
|
@@ -16,7 +15,6 @@ describe('plugin-meetings', () => {
|
|
|
16
15
|
let fakeMeeting;
|
|
17
16
|
|
|
18
17
|
beforeEach(() => {
|
|
19
|
-
Metrics.postEvent = sinon.stub();
|
|
20
18
|
fakeMediaConnection = {
|
|
21
19
|
initiateOffer: sinon.stub().resolves({}),
|
|
22
20
|
reconnect: sinon.stub().resolves({}),
|
|
@@ -43,8 +41,8 @@ describe('plugin-meetings', () => {
|
|
|
43
41
|
webrtcMediaConnection: fakeMediaConnection,
|
|
44
42
|
},
|
|
45
43
|
mediaRequestManagers: {
|
|
46
|
-
audio: {commit: sinon.stub()},
|
|
47
|
-
video: {commit: sinon.stub()},
|
|
44
|
+
audio: {commit: sinon.stub(), clearPreviousRequests: sinon.stub()},
|
|
45
|
+
video: {commit: sinon.stub(), clearPreviousRequests: sinon.stub()},
|
|
48
46
|
},
|
|
49
47
|
roap: {
|
|
50
48
|
doTurnDiscovery: sinon.stub().resolves({
|
|
@@ -60,14 +58,40 @@ describe('plugin-meetings', () => {
|
|
|
60
58
|
updateMediaConnection: sinon.stub(),
|
|
61
59
|
},
|
|
62
60
|
webex: {
|
|
61
|
+
credentials: {
|
|
62
|
+
isUnverifiedGuest: false,
|
|
63
|
+
},
|
|
63
64
|
meetings: {
|
|
64
65
|
getMeetingByType: sinon.stub().returns(true),
|
|
65
66
|
syncMeetings: sinon.stub().resolves({}),
|
|
66
67
|
},
|
|
68
|
+
internal: {
|
|
69
|
+
newMetrics: {
|
|
70
|
+
submitClientEvent: sinon.stub()
|
|
71
|
+
}
|
|
72
|
+
}
|
|
67
73
|
},
|
|
68
74
|
};
|
|
69
75
|
});
|
|
70
76
|
|
|
77
|
+
it('syncs meetings if it is not an unverified guest', async () => {
|
|
78
|
+
const rm = new ReconnectionManager(fakeMeeting);
|
|
79
|
+
|
|
80
|
+
await rm.reconnect();
|
|
81
|
+
|
|
82
|
+
assert.calledOnce(rm.webex.meetings.syncMeetings);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('does not sync meetings if it is an unverified guest', async () => {
|
|
86
|
+
const rm = new ReconnectionManager(fakeMeeting);
|
|
87
|
+
|
|
88
|
+
rm.webex.credentials.isUnverifiedGuest = true;
|
|
89
|
+
|
|
90
|
+
await rm.reconnect();
|
|
91
|
+
|
|
92
|
+
assert.notCalled(rm.webex.meetings.syncMeetings);
|
|
93
|
+
});
|
|
94
|
+
|
|
71
95
|
it('uses correct TURN TLS information on the reconnection', async () => {
|
|
72
96
|
const rm = new ReconnectionManager(fakeMeeting);
|
|
73
97
|
|
|
@@ -82,27 +106,77 @@ describe('plugin-meetings', () => {
|
|
|
82
106
|
credential: 'fake_turn_password',
|
|
83
107
|
},
|
|
84
108
|
]);
|
|
109
|
+
|
|
110
|
+
assert.calledWith(fakeMeeting.webex.internal.newMetrics.submitClientEvent, {
|
|
111
|
+
name: 'client.media.reconnecting',
|
|
112
|
+
options: {
|
|
113
|
+
meetingId: rm.meeting.id,
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
assert.calledWith(fakeMeeting.webex.internal.newMetrics.submitClientEvent, {
|
|
118
|
+
name: 'client.media.recovered',
|
|
119
|
+
payload: {
|
|
120
|
+
recoveredBy: 'new',
|
|
121
|
+
},
|
|
122
|
+
options: {
|
|
123
|
+
meetingId: rm.meeting.id,
|
|
124
|
+
},
|
|
125
|
+
});
|
|
85
126
|
});
|
|
86
127
|
|
|
87
|
-
it('does not re-request media for non-multistream meetings', async () => {
|
|
128
|
+
it('does not clear previous requests and re-request media for non-multistream meetings', async () => {
|
|
88
129
|
fakeMeeting.isMultistream = false;
|
|
89
130
|
const rm = new ReconnectionManager(fakeMeeting);
|
|
90
131
|
|
|
91
132
|
await rm.reconnect();
|
|
92
133
|
|
|
134
|
+
assert.notCalled(fakeMeeting.mediaRequestManagers.audio.clearPreviousRequests);
|
|
135
|
+
assert.notCalled(fakeMeeting.mediaRequestManagers.video.clearPreviousRequests);
|
|
93
136
|
assert.notCalled(fakeMeeting.mediaRequestManagers.audio.commit);
|
|
94
137
|
assert.notCalled(fakeMeeting.mediaRequestManagers.video.commit);
|
|
95
138
|
});
|
|
96
139
|
|
|
97
|
-
it('does re-request media for multistream meetings', async () => {
|
|
140
|
+
it('does clear previous requests and re-request media for multistream meetings', async () => {
|
|
98
141
|
fakeMeeting.isMultistream = true;
|
|
99
142
|
const rm = new ReconnectionManager(fakeMeeting);
|
|
100
143
|
|
|
101
144
|
await rm.reconnect();
|
|
102
145
|
|
|
146
|
+
assert.calledOnce(fakeMeeting.mediaRequestManagers.audio.clearPreviousRequests);
|
|
147
|
+
assert.calledOnce(fakeMeeting.mediaRequestManagers.video.clearPreviousRequests);
|
|
103
148
|
assert.calledOnce(fakeMeeting.mediaRequestManagers.audio.commit);
|
|
104
149
|
assert.calledOnce(fakeMeeting.mediaRequestManagers.video.commit);
|
|
105
150
|
});
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
it('sends the correct client event when reconnection fails', async () => {
|
|
154
|
+
sinon.stub(ReconnectionManager.prototype, 'executeReconnection').rejects();
|
|
155
|
+
fakeMeeting.isMultistream = true;
|
|
156
|
+
const rm = new ReconnectionManager(fakeMeeting);
|
|
157
|
+
|
|
158
|
+
try {
|
|
159
|
+
await rm.reconnect();
|
|
160
|
+
} catch (err) {
|
|
161
|
+
assert.calledWith(fakeMeeting.webex.internal.newMetrics.submitClientEvent, {
|
|
162
|
+
name: 'client.call.aborted',
|
|
163
|
+
payload: {
|
|
164
|
+
errors: [
|
|
165
|
+
{
|
|
166
|
+
category: 'expected',
|
|
167
|
+
errorCode: 2008,
|
|
168
|
+
fatal: true,
|
|
169
|
+
name: 'media-engine',
|
|
170
|
+
shownToUser: false,
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
},
|
|
174
|
+
options: {
|
|
175
|
+
meetingId: rm.meeting.id,
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
});
|
|
106
180
|
});
|
|
107
181
|
|
|
108
182
|
/**
|
|
@@ -110,7 +184,7 @@ describe('plugin-meetings', () => {
|
|
|
110
184
|
* level causes testing errors in CI based around related files. Skipping this here until a solution
|
|
111
185
|
* to this problem is generated.
|
|
112
186
|
*/
|
|
113
|
-
describe
|
|
187
|
+
describe('ReconnectionManager', () => {
|
|
114
188
|
let reconnectionManager;
|
|
115
189
|
|
|
116
190
|
beforeEach(() => {
|
|
@@ -203,10 +277,11 @@ describe('plugin-meetings', () => {
|
|
|
203
277
|
assert.isTrue(reconnectionManager.iceState.disconnected);
|
|
204
278
|
});
|
|
205
279
|
|
|
206
|
-
it('should return a promise that rejects after a duration', () => {
|
|
280
|
+
it('should return a promise that rejects after a duration', (done) => {
|
|
207
281
|
reconnectionManager.iceState.timeoutDuration = 100;
|
|
208
282
|
|
|
209
|
-
|
|
283
|
+
assert.isRejected(reconnectionManager.waitForIceReconnect());
|
|
284
|
+
done();
|
|
210
285
|
});
|
|
211
286
|
|
|
212
287
|
it('should resolve return a resolved promise when triggered', () => {
|