@webex/plugin-meetings 3.4.0 → 3.5.0

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.
Files changed (60) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/interpretation/index.js +1 -1
  4. package/dist/interpretation/siLanguage.js +1 -1
  5. package/dist/media/index.js +6 -9
  6. package/dist/media/index.js.map +1 -1
  7. package/dist/meeting/index.js +122 -49
  8. package/dist/meeting/index.js.map +1 -1
  9. package/dist/meeting/util.js +1 -0
  10. package/dist/meeting/util.js.map +1 -1
  11. package/dist/meetings/index.js +4 -2
  12. package/dist/meetings/index.js.map +1 -1
  13. package/dist/reachability/index.js +175 -103
  14. package/dist/reachability/index.js.map +1 -1
  15. package/dist/reconnection-manager/index.js +1 -1
  16. package/dist/reconnection-manager/index.js.map +1 -1
  17. package/dist/rtcMetrics/index.js +26 -6
  18. package/dist/rtcMetrics/index.js.map +1 -1
  19. package/dist/types/meeting/index.d.ts +11 -2
  20. package/dist/types/meetings/index.d.ts +2 -1
  21. package/dist/types/reachability/index.d.ts +14 -2
  22. package/dist/types/rtcMetrics/index.d.ts +11 -1
  23. package/dist/webinar/index.js +1 -1
  24. package/package.json +22 -22
  25. package/src/media/index.ts +5 -9
  26. package/src/meeting/index.ts +54 -10
  27. package/src/meeting/util.ts +2 -0
  28. package/src/meetings/index.ts +4 -3
  29. package/src/reachability/index.ts +49 -4
  30. package/src/reconnection-manager/index.ts +1 -1
  31. package/src/rtcMetrics/index.ts +25 -5
  32. package/test/integration/spec/converged-space-meetings.js +1 -1
  33. package/test/unit/spec/breakouts/index.ts +1 -0
  34. package/test/unit/spec/interceptors/locusRetry.ts +11 -10
  35. package/test/unit/spec/media/MediaConnectionAwaiter.ts +1 -0
  36. package/test/unit/spec/media/index.ts +34 -7
  37. package/test/unit/spec/media/properties.ts +1 -1
  38. package/test/unit/spec/meeting/connectionStateHandler.ts +1 -0
  39. package/test/unit/spec/meeting/index.js +77 -6
  40. package/test/unit/spec/meeting/locusMediaRequest.ts +3 -2
  41. package/test/unit/spec/meeting/request.js +1 -0
  42. package/test/unit/spec/meeting/utils.js +4 -0
  43. package/test/unit/spec/meeting-info/meetinginfov2.js +10 -11
  44. package/test/unit/spec/meeting-info/request.js +1 -1
  45. package/test/unit/spec/meetings/index.js +30 -3
  46. package/test/unit/spec/members/request.js +2 -1
  47. package/test/unit/spec/multistream/mediaRequestManager.ts +1 -0
  48. package/test/unit/spec/multistream/receiveSlot.ts +1 -0
  49. package/test/unit/spec/multistream/receiveSlotManager.ts +1 -0
  50. package/test/unit/spec/multistream/remoteMedia.ts +1 -0
  51. package/test/unit/spec/multistream/remoteMediaGroup.ts +1 -0
  52. package/test/unit/spec/multistream/remoteMediaManager.ts +1 -0
  53. package/test/unit/spec/multistream/sendSlotManager.ts +1 -0
  54. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +0 -1
  55. package/test/unit/spec/reachability/index.ts +211 -13
  56. package/test/unit/spec/reachability/request.js +1 -0
  57. package/test/unit/spec/roap/request.ts +1 -0
  58. package/test/unit/spec/rtcMetrics/index.ts +31 -0
  59. package/src/networkQualityMonitor/index.ts +0 -211
  60. package/test/unit/spec/networkQualityMonitor/index.js +0 -99
@@ -1,211 +0,0 @@
1
- import EventsScope from '../common/events/events-scope';
2
- import {EVENT_TRIGGERS} from '../constants';
3
-
4
- /**
5
- * Meeting - network quality event
6
- * Emitted on each interval of retrieving stats Analyzer data
7
- * @event network:quality
8
- * @type {Object}
9
- * @property {string} mediaType {video|audio}
10
- * @property {number} networkQualityScore - value determined in determineUplinkNetworkQuality
11
- * @memberof NetworkQualityMonitor
12
- */
13
- /**
14
- * NetworkQualityMonitor class that will emit events based on detected quality
15
- *
16
- * @class NetworkQualityMonitor
17
- * @extends {EventsScope}
18
- */
19
- export default class NetworkQualityMonitor extends EventsScope {
20
- config: any;
21
- frequencyTypes: any;
22
- indicatorTypes: any;
23
- mediaType: any;
24
- networkQualityScore: any;
25
- networkQualityStatus: any;
26
-
27
- /**
28
- * Creates a new instance of NetworkQualityMonitor
29
- * @constructor
30
- * @public
31
- * @param {Object} config
32
- * @property {Object} indicatorTypes - network properties used to evaluate network quality used as constants
33
- * @property {Object} frequencyTypes - frequency properties used as constants {uplink|send} {downlink|receive}
34
- * @property {number} networkQualityScore - 0|1 1 is acceptable 0 is bad/unknown
35
- * @property {Object} networkQualityStatus - hash object based on indicatorTypes and frequencyTypes
36
- * @property {string} mediaType - audio|video
37
- */
38
- constructor(config: any) {
39
- super();
40
- this.config = config;
41
- this.indicatorTypes = Object.freeze({
42
- PACKETLOSS: 'packetLoss',
43
- LATENCY: 'latency',
44
- JITTER: 'jitter',
45
- });
46
- this.frequencyTypes = Object.freeze({
47
- UPLINK: 'uplink',
48
- DOWNLINK: 'downlink',
49
- });
50
- this.networkQualityScore = 1;
51
- this.networkQualityStatus = {
52
- [this.frequencyTypes.UPLINK]: {},
53
- };
54
- this.mediaType = null;
55
- }
56
-
57
- /**
58
- * emits NETWORK_QUALITY event on meeting with payload of media type and uplinkNetworkQuality score
59
- *
60
- * @memberof NetworkQualityMonitor
61
- * @returns {void}
62
- */
63
- emitNetworkQuality() {
64
- this.emit(
65
- {
66
- file: 'networkQualityMonitor',
67
- function: 'emitNetworkQuality',
68
- },
69
- EVENT_TRIGGERS.NETWORK_QUALITY,
70
- {
71
- mediaType: this.mediaType,
72
- networkQualityScore: this.networkQualityScore,
73
- }
74
- );
75
- }
76
-
77
- /**
78
- * invokes emitNetworkQuality method resets values back to default
79
- * @returns {void}
80
- * @memberof NetworkQualityMonitor
81
- */
82
- updateNetworkQualityStatus() {
83
- this.emitNetworkQuality();
84
-
85
- // reset values
86
- this.networkQualityScore = 1;
87
- this.mediaType = null;
88
- }
89
-
90
- /**
91
- * filter data to determine uplink network quality, invoked on same interval as stats analyzer remote-inbout-rtp
92
- * @param {Object} configObj
93
- * @param {string} configObj.mediaType {audio|video}
94
- * @param {RTCStats} configObj.remoteRtpResults RTC stats remote obj
95
- * @param {Object} configObj.statsAnalyzerCurrentStats statsResults
96
- * @returns {void}
97
- * @public
98
- * @memberof NetworkQualityMonitor
99
- */
100
- public determineUplinkNetworkQuality({
101
- mediaType,
102
- remoteRtpResults,
103
- statsAnalyzerCurrentStats,
104
- }: {
105
- mediaType: string;
106
- remoteRtpResults: any;
107
- statsAnalyzerCurrentStats: object;
108
- }) {
109
- const roundTripTimeInMilliseconds = remoteRtpResults.roundTripTime * 1000;
110
- const jitterInMilliseconds = remoteRtpResults.jitter * 1000;
111
- const {currentPacketLossRatio} = statsAnalyzerCurrentStats[mediaType].send;
112
-
113
- this.mediaType = mediaType;
114
-
115
- const {JITTER, PACKETLOSS, LATENCY} = this.indicatorTypes;
116
- const {UPLINK} = this.frequencyTypes;
117
-
118
- /**
119
- * determines if packetLoss ratio is over threshold set in config
120
- * sets networkQualityScore to 0 if over threshold
121
- * @returns {boolean}
122
- */
123
- const determinePacketLoss = () => {
124
- if (currentPacketLossRatio > this.config.videoPacketLossRatioThreshold) {
125
- this.networkQualityScore = 0;
126
-
127
- return false;
128
- }
129
-
130
- return true;
131
- };
132
-
133
- /**
134
- * determines if round trip time value is over threshold set in config
135
- * sets networkQualityScore to 0 if over threshold
136
- * @returns {boolean}
137
- */
138
- const determineLatency = () => {
139
- if (roundTripTimeInMilliseconds > this.config.rttThreshold) {
140
- this.networkQualityScore = 0;
141
-
142
- return false;
143
- }
144
-
145
- return true;
146
- };
147
-
148
- /**
149
- * determines if jitter value is over threshold in config
150
- * sets networkQualityScore to 0 if over threshold
151
- * @returns {boolean}
152
- */
153
- const deterMineJitter = () => {
154
- if (jitterInMilliseconds > this.config.jitterThreshold) {
155
- this.networkQualityScore = 0;
156
-
157
- return false;
158
- }
159
-
160
- return true;
161
- };
162
-
163
- /**
164
- * returns null if val is specifically undefined
165
- * @param {(number|undefined)} value
166
- * @returns {(number|null)}
167
- */
168
- const determineIfUndefined = (value: number | undefined) =>
169
- typeof value === 'undefined' ? null : value;
170
-
171
- if (!this.networkQualityStatus[UPLINK][mediaType]) {
172
- this.networkQualityStatus[UPLINK][mediaType] = {};
173
- }
174
-
175
- /**
176
- * Values for some browsers specifically Safari will be undefined we explicitly set to null
177
- * https://bugs.webkit.org/show_bug.cgi?id=206645
178
- * https://bugs.webkit.org/show_bug.cgi?id=212668
179
- */
180
- // PACKET LOSS
181
- this.networkQualityStatus[UPLINK][mediaType][PACKETLOSS] = {
182
- acceptable: determinePacketLoss(),
183
- value: determineIfUndefined(currentPacketLossRatio),
184
- };
185
-
186
- // LATENCY measured in Round trip time
187
- this.networkQualityStatus[UPLINK][mediaType][LATENCY] = {
188
- acceptable: determineLatency(),
189
- value: determineIfUndefined(remoteRtpResults.roundTripTime),
190
- };
191
-
192
- // JITTER
193
- this.networkQualityStatus[UPLINK][mediaType][JITTER] = {
194
- acceptable: deterMineJitter(),
195
- value: determineIfUndefined(remoteRtpResults.jitter),
196
- };
197
-
198
- this.updateNetworkQualityStatus();
199
- }
200
-
201
- /**
202
- * Get the current status of network quaility object - networkQualityStatus
203
- * @returns {Object}
204
- * @public
205
- */
206
- get networkQualityStats() {
207
- const {UPLINK} = this.frequencyTypes;
208
-
209
- return this.networkQualityStatus[UPLINK];
210
- }
211
- }
@@ -1,99 +0,0 @@
1
- import 'jsdom-global/register';
2
- import chai from 'chai';
3
- import chaiAsPromised from 'chai-as-promised';
4
- import sinon from 'sinon';
5
-
6
- import NetworkQualityMonitor from '../../../../src/networkQualityMonitor';
7
- import {EVENT_TRIGGERS} from '../../../../src/constants';
8
-
9
- const {assert} = chai;
10
-
11
- chai.use(chaiAsPromised);
12
- sinon.assert.expose(chai.assert, {prefix: ''});
13
-
14
- // eslint-disable-next-line mocha/no-exclusive-tests
15
- describe('plugin-meetings', () => {
16
- describe('NetworkQualityMonitor', () => {
17
- let networkQualityMonitor;
18
- let sandBoxEmitSpy;
19
-
20
- const initialConfig = {
21
- videoPacketLossRatioThreshold: 9,
22
- rttThreshold: 500,
23
- jitterThreshold: 500,
24
- };
25
-
26
- const configObject = {
27
- mediaType: 'video-send',
28
- remoteRtpResults: {
29
- id: 'RTCRemoteInboundRtpVideoStream_2411086660',
30
- timestamp: 1624472676193.79,
31
- type: 'remote-inbound-rtp',
32
- ssrc: 2411086660,
33
- kind: 'video',
34
- transportId: 'RTCTransport_1_1',
35
- codecId: 'RTCCodec_1_Outbound_102',
36
- jitter: 0.004,
37
- packetsLost: 8,
38
- localId: 'RTCOutboundRTPVideoStream_2411086660',
39
- roundTripTime: 0.648,
40
- fractionLost: 0,
41
- totalRoundTripTime: 3.554,
42
- roundTripTimeMeasurements: 14,
43
- },
44
- statsAnalyzerCurrentStats: {
45
- 'audio-send': {
46
- send: {
47
- currentPacketLossRatio: 8,
48
- },
49
- },
50
- 'video-send': {
51
- send: {
52
- currentPacketLossRatio: 10,
53
- },
54
- },
55
- },
56
- };
57
-
58
- const sandbox = sinon.createSandbox();
59
-
60
- beforeEach(() => {
61
- networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
62
- sandbox.spy(networkQualityMonitor, 'updateNetworkQualityStatus');
63
- sandBoxEmitSpy = sandbox.spy(networkQualityMonitor, 'emit');
64
- });
65
-
66
- afterEach(() => {
67
- sandbox.restore();
68
- });
69
-
70
- it('should trigger updateNetworkQualityStatus when determineUplinkNetworkQuality has finished', async () => {
71
- await networkQualityMonitor.determineUplinkNetworkQuality(configObject);
72
-
73
- assert.calledOnce(networkQualityMonitor.updateNetworkQualityStatus);
74
- });
75
-
76
- it('should emit a network quality judgement event with the proper payload', async () => {
77
- await networkQualityMonitor.determineUplinkNetworkQuality(configObject);
78
- assert(
79
- sandBoxEmitSpy.calledWith(
80
- sinon.match({
81
- file: 'networkQualityMonitor',
82
- function: 'emitNetworkQuality',
83
- }),
84
- sinon.match(EVENT_TRIGGERS.NETWORK_QUALITY),
85
- sinon.match({
86
- mediaType: 'video-send',
87
- networkQualityScore: 0,
88
- })
89
- )
90
- );
91
- });
92
-
93
- it('should reset to default values after determineUplinkNetworkQuality call stack is complete', async () => {
94
- await networkQualityMonitor.determineUplinkNetworkQuality(configObject);
95
- assert.isNull(networkQualityMonitor.mediaType);
96
- assert.deepEqual(networkQualityMonitor.networkQualityScore, 1);
97
- });
98
- });
99
- });