@webex/plugin-meetings 3.0.0-next.2 → 3.0.0-next.21
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 +3 -9
- package/dist/constants.js +4 -9
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/interpretation/index.js +3 -3
- package/dist/interpretation/index.js.map +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/mediaSharesUtils.js +15 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/media/index.js +4 -1
- package/dist/media/index.js.map +1 -1
- package/dist/mediaQualityMetrics/config.d.ts +9 -1
- package/dist/mediaQualityMetrics/config.js +10 -1
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/index.d.ts +18 -7
- package/dist/meeting/index.js +745 -567
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.d.ts +2 -8
- package/dist/meeting/muteState.js +37 -25
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.d.ts +3 -0
- package/dist/meeting/request.js +32 -23
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +1 -0
- package/dist/meeting/util.js.map +1 -1
- package/dist/multistream/mediaRequestManager.d.ts +1 -2
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.d.ts +1 -1
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.d.ts +1 -2
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.d.ts +1 -2
- package/dist/multistream/sendSlotManager.js.map +1 -1
- package/dist/reachability/request.js +12 -10
- package/dist/reachability/request.js.map +1 -1
- package/dist/reconnection-manager/index.js +2 -1
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/roap/index.d.ts +10 -2
- package/dist/roap/index.js +15 -0
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +3 -3
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.d.ts +64 -17
- package/dist/roap/turnDiscovery.js +307 -126
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/index.js +61 -41
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/webinar/index.js +1 -1
- package/package.json +22 -22
- package/src/constants.ts +3 -9
- package/src/index.ts +1 -0
- package/src/interpretation/index.ts +2 -2
- package/src/locus-info/mediaSharesUtils.ts +16 -0
- package/src/media/index.ts +3 -1
- package/src/mediaQualityMetrics/config.ts +11 -1
- package/src/meeting/index.ts +264 -90
- package/src/meeting/muteState.ts +34 -20
- package/src/meeting/request.ts +18 -2
- package/src/meeting/util.ts +1 -0
- package/src/multistream/mediaRequestManager.ts +1 -1
- package/src/multistream/remoteMediaGroup.ts +1 -1
- package/src/multistream/remoteMediaManager.ts +1 -2
- package/src/multistream/sendSlotManager.ts +1 -2
- package/src/reachability/request.ts +15 -11
- package/src/reconnection-manager/index.ts +1 -1
- package/src/roap/index.ts +25 -3
- package/src/roap/request.ts +3 -3
- package/src/roap/turnDiscovery.ts +244 -78
- package/src/statsAnalyzer/index.ts +72 -43
- package/test/integration/spec/journey.js +14 -14
- package/test/integration/spec/space-meeting.js +1 -1
- package/test/unit/spec/interpretation/index.ts +4 -1
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +9 -0
- package/test/unit/spec/media/index.ts +89 -78
- package/test/unit/spec/meeting/index.js +611 -125
- package/test/unit/spec/meeting/muteState.js +219 -67
- package/test/unit/spec/meeting/request.js +21 -0
- package/test/unit/spec/meeting/utils.js +6 -1
- package/test/unit/spec/meetings/index.js +27 -20
- package/test/unit/spec/multistream/remoteMediaGroup.ts +0 -1
- package/test/unit/spec/multistream/remoteMediaManager.ts +0 -1
- package/test/unit/spec/reachability/request.js +15 -7
- package/test/unit/spec/reconnection-manager/index.js +28 -0
- package/test/unit/spec/roap/index.ts +61 -6
- package/test/unit/spec/roap/turnDiscovery.ts +298 -16
- package/test/unit/spec/stats-analyzer/index.js +183 -8
- package/dist/member/member.types.d.ts +0 -11
- package/dist/member/member.types.js +0 -17
- package/dist/member/member.types.js.map +0 -1
- package/src/member/member.types.ts +0 -13
|
@@ -412,9 +412,13 @@ describe('plugin-meetings', () => {
|
|
|
412
412
|
assert.exists(result);
|
|
413
413
|
assert.instanceOf(result, NoiseReductionEffect);
|
|
414
414
|
assert.containsAllKeys(result, ['audioContext', 'isEnabled', 'isReady', 'options']);
|
|
415
|
+
assert.equal(result.options.authToken, 'fake_token');
|
|
415
416
|
assert.deepEqual(result.options, {
|
|
416
|
-
authToken: 'fake_token',
|
|
417
417
|
audioContext: {},
|
|
418
|
+
authToken: 'fake_token',
|
|
419
|
+
mode: 'WORKLET',
|
|
420
|
+
env: 'prod',
|
|
421
|
+
avoidSimd: false,
|
|
418
422
|
});
|
|
419
423
|
assert.exists(result.enable);
|
|
420
424
|
assert.exists(result.disable);
|
|
@@ -424,8 +428,9 @@ describe('plugin-meetings', () => {
|
|
|
424
428
|
it('creates noise reduction effect with custom options passed', async () => {
|
|
425
429
|
const effectOptions = {
|
|
426
430
|
audioContext: {},
|
|
427
|
-
mode: '
|
|
428
|
-
env: '
|
|
431
|
+
mode: 'LEGACY',
|
|
432
|
+
env: 'int',
|
|
433
|
+
avoidSimd: true,
|
|
429
434
|
};
|
|
430
435
|
|
|
431
436
|
const result = await webex.meetings.createNoiseReductionEffect(effectOptions);
|
|
@@ -2003,24 +2008,27 @@ describe('plugin-meetings', () => {
|
|
|
2003
2008
|
assert.notCalled(loggerProxySpy);
|
|
2004
2009
|
});
|
|
2005
2010
|
|
|
2006
|
-
forEach(
|
|
2007
|
-
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2011
|
+
forEach(
|
|
2012
|
+
[
|
|
2013
|
+
{user: undefined},
|
|
2014
|
+
{user: {userPreferences: {}}},
|
|
2015
|
+
{user: {userPreferences: {userPreferencesItems: {}}}},
|
|
2016
|
+
{user: {userPreferences: {userPreferencesItems: {preferredWebExSite: undefined}}}},
|
|
2017
|
+
],
|
|
2018
|
+
({user}) => {
|
|
2019
|
+
it(`should handle invalid user data ${user}`, async () => {
|
|
2020
|
+
setup({user});
|
|
2014
2021
|
|
|
2015
|
-
|
|
2022
|
+
await webex.meetings.fetchUserPreferredWebexSite();
|
|
2016
2023
|
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
+
assert.equal(webex.meetings.preferredWebexSite, '');
|
|
2025
|
+
assert.calledOnceWithExactly(
|
|
2026
|
+
loggerProxySpy,
|
|
2027
|
+
'Failed to fetch preferred site from user - no site will be set'
|
|
2028
|
+
);
|
|
2029
|
+
});
|
|
2030
|
+
}
|
|
2031
|
+
);
|
|
2024
2032
|
|
|
2025
2033
|
it('should handle a get user failure', async () => {
|
|
2026
2034
|
setup();
|
|
@@ -2035,7 +2043,6 @@ describe('plugin-meetings', () => {
|
|
|
2035
2043
|
'Failed to fetch preferred site from user - no site will be set'
|
|
2036
2044
|
);
|
|
2037
2045
|
});
|
|
2038
|
-
|
|
2039
2046
|
});
|
|
2040
2047
|
});
|
|
2041
2048
|
|
|
@@ -6,7 +6,6 @@ import {RemoteMedia} from '@webex/plugin-meetings/src/multistream/remoteMedia';
|
|
|
6
6
|
import {ReceiveSlot} from '@webex/plugin-meetings/src/multistream/receiveSlot';
|
|
7
7
|
import sinon from 'sinon';
|
|
8
8
|
import {assert} from '@webex/test-helper-chai';
|
|
9
|
-
import { NamedMediaGroup } from "@webex/json-multistream";
|
|
10
9
|
|
|
11
10
|
class FakeSlot extends EventEmitter {
|
|
12
11
|
public mediaType: MediaType;
|
|
@@ -18,7 +18,6 @@ import testUtils from '../../../utils/testUtils';
|
|
|
18
18
|
import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
|
|
19
19
|
import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
|
|
20
20
|
import { expect } from 'chai';
|
|
21
|
-
import { NamedMediaGroup } from "@webex/json-multistream";
|
|
22
21
|
|
|
23
22
|
class FakeSlot extends EventEmitter {
|
|
24
23
|
public mediaType: MediaType;
|
|
@@ -4,6 +4,7 @@ import MockWebex from '@webex/test-helper-mock-webex';
|
|
|
4
4
|
import Meetings from '@webex/plugin-meetings';
|
|
5
5
|
import ReachabilityRequest from '@webex/plugin-meetings/src/reachability/request';
|
|
6
6
|
import {IP_VERSION} from '@webex/plugin-meetings/src/constants';
|
|
7
|
+
import {NewMetrics} from '@webex/internal-plugin-metrics';
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
describe('plugin-meetings/reachability', () => {
|
|
@@ -14,6 +15,7 @@ describe('plugin-meetings/reachability', () => {
|
|
|
14
15
|
webex = new MockWebex({
|
|
15
16
|
children: {
|
|
16
17
|
meetings: Meetings,
|
|
18
|
+
newMetrics: NewMetrics
|
|
17
19
|
},
|
|
18
20
|
});
|
|
19
21
|
|
|
@@ -22,19 +24,25 @@ describe('plugin-meetings/reachability', () => {
|
|
|
22
24
|
regionCode: 'WEST-COAST',
|
|
23
25
|
};
|
|
24
26
|
|
|
25
|
-
webex.internal = {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
waitForCatalog: sinon.mock().returns(Promise.resolve({})),
|
|
29
|
-
},
|
|
27
|
+
webex.internal.services = {
|
|
28
|
+
get: sinon.mock().returns('locusUrl'),
|
|
29
|
+
waitForCatalog: sinon.mock().returns(Promise.resolve({})),
|
|
30
30
|
};
|
|
31
31
|
|
|
32
|
-
|
|
33
32
|
reachabilityRequest = new ReachabilityRequest(webex);
|
|
34
33
|
|
|
35
34
|
});
|
|
36
35
|
|
|
37
36
|
describe('#getClusters', () => {
|
|
37
|
+
|
|
38
|
+
beforeEach(() => {
|
|
39
|
+
sinon.spy(webex.internal.newMetrics.callDiagnosticLatencies, 'measureLatency');
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
afterEach(() => {
|
|
43
|
+
sinon.restore();
|
|
44
|
+
});
|
|
45
|
+
|
|
38
46
|
it('sends a GET request with the correct params', async () => {
|
|
39
47
|
webex.request = sinon.mock().returns(Promise.resolve({
|
|
40
48
|
body: {
|
|
@@ -49,7 +57,6 @@ describe('plugin-meetings/reachability', () => {
|
|
|
49
57
|
}));
|
|
50
58
|
|
|
51
59
|
const res = await reachabilityRequest.getClusters(IP_VERSION.only_ipv4);
|
|
52
|
-
|
|
53
60
|
const requestParams = webex.request.getCall(0).args[0];
|
|
54
61
|
|
|
55
62
|
assert.equal(requestParams.method, 'GET');
|
|
@@ -63,6 +70,7 @@ describe('plugin-meetings/reachability', () => {
|
|
|
63
70
|
});
|
|
64
71
|
assert.deepEqual(res.clusters.clusterId, {udp: "testUDP", isVideoMesh: true})
|
|
65
72
|
assert.deepEqual(res.joinCookie, {anycastEntryPoint: "aws-eu-west-1"})
|
|
73
|
+
assert.calledOnceWithExactly(webex.internal.newMetrics.callDiagnosticLatencies.measureLatency, sinon.match.func, 'internal.get.cluster.time');
|
|
66
74
|
});
|
|
67
75
|
});
|
|
68
76
|
});
|
|
@@ -144,6 +144,34 @@ describe('plugin-meetings', () => {
|
|
|
144
144
|
});
|
|
145
145
|
});
|
|
146
146
|
|
|
147
|
+
// this can happen when we land on a video mesh node
|
|
148
|
+
it('does not use TURN server if TURN url is an empty string', async () => {
|
|
149
|
+
const rm = new ReconnectionManager(fakeMeeting);
|
|
150
|
+
|
|
151
|
+
fakeMeeting.roap.doTurnDiscovery.resolves({
|
|
152
|
+
turnServerInfo: {
|
|
153
|
+
url: '',
|
|
154
|
+
username: 'whatever',
|
|
155
|
+
password: 'whatever',
|
|
156
|
+
},
|
|
157
|
+
turnDiscoverySkippedReason: undefined,
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
await rm.reconnect();
|
|
161
|
+
|
|
162
|
+
assert.calledOnce(fakeMeeting.roap.doTurnDiscovery);
|
|
163
|
+
assert.calledWith(fakeMeeting.roap.doTurnDiscovery, fakeMeeting, true, true);
|
|
164
|
+
assert.calledOnce(fakeMediaConnection.reconnect);
|
|
165
|
+
assert.calledWith(fakeMediaConnection.reconnect, []);
|
|
166
|
+
|
|
167
|
+
assert.calledWith(fakeMeeting.webex.internal.newMetrics.submitClientEvent, {
|
|
168
|
+
name: 'client.media.reconnecting',
|
|
169
|
+
options: {
|
|
170
|
+
meetingId: rm.meeting.id,
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
|
|
147
175
|
it('does not clear previous requests and re-request media for non-multistream meetings', async () => {
|
|
148
176
|
fakeMeeting.isMultistream = false;
|
|
149
177
|
const rm = new ReconnectionManager(fakeMeeting);
|
|
@@ -13,15 +13,23 @@ import BEHAVIORAL_METRICS from '@webex/plugin-meetings/src/metrics/constants';
|
|
|
13
13
|
import { IP_VERSION } from '../../../../src/constants';
|
|
14
14
|
|
|
15
15
|
describe('Roap', () => {
|
|
16
|
+
let webex;
|
|
17
|
+
|
|
18
|
+
const RESULT = {something: 'some value'};
|
|
19
|
+
const meeting = {id: 'some meeting id'} as Meeting;
|
|
20
|
+
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
webex = new MockWebex({});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
sinon.restore();
|
|
27
|
+
});
|
|
28
|
+
|
|
16
29
|
describe('doTurnDiscovery', () => {
|
|
17
30
|
[false, true].forEach(function (isReconnecting) {
|
|
18
31
|
[false, true, undefined].forEach(function (isForced) {
|
|
19
32
|
it(`calls this.turnDiscovery.doTurnDiscovery() and forwards all the arguments when isReconnecting = ${isReconnecting} and isForced = ${isForced}`, async () => {
|
|
20
|
-
const webex = new MockWebex({});
|
|
21
|
-
|
|
22
|
-
const RESULT = {something: 'some value'};
|
|
23
|
-
const meeting = {id: 'some meeting id'} as Meeting;
|
|
24
|
-
|
|
25
33
|
const doTurnDiscoveryStub = sinon
|
|
26
34
|
.stub(TurnDiscovery.prototype, 'doTurnDiscovery')
|
|
27
35
|
.resolves(RESULT);
|
|
@@ -32,11 +40,58 @@ describe('Roap', () => {
|
|
|
32
40
|
|
|
33
41
|
assert.calledOnceWithExactly(doTurnDiscoveryStub, meeting, isReconnecting, isForced);
|
|
34
42
|
assert.deepEqual(result, RESULT);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe('generateTurnDiscoveryRequestMessage', () => {
|
|
48
|
+
[false, true].forEach(function (isForced) {
|
|
49
|
+
it(`calls this.turnDiscovery.generateTurnDiscoveryRequestMessage with isForced=${isForced}`, async () => {
|
|
50
|
+
const generateTurnDiscoveryRequestMessageStub = sinon
|
|
51
|
+
.stub(TurnDiscovery.prototype, 'generateTurnDiscoveryRequestMessage')
|
|
52
|
+
.resolves(RESULT);
|
|
53
|
+
|
|
54
|
+
const roap = new Roap({}, {parent: webex});
|
|
35
55
|
|
|
36
|
-
|
|
56
|
+
const result = await roap.generateTurnDiscoveryRequestMessage(meeting, isForced);
|
|
57
|
+
|
|
58
|
+
assert.calledOnceWithExactly(generateTurnDiscoveryRequestMessageStub, meeting, isForced);
|
|
59
|
+
assert.deepEqual(result, RESULT);
|
|
37
60
|
});
|
|
38
61
|
});
|
|
39
62
|
});
|
|
63
|
+
|
|
64
|
+
describe('handleTurnDiscoveryHttpResponse', () => {
|
|
65
|
+
it('calls this.turnDiscovery.handleTurnDiscoveryHttpResponse', async () => {
|
|
66
|
+
const handleTurnDiscoveryHttpResponseStub = sinon
|
|
67
|
+
.stub(TurnDiscovery.prototype, 'handleTurnDiscoveryHttpResponse')
|
|
68
|
+
.resolves(RESULT);
|
|
69
|
+
|
|
70
|
+
const httpReponse = {some: 'http response'};
|
|
71
|
+
|
|
72
|
+
const roap = new Roap({}, {parent: webex});
|
|
73
|
+
|
|
74
|
+
const result = await roap.handleTurnDiscoveryHttpResponse(meeting, httpReponse);
|
|
75
|
+
|
|
76
|
+
assert.calledOnceWithExactly(handleTurnDiscoveryHttpResponseStub, meeting, httpReponse);
|
|
77
|
+
assert.deepEqual(result, RESULT);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
describe('abortTurnDiscovery', () => {
|
|
82
|
+
it('calls this.turnDiscovery.abort', async () => {
|
|
83
|
+
const abortStub = sinon
|
|
84
|
+
.stub(TurnDiscovery.prototype, 'abort')
|
|
85
|
+
.returns(RESULT);
|
|
86
|
+
|
|
87
|
+
const roap = new Roap({}, {parent: webex});
|
|
88
|
+
|
|
89
|
+
const result = await roap.abortTurnDiscovery();
|
|
90
|
+
|
|
91
|
+
assert.calledOnceWithExactly(abortStub);
|
|
92
|
+
assert.deepEqual(result, RESULT);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
40
95
|
});
|
|
41
96
|
|
|
42
97
|
describe('sendRoapMediaRequest', () => {
|