@webex/plugin-meetings 3.4.0-next.1 → 3.4.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.
@@ -2,9 +2,8 @@
2
2
  import { StatelessWebexPlugin } from '@webex/webex-core';
3
3
  import { ClientEvent, ClientEventLeaveReason } from '@webex/internal-plugin-metrics';
4
4
  import { ClientEvent as RawClientEvent } from '@webex/event-dictionary-ts';
5
- import { MediaType, StatsAnalyzer } from '@webex/internal-media-core';
5
+ import { MediaType, StatsAnalyzer, NetworkQualityMonitor } from '@webex/internal-media-core';
6
6
  import { LocalStream, LocalCameraStream, LocalDisplayStream, LocalSystemAudioStream, LocalMicrophoneStream } from '@webex/media-helpers';
7
- import NetworkQualityMonitor from '../networkQualityMonitor';
8
7
  import Roap, { type TurnServerInfo, type TurnDiscoverySkipReason } from '../roap/index';
9
8
  import { type BundlePolicy } from '../media';
10
9
  import MediaProperties from '../media/properties';
@@ -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.4.0-next.1"
65
+ version: "3.4.0-next.2"
66
66
  });
67
67
  var _default = exports.default = Webinar;
68
68
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -43,7 +43,7 @@
43
43
  "@webex/eslint-config-legacy": "0.0.0",
44
44
  "@webex/jest-config-legacy": "0.0.0",
45
45
  "@webex/legacy-tools": "0.0.0",
46
- "@webex/plugin-meetings": "3.4.0-next.1",
46
+ "@webex/plugin-meetings": "3.4.0-next.2",
47
47
  "@webex/plugin-rooms": "3.3.1-next.14",
48
48
  "@webex/test-helper-chai": "3.3.1-next.13",
49
49
  "@webex/test-helper-mocha": "3.3.1-next.13",
@@ -62,7 +62,7 @@
62
62
  },
63
63
  "dependencies": {
64
64
  "@webex/common": "3.3.1-next.13",
65
- "@webex/internal-media-core": "2.10.0",
65
+ "@webex/internal-media-core": "2.10.2",
66
66
  "@webex/internal-plugin-conversation": "3.3.1-next.14",
67
67
  "@webex/internal-plugin-device": "3.3.1-next.13",
68
68
  "@webex/internal-plugin-llm": "3.3.1-next.15",
@@ -70,8 +70,8 @@
70
70
  "@webex/internal-plugin-metrics": "3.3.1-next.13",
71
71
  "@webex/internal-plugin-support": "3.3.1-next.14",
72
72
  "@webex/internal-plugin-user": "3.3.1-next.13",
73
- "@webex/internal-plugin-voicea": "3.4.0-next.1",
74
- "@webex/media-helpers": "3.3.1-next.25",
73
+ "@webex/internal-plugin-voicea": "3.4.0-next.2",
74
+ "@webex/media-helpers": "3.4.0-next.1",
75
75
  "@webex/plugin-people": "3.3.1-next.14",
76
76
  "@webex/plugin-rooms": "3.3.1-next.14",
77
77
  "@webex/web-capabilities": "^1.4.0",
@@ -91,5 +91,5 @@
91
91
  "//": [
92
92
  "TODO: upgrade jwt-decode when moving to node 18"
93
93
  ],
94
- "version": "3.4.0-next.1"
94
+ "version": "3.4.0-next.2"
95
95
  }
@@ -24,6 +24,8 @@ import {
24
24
  RoapMessage,
25
25
  StatsAnalyzer,
26
26
  StatsAnalyzerEventNames,
27
+ NetworkQualityEventNames,
28
+ NetworkQualityMonitor,
27
29
  } from '@webex/internal-media-core';
28
30
 
29
31
  import {
@@ -54,7 +56,6 @@ import {
54
56
  AddMediaFailed,
55
57
  } from '../common/errors/webex-errors';
56
58
 
57
- import NetworkQualityMonitor from '../networkQualityMonitor';
58
59
  import LoggerProxy from '../common/logs/logger-proxy';
59
60
  import EventsUtil from '../common/events/util';
60
61
  import Trigger from '../common/events/trigger-proxy';
@@ -6500,7 +6501,7 @@ export default class Meeting extends StatelessWebexPlugin {
6500
6501
  });
6501
6502
  this.setupStatsAnalyzerEventHandlers();
6502
6503
  this.networkQualityMonitor.on(
6503
- EVENT_TRIGGERS.NETWORK_QUALITY,
6504
+ NetworkQualityEventNames.NETWORK_QUALITY,
6504
6505
  this.sendNetworkQualityEvent.bind(this)
6505
6506
  );
6506
6507
  }
@@ -8193,7 +8194,7 @@ export default class Meeting extends StatelessWebexPlugin {
8193
8194
  * @private
8194
8195
  * @memberof Meeting
8195
8196
  */
8196
- private sendNetworkQualityEvent(res: any) {
8197
+ private sendNetworkQualityEvent(res: {networkQualityScore: number; mediaType: string}) {
8197
8198
  Trigger.trigger(
8198
8199
  this,
8199
8200
  {
@@ -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
- }