@webex/plugin-meetings 3.4.0 → 3.5.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.
Files changed (63) 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 +151 -50
  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 +11 -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 +22 -2
  20. package/dist/types/meetings/index.d.ts +4 -2
  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 +88 -10
  27. package/src/meeting/util.ts +2 -0
  28. package/src/meetings/index.ts +11 -4
  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 +116 -12
  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 +40 -5
  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/dist/networkQualityMonitor/index.js +0 -227
  60. package/dist/networkQualityMonitor/index.js.map +0 -1
  61. package/dist/types/networkQualityMonitor/index.d.ts +0 -70
  62. package/src/networkQualityMonitor/index.ts +0 -211
  63. package/test/unit/spec/networkQualityMonitor/index.js +0 -99
@@ -120,4 +120,35 @@ describe('RtcMetrics', () => {
120
120
  metrics.addMetrics({ name: 'stats-report', payload: [STATS_WITH_IP] });
121
121
  assert.calledOnce(anonymizeIpSpy);
122
122
  })
123
+
124
+ it('should send metrics on first stats-report', () => {
125
+ assert.callCount(webex.request, 0);
126
+
127
+ metrics.addMetrics(FAKE_METRICS_ITEM);
128
+ assert.callCount(webex.request, 0);
129
+
130
+ // first stats-report should trigger a call to webex.request
131
+ metrics.addMetrics({ name: 'stats-report', payload: [STATS_WITH_IP] });
132
+ assert.callCount(webex.request, 1);
133
+ });
134
+
135
+ it('should send metrics on first stats-report after a new connection', () => {
136
+ assert.callCount(webex.request, 0);
137
+
138
+ // first stats-report should trigger a call to webex.request
139
+ metrics.addMetrics({ name: 'stats-report', payload: [STATS_WITH_IP] });
140
+ assert.callCount(webex.request, 1);
141
+
142
+ // subsequent stats-report doesn't trigger it
143
+ metrics.addMetrics({ name: 'stats-report', payload: [STATS_WITH_IP] });
144
+ assert.callCount(webex.request, 1);
145
+
146
+ // now, simulate a failure - that triggers a new connection and upload of the metrics
147
+ metrics.addMetrics(FAILURE_METRICS_ITEM);
148
+ assert.callCount(webex.request, 2);
149
+
150
+ // and another stats-report should trigger another upload of the metrics
151
+ metrics.addMetrics({ name: 'stats-report', payload: [STATS_WITH_IP] });
152
+ assert.callCount(webex.request, 3);
153
+ });
123
154
  });
