@webex/plugin-meetings 2.60.0-next.1 → 2.60.0-next.2
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.js +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +2 -1
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/meeting/in-meeting-actions.js +2 -0
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +155 -103
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +3 -0
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/utilv2.js +14 -29
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +17 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +13 -0
- package/dist/meetings/index.js.map +1 -1
- package/dist/metrics/constants.js +1 -0
- package/dist/metrics/constants.js.map +1 -1
- package/dist/reconnection-manager/index.js +26 -26
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/rtcMetrics/index.js +25 -0
- package/dist/rtcMetrics/index.js.map +1 -1
- package/dist/statsAnalyzer/index.js +21 -1
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +16 -16
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/webinar/index.js +1 -1
- package/package.json +21 -22
- package/src/constants.ts +10 -4
- package/src/controls-options-manager/enums.ts +2 -0
- package/src/meeting/in-meeting-actions.ts +4 -0
- package/src/meeting/index.ts +140 -92
- package/src/meeting-info/meeting-info-v2.ts +4 -0
- package/src/meeting-info/utilv2.ts +6 -19
- package/src/meetings/collection.ts +13 -0
- package/src/meetings/index.ts +11 -0
- package/src/metrics/constants.ts +1 -0
- package/src/reconnection-manager/index.ts +62 -66
- package/src/rtcMetrics/index.ts +24 -0
- package/src/statsAnalyzer/index.ts +30 -1
- package/src/statsAnalyzer/mqaUtil.ts +17 -14
- package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
- package/test/unit/spec/meeting/index.js +1058 -158
- package/test/unit/spec/meeting/muteState.js +2 -1
- package/test/unit/spec/meeting-info/meetinginfov2.js +28 -0
- package/test/unit/spec/meetings/collection.js +12 -0
- package/test/unit/spec/meetings/index.js +306 -118
- package/test/unit/spec/member/util.js +0 -31
- package/test/unit/spec/reconnection-manager/index.js +25 -10
- package/test/unit/spec/rtcMetrics/index.ts +20 -0
- package/test/unit/spec/stats-analyzer/index.js +12 -2
|
@@ -548,34 +548,3 @@ describe('extractMediaStatus', () => {
|
|
|
548
548
|
assert.deepEqual(mediaStatus, {audio: 'RECVONLY', video: 'SENDRECV'});
|
|
549
549
|
});
|
|
550
550
|
});
|
|
551
|
-
|
|
552
|
-
describe('extractMediaStatus', () => {
|
|
553
|
-
it('throws error when there is no participant', () => {
|
|
554
|
-
assert.throws(() => {
|
|
555
|
-
MemberUtil.extractMediaStatus()
|
|
556
|
-
}, 'Media status could not be extracted, participant is undefined.');
|
|
557
|
-
});
|
|
558
|
-
|
|
559
|
-
it('returns undefined media status when participant audio/video status is not present', () => {
|
|
560
|
-
const participant = {
|
|
561
|
-
status: {}
|
|
562
|
-
};
|
|
563
|
-
|
|
564
|
-
const mediaStatus = MemberUtil.extractMediaStatus(participant)
|
|
565
|
-
|
|
566
|
-
assert.deepEqual(mediaStatus, {audio: undefined, video: undefined});
|
|
567
|
-
});
|
|
568
|
-
|
|
569
|
-
it('returns correct media status when participant audio/video status is present', () => {
|
|
570
|
-
const participant = {
|
|
571
|
-
status: {
|
|
572
|
-
audioStatus: 'RECVONLY',
|
|
573
|
-
videoStatus: 'SENDRECV'
|
|
574
|
-
}
|
|
575
|
-
};
|
|
576
|
-
|
|
577
|
-
const mediaStatus = MemberUtil.extractMediaStatus(participant)
|
|
578
|
-
|
|
579
|
-
assert.deepEqual(mediaStatus, {audio: 'RECVONLY', video: 'SENDRECV'});
|
|
580
|
-
});
|
|
581
|
-
});
|
|
@@ -3,6 +3,7 @@ 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 { RECONNECTION } from '../../../../src/constants';
|
|
6
7
|
|
|
7
8
|
const {assert} = chai;
|
|
8
9
|
|
|
@@ -114,16 +115,6 @@ describe('plugin-meetings', () => {
|
|
|
114
115
|
meetingId: rm.meeting.id,
|
|
115
116
|
},
|
|
116
117
|
});
|
|
117
|
-
|
|
118
|
-
assert.calledWith(fakeMeeting.webex.internal.newMetrics.submitClientEvent, {
|
|
119
|
-
name: 'client.media.recovered',
|
|
120
|
-
payload: {
|
|
121
|
-
recoveredBy: 'new',
|
|
122
|
-
},
|
|
123
|
-
options: {
|
|
124
|
-
meetingId: rm.meeting.id,
|
|
125
|
-
},
|
|
126
|
-
});
|
|
127
118
|
});
|
|
128
119
|
|
|
129
120
|
it('does not clear previous requests and re-request media for non-multistream meetings', async () => {
|
|
@@ -309,6 +300,30 @@ describe('plugin-meetings', () => {
|
|
|
309
300
|
assert.isTrue(reconnectionManager.iceState.disconnected);
|
|
310
301
|
});
|
|
311
302
|
});
|
|
303
|
+
|
|
304
|
+
describe('setStatus()', () => {
|
|
305
|
+
beforeEach(() => {
|
|
306
|
+
reconnectionManager.status = RECONNECTION.STATE.DEFAULT_STATUS;
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
it('should correctly change status to in progress', () => {
|
|
310
|
+
reconnectionManager.setStatus(RECONNECTION.STATE.IN_PROGRESS);
|
|
311
|
+
|
|
312
|
+
assert.equal(reconnectionManager.status, RECONNECTION.STATE.IN_PROGRESS);
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
it('should correctly change status to complete', () => {
|
|
316
|
+
reconnectionManager.setStatus(RECONNECTION.STATE.COMPLETE);
|
|
317
|
+
|
|
318
|
+
assert.equal(reconnectionManager.status, RECONNECTION.STATE.COMPLETE);
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
it('should correctly change status to failure', () => {
|
|
322
|
+
reconnectionManager.setStatus(RECONNECTION.STATE.FAILURE);
|
|
323
|
+
|
|
324
|
+
assert.equal(reconnectionManager.status, RECONNECTION.STATE.FAILURE);
|
|
325
|
+
});
|
|
326
|
+
});
|
|
312
327
|
});
|
|
313
328
|
});
|
|
314
329
|
});
|
|
@@ -6,15 +6,26 @@ import RTC_METRICS from '../../../../src/rtcMetrics/constants';
|
|
|
6
6
|
|
|
7
7
|
const FAKE_METRICS_ITEM = {payload: ['fake-metrics']};
|
|
8
8
|
|
|
9
|
+
const STATS_WITH_IP = '{\"id\":\"RTCIceCandidate_/kQs0ZNU\",\"type\":\"remote-candidate\",\"transportId\":\"RTCTransport_0_1\",\"isRemote\":true,\"ip\":\"11.22.111.255\",\"address\":\"11.22.111.255\",\"port\":5004,\"protocol\":\"udp\",\"candidateType\":\"host\",\"priority\":2130706431}';
|
|
10
|
+
const STATS_WITH_IP_RESULT = '{\"id\":\"RTCIceCandidate_/kQs0ZNU\",\"type\":\"remote-candidate\",\"transportId\":\"RTCTransport_0_1\",\"isRemote\":true,\"ip\":\"11.22.111.240\",\"address\":\"11.22.111.240\",\"port\":5004,\"protocol\":\"udp\",\"candidateType\":\"host\",\"priority\":2130706431}';
|
|
11
|
+
|
|
9
12
|
describe('RtcMetrics', () => {
|
|
10
13
|
let metrics: RtcMetrics;
|
|
11
14
|
let webex: MockWebex;
|
|
12
15
|
let clock;
|
|
16
|
+
let anonymizeIpSpy;
|
|
17
|
+
|
|
18
|
+
const sandbox = sinon.createSandbox();
|
|
13
19
|
|
|
14
20
|
beforeEach(() => {
|
|
15
21
|
clock = sinon.useFakeTimers();
|
|
16
22
|
webex = new MockWebex();
|
|
17
23
|
metrics = new RtcMetrics(webex, 'mock-meeting-id', 'mock-correlation-id');
|
|
24
|
+
anonymizeIpSpy = sandbox.spy(metrics, 'anonymizeIp');
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
sandbox.restore();
|
|
18
29
|
});
|
|
19
30
|
|
|
20
31
|
it('sendMetrics should send a webex request', () => {
|
|
@@ -70,4 +81,13 @@ describe('RtcMetrics', () => {
|
|
|
70
81
|
|
|
71
82
|
assert.callCount(webex.request, 1);
|
|
72
83
|
});
|
|
84
|
+
|
|
85
|
+
it('should anonymize IP addresses', () => {
|
|
86
|
+
assert.strictEqual(metrics.anonymizeIp(STATS_WITH_IP), STATS_WITH_IP_RESULT);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('should call anonymizeIp', () => {
|
|
90
|
+
metrics.addMetrics({ name: 'stats-report', payload: [STATS_WITH_IP] });
|
|
91
|
+
assert.calledOnce(anonymizeIpSpy);
|
|
92
|
+
})
|
|
73
93
|
});
|
|
@@ -179,7 +179,7 @@ describe('plugin-meetings', () => {
|
|
|
179
179
|
report: [
|
|
180
180
|
{
|
|
181
181
|
type: 'outbound-rtp',
|
|
182
|
-
framesSent:
|
|
182
|
+
framesSent: 1500,
|
|
183
183
|
bytesSent: 1,
|
|
184
184
|
},
|
|
185
185
|
{
|
|
@@ -209,7 +209,7 @@ describe('plugin-meetings', () => {
|
|
|
209
209
|
bytesReceived: 1,
|
|
210
210
|
frameHeight: 720,
|
|
211
211
|
frameWidth: 1280,
|
|
212
|
-
framesReceived:
|
|
212
|
+
framesReceived: 1500,
|
|
213
213
|
},
|
|
214
214
|
{
|
|
215
215
|
type: 'candidate-pair',
|
|
@@ -437,6 +437,16 @@ describe('plugin-meetings', () => {
|
|
|
437
437
|
assert.strictEqual(mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.MICROPHONE).information, _UNKNOWN_);
|
|
438
438
|
assert.strictEqual(mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.CAMERA).information, _UNKNOWN_);
|
|
439
439
|
});
|
|
440
|
+
|
|
441
|
+
it('emits the correct frameRate', async () => {
|
|
442
|
+
await startStatsAnalyzer({expected: {receiveVideo: true}});
|
|
443
|
+
|
|
444
|
+
await progressTime();
|
|
445
|
+
assert.strictEqual(mqeData.videoReceive[0].streams[0].common.receivedFrameRate, 25);
|
|
446
|
+
fakeStats.video.receivers[0].framesReceived = 3000;
|
|
447
|
+
await progressTime();
|
|
448
|
+
assert.strictEqual(mqeData.videoReceive[0].streams[0].common.receivedFrameRate, 25);
|
|
449
|
+
});
|
|
440
450
|
});
|
|
441
451
|
});
|
|
442
452
|
});
|