@webex/plugin-meetings 3.0.0-beta.354 → 3.0.0-beta.355
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/index.js
CHANGED
|
@@ -1041,7 +1041,7 @@ var Breakouts = _webexCore.WebexPlugin.extend({
|
|
|
1041
1041
|
this.trigger(_constants.BREAKOUTS.EVENTS.ASK_RETURN_TO_MAIN);
|
|
1042
1042
|
}
|
|
1043
1043
|
},
|
|
1044
|
-
version: "3.0.0-beta.
|
|
1044
|
+
version: "3.0.0-beta.355"
|
|
1045
1045
|
});
|
|
1046
1046
|
var _default = Breakouts;
|
|
1047
1047
|
exports.default = _default;
|
package/dist/webinar/index.js
CHANGED
|
@@ -62,7 +62,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
62
62
|
updateCanManageWebcast: function updateCanManageWebcast(canManageWebcast) {
|
|
63
63
|
this.set('canManageWebcast', canManageWebcast);
|
|
64
64
|
},
|
|
65
|
-
version: "3.0.0-beta.
|
|
65
|
+
version: "3.0.0-beta.355"
|
|
66
66
|
});
|
|
67
67
|
var _default = Webinar;
|
|
68
68
|
exports.default = _default;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/plugin-meetings",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.355",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
|
|
6
6
|
"contributors": [
|
|
@@ -33,12 +33,12 @@
|
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@peculiar/webcrypto": "^1.4.3",
|
|
36
|
-
"@webex/plugin-meetings": "3.0.0-beta.
|
|
37
|
-
"@webex/test-helper-chai": "3.0.0-beta.
|
|
38
|
-
"@webex/test-helper-mocha": "3.0.0-beta.
|
|
39
|
-
"@webex/test-helper-mock-webex": "3.0.0-beta.
|
|
40
|
-
"@webex/test-helper-retry": "3.0.0-beta.
|
|
41
|
-
"@webex/test-helper-test-users": "3.0.0-beta.
|
|
36
|
+
"@webex/plugin-meetings": "3.0.0-beta.355",
|
|
37
|
+
"@webex/test-helper-chai": "3.0.0-beta.355",
|
|
38
|
+
"@webex/test-helper-mocha": "3.0.0-beta.355",
|
|
39
|
+
"@webex/test-helper-mock-webex": "3.0.0-beta.355",
|
|
40
|
+
"@webex/test-helper-retry": "3.0.0-beta.355",
|
|
41
|
+
"@webex/test-helper-test-users": "3.0.0-beta.355",
|
|
42
42
|
"chai": "^4.3.4",
|
|
43
43
|
"chai-as-promised": "^7.1.1",
|
|
44
44
|
"jsdom-global": "3.0.2",
|
|
@@ -47,19 +47,19 @@
|
|
|
47
47
|
"typescript": "^4.7.4"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@webex/common": "3.0.0-beta.
|
|
50
|
+
"@webex/common": "3.0.0-beta.355",
|
|
51
51
|
"@webex/internal-media-core": "2.2.6",
|
|
52
|
-
"@webex/internal-plugin-conversation": "3.0.0-beta.
|
|
53
|
-
"@webex/internal-plugin-device": "3.0.0-beta.
|
|
54
|
-
"@webex/internal-plugin-llm": "3.0.0-beta.
|
|
55
|
-
"@webex/internal-plugin-mercury": "3.0.0-beta.
|
|
56
|
-
"@webex/internal-plugin-metrics": "3.0.0-beta.
|
|
57
|
-
"@webex/internal-plugin-support": "3.0.0-beta.
|
|
58
|
-
"@webex/internal-plugin-user": "3.0.0-beta.
|
|
59
|
-
"@webex/media-helpers": "3.0.0-beta.
|
|
60
|
-
"@webex/plugin-people": "3.0.0-beta.
|
|
61
|
-
"@webex/plugin-rooms": "3.0.0-beta.
|
|
62
|
-
"@webex/webex-core": "3.0.0-beta.
|
|
52
|
+
"@webex/internal-plugin-conversation": "3.0.0-beta.355",
|
|
53
|
+
"@webex/internal-plugin-device": "3.0.0-beta.355",
|
|
54
|
+
"@webex/internal-plugin-llm": "3.0.0-beta.355",
|
|
55
|
+
"@webex/internal-plugin-mercury": "3.0.0-beta.355",
|
|
56
|
+
"@webex/internal-plugin-metrics": "3.0.0-beta.355",
|
|
57
|
+
"@webex/internal-plugin-support": "3.0.0-beta.355",
|
|
58
|
+
"@webex/internal-plugin-user": "3.0.0-beta.355",
|
|
59
|
+
"@webex/media-helpers": "3.0.0-beta.355",
|
|
60
|
+
"@webex/plugin-people": "3.0.0-beta.355",
|
|
61
|
+
"@webex/plugin-rooms": "3.0.0-beta.355",
|
|
62
|
+
"@webex/webex-core": "3.0.0-beta.355",
|
|
63
63
|
"ampersand-collection": "^2.0.2",
|
|
64
64
|
"bowser": "^2.11.0",
|
|
65
65
|
"btoa": "^1.2.1",
|
|
@@ -8,6 +8,8 @@ import {StatsAnalyzer, EVENTS} from '../../../../src/statsAnalyzer';
|
|
|
8
8
|
import NetworkQualityMonitor from '../../../../src/networkQualityMonitor';
|
|
9
9
|
import testUtils from '../../../utils/testUtils';
|
|
10
10
|
import {MEDIA_DEVICES, _UNKNOWN_} from '@webex/plugin-meetings/src/constants';
|
|
11
|
+
import LoggerProxy from '../../../../src/common/logs/logger-proxy';
|
|
12
|
+
import LoggerConfig from '../../../../src/common/logs/logger-config';
|
|
11
13
|
|
|
12
14
|
const {assert} = chai;
|
|
13
15
|
|
|
@@ -16,6 +18,156 @@ sinon.assert.expose(chai.assert, {prefix: ''});
|
|
|
16
18
|
|
|
17
19
|
describe('plugin-meetings', () => {
|
|
18
20
|
describe('StatsAnalyzer', () => {
|
|
21
|
+
describe('parseStatsResult', () => {
|
|
22
|
+
const sandbox = sinon.createSandbox();
|
|
23
|
+
let statsAnalyzer;
|
|
24
|
+
|
|
25
|
+
const initialConfig = {};
|
|
26
|
+
const defaultStats = {};
|
|
27
|
+
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
const networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
|
|
30
|
+
|
|
31
|
+
statsAnalyzer = new StatsAnalyzer(
|
|
32
|
+
initialConfig,
|
|
33
|
+
() => ({}),
|
|
34
|
+
networkQualityMonitor,
|
|
35
|
+
defaultStats
|
|
36
|
+
);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
afterEach(() => {
|
|
40
|
+
sandbox.reset();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should call processOutboundRTPResult', () => {
|
|
44
|
+
const calledSpy = sandbox.spy(statsAnalyzer, 'processOutboundRTPResult');
|
|
45
|
+
statsAnalyzer.parseGetStatsResult({ type: 'outbound-rtp' }, 'video-send');
|
|
46
|
+
assert(calledSpy.calledOnce);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('should call processInboundRTPResult', () => {
|
|
50
|
+
const calledSpy = sandbox.spy(statsAnalyzer, 'processInboundRTPResult');
|
|
51
|
+
statsAnalyzer.parseGetStatsResult({ type: 'inbound-rtp' }, 'video-recv');
|
|
52
|
+
assert(calledSpy.calledOnce);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('should call compareSentAndReceived', () => {
|
|
56
|
+
const calledSpy = sandbox.spy(statsAnalyzer, 'compareSentAndReceived');
|
|
57
|
+
statsAnalyzer.parseGetStatsResult({ type: 'remote-outbound-rtp' }, 'video-send');
|
|
58
|
+
assert(calledSpy.calledOnce);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('should call parseCandidate', () => {
|
|
62
|
+
const calledSpy = sandbox.spy(statsAnalyzer, 'parseCandidate');
|
|
63
|
+
statsAnalyzer.parseGetStatsResult({ type: 'local-candidate' }, 'video-send');
|
|
64
|
+
assert(calledSpy.calledOnce);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('processOutboundRTPResult should create the correct stats results', () => {
|
|
68
|
+
// establish the `statsResults` object.
|
|
69
|
+
statsAnalyzer.parseGetStatsResult({ type: 'none' }, 'audio-send', true);
|
|
70
|
+
|
|
71
|
+
statsAnalyzer.processOutboundRTPResult({
|
|
72
|
+
bytesSent: 50000,
|
|
73
|
+
codecId: "RTCCodec_1_Outbound_111",
|
|
74
|
+
headerBytesSent: 25000,
|
|
75
|
+
id: "RTCOutboundRTPAudioStream_123456789",
|
|
76
|
+
kind: "audio",
|
|
77
|
+
mediaSourceId: "RTCAudioSource_2",
|
|
78
|
+
mediaType: "audio",
|
|
79
|
+
nackCount: 1,
|
|
80
|
+
packetsSent: 3600,
|
|
81
|
+
remoteId: "RTCRemoteInboundRtpAudioStream_123456789",
|
|
82
|
+
retransmittedBytesSent: 100,
|
|
83
|
+
retransmittedPacketsSent: 2,
|
|
84
|
+
ssrc: 123456789,
|
|
85
|
+
targetBitrate: 256000,
|
|
86
|
+
timestamp: 1707341489336,
|
|
87
|
+
trackId: "RTCMediaStreamTrack_sender_2",
|
|
88
|
+
transportId: "RTCTransport_0_1",
|
|
89
|
+
type: "outbound-rtp",
|
|
90
|
+
}, 'audio-send', true);
|
|
91
|
+
|
|
92
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-send'].send.headerBytesSent, 25000);
|
|
93
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-send'].send.totalBytesSent, 50000);
|
|
94
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-send'].send.totalNackCount, 1);
|
|
95
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-send'].send.totalPacketsSent, 3600)
|
|
96
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-send'].send.retransmittedPacketsSent, 2);
|
|
97
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-send'].send.retransmittedBytesSent, 100);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('processInboundRTPResult should create the correct stats results', () => {
|
|
101
|
+
// establish the `statsResults` object.
|
|
102
|
+
statsAnalyzer.parseGetStatsResult({ type: 'none' }, 'audio-recv-1', false);
|
|
103
|
+
|
|
104
|
+
statsAnalyzer.processInboundRTPResult({
|
|
105
|
+
audioLevel: 0,
|
|
106
|
+
bytesReceived: 509,
|
|
107
|
+
codecId: "RTCCodec_6_Inbound_111",
|
|
108
|
+
concealedSamples: 200000,
|
|
109
|
+
concealmentEvents: 13,
|
|
110
|
+
fecPacketsDiscarded: 1,
|
|
111
|
+
fecPacketsReceived: 1,
|
|
112
|
+
headerBytesReceived: 250,
|
|
113
|
+
id: "RTCInboundRTPAudioStream_123456789",
|
|
114
|
+
insertedSamplesForDeceleration: 0,
|
|
115
|
+
jitter: 0.012,
|
|
116
|
+
jitterBufferDelay: 1000,
|
|
117
|
+
jitterBufferEmittedCount: 10000,
|
|
118
|
+
kind: "audio",
|
|
119
|
+
lastPacketReceivedTimestamp: 1707341488529,
|
|
120
|
+
mediaType: "audio",
|
|
121
|
+
packetsDiscarded: 0,
|
|
122
|
+
packetsLost: 0,
|
|
123
|
+
packetsReceived: 12,
|
|
124
|
+
remoteId: "RTCRemoteOutboundRTPAudioStream_123456789",
|
|
125
|
+
removedSamplesForAcceleration: 0,
|
|
126
|
+
silentConcealedSamples: 200000,
|
|
127
|
+
ssrc: 123456789,
|
|
128
|
+
timestamp: 1707341489419,
|
|
129
|
+
totalAudioEnergy: 133,
|
|
130
|
+
totalSamplesDuration: 7,
|
|
131
|
+
totalSamplesReceived: 300000,
|
|
132
|
+
trackId: "RTCMediaStreamTrack_receiver_76",
|
|
133
|
+
transportId: "RTCTransport_0_1",
|
|
134
|
+
type: "inbound-rtp",
|
|
135
|
+
}, 'audio-recv-1', false);
|
|
136
|
+
|
|
137
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.totalPacketsReceived, 12);
|
|
138
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.fecPacketsDiscarded, 1);
|
|
139
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.fecPacketsReceived, 1);
|
|
140
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.totalBytesReceived, 509);
|
|
141
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.headerBytesReceived, 250);
|
|
142
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.audioLevel, 0);
|
|
143
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.totalAudioEnergy, 133);
|
|
144
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.totalSamplesReceived, 300000);
|
|
145
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.totalSamplesDecoded, 0);
|
|
146
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.concealedSamples, 200000);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it.only('parseAudioSource should create the correct stats results', () => {
|
|
150
|
+
// establish the `statsResults` object.
|
|
151
|
+
statsAnalyzer.parseGetStatsResult({ type: 'none' }, 'audio-send', true);
|
|
152
|
+
|
|
153
|
+
statsAnalyzer.parseAudioSource({
|
|
154
|
+
audioLevel: 0.03,
|
|
155
|
+
echoReturnLoss: -30,
|
|
156
|
+
echoReturnLossEnhancement: 0.17,
|
|
157
|
+
id: "RTCAudioSource_2",
|
|
158
|
+
kind: "audio",
|
|
159
|
+
timestamp: 1707341488160.012,
|
|
160
|
+
totalAudioEnergy: 0.001,
|
|
161
|
+
totalSamplesDuration: 4.5,
|
|
162
|
+
trackIdentifier: "2207e5bf-c595-4301-93f7-283994d8143f",
|
|
163
|
+
type: "media-source",
|
|
164
|
+
}, 'audio-send', true);
|
|
165
|
+
|
|
166
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-send'].send.audioLevel, 0.03);
|
|
167
|
+
assert.strictEqual(statsAnalyzer.statsResults['audio-send'].send.totalAudioEnergy, 0.001);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
|
|
19
171
|
describe('compareSentAndReceived()', () => {
|
|
20
172
|
let statsAnalyzer;
|
|
21
173
|
let sandBoxSpy;
|
|
@@ -91,6 +243,7 @@ describe('plugin-meetings', () => {
|
|
|
91
243
|
let networkQualityMonitor;
|
|
92
244
|
let statsAnalyzer;
|
|
93
245
|
let mqeData;
|
|
246
|
+
let loggerSpy;
|
|
94
247
|
|
|
95
248
|
let receivedEventsData = {
|
|
96
249
|
local: {},
|
|
@@ -103,6 +256,8 @@ describe('plugin-meetings', () => {
|
|
|
103
256
|
|
|
104
257
|
let fakeStats;
|
|
105
258
|
|
|
259
|
+
const sandbox = sinon.createSandbox();
|
|
260
|
+
|
|
106
261
|
const resetReceivedEvents = () => {
|
|
107
262
|
receivedEventsData = {
|
|
108
263
|
local: {},
|
|
@@ -110,6 +265,12 @@ describe('plugin-meetings', () => {
|
|
|
110
265
|
};
|
|
111
266
|
};
|
|
112
267
|
|
|
268
|
+
before(() => {
|
|
269
|
+
LoggerConfig.set({ enable: false });
|
|
270
|
+
LoggerProxy.set();
|
|
271
|
+
loggerSpy = sandbox.spy(LoggerProxy.logger, 'info');
|
|
272
|
+
});
|
|
273
|
+
|
|
113
274
|
beforeEach(() => {
|
|
114
275
|
clock = sinon.useFakeTimers();
|
|
115
276
|
|
|
@@ -276,6 +437,7 @@ describe('plugin-meetings', () => {
|
|
|
276
437
|
});
|
|
277
438
|
|
|
278
439
|
afterEach(() => {
|
|
440
|
+
sandbox.reset();
|
|
279
441
|
clock.restore();
|
|
280
442
|
});
|
|
281
443
|
|
|
@@ -527,6 +689,78 @@ describe('plugin-meetings', () => {
|
|
|
527
689
|
await progressTime();
|
|
528
690
|
assert.strictEqual(statsAnalyzer.getLocalIpAddress(), '');
|
|
529
691
|
});
|
|
692
|
+
|
|
693
|
+
it('logs a message when audio send packets do not increase', async () => {
|
|
694
|
+
await startStatsAnalyzer({expected: {sendAudio: true}});
|
|
695
|
+
|
|
696
|
+
// don't increase the packets when time progresses.
|
|
697
|
+
await progressTime();
|
|
698
|
+
|
|
699
|
+
assert(loggerSpy.calledWith('StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent'));
|
|
700
|
+
});
|
|
701
|
+
|
|
702
|
+
it('does not log a message when audio send packets increase', async () => {
|
|
703
|
+
await startStatsAnalyzer({expected: {sendAudio: true}});
|
|
704
|
+
|
|
705
|
+
fakeStats.audio.senders[0].report[0].packetsSent += 5;
|
|
706
|
+
await progressTime();
|
|
707
|
+
|
|
708
|
+
assert(loggerSpy.neverCalledWith('StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent'));
|
|
709
|
+
});
|
|
710
|
+
|
|
711
|
+
it('logs a message when audio receive packets do not increase', async () => {
|
|
712
|
+
await startStatsAnalyzer({expected: {receiveAudio: true}});
|
|
713
|
+
|
|
714
|
+
// don't increase the packets when time progresses.
|
|
715
|
+
await progressTime();
|
|
716
|
+
|
|
717
|
+
assert(loggerSpy.calledWith('StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received'));
|
|
718
|
+
});
|
|
719
|
+
|
|
720
|
+
it('does not log a message when audio receive packets increase', async () => {
|
|
721
|
+
await startStatsAnalyzer({expected: {receiveAudio: true}});
|
|
722
|
+
|
|
723
|
+
fakeStats.audio.receivers[0].report[0].packetsReceived += 5;
|
|
724
|
+
await progressTime();
|
|
725
|
+
|
|
726
|
+
assert(loggerSpy.neverCalledWith('StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received'));
|
|
727
|
+
});
|
|
728
|
+
|
|
729
|
+
it('logs a message when video send packets do not increase', async () => {
|
|
730
|
+
await startStatsAnalyzer({expected: {sendVideo: true}});
|
|
731
|
+
|
|
732
|
+
// don't increase the packets when time progresses.
|
|
733
|
+
await progressTime();
|
|
734
|
+
|
|
735
|
+
assert(loggerSpy.calledWith('StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent'));
|
|
736
|
+
});
|
|
737
|
+
|
|
738
|
+
it('does not log a message when video send packets increase', async () => {
|
|
739
|
+
await startStatsAnalyzer({expected: {sendVideo: true}});
|
|
740
|
+
|
|
741
|
+
fakeStats.video.senders[0].report[0].packetsSent += 5;
|
|
742
|
+
await progressTime();
|
|
743
|
+
|
|
744
|
+
assert(loggerSpy.neverCalledWith('StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent'));
|
|
745
|
+
});
|
|
746
|
+
|
|
747
|
+
it('logs a message when video receive packets do not increase', async () => {
|
|
748
|
+
await startStatsAnalyzer({expected: {receiveVideo: true}});
|
|
749
|
+
|
|
750
|
+
// don't increase the packets when time progresses.
|
|
751
|
+
await progressTime();
|
|
752
|
+
|
|
753
|
+
assert(loggerSpy.calledWith('StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received'));
|
|
754
|
+
});
|
|
755
|
+
|
|
756
|
+
it('does not log a message when video receive packets increase', async () => {
|
|
757
|
+
await startStatsAnalyzer({expected: {receiveVideo: true}});
|
|
758
|
+
|
|
759
|
+
fakeStats.video.receivers[0].report[0].packetsReceived += 5;
|
|
760
|
+
await progressTime();
|
|
761
|
+
|
|
762
|
+
assert(loggerSpy.neverCalledWith('StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received'));
|
|
763
|
+
});
|
|
530
764
|
});
|
|
531
765
|
});
|
|
532
766
|
});
|