@@ -1,227 +0,0 @@
1
- "use strict";
2
-
3
- var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
4
- var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
5
- var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
- _Object$defineProperty(exports, "__esModule", {
7
- value: true
8
- });
9
- exports.default = void 0;
10
- var _freeze = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/freeze"));
11
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
12
- var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
13
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
14
- var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
15
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
16
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
17
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
18
- var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
19
- var _constants = require("../constants");
20
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
21
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
22
- /**
23
- * Meeting - network quality event
24
- * Emitted on each interval of retrieving stats Analyzer data
25
- * @event network:quality
26
- * @type {Object}
27
- * @property {string} mediaType {video|audio}
28
- * @property {number} networkQualityScore - value determined in determineUplinkNetworkQuality
29
- * @memberof NetworkQualityMonitor
30
- */
31
- /**
32
- * NetworkQualityMonitor class that will emit events based on detected quality
33
- *
34
- * @class NetworkQualityMonitor
35
- * @extends {EventsScope}
36
- */
37
- var NetworkQualityMonitor = exports.default = /*#__PURE__*/function (_EventsScope) {
38
- (0, _inherits2.default)(NetworkQualityMonitor, _EventsScope);
39
- var _super = _createSuper(NetworkQualityMonitor);
40
- /**
41
- * Creates a new instance of NetworkQualityMonitor
42
- * @constructor
43
- * @public
44
- * @param {Object} config
45
- * @property {Object} indicatorTypes - network properties used to evaluate network quality used as constants
46
- * @property {Object} frequencyTypes - frequency properties used as constants {uplink|send} {downlink|receive}
47
- * @property {number} networkQualityScore - 0|1 1 is acceptable 0 is bad/unknown
48
- * @property {Object} networkQualityStatus - hash object based on indicatorTypes and frequencyTypes
49
- * @property {string} mediaType - audio|video
50
- */
51
- function NetworkQualityMonitor(config) {
52
- var _this;
53
- (0, _classCallCheck2.default)(this, NetworkQualityMonitor);
54
- _this = _super.call(this);
55
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "config", void 0);
56
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "frequencyTypes", void 0);
57
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "indicatorTypes", void 0);
58
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mediaType", void 0);
59
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "networkQualityScore", void 0);
60
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "networkQualityStatus", void 0);
61
- _this.config = config;
62
- _this.indicatorTypes = (0, _freeze.default)({
63
- PACKETLOSS: 'packetLoss',
64
- LATENCY: 'latency',
65
- JITTER: 'jitter'
66
- });
67
- _this.frequencyTypes = (0, _freeze.default)({
68
- UPLINK: 'uplink',
69
- DOWNLINK: 'downlink'
70
- });
71
- _this.networkQualityScore = 1;
72
- _this.networkQualityStatus = (0, _defineProperty2.default)({}, _this.frequencyTypes.UPLINK, {});
73
- _this.mediaType = null;
74
- return _this;
75
- }
76
-
77
- /**
78
- * emits NETWORK_QUALITY event on meeting with payload of media type and uplinkNetworkQuality score
79
- *
80
- * @memberof NetworkQualityMonitor
81
- * @returns {void}
82
- */
83
- (0, _createClass2.default)(NetworkQualityMonitor, [{
84
- key: "emitNetworkQuality",
85
- value: function emitNetworkQuality() {
86
- this.emit({
87
- file: 'networkQualityMonitor',
88
- function: 'emitNetworkQuality'
89
- }, _constants.EVENT_TRIGGERS.NETWORK_QUALITY, {
90
- mediaType: this.mediaType,
91
- networkQualityScore: this.networkQualityScore
92
- });
93
- }
94
-
95
- /**
96
- * invokes emitNetworkQuality method resets values back to default
97
- * @returns {void}
98
- * @memberof NetworkQualityMonitor
99
- */
100
- }, {
101
- key: "updateNetworkQualityStatus",
102
- value: function updateNetworkQualityStatus() {
103
- this.emitNetworkQuality();
104
-
105
- // reset values
106
- this.networkQualityScore = 1;
107
- this.mediaType = null;
108
- }
109
-
110
- /**
111
- * filter data to determine uplink network quality, invoked on same interval as stats analyzer remote-inbout-rtp
112
- * @param {Object} configObj
113
- * @param {string} configObj.mediaType {audio|video}
114
- * @param {RTCStats} configObj.remoteRtpResults RTC stats remote obj
115
- * @param {Object} configObj.statsAnalyzerCurrentStats statsResults
116
- * @returns {void}
117
- * @public
118
- * @memberof NetworkQualityMonitor
119
- */
120
- }, {
121
- key: "determineUplinkNetworkQuality",
122
- value: function determineUplinkNetworkQuality(_ref) {
123
- var _this2 = this;
124
- var mediaType = _ref.mediaType,
125
- remoteRtpResults = _ref.remoteRtpResults,
126
- statsAnalyzerCurrentStats = _ref.statsAnalyzerCurrentStats;
127
- var roundTripTimeInMilliseconds = remoteRtpResults.roundTripTime * 1000;
128
- var jitterInMilliseconds = remoteRtpResults.jitter * 1000;
129
- var currentPacketLossRatio = statsAnalyzerCurrentStats[mediaType].send.currentPacketLossRatio;
130
- this.mediaType = mediaType;
131
- var _this$indicatorTypes = this.indicatorTypes,
132
- JITTER = _this$indicatorTypes.JITTER,
133
- PACKETLOSS = _this$indicatorTypes.PACKETLOSS,
134
- LATENCY = _this$indicatorTypes.LATENCY;
135
- var UPLINK = this.frequencyTypes.UPLINK;
136
-
137
- /**
138
- * determines if packetLoss ratio is over threshold set in config
139
- * sets networkQualityScore to 0 if over threshold
140
- * @returns {boolean}
141
- */
142
- var determinePacketLoss = function determinePacketLoss() {
143
- if (currentPacketLossRatio > _this2.config.videoPacketLossRatioThreshold) {
144
- _this2.networkQualityScore = 0;
145
- return false;
146
- }
147
- return true;
148
- };
149
-
150
- /**
151
- * determines if round trip time value is over threshold set in config
152
- * sets networkQualityScore to 0 if over threshold
153
- * @returns {boolean}
154
- */
155
- var determineLatency = function determineLatency() {
156
- if (roundTripTimeInMilliseconds > _this2.config.rttThreshold) {
157
- _this2.networkQualityScore = 0;
158
- return false;
159
- }
160
- return true;
161
- };
162
-
163
- /**
164
- * determines if jitter value is over threshold in config
165
- * sets networkQualityScore to 0 if over threshold
166
- * @returns {boolean}
167
- */
168
- var deterMineJitter = function deterMineJitter() {
169
- if (jitterInMilliseconds > _this2.config.jitterThreshold) {
170
- _this2.networkQualityScore = 0;
171
- return false;
172
- }
173
- return true;
174
- };
175
-
176
- /**
177
- * returns null if val is specifically undefined
178
- * @param {(number|undefined)} value
179
- * @returns {(number|null)}
180
- */
181
- var determineIfUndefined = function determineIfUndefined(value) {
182
- return typeof value === 'undefined' ? null : value;
183
- };
184
- if (!this.networkQualityStatus[UPLINK][mediaType]) {
185
- this.networkQualityStatus[UPLINK][mediaType] = {};
186
- }
187
-
188
- /**
189
- * Values for some browsers specifically Safari will be undefined we explicitly set to null
190
- * https://bugs.webkit.org/show_bug.cgi?id=206645
191
- * https://bugs.webkit.org/show_bug.cgi?id=212668
192
- */
193
- // PACKET LOSS
194
- this.networkQualityStatus[UPLINK][mediaType][PACKETLOSS] = {
195
- acceptable: determinePacketLoss(),
196
- value: determineIfUndefined(currentPacketLossRatio)
197
- };
198
-
199
- // LATENCY measured in Round trip time
200
- this.networkQualityStatus[UPLINK][mediaType][LATENCY] = {
201
- acceptable: determineLatency(),
202
- value: determineIfUndefined(remoteRtpResults.roundTripTime)
203
- };
204
-
205
- // JITTER
206
- this.networkQualityStatus[UPLINK][mediaType][JITTER] = {
207
- acceptable: deterMineJitter(),
208
- value: determineIfUndefined(remoteRtpResults.jitter)
209
- };
210
- this.updateNetworkQualityStatus();
211
- }
212
-
213
- /**
214
- * Get the current status of network quaility object - networkQualityStatus
215
- * @returns {Object}
216
- * @public
217
- */
218
- }, {
219
- key: "networkQualityStats",
220
- get: function get() {
221
- var UPLINK = this.frequencyTypes.UPLINK;
222
- return this.networkQualityStatus[UPLINK];
223
- }
224
- }]);
225
- return NetworkQualityMonitor;
226
- }(_eventsScope.default);
227
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_eventsScope","_interopRequireDefault","require","_constants","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","NetworkQualityMonitor","exports","_EventsScope","_inherits2","_super","config","_this","_classCallCheck2","_defineProperty2","_assertThisInitialized2","indicatorTypes","_freeze","PACKETLOSS","LATENCY","JITTER","frequencyTypes","UPLINK","DOWNLINK","networkQualityScore","networkQualityStatus","mediaType","_createClass2","key","value","emitNetworkQuality","emit","file","function","EVENT_TRIGGERS","NETWORK_QUALITY","updateNetworkQualityStatus","determineUplinkNetworkQuality","_ref","_this2","remoteRtpResults","statsAnalyzerCurrentStats","roundTripTimeInMilliseconds","roundTripTime","jitterInMilliseconds","jitter","currentPacketLossRatio","send","_this$indicatorTypes","determinePacketLoss","videoPacketLossRatioThreshold","determineLatency","rttThreshold","deterMineJitter","jitterThreshold","determineIfUndefined","acceptable","get","EventsScope"],"sources":["index.ts"],"sourcesContent":["import EventsScope from '../common/events/events-scope';\nimport {EVENT_TRIGGERS} from '../constants';\n\n/**\n * Meeting - network quality event\n * Emitted on each interval of retrieving stats Analyzer data\n * @event network:quality\n * @type {Object}\n * @property {string} mediaType {video|audio}\n * @property {number} networkQualityScore - value determined in determineUplinkNetworkQuality\n * @memberof NetworkQualityMonitor\n */\n/**\n * NetworkQualityMonitor class that will emit events based on detected quality\n *\n * @class NetworkQualityMonitor\n * @extends {EventsScope}\n */\nexport default class NetworkQualityMonitor extends EventsScope {\n config: any;\n frequencyTypes: any;\n indicatorTypes: any;\n mediaType: any;\n networkQualityScore: any;\n networkQualityStatus: any;\n\n /**\n * Creates a new instance of NetworkQualityMonitor\n * @constructor\n * @public\n * @param {Object} config\n * @property {Object} indicatorTypes - network properties used to evaluate network quality used as constants\n * @property {Object} frequencyTypes - frequency properties used as constants {uplink|send} {downlink|receive}\n * @property {number} networkQualityScore - 0|1 1 is acceptable 0 is bad/unknown\n * @property {Object} networkQualityStatus - hash object based on indicatorTypes and frequencyTypes\n * @property {string} mediaType - audio|video\n */\n constructor(config: any) {\n super();\n this.config = config;\n this.indicatorTypes = Object.freeze({\n PACKETLOSS: 'packetLoss',\n LATENCY: 'latency',\n JITTER: 'jitter',\n });\n this.frequencyTypes = Object.freeze({\n UPLINK: 'uplink',\n DOWNLINK: 'downlink',\n });\n this.networkQualityScore = 1;\n this.networkQualityStatus = {\n [this.frequencyTypes.UPLINK]: {},\n };\n this.mediaType = null;\n }\n\n /**\n * emits NETWORK_QUALITY event on meeting with payload of media type and uplinkNetworkQuality score\n *\n * @memberof NetworkQualityMonitor\n * @returns {void}\n */\n emitNetworkQuality() {\n this.emit(\n {\n file: 'networkQualityMonitor',\n function: 'emitNetworkQuality',\n },\n EVENT_TRIGGERS.NETWORK_QUALITY,\n {\n mediaType: this.mediaType,\n networkQualityScore: this.networkQualityScore,\n }\n );\n }\n\n /**\n * invokes emitNetworkQuality method resets values back to default\n * @returns {void}\n * @memberof NetworkQualityMonitor\n */\n updateNetworkQualityStatus() {\n this.emitNetworkQuality();\n\n // reset values\n this.networkQualityScore = 1;\n this.mediaType = null;\n }\n\n /**\n * filter data to determine uplink network quality, invoked on same interval as stats analyzer remote-inbout-rtp\n * @param {Object} configObj\n * @param {string} configObj.mediaType {audio|video}\n * @param {RTCStats} configObj.remoteRtpResults RTC stats remote obj\n * @param {Object} configObj.statsAnalyzerCurrentStats statsResults\n * @returns {void}\n * @public\n * @memberof NetworkQualityMonitor\n */\n public determineUplinkNetworkQuality({\n mediaType,\n remoteRtpResults,\n statsAnalyzerCurrentStats,\n }: {\n mediaType: string;\n remoteRtpResults: any;\n statsAnalyzerCurrentStats: object;\n }) {\n const roundTripTimeInMilliseconds = remoteRtpResults.roundTripTime * 1000;\n const jitterInMilliseconds = remoteRtpResults.jitter * 1000;\n const {currentPacketLossRatio} = statsAnalyzerCurrentStats[mediaType].send;\n\n this.mediaType = mediaType;\n\n const {JITTER, PACKETLOSS, LATENCY} = this.indicatorTypes;\n const {UPLINK} = this.frequencyTypes;\n\n /**\n * determines if packetLoss ratio is over threshold set in config\n * sets networkQualityScore to 0 if over threshold\n * @returns {boolean}\n */\n const determinePacketLoss = () => {\n if (currentPacketLossRatio > this.config.videoPacketLossRatioThreshold) {\n this.networkQualityScore = 0;\n\n return false;\n }\n\n return true;\n };\n\n /**\n * determines if round trip time value is over threshold set in config\n * sets networkQualityScore to 0 if over threshold\n * @returns {boolean}\n */\n const determineLatency = () => {\n if (roundTripTimeInMilliseconds > this.config.rttThreshold) {\n this.networkQualityScore = 0;\n\n return false;\n }\n\n return true;\n };\n\n /**\n * determines if jitter value is over threshold in config\n * sets networkQualityScore to 0 if over threshold\n * @returns {boolean}\n */\n const deterMineJitter = () => {\n if (jitterInMilliseconds > this.config.jitterThreshold) {\n this.networkQualityScore = 0;\n\n return false;\n }\n\n return true;\n };\n\n /**\n * returns null if val is specifically undefined\n * @param {(number|undefined)} value\n * @returns {(number|null)}\n */\n const determineIfUndefined = (value: number | undefined) =>\n typeof value === 'undefined' ? null : value;\n\n if (!this.networkQualityStatus[UPLINK][mediaType]) {\n this.networkQualityStatus[UPLINK][mediaType] = {};\n }\n\n /**\n * Values for some browsers specifically Safari will be undefined we explicitly set to null\n * https://bugs.webkit.org/show_bug.cgi?id=206645\n * https://bugs.webkit.org/show_bug.cgi?id=212668\n */\n // PACKET LOSS\n this.networkQualityStatus[UPLINK][mediaType][PACKETLOSS] = {\n acceptable: determinePacketLoss(),\n value: determineIfUndefined(currentPacketLossRatio),\n };\n\n // LATENCY measured in Round trip time\n this.networkQualityStatus[UPLINK][mediaType][LATENCY] = {\n acceptable: determineLatency(),\n value: determineIfUndefined(remoteRtpResults.roundTripTime),\n };\n\n // JITTER\n this.networkQualityStatus[UPLINK][mediaType][JITTER] = {\n acceptable: deterMineJitter(),\n value: determineIfUndefined(remoteRtpResults.jitter),\n };\n\n this.updateNetworkQualityStatus();\n }\n\n /**\n * Get the current status of network quaility object - networkQualityStatus\n * @returns {Object}\n * @public\n */\n get networkQualityStats() {\n const {UPLINK} = this.frequencyTypes;\n\n return this.networkQualityStatus[UPLINK];\n }\n}\n"],"mappings":"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"}
@@ -1,70 +0,0 @@
1
- import EventsScope from '../common/events/events-scope';
2
- /**
3
- * Meeting - network quality event
4
- * Emitted on each interval of retrieving stats Analyzer data
5
- * @event network:quality
6
- * @type {Object}
7
- * @property {string} mediaType {video|audio}
8
- * @property {number} networkQualityScore - value determined in determineUplinkNetworkQuality
9
- * @memberof NetworkQualityMonitor
10
- */
11
- /**
12
- * NetworkQualityMonitor class that will emit events based on detected quality
13
- *
14
- * @class NetworkQualityMonitor
15
- * @extends {EventsScope}
16
- */
17
- export default class NetworkQualityMonitor extends EventsScope {
18
- config: any;
19
- frequencyTypes: any;
20
- indicatorTypes: any;
21
- mediaType: any;
22
- networkQualityScore: any;
23
- networkQualityStatus: any;
24
- /**
25
- * Creates a new instance of NetworkQualityMonitor
26
- * @constructor
27
- * @public
28
- * @param {Object} config
29
- * @property {Object} indicatorTypes - network properties used to evaluate network quality used as constants
30
- * @property {Object} frequencyTypes - frequency properties used as constants {uplink|send} {downlink|receive}
31
- * @property {number} networkQualityScore - 0|1 1 is acceptable 0 is bad/unknown
32
- * @property {Object} networkQualityStatus - hash object based on indicatorTypes and frequencyTypes
33
- * @property {string} mediaType - audio|video
34
- */
35
- constructor(config: any);
36
- /**
37
- * emits NETWORK_QUALITY event on meeting with payload of media type and uplinkNetworkQuality score
38
- *
39
- * @memberof NetworkQualityMonitor
40
- * @returns {void}
41
- */
42
- emitNetworkQuality(): void;
43
- /**
44
- * invokes emitNetworkQuality method resets values back to default
45
- * @returns {void}
46
- * @memberof NetworkQualityMonitor
47
- */
48
- updateNetworkQualityStatus(): void;
49
- /**
50
- * filter data to determine uplink network quality, invoked on same interval as stats analyzer remote-inbout-rtp
51
- * @param {Object} configObj
52
- * @param {string} configObj.mediaType {audio|video}
53
- * @param {RTCStats} configObj.remoteRtpResults RTC stats remote obj
54
- * @param {Object} configObj.statsAnalyzerCurrentStats statsResults
55
- * @returns {void}
56
- * @public
57
- * @memberof NetworkQualityMonitor
58
- */
59
- determineUplinkNetworkQuality({ mediaType, remoteRtpResults, statsAnalyzerCurrentStats, }: {
60
- mediaType: string;
61
- remoteRtpResults: any;
62
- statsAnalyzerCurrentStats: object;
63
- }): void;
64
- /**
65
- * Get the current status of network quaility object - networkQualityStatus
66
- * @returns {Object}
67
- * @public
68
- */
69
- get networkQualityStats(): any;
70
- }
@@ -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
- });