@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.
@@ -209,7 +209,7 @@ var Breakout = _webexCore.WebexPlugin.extend({
209
209
  sessionId: this.sessionId
210
210
  });
211
211
  },
212
- version: "3.0.0-beta.354"
212
+ version: "3.0.0-beta.355"
213
213
  });
214
214
  var _default = Breakout;
215
215
  exports.default = _default;
@@ -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.354"
1044
+ version: "3.0.0-beta.355"
1045
1045
  });
1046
1046
  var _default = Breakouts;
1047
1047
  exports.default = _default;
@@ -359,7 +359,7 @@ var SimultaneousInterpretation = _webexCore.WebexPlugin.extend({
359
359
  throw error;
360
360
  });
361
361
  },
362
- version: "3.0.0-beta.354"
362
+ version: "3.0.0-beta.355"
363
363
  });
364
364
  var _default = SimultaneousInterpretation;
365
365
  exports.default = _default;
@@ -18,7 +18,7 @@ var SILanguage = _webexCore.WebexPlugin.extend({
18
18
  languageCode: 'number',
19
19
  languageName: 'string'
20
20
  },
21
- version: "3.0.0-beta.354"
21
+ version: "3.0.0-beta.355"
22
22
  });
23
23
  var _default = SILanguage;
24
24
  exports.default = _default;
@@ -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.354"
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.354",
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.354",
37
- "@webex/test-helper-chai": "3.0.0-beta.354",
38
- "@webex/test-helper-mocha": "3.0.0-beta.354",
39
- "@webex/test-helper-mock-webex": "3.0.0-beta.354",
40
- "@webex/test-helper-retry": "3.0.0-beta.354",
41
- "@webex/test-helper-test-users": "3.0.0-beta.354",
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.354",
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.354",
53
- "@webex/internal-plugin-device": "3.0.0-beta.354",
54
- "@webex/internal-plugin-llm": "3.0.0-beta.354",
55
- "@webex/internal-plugin-mercury": "3.0.0-beta.354",
56
- "@webex/internal-plugin-metrics": "3.0.0-beta.354",
57
- "@webex/internal-plugin-support": "3.0.0-beta.354",
58
- "@webex/internal-plugin-user": "3.0.0-beta.354",
59
- "@webex/media-helpers": "3.0.0-beta.354",
60
- "@webex/plugin-people": "3.0.0-beta.354",
61
- "@webex/plugin-rooms": "3.0.0-beta.354",
62
- "@webex/webex-core": "3.0.0-beta.354",
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
  });