@webex/plugin-meetings 3.0.0-stream-classes.4 → 3.0.0-test.1

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 (239) hide show
  1. package/README.md +12 -0
  2. package/dist/breakouts/breakout.js +1 -1
  3. package/dist/breakouts/index.js +1 -1
  4. package/dist/common/errors/no-meeting-info.js +51 -0
  5. package/dist/common/errors/no-meeting-info.js.map +1 -0
  6. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  7. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  8. package/dist/common/errors/webex-errors.js +23 -3
  9. package/dist/common/errors/webex-errors.js.map +1 -1
  10. package/dist/common/logs/request.js +5 -1
  11. package/dist/common/logs/request.js.map +1 -1
  12. package/dist/config.js +1 -1
  13. package/dist/config.js.map +1 -1
  14. package/dist/constants.js +69 -9
  15. package/dist/constants.js.map +1 -1
  16. package/dist/index.js +11 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/interceptors/index.js +15 -0
  19. package/dist/interceptors/index.js.map +1 -0
  20. package/dist/interceptors/locusRetry.js +93 -0
  21. package/dist/interceptors/locusRetry.js.map +1 -0
  22. package/dist/interpretation/index.js +16 -2
  23. package/dist/interpretation/index.js.map +1 -1
  24. package/dist/interpretation/siLanguage.js +1 -1
  25. package/dist/locus-info/index.js +40 -11
  26. package/dist/locus-info/index.js.map +1 -1
  27. package/dist/locus-info/mediaSharesUtils.js +15 -1
  28. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  29. package/dist/locus-info/parser.js +42 -21
  30. package/dist/locus-info/parser.js.map +1 -1
  31. package/dist/media/index.js +10 -6
  32. package/dist/media/index.js.map +1 -1
  33. package/dist/media/properties.js +13 -3
  34. package/dist/media/properties.js.map +1 -1
  35. package/dist/mediaQualityMetrics/config.js +135 -330
  36. package/dist/mediaQualityMetrics/config.js.map +1 -1
  37. package/dist/meeting/in-meeting-actions.js +4 -0
  38. package/dist/meeting/in-meeting-actions.js.map +1 -1
  39. package/dist/meeting/index.js +2187 -1074
  40. package/dist/meeting/index.js.map +1 -1
  41. package/dist/meeting/muteState.js +37 -25
  42. package/dist/meeting/muteState.js.map +1 -1
  43. package/dist/meeting/request.js +34 -19
  44. package/dist/meeting/request.js.map +1 -1
  45. package/dist/meeting/util.js +71 -0
  46. package/dist/meeting/util.js.map +1 -1
  47. package/dist/meeting-info/index.js +48 -23
  48. package/dist/meeting-info/index.js.map +1 -1
  49. package/dist/meeting-info/meeting-info-v2.js +25 -4
  50. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  51. package/dist/meeting-info/utilv2.js +1 -1
  52. package/dist/meeting-info/utilv2.js.map +1 -1
  53. package/dist/meetings/collection.js +17 -0
  54. package/dist/meetings/collection.js.map +1 -1
  55. package/dist/meetings/index.js +142 -57
  56. package/dist/meetings/index.js.map +1 -1
  57. package/dist/meetings/util.js +2 -6
  58. package/dist/meetings/util.js.map +1 -1
  59. package/dist/member/index.js +9 -0
  60. package/dist/member/index.js.map +1 -1
  61. package/dist/member/util.js +11 -0
  62. package/dist/member/util.js.map +1 -1
  63. package/dist/members/index.js +17 -1
  64. package/dist/members/index.js.map +1 -1
  65. package/dist/members/types.js.map +1 -1
  66. package/dist/members/util.js +15 -4
  67. package/dist/members/util.js.map +1 -1
  68. package/dist/metrics/constants.js +15 -1
  69. package/dist/metrics/constants.js.map +1 -1
  70. package/dist/multistream/mediaRequestManager.js +1 -1
  71. package/dist/multistream/mediaRequestManager.js.map +1 -1
  72. package/dist/multistream/remoteMediaGroup.js +16 -2
  73. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  74. package/dist/multistream/remoteMediaManager.js +222 -73
  75. package/dist/multistream/remoteMediaManager.js.map +1 -1
  76. package/dist/multistream/sendSlotManager.js +22 -0
  77. package/dist/multistream/sendSlotManager.js.map +1 -1
  78. package/dist/reachability/clusterReachability.js +356 -0
  79. package/dist/reachability/clusterReachability.js.map +1 -0
  80. package/dist/reachability/index.js +262 -432
  81. package/dist/reachability/index.js.map +1 -1
  82. package/dist/reachability/request.js +1 -1
  83. package/dist/reachability/request.js.map +1 -1
  84. package/dist/reachability/util.js +29 -0
  85. package/dist/reachability/util.js.map +1 -0
  86. package/dist/reconnection-manager/index.js +113 -96
  87. package/dist/reconnection-manager/index.js.map +1 -1
  88. package/dist/roap/index.js +57 -25
  89. package/dist/roap/index.js.map +1 -1
  90. package/dist/roap/request.js +5 -13
  91. package/dist/roap/request.js.map +1 -1
  92. package/dist/roap/turnDiscovery.js +173 -81
  93. package/dist/roap/turnDiscovery.js.map +1 -1
  94. package/dist/rtcMetrics/index.js +68 -6
  95. package/dist/rtcMetrics/index.js.map +1 -1
  96. package/dist/statsAnalyzer/index.js +338 -289
  97. package/dist/statsAnalyzer/index.js.map +1 -1
  98. package/dist/statsAnalyzer/mqaUtil.js +296 -156
  99. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  100. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  101. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  102. package/dist/types/common/errors/webex-errors.d.ts +13 -1
  103. package/dist/types/common/logs/request.d.ts +2 -0
  104. package/dist/types/config.d.ts +1 -1
  105. package/dist/types/constants.d.ts +66 -13
  106. package/dist/types/index.d.ts +1 -1
  107. package/dist/types/interceptors/index.d.ts +2 -0
  108. package/dist/types/interceptors/locusRetry.d.ts +27 -0
  109. package/dist/types/locus-info/index.d.ts +1 -1
  110. package/dist/types/locus-info/parser.d.ts +3 -2
  111. package/dist/types/mediaQualityMetrics/config.d.ts +99 -223
  112. package/dist/types/meeting/in-meeting-actions.d.ts +4 -0
  113. package/dist/types/meeting/index.d.ts +285 -34
  114. package/dist/types/meeting/locusMediaRequest.d.ts +1 -2
  115. package/dist/types/meeting/muteState.d.ts +2 -8
  116. package/dist/types/meeting/request.d.ts +4 -1
  117. package/dist/types/meeting/util.d.ts +25 -1
  118. package/dist/types/meeting-info/index.d.ts +7 -0
  119. package/dist/types/meeting-info/meeting-info-v2.d.ts +1 -0
  120. package/dist/types/meetings/collection.d.ts +9 -0
  121. package/dist/types/meetings/index.d.ts +42 -14
  122. package/dist/types/member/index.d.ts +1 -0
  123. package/dist/types/members/types.d.ts +1 -0
  124. package/dist/types/members/util.d.ts +5 -0
  125. package/dist/types/metrics/constants.d.ts +15 -0
  126. package/dist/types/multistream/mediaRequestManager.d.ts +2 -0
  127. package/dist/types/multistream/remoteMediaGroup.d.ts +2 -0
  128. package/dist/types/multistream/remoteMediaManager.d.ts +25 -1
  129. package/dist/types/multistream/sendSlotManager.d.ts +9 -0
  130. package/dist/types/reachability/clusterReachability.d.ts +109 -0
  131. package/dist/types/reachability/index.d.ts +59 -112
  132. package/dist/types/reachability/request.d.ts +1 -1
  133. package/dist/types/reachability/util.d.ts +8 -0
  134. package/dist/types/reconnection-manager/index.d.ts +10 -0
  135. package/dist/types/roap/index.d.ts +2 -1
  136. package/dist/types/roap/request.d.ts +2 -1
  137. package/dist/types/roap/turnDiscovery.d.ts +21 -4
  138. package/dist/types/rtcMetrics/index.d.ts +15 -1
  139. package/dist/types/statsAnalyzer/index.d.ts +28 -11
  140. package/dist/types/statsAnalyzer/mqaUtil.d.ts +28 -4
  141. package/dist/types/webinar/collection.d.ts +16 -0
  142. package/dist/types/webinar/index.d.ts +5 -0
  143. package/dist/webinar/collection.js +44 -0
  144. package/dist/webinar/collection.js.map +1 -0
  145. package/dist/webinar/index.js +69 -0
  146. package/dist/webinar/index.js.map +1 -0
  147. package/package.json +3 -2
  148. package/src/common/errors/no-meeting-info.ts +24 -0
  149. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  150. package/src/common/errors/webex-errors.ts +19 -2
  151. package/src/common/logs/request.ts +5 -1
  152. package/src/config.ts +1 -1
  153. package/src/constants.ts +71 -6
  154. package/src/index.ts +5 -0
  155. package/src/interceptors/index.ts +3 -0
  156. package/src/interceptors/locusRetry.ts +67 -0
  157. package/src/interpretation/index.ts +18 -1
  158. package/src/locus-info/index.ts +52 -16
  159. package/src/locus-info/mediaSharesUtils.ts +16 -0
  160. package/src/locus-info/parser.ts +47 -21
  161. package/src/media/index.ts +8 -6
  162. package/src/media/properties.ts +17 -2
  163. package/src/mediaQualityMetrics/config.ts +103 -238
  164. package/src/meeting/in-meeting-actions.ts +8 -0
  165. package/src/meeting/index.ts +1510 -529
  166. package/src/meeting/muteState.ts +34 -20
  167. package/src/meeting/request.ts +19 -1
  168. package/src/meeting/util.ts +97 -0
  169. package/src/meeting-info/index.ts +47 -20
  170. package/src/meeting-info/meeting-info-v2.ts +27 -5
  171. package/src/meeting-info/utilv2.ts +1 -1
  172. package/src/meetings/collection.ts +13 -0
  173. package/src/meetings/index.ts +112 -31
  174. package/src/meetings/util.ts +2 -8
  175. package/src/member/index.ts +9 -0
  176. package/src/member/util.ts +14 -0
  177. package/src/members/index.ts +29 -2
  178. package/src/members/types.ts +1 -0
  179. package/src/members/util.ts +15 -1
  180. package/src/metrics/constants.ts +14 -0
  181. package/src/multistream/mediaRequestManager.ts +4 -1
  182. package/src/multistream/remoteMediaGroup.ts +19 -0
  183. package/src/multistream/remoteMediaManager.ts +141 -18
  184. package/src/multistream/sendSlotManager.ts +29 -0
  185. package/src/reachability/clusterReachability.ts +320 -0
  186. package/src/reachability/index.ts +221 -382
  187. package/src/reachability/request.ts +1 -1
  188. package/src/reachability/util.ts +24 -0
  189. package/src/reconnection-manager/index.ts +87 -83
  190. package/src/roap/index.ts +60 -24
  191. package/src/roap/request.ts +3 -16
  192. package/src/roap/turnDiscovery.ts +112 -39
  193. package/src/rtcMetrics/index.ts +71 -5
  194. package/src/statsAnalyzer/index.ts +430 -427
  195. package/src/statsAnalyzer/mqaUtil.ts +317 -168
  196. package/src/webinar/collection.ts +31 -0
  197. package/src/webinar/index.ts +62 -0
  198. package/test/integration/spec/converged-space-meetings.js +7 -7
  199. package/test/integration/spec/journey.js +86 -104
  200. package/test/integration/spec/space-meeting.js +9 -9
  201. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  202. package/test/unit/spec/interpretation/index.ts +36 -3
  203. package/test/unit/spec/locus-info/index.js +205 -12
  204. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  205. package/test/unit/spec/locus-info/mediaSharesUtils.ts +10 -0
  206. package/test/unit/spec/locus-info/parser.js +54 -13
  207. package/test/unit/spec/media/index.ts +20 -4
  208. package/test/unit/spec/media/properties.ts +2 -2
  209. package/test/unit/spec/meeting/in-meeting-actions.ts +4 -0
  210. package/test/unit/spec/meeting/index.js +4027 -1075
  211. package/test/unit/spec/meeting/muteState.js +219 -67
  212. package/test/unit/spec/meeting/request.js +63 -12
  213. package/test/unit/spec/meeting/utils.js +93 -0
  214. package/test/unit/spec/meeting-info/index.js +180 -61
  215. package/test/unit/spec/meeting-info/meetinginfov2.js +196 -53
  216. package/test/unit/spec/meetings/collection.js +12 -0
  217. package/test/unit/spec/meetings/index.js +619 -206
  218. package/test/unit/spec/meetings/utils.js +35 -12
  219. package/test/unit/spec/member/index.js +8 -7
  220. package/test/unit/spec/member/util.js +32 -0
  221. package/test/unit/spec/members/index.js +130 -17
  222. package/test/unit/spec/members/utils.js +26 -0
  223. package/test/unit/spec/multistream/mediaRequestManager.ts +20 -2
  224. package/test/unit/spec/multistream/remoteMediaGroup.ts +80 -1
  225. package/test/unit/spec/multistream/remoteMediaManager.ts +210 -3
  226. package/test/unit/spec/multistream/sendSlotManager.ts +50 -18
  227. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  228. package/test/unit/spec/reachability/index.ts +505 -135
  229. package/test/unit/spec/reachability/util.ts +40 -0
  230. package/test/unit/spec/reconnection-manager/index.js +74 -17
  231. package/test/unit/spec/roap/index.ts +181 -61
  232. package/test/unit/spec/roap/request.ts +27 -3
  233. package/test/unit/spec/roap/turnDiscovery.ts +362 -101
  234. package/test/unit/spec/rtcMetrics/index.ts +57 -3
  235. package/test/unit/spec/stats-analyzer/index.js +1225 -12
  236. package/test/unit/spec/webinar/collection.ts +13 -0
  237. package/test/unit/spec/webinar/index.ts +60 -0
  238. package/test/utils/integrationTestUtils.js +4 -4
  239. package/test/utils/webex-test-users.js +12 -4
@@ -1,6 +1,11 @@
1
1
  "use strict";
2
2
 
3
3
  var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
4
+ var _Object$keys2 = require("@babel/runtime-corejs2/core-js/object/keys");
5
+ var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
6
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
7
+ var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
8
+ var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
4
9
  var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
5
10
  var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
11
  _Object$defineProperty(exports, "__esModule", {
@@ -17,6 +22,7 @@ var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/
17
22
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
18
23
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
19
24
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
25
+ var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty"));
20
26
  var _cloneDeep2 = _interopRequireDefault(require("lodash/cloneDeep"));
21
27
  var _internalMediaCore = require("@webex/internal-media-core");
22
28
  var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
@@ -25,6 +31,8 @@ var _config = require("../mediaQualityMetrics/config");
25
31
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
26
32
  var _global = _interopRequireDefault(require("./global"));
27
33
  var _mqaUtil = require("./mqaUtil");
34
+ function ownKeys(object, enumerableOnly) { var keys = _Object$keys2(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
35
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
28
36
  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); }; }
29
37
  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; } }
30
38
  var EVENTS = {
@@ -59,6 +67,8 @@ var emptyReceiver = {
59
67
  var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
60
68
  (0, _inherits2.default)(StatsAnalyzer, _EventsScope);
61
69
  var _super = _createSuper(StatsAnalyzer);
70
+ // Returns the local IP address for diagnostics. this is the local IP of the interface used for the current media connection a host can have many local Ip Addresses
71
+
62
72
  /**
63
73
  * Creates a new instance of StatsAnalyzer
64
74
  * @constructor
@@ -90,6 +100,8 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
90
100
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "statsInterval", void 0);
91
101
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "statsResults", void 0);
92
102
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "statsStarted", void 0);
103
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "successfulCandidatePair", void 0);
104
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "localIpAddress", void 0);
93
105
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "receiveSlotCallback", void 0);
94
106
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "emitStartStopEvents", function (mediaType, previousValue, currentValue, isLocal) {
95
107
  if (mediaType !== 'audio' && mediaType !== 'video' && mediaType !== 'share') {
@@ -124,57 +136,75 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
124
136
  });
125
137
  }
126
138
  });
139
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "extractAndSetLocalIpAddressInfoForDiagnostics", function (successfulCandidatePairId, candidates) {
140
+ var newIpAddress = '';
141
+ if (successfulCandidatePairId && !(0, _isEmpty2.default)(candidates)) {
142
+ var localCandidate = candidates[successfulCandidatePairId];
143
+ if (localCandidate) {
144
+ if (localCandidate.candidateType === 'host') {
145
+ // if it's a host candidate, use the address property - it will be the local IP
146
+ newIpAddress = "".concat(localCandidate.address);
147
+ } else if (localCandidate.candidateType === 'prflx') {
148
+ // if it's a peer reflexive candidate and we're not using a relay (there is no relayProtocol set)
149
+ // then look at the relatedAddress - it will be the local
150
+ //
151
+ // Firefox doesn't populate the relayProtocol property
152
+ if (!localCandidate.relayProtocol) {
153
+ newIpAddress = "".concat(localCandidate.relatedAddress);
154
+ } else {
155
+ // if it's a peer reflexive candidate and we are using a relay -
156
+ // in that case the relatedAddress will be the IP of the TURN server (Linus),
157
+ // so we can only look at the address, but it might be local IP or public IP,
158
+ // depending on if the user is behind a NAT or not
159
+ newIpAddress = "".concat(localCandidate.address);
160
+ }
161
+ }
162
+ }
163
+ }
164
+ _this.localIpAddress = newIpAddress;
165
+ });
127
166
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "parseCandidate", function (result, type, isSender, isRemote) {
167
+ var _this$successfulCandi;
128
168
  if (!result || !result.id) {
129
169
  return;
130
170
  }
131
- var RemoteCandidateType = {};
132
- var RemoteTransport = {};
133
- var RemoteIpAddress = {};
134
- var RemoteNetworkType = {};
135
- if (!result.id) return;
136
- var sendRecvType = isSender ? _constants.STATS.SEND_DIRECTION : _constants.STATS.RECEIVE_DIRECTION;
137
- var ipType = isRemote ? _constants.STATS.REMOTE : _constants.STATS.LOCAL;
138
- if (!RemoteCandidateType[result.id]) {
139
- RemoteCandidateType[result.id] = [];
140
- }
141
- if (!RemoteTransport[result.id]) {
142
- RemoteTransport[result.id] = [];
143
- }
144
- if (!RemoteIpAddress[result.id]) {
145
- RemoteIpAddress[result.id] = [];
146
- }
147
- if (!RemoteNetworkType[result.id]) {
148
- RemoteNetworkType[result.id] = [];
149
- }
150
- if (result.candidateType && RemoteCandidateType[result.id].indexOf(result.candidateType) === -1) {
151
- RemoteCandidateType[result.id].push(result.candidateType);
152
- }
153
- if (result.protocol && RemoteTransport[result.id].indexOf(result.protocol) === -1) {
154
- RemoteTransport[result.id].push(result.protocol.toUpperCase());
171
+
172
+ // We only care about the successful local candidate
173
+ if (((_this$successfulCandi = _this.successfulCandidatePair) === null || _this$successfulCandi === void 0 ? void 0 : _this$successfulCandi.localCandidateId) !== result.id) {
174
+ return;
155
175
  }
156
- if (result.ip && RemoteIpAddress[result.id].indexOf("".concat(result.ip, ":").concat(result.portNumber)) === -1) {
157
- RemoteIpAddress[result.id].push("".concat(result.ip)); // TODO: Add ports
176
+ var transport;
177
+ if (result.relayProtocol) {
178
+ transport = result.relayProtocol.toUpperCase();
179
+ } else if (result.protocol) {
180
+ transport = result.protocol.toUpperCase();
158
181
  }
159
-
160
- if (result.networkType && RemoteNetworkType[result.id].indexOf(result.networkType) === -1) {
161
- RemoteNetworkType[result.id].push(result.networkType);
182
+ var sendRecvType = isSender ? _constants.STATS.SEND_DIRECTION : _constants.STATS.RECEIVE_DIRECTION;
183
+ var ipType = isRemote ? _constants.STATS.REMOTE : _constants.STATS.LOCAL;
184
+ if (!_this.statsResults.candidates) {
185
+ _this.statsResults.candidates = {};
162
186
  }
163
- _this.statsResults.internal.candidates[result.id] = {
164
- candidateType: RemoteCandidateType[result.id],
165
- ipAddress: RemoteIpAddress[result.id],
187
+ _this.statsResults.candidates[result.id] = {
188
+ candidateType: result.candidateType,
189
+ ipAddress: result.ip,
190
+ // TODO: add ports
191
+ relatedAddress: result.relatedAddress,
192
+ relatedPort: result.relatedPort,
193
+ relayProtocol: result.relayProtocol,
194
+ protocol: result.protocol,
195
+ address: result.address,
166
196
  portNumber: result.port,
167
- networkType: RemoteNetworkType[result.id],
197
+ networkType: result.networkType,
168
198
  priority: result.priority,
169
- transport: RemoteTransport[result.id],
199
+ transport: transport,
170
200
  timestamp: result.time,
171
201
  id: result.id,
172
202
  type: result.type
173
203
  };
174
- _this.statsResults.connectionType[ipType].candidateType = RemoteCandidateType[result.id];
175
- _this.statsResults.connectionType[ipType].ipAddress = RemoteIpAddress[result.id];
176
- _this.statsResults.connectionType[ipType].networkType = RemoteNetworkType[result.id][0] === _constants.NETWORK_TYPE.VPN ? _constants.NETWORK_TYPE.UNKNOWN : RemoteNetworkType[result.id][0];
177
- _this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];
204
+ _this.statsResults.connectionType[ipType].candidateType = result.candidateType;
205
+ _this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;
206
+ _this.statsResults.connectionType[ipType].networkType = result.networkType === _constants.NETWORK_TYPE.VPN ? _constants.NETWORK_TYPE.UNKNOWN : result.networkType;
207
+ _this.statsResults.connectionType[ipType].transport = transport;
178
208
  _this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
179
209
  });
180
210
  _this.statsStarted = false;
@@ -187,6 +217,8 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
187
217
  _this.lastMqaDataSent = {};
188
218
  _this.lastEmittedStartStopEvent = {};
189
219
  _this.receiveSlotCallback = receiveSlotCallback;
220
+ _this.successfulCandidatePair = {};
221
+ _this.localIpAddress = '';
190
222
  return _this;
191
223
  }
192
224
 
@@ -223,7 +255,11 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
223
255
  }, {
224
256
  key: "updateMediaStatus",
225
257
  value: function updateMediaStatus(status) {
226
- this.meetingMediaStatus = status;
258
+ var _this$meetingMediaSta, _this$meetingMediaSta2;
259
+ this.meetingMediaStatus = {
260
+ actual: _objectSpread(_objectSpread({}, (_this$meetingMediaSta = this.meetingMediaStatus) === null || _this$meetingMediaSta === void 0 ? void 0 : _this$meetingMediaSta.actual), status === null || status === void 0 ? void 0 : status.actual),
261
+ expected: _objectSpread(_objectSpread({}, (_this$meetingMediaSta2 = this.meetingMediaStatus) === null || _this$meetingMediaSta2 === void 0 ? void 0 : _this$meetingMediaSta2.expected), status === null || status === void 0 ? void 0 : status.expected)
262
+ };
227
263
  }
228
264
 
229
265
  /**
@@ -238,64 +274,186 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
238
274
  value: function sendMqaData() {
239
275
  var _this3 = this;
240
276
  var newMqa = (0, _cloneDeep2.default)(_config.emptyMqaInterval);
277
+
278
+ // Fill in empty stats items for lastMqaDataSent
279
+ (0, _keys.default)(this.statsResults).forEach(function (mediaType) {
280
+ if (!_this3.lastMqaDataSent[mediaType]) {
281
+ _this3.lastMqaDataSent[mediaType] = {};
282
+ }
283
+ if (!_this3.lastMqaDataSent[mediaType].send && mediaType.includes('-send')) {
284
+ _this3.lastMqaDataSent[mediaType].send = {};
285
+ }
286
+ if (!_this3.lastMqaDataSent[mediaType].recv && mediaType.includes('-recv')) {
287
+ _this3.lastMqaDataSent[mediaType].recv = {};
288
+ }
289
+ });
290
+
291
+ // Create stats the first level, totals for senders and receivers
292
+ var audioSender = (0, _cloneDeep2.default)(_config.emptyAudioTransmit);
293
+ var audioShareSender = (0, _cloneDeep2.default)(_config.emptyAudioTransmit);
294
+ var audioReceiver = (0, _cloneDeep2.default)(_config.emptyAudioReceive);
295
+ var audioShareReceiver = (0, _cloneDeep2.default)(_config.emptyAudioReceive);
296
+ var videoSender = (0, _cloneDeep2.default)(_config.emptyVideoTransmit);
297
+ var videoShareSender = (0, _cloneDeep2.default)(_config.emptyVideoTransmit);
298
+ var videoReceiver = (0, _cloneDeep2.default)(_config.emptyVideoReceive);
299
+ var videoShareReceiver = (0, _cloneDeep2.default)(_config.emptyVideoReceive);
300
+ (0, _mqaUtil.getAudioSenderMqa)({
301
+ audioSender: audioSender,
302
+ statsResults: this.statsResults,
303
+ lastMqaDataSent: this.lastMqaDataSent,
304
+ baseMediaType: 'audio-send'
305
+ });
306
+ newMqa.audioTransmit.push(audioSender);
307
+ (0, _mqaUtil.getAudioSenderMqa)({
308
+ audioSender: audioShareSender,
309
+ statsResults: this.statsResults,
310
+ lastMqaDataSent: this.lastMqaDataSent,
311
+ baseMediaType: 'audio-share-send'
312
+ });
313
+ newMqa.audioTransmit.push(audioShareSender);
314
+ (0, _mqaUtil.getAudioReceiverMqa)({
315
+ audioReceiver: audioReceiver,
316
+ statsResults: this.statsResults,
317
+ lastMqaDataSent: this.lastMqaDataSent,
318
+ baseMediaType: 'audio-recv'
319
+ });
320
+ newMqa.audioReceive.push(audioReceiver);
321
+ (0, _mqaUtil.getAudioReceiverMqa)({
322
+ audioReceiver: audioShareReceiver,
323
+ statsResults: this.statsResults,
324
+ lastMqaDataSent: this.lastMqaDataSent,
325
+ baseMediaType: 'audio-share-recv'
326
+ });
327
+ newMqa.audioReceive.push(audioShareReceiver);
328
+ (0, _mqaUtil.getVideoSenderMqa)({
329
+ videoSender: videoSender,
330
+ statsResults: this.statsResults,
331
+ lastMqaDataSent: this.lastMqaDataSent,
332
+ baseMediaType: 'video-send'
333
+ });
334
+ newMqa.videoTransmit.push(videoSender);
335
+ (0, _mqaUtil.getVideoSenderMqa)({
336
+ videoSender: videoShareSender,
337
+ statsResults: this.statsResults,
338
+ lastMqaDataSent: this.lastMqaDataSent,
339
+ baseMediaType: 'video-share-send'
340
+ });
341
+ newMqa.videoTransmit.push(videoShareSender);
342
+ (0, _mqaUtil.getVideoReceiverMqa)({
343
+ videoReceiver: videoReceiver,
344
+ statsResults: this.statsResults,
345
+ lastMqaDataSent: this.lastMqaDataSent,
346
+ baseMediaType: 'video-recv'
347
+ });
348
+ newMqa.videoReceive.push(videoReceiver);
349
+ (0, _mqaUtil.getVideoReceiverMqa)({
350
+ videoReceiver: videoShareReceiver,
351
+ statsResults: this.statsResults,
352
+ lastMqaDataSent: this.lastMqaDataSent,
353
+ baseMediaType: 'video-share-recv'
354
+ });
355
+ newMqa.videoReceive.push(videoShareReceiver);
356
+
357
+ // Add stats for individual streams
241
358
  (0, _keys.default)(this.statsResults).forEach(function (mediaType) {
242
- if (mediaType.includes('audio-send') || mediaType.includes('audio-share-send')) {
243
- var audioSender = (0, _cloneDeep2.default)(_config.emptyAudioTransmit);
244
- (0, _mqaUtil.getAudioSenderMqa)({
245
- audioSender: audioSender,
359
+ if (mediaType.includes('audio-send')) {
360
+ var audioSenderStream = (0, _cloneDeep2.default)(_config.emptyAudioTransmitStream);
361
+ (0, _mqaUtil.getAudioSenderStreamMqa)({
362
+ audioSenderStream: audioSenderStream,
246
363
  statsResults: _this3.statsResults,
247
364
  lastMqaDataSent: _this3.lastMqaDataSent,
248
365
  mediaType: mediaType
249
366
  });
250
- newMqa.audioTransmit.push(audioSender);
251
- } else if (mediaType.includes('audio-recv') || mediaType.includes('audio-share-recv')) {
252
- var audioReceiver = (0, _cloneDeep2.default)(_config.emptyAudioReceive);
253
- (0, _mqaUtil.getAudioReceiverMqa)({
254
- audioReceiver: audioReceiver,
367
+ newMqa.audioTransmit[0].streams.push(audioSenderStream);
368
+ _this3.lastMqaDataSent[mediaType].send = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].send);
369
+ } else if (mediaType.includes('audio-share-send')) {
370
+ var _audioSenderStream = (0, _cloneDeep2.default)(_config.emptyAudioTransmitStream);
371
+ (0, _mqaUtil.getAudioSenderStreamMqa)({
372
+ audioSenderStream: _audioSenderStream,
255
373
  statsResults: _this3.statsResults,
256
374
  lastMqaDataSent: _this3.lastMqaDataSent,
257
375
  mediaType: mediaType
258
376
  });
259
- newMqa.audioReceive.push(audioReceiver);
260
- } else if (mediaType.includes('video-send') || mediaType.includes('video-share-send')) {
261
- var videoSender = (0, _cloneDeep2.default)(_config.emptyVideoTransmit);
262
- (0, _mqaUtil.getVideoSenderMqa)({
263
- videoSender: videoSender,
377
+ newMqa.audioTransmit[1].streams.push(_audioSenderStream);
378
+ _this3.lastMqaDataSent[mediaType].send = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].send);
379
+ } else if (mediaType.includes('audio-recv')) {
380
+ var audioReceiverStream = (0, _cloneDeep2.default)(_config.emptyAudioReceiveStream);
381
+ (0, _mqaUtil.getAudioReceiverStreamMqa)({
382
+ audioReceiverStream: audioReceiverStream,
264
383
  statsResults: _this3.statsResults,
265
384
  lastMqaDataSent: _this3.lastMqaDataSent,
266
385
  mediaType: mediaType
267
386
  });
268
- newMqa.videoTransmit.push(videoSender);
269
- } else if (mediaType.includes('video-recv') || mediaType.includes('video-share-recv')) {
270
- var videoReceiver = (0, _cloneDeep2.default)(_config.emptyVideoReceive);
271
- (0, _mqaUtil.getVideoReceiverMqa)({
272
- videoReceiver: videoReceiver,
387
+ newMqa.audioReceive[0].streams.push(audioReceiverStream);
388
+ _this3.lastMqaDataSent[mediaType].recv = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].recv);
389
+ } else if (mediaType.includes('audio-share-recv')) {
390
+ var _audioReceiverStream = (0, _cloneDeep2.default)(_config.emptyAudioReceiveStream);
391
+ (0, _mqaUtil.getAudioReceiverStreamMqa)({
392
+ audioReceiverStream: _audioReceiverStream,
273
393
  statsResults: _this3.statsResults,
274
394
  lastMqaDataSent: _this3.lastMqaDataSent,
275
395
  mediaType: mediaType
276
396
  });
277
- newMqa.videoReceive.push(videoReceiver);
397
+ newMqa.audioReceive[1].streams.push(_audioReceiverStream);
398
+ _this3.lastMqaDataSent[mediaType].recv = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].recv);
399
+ } else if (mediaType.includes('video-send')) {
400
+ var videoSenderStream = (0, _cloneDeep2.default)(_config.emptyVideoTransmitStream);
401
+ (0, _mqaUtil.getVideoSenderStreamMqa)({
402
+ videoSenderStream: videoSenderStream,
403
+ statsResults: _this3.statsResults,
404
+ lastMqaDataSent: _this3.lastMqaDataSent,
405
+ mediaType: mediaType
406
+ });
407
+ newMqa.videoTransmit[0].streams.push(videoSenderStream);
408
+ _this3.lastMqaDataSent[mediaType].send = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].send);
409
+ } else if (mediaType.includes('video-share-send')) {
410
+ var _videoSenderStream = (0, _cloneDeep2.default)(_config.emptyVideoTransmitStream);
411
+ (0, _mqaUtil.getVideoSenderStreamMqa)({
412
+ videoSenderStream: _videoSenderStream,
413
+ statsResults: _this3.statsResults,
414
+ lastMqaDataSent: _this3.lastMqaDataSent,
415
+ mediaType: mediaType
416
+ });
417
+ newMqa.videoTransmit[1].streams.push(_videoSenderStream);
418
+ _this3.lastMqaDataSent[mediaType].send = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].send);
419
+ } else if (mediaType.includes('video-recv')) {
420
+ var videoReceiverStream = (0, _cloneDeep2.default)(_config.emptyVideoReceiveStream);
421
+ (0, _mqaUtil.getVideoReceiverStreamMqa)({
422
+ videoReceiverStream: videoReceiverStream,
423
+ statsResults: _this3.statsResults,
424
+ lastMqaDataSent: _this3.lastMqaDataSent,
425
+ mediaType: mediaType
426
+ });
427
+ newMqa.videoReceive[0].streams.push(videoReceiverStream);
428
+ _this3.lastMqaDataSent[mediaType].recv = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].recv);
429
+ } else if (mediaType.includes('video-share-recv')) {
430
+ var _videoReceiverStream = (0, _cloneDeep2.default)(_config.emptyVideoReceiveStream);
431
+ (0, _mqaUtil.getVideoReceiverStreamMqa)({
432
+ videoReceiverStream: _videoReceiverStream,
433
+ statsResults: _this3.statsResults,
434
+ lastMqaDataSent: _this3.lastMqaDataSent,
435
+ mediaType: mediaType
436
+ });
437
+ newMqa.videoReceive[1].streams.push(_videoReceiverStream);
438
+ _this3.lastMqaDataSent[mediaType].recv = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].recv);
278
439
  }
279
440
  });
280
- newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress[0];
441
+ newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;
281
442
 
282
443
  // Adding peripheral information
283
- newMqa.intervalMetadata.peripherals = [];
284
444
  newMqa.intervalMetadata.peripherals.push({
285
445
  information: _constants._UNKNOWN_,
286
446
  name: _constants.MEDIA_DEVICES.SPEAKER
287
447
  });
288
448
  if (this.statsResults['audio-send']) {
289
- var _this$statsResults$au;
290
449
  newMqa.intervalMetadata.peripherals.push({
291
- information: (_this$statsResults$au = this.statsResults['audio-send']) === null || _this$statsResults$au === void 0 ? void 0 : _this$statsResults$au.trackLabel,
450
+ information: this.statsResults['audio-send'].trackLabel || _constants._UNKNOWN_,
292
451
  name: _constants.MEDIA_DEVICES.MICROPHONE
293
452
  });
294
453
  }
295
454
  if (this.statsResults['video-send']) {
296
- var _this$statsResults$vi;
297
455
  newMqa.intervalMetadata.peripherals.push({
298
- information: (_this$statsResults$vi = this.statsResults['video-send']) === null || _this$statsResults$vi === void 0 ? void 0 : _this$statsResults$vi.trackLabel,
456
+ information: this.statsResults['video-send'].trackLabel || _constants._UNKNOWN_,
299
457
  name: _constants.MEDIA_DEVICES.CAMERA
300
458
  });
301
459
  }
@@ -327,6 +485,18 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
327
485
  this.mediaConnection = mediaConnection;
328
486
  }
329
487
 
488
+ /**
489
+ * Returns the local IP address for diagnostics.
490
+ * this is the local IP of the interface used for the current media connection
491
+ * a host can have many local Ip Addresses
492
+ * @returns {string | undefined} The local IP address.
493
+ */
494
+ }, {
495
+ key: "getLocalIpAddress",
496
+ value: function getLocalIpAddress() {
497
+ return this.localIpAddress;
498
+ }
499
+
330
500
  /**
331
501
  * Starts the stats analyzer on interval
332
502
  *
@@ -350,7 +520,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
350
520
  _this4.sendMqaData();
351
521
  _this4.mqaInterval = setInterval(function () {
352
522
  _this4.sendMqaData();
353
- }, _constants.MQA_INTEVAL);
523
+ }, _constants.MQA_INTERVAL);
354
524
  });
355
525
  }
356
526
  return _promise.default.resolve();
@@ -411,22 +581,6 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
411
581
  } else if (!isSender && !this.statsResults[type].recv) {
412
582
  this.statsResults[type].recv = (0, _cloneDeep2.default)(emptyReceiver);
413
583
  }
414
- if (!this.statsResults.resolutions[type]) {
415
- this.statsResults.resolutions[type] = {};
416
- }
417
- if (isSender && !this.statsResults.resolutions[type].send) {
418
- this.statsResults.resolutions[type].send = (0, _cloneDeep2.default)(emptySender);
419
- } else if (!isSender && !this.statsResults.resolutions[type].recv) {
420
- this.statsResults.resolutions[type].recv = (0, _cloneDeep2.default)(emptyReceiver);
421
- }
422
- if (!this.statsResults.internal[type]) {
423
- this.statsResults.internal[type] = {};
424
- }
425
- if (isSender && !this.statsResults.internal[type].send) {
426
- this.statsResults.internal[type].send = (0, _cloneDeep2.default)(emptySender);
427
- } else if (!isSender && !this.statsResults.internal[type].recv) {
428
- this.statsResults.internal[type].recv = (0, _cloneDeep2.default)(emptyReceiver);
429
- }
430
584
  switch (getStatsResult.type) {
431
585
  case 'outbound-rtp':
432
586
  this.processOutboundRTPResult(getStatsResult, type);
@@ -434,13 +588,9 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
434
588
  case 'inbound-rtp':
435
589
  this.processInboundRTPResult(getStatsResult, type);
436
590
  break;
437
- case 'track':
438
- this.processTrackResult(getStatsResult, type);
439
- break;
440
591
  case 'remote-inbound-rtp':
441
592
  case 'remote-outbound-rtp':
442
- // @ts-ignore
443
- this.compareSentAndReceived(getStatsResult, type, isSender);
593
+ this.compareSentAndReceived(getStatsResult, type);
444
594
  break;
445
595
  case 'remotecandidate':
446
596
  case 'remote-candidate':
@@ -450,7 +600,6 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
450
600
  this.parseCandidate(getStatsResult, type, isSender, false);
451
601
  break;
452
602
  case 'media-source':
453
- // @ts-ignore
454
603
  this.parseAudioSource(getStatsResult, type);
455
604
  break;
456
605
  default:
@@ -471,15 +620,26 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
471
620
  value: function filterAndParseGetStatsResults(statsItem, type, isSender) {
472
621
  var _this6 = this;
473
622
  var types = _constants.DEFAULT_GET_STATS_FILTER.types;
623
+
624
+ // get the successful candidate pair before parsing stats.
625
+ statsItem.report.forEach(function (report) {
626
+ if (report.type === 'candidate-pair' && report.state === 'succeeded') {
627
+ _this6.successfulCandidatePair = report;
628
+ }
629
+ });
474
630
  statsItem.report.forEach(function (result) {
475
631
  if (types.includes(result.type)) {
476
632
  _this6.parseGetStatsResult(result, type, isSender);
477
633
  }
478
634
  });
479
635
  if (this.statsResults[type]) {
636
+ var _this$successfulCandi2, _this$statsResults;
480
637
  this.statsResults[type].direction = statsItem.currentDirection;
481
638
  this.statsResults[type].trackLabel = statsItem.localTrackLabel;
482
639
  this.statsResults[type].csi = statsItem.csi;
640
+ this.extractAndSetLocalIpAddressInfoForDiagnostics((_this$successfulCandi2 = this.successfulCandidatePair) === null || _this$successfulCandi2 === void 0 ? void 0 : _this$successfulCandi2.localCandidateId, (_this$statsResults = this.statsResults) === null || _this$statsResults === void 0 ? void 0 : _this$statsResults.candidates);
641
+ // reset the successful candidate pair.
642
+ this.successfulCandidatePair = {};
483
643
  }
484
644
  }
485
645
 
@@ -544,138 +704,77 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
544
704
  return prev + (((_this7$lastStatsResul = _this7.lastStatsResults[cur]) === null || _this7$lastStatsResul === void 0 ? void 0 : _this7$lastStatsResul.recv[value]) || 0);
545
705
  }, 0);
546
706
  };
547
- var getCurrentResolutionsStatsTotals = function getCurrentResolutionsStatsTotals(keyPrefix, value) {
548
- return (0, _keys.default)(_this7.statsResults).filter(function (key) {
549
- return key.startsWith(keyPrefix);
550
- }).reduce(function (prev, cur) {
551
- var _this7$statsResults$r;
552
- return prev + (((_this7$statsResults$r = _this7.statsResults.resolutions[cur]) === null || _this7$statsResults$r === void 0 ? void 0 : _this7$statsResults$r.recv[value]) || 0);
553
- }, 0);
554
- };
555
- var getPreviousResolutionsStatsTotals = function getPreviousResolutionsStatsTotals(keyPrefix, value) {
556
- return (0, _keys.default)(_this7.statsResults).filter(function (key) {
557
- return key.startsWith(keyPrefix);
558
- }).reduce(function (prev, cur) {
559
- var _this7$lastStatsResul2;
560
- return prev + (((_this7$lastStatsResul2 = _this7.lastStatsResults.resolutions[cur]) === null || _this7$lastStatsResul2 === void 0 ? void 0 : _this7$lastStatsResul2.recv[value]) || 0);
561
- }, 0);
562
- };
563
- if (this.meetingMediaStatus.expected.sendAudio && this.lastStatsResults['audio-send']) {
707
+
708
+ // Audio Transmit
709
+ if (this.lastStatsResults['audio-send']) {
564
710
  // compare audio stats sent
565
711
  // NOTE: relies on there being only one sender.
566
712
  var currentStats = this.statsResults['audio-send'].send;
567
713
  var previousStats = this.lastStatsResults['audio-send'].send;
568
- if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
714
+ if (this.meetingMediaStatus.expected.sendAudio && currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
569
715
  _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent", currentStats.totalPacketsSent);
570
716
  } else {
571
- if (currentStats.totalAudioEnergy === previousStats.totalAudioEnergy || currentStats.totalAudioEnergy === 0) {
717
+ if (this.meetingMediaStatus.expected.sendAudio && currentStats.totalAudioEnergy === previousStats.totalAudioEnergy || currentStats.totalAudioEnergy === 0) {
572
718
  _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present", currentStats.totalAudioEnergy);
573
719
  }
574
- if (currentStats.audioLevel === 0) {
720
+ if (this.meetingMediaStatus.expected.sendAudio && currentStats.audioLevel === 0) {
575
721
  _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> audio level is 0 for the user");
576
722
  }
577
723
  }
578
724
  this.emitStartStopEvents('audio', previousStats.totalPacketsSent, currentStats.totalPacketsSent, true);
579
725
  }
580
- if (this.meetingMediaStatus.expected.receiveAudio) {
581
- // compare audio stats received
582
- var currentPacketsReceived = getCurrentStatsTotals('audio-recv', 'totalPacketsReceived');
583
- var previousPacketsReceived = getPreviousStatsTotals('audio-recv', 'totalPacketsReceived');
584
- var currentSamplesReceived = getCurrentStatsTotals('audio-recv', 'totalSamplesReceived');
585
- var previousSamplesReceived = getPreviousStatsTotals('audio-recv', 'totalSamplesReceived');
586
- if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
587
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received", currentPacketsReceived);
588
- } else if (currentSamplesReceived === previousSamplesReceived || currentSamplesReceived === 0) {
589
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio samples received", currentSamplesReceived);
590
- }
591
- this.emitStartStopEvents('audio', previousPacketsReceived, currentPacketsReceived, false);
592
- }
593
- if (this.meetingMediaStatus.expected.sendVideo && this.lastStatsResults['video-send']) {
726
+
727
+ // Audio Receive
728
+ var currentAudioPacketsReceived = getCurrentStatsTotals('audio-recv', 'totalPacketsReceived');
729
+ var previousAudioPacketsReceived = getPreviousStatsTotals('audio-recv', 'totalPacketsReceived');
730
+ this.emitStartStopEvents('audio', previousAudioPacketsReceived, currentAudioPacketsReceived, false);
731
+
732
+ // Video Transmit
733
+ if (this.lastStatsResults['video-send']) {
594
734
  // compare video stats sent
595
735
  var _currentStats = this.statsResults['video-send'].send;
596
736
  var _previousStats = this.lastStatsResults['video-send'].send;
597
- if (_currentStats.totalPacketsSent === _previousStats.totalPacketsSent || _currentStats.totalPacketsSent === 0) {
737
+ if (this.meetingMediaStatus.expected.sendVideo && (_currentStats.totalPacketsSent === _previousStats.totalPacketsSent || _currentStats.totalPacketsSent === 0)) {
598
738
  _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent", _currentStats.totalPacketsSent);
599
739
  } else {
600
- if (_currentStats.framesEncoded === _previousStats.framesEncoded || _currentStats.framesEncoded === 0) {
740
+ if (this.meetingMediaStatus.expected.sendVideo && (_currentStats.framesEncoded === _previousStats.framesEncoded || _currentStats.framesEncoded === 0)) {
601
741
  _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded", _currentStats.framesEncoded);
602
742
  }
603
- if (this.statsResults.resolutions['video-send'].send.framesSent === this.lastStatsResults.resolutions['video-send'].send.framesSent || this.statsResults.resolutions['video-send'].send.framesSent === 0) {
604
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent", this.statsResults.resolutions['video-send'].send.framesSent);
743
+ if (this.meetingMediaStatus.expected.sendVideo && (this.statsResults['video-send'].send.framesSent === this.lastStatsResults['video-send'].send.framesSent || this.statsResults['video-send'].send.framesSent === 0)) {
744
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent", this.statsResults['video-send'].send.framesSent);
605
745
  }
606
746
  }
607
747
  this.emitStartStopEvents('video', _previousStats.framesSent, _currentStats.framesSent, true);
608
748
  }
609
- if (this.meetingMediaStatus.expected.receiveVideo) {
610
- // compare video stats received
611
- var _currentPacketsReceived = getCurrentStatsTotals('video-recv', 'totalPacketsReceived');
612
- var _previousPacketsReceived = getPreviousStatsTotals('video-recv', 'totalPacketsReceived');
613
- var currentFramesReceived = getCurrentResolutionsStatsTotals('video-recv', 'framesReceived');
614
- var previousFramesReceived = getPreviousResolutionsStatsTotals('video-recv', 'framesReceived');
615
- var currentFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');
616
- var previousFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');
617
- var currentFramesDropped = getCurrentResolutionsStatsTotals('video-recv', 'framesDropped');
618
- var previousFramesDropped = getPreviousResolutionsStatsTotals('video-recv', 'framesDropped');
619
- if (_currentPacketsReceived === _previousPacketsReceived || _currentPacketsReceived === 0) {
620
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received", _currentPacketsReceived);
621
- } else {
622
- if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
623
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video frames received", currentFramesReceived);
624
- }
625
- if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
626
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded", currentFramesDecoded);
627
- }
628
- if (currentFramesDropped - previousFramesDropped > 10) {
629
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped", currentFramesDropped - previousFramesDropped);
630
- }
631
- }
632
- this.emitStartStopEvents('video', previousFramesDecoded, currentFramesDecoded, false);
633
- }
634
- if (this.meetingMediaStatus.expected.sendShare && this.lastStatsResults['video-share-send']) {
749
+
750
+ // Video Receive
751
+ var currentVideoFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');
752
+ var previousVideoFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');
753
+ this.emitStartStopEvents('video', previousVideoFramesDecoded, currentVideoFramesDecoded, false);
754
+
755
+ // Share Transmit
756
+ if (this.lastStatsResults['video-share-send']) {
635
757
  // compare share stats sent
636
758
 
637
759
  var _currentStats2 = this.statsResults['video-share-send'].send;
638
760
  var _previousStats2 = this.lastStatsResults['video-share-send'].send;
639
- if (_currentStats2.totalPacketsSent === _previousStats2.totalPacketsSent || _currentStats2.totalPacketsSent === 0) {
761
+ if (this.meetingMediaStatus.expected.sendShare && (_currentStats2.totalPacketsSent === _previousStats2.totalPacketsSent || _currentStats2.totalPacketsSent === 0)) {
640
762
  _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent", _currentStats2.totalPacketsSent);
641
763
  } else {
642
- if (_currentStats2.framesEncoded === _previousStats2.framesEncoded || _currentStats2.framesEncoded === 0) {
764
+ if (this.meetingMediaStatus.expected.sendShare && (_currentStats2.framesEncoded === _previousStats2.framesEncoded || _currentStats2.framesEncoded === 0)) {
643
765
  _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded", _currentStats2.framesEncoded);
644
766
  }
645
- if (this.statsResults.resolutions['video-share-send'].send.framesSent === this.lastStatsResults.resolutions['video-share-send'].send.framesSent || this.statsResults.resolutions['video-share-send'].send.framesSent === 0) {
646
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames sent", this.statsResults.resolutions['video-share-send'].send.framesSent);
767
+ if (this.meetingMediaStatus.expected.sendShare && (this.statsResults['video-share-send'].send.framesSent === this.lastStatsResults['video-share-send'].send.framesSent || this.statsResults['video-share-send'].send.framesSent === 0)) {
768
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames sent", this.statsResults['video-share-send'].send.framesSent);
647
769
  }
648
770
  }
771
+ this.emitStartStopEvents('share', _previousStats2.framesSent, _currentStats2.framesSent, true);
649
772
  }
650
- if (this.meetingMediaStatus.expected.sendShare) {
651
- // TODO:need to check receive share value
652
- // compare share stats received
653
- var _currentPacketsReceived2 = getCurrentStatsTotals('video-share-recv', 'totalPacketsReceived');
654
- var _previousPacketsReceived2 = getPreviousStatsTotals('video-share-recv', 'totalPacketsReceived');
655
- var _currentFramesReceived = getCurrentResolutionsStatsTotals('video-share-recv', 'framesReceived');
656
- var _previousFramesReceived = getPreviousResolutionsStatsTotals('video-share-recv', 'framesReceived');
657
- var _currentFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');
658
- var _previousFramesDecoded = getPreviousStatsTotals('video-share-recv', 'framesDecoded');
659
- var _currentFramesDropped = getCurrentResolutionsStatsTotals('video-share-recv', 'framesDropped');
660
- var _previousFramesDropped = getPreviousResolutionsStatsTotals('video-share-recv', 'framesDropped');
661
- if (_currentPacketsReceived2 === _previousPacketsReceived2 || _currentPacketsReceived2 === 0) {
662
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received", _currentPacketsReceived2);
663
- } else {
664
- if (_currentFramesReceived === _previousFramesReceived || _currentFramesReceived === 0) {
665
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames received", _currentFramesReceived);
666
- }
667
- if (_currentFramesDecoded === _previousFramesDecoded || _currentFramesDecoded === 0) {
668
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded", _currentFramesDecoded);
669
- }
670
- if (_currentFramesDropped - _previousFramesDropped > 10) {
671
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped", _currentFramesDropped - _previousFramesDropped);
672
- }
673
- }
674
773
 
675
- // we are not calling emitStartStopEvents() for sending or receiving share because sharing is often started and stopped
676
- // in meetings and this.meetingMediaStatus.expected values can be out of sync with the actual packet flow
677
- // so we would send "sharing stopped" events incorrectly
678
- }
774
+ // Share receive
775
+ var currentShareFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');
776
+ var previousShareFramesDecoded = getPreviousStatsTotals('video-share-recv', 'framesDecoded');
777
+ this.emitStartStopEvents('share', previousShareFramesDecoded, currentShareFramesDecoded, false);
679
778
  }
680
779
  }
681
780
 
@@ -758,33 +857,15 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
758
857
  if (result.bytesSent) {
759
858
  var kilobytes = 0;
760
859
  if (result.frameWidth && result.frameHeight) {
761
- this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
762
- this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
763
- this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
764
- this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
765
- }
766
- if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {
767
- this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
768
- }
769
- if (!this.statsResults.internal[mediaType][sendrecvType].framesEncoded) {
770
- this.statsResults.internal[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
771
- }
772
- if (!this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded) {
773
- this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;
860
+ this.statsResults[mediaType][sendrecvType].width = result.frameWidth;
861
+ this.statsResults[mediaType][sendrecvType].height = result.frameHeight;
862
+ this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;
863
+ this.statsResults[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
774
864
  }
775
- var bytes = result.bytesSent - this.statsResults.internal[mediaType][sendrecvType].prevBytesSent;
776
- this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
777
- kilobytes = bytes / 1024;
778
865
  this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
779
- this.statsResults[mediaType].bytesSent = kilobytes;
780
- this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded - this.statsResults.internal[mediaType][sendrecvType].framesEncoded;
781
- this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded - this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded;
782
- this.statsResults.internal[mediaType].outboundRtpId = result.id;
783
- if (!this.statsResults.internal[mediaType][sendrecvType].packetsSent) {
784
- this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
785
- }
786
- this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent - this.statsResults.internal[mediaType][sendrecvType].packetsSent;
787
- this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
866
+ this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
867
+ this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;
868
+ this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent;
788
869
 
789
870
  // Data saved to send MQA metrics
790
871
 
@@ -819,50 +900,53 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
819
900
  if (result.bytesReceived) {
820
901
  var kilobytes = 0;
821
902
  var receiveSlot = this.receiveSlotCallback(result.ssrc);
903
+ var sourceState = receiveSlot === null || receiveSlot === void 0 ? void 0 : receiveSlot.sourceState;
822
904
  var idAndCsi = receiveSlot ? "id: \"".concat(receiveSlot.id || '', "\"").concat(receiveSlot.csi ? " and csi: ".concat(receiveSlot.csi) : '') : '';
823
- if (result.frameWidth && result.frameHeight) {
824
- this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
825
- this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
826
- this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
827
- }
828
- if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
829
- this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;
830
- }
831
- if (!this.statsResults.internal[mediaType][sendrecvType].pliCount) {
832
- this.statsResults.internal[mediaType][sendrecvType].pliCount = result.pliCount;
833
- }
834
- if (!this.statsResults.internal[mediaType][sendrecvType].packetsLost) {
835
- this.statsResults.internal[mediaType][sendrecvType].packetsLost = result.packetsLost;
836
- }
837
- if (!this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived) {
838
- this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
839
- }
840
- if (!this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp) {
841
- this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp = result.lastPacketReceivedTimestamp;
842
- }
843
- var bytes = result.bytesReceived - this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived;
844
- this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;
905
+ var bytes = result.bytesReceived - this.statsResults[mediaType][sendrecvType].totalBytesReceived;
845
906
  kilobytes = bytes / 1024;
846
907
  this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
847
- this.statsResults[mediaType].bytesReceived = kilobytes.toFixed(1);
848
- this.statsResults[mediaType][sendrecvType].pliCount = result.pliCount - this.statsResults.internal[mediaType][sendrecvType].pliCount;
849
- this.statsResults[mediaType][sendrecvType].currentPacketsLost = result.packetsLost - this.statsResults.internal[mediaType][sendrecvType].packetsLost;
850
- if (this.statsResults[mediaType][sendrecvType].currentPacketsLost < 0) {
851
- this.statsResults[mediaType][sendrecvType].currentPacketsLost = 0;
908
+ var currentPacketsLost = result.packetsLost - this.statsResults[mediaType][sendrecvType].totalPacketsLost;
909
+ if (currentPacketsLost < 0) {
910
+ currentPacketsLost = 0;
852
911
  }
853
- this.statsResults[mediaType][sendrecvType].packetsReceived = result.packetsReceived - this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived;
854
- this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
855
- if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {
856
- if (receiveSlot) {
857
- _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ".concat(idAndCsi), this.statsResults[mediaType][sendrecvType].packetsReceived);
912
+ var packetsReceivedDiff = result.packetsReceived - this.statsResults[mediaType][sendrecvType].totalPacketsReceived;
913
+ this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
914
+ if (packetsReceivedDiff === 0) {
915
+ if (receiveSlot && sourceState === 'live') {
916
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No packets received for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total packets received on slot: "), result.packetsReceived);
917
+ }
918
+ }
919
+ if (mediaType.startsWith('video') || mediaType.startsWith('share')) {
920
+ var videoFramesReceivedDiff = result.framesReceived - this.statsResults[mediaType][sendrecvType].framesReceived;
921
+ if (videoFramesReceivedDiff === 0) {
922
+ if (receiveSlot && sourceState === 'live') {
923
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No frames received for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total frames received on slot: "), result.framesReceived);
924
+ }
925
+ }
926
+ var videoFramesDecodedDiff = result.framesDecoded - this.statsResults[mediaType][sendrecvType].framesDecoded;
927
+ if (videoFramesDecodedDiff === 0) {
928
+ if (receiveSlot && sourceState === 'live') {
929
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No frames decoded for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total frames decoded on slot: "), result.framesDecoded);
930
+ }
931
+ }
932
+ var videoFramesDroppedDiff = result.framesDropped - this.statsResults[mediaType][sendrecvType].framesDropped;
933
+ if (videoFramesDroppedDiff > 10) {
934
+ if (receiveSlot && sourceState === 'live') {
935
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> Frames dropped for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total frames dropped on slot: "), result.framesDropped);
936
+ }
858
937
  }
859
938
  }
860
939
 
861
940
  // Check the over all packet Lost ratio
862
- this.statsResults[mediaType][sendrecvType].currentPacketLossRatio = this.statsResults[mediaType][sendrecvType].currentPacketsLost > 0 ? this.statsResults[mediaType][sendrecvType].currentPacketsLost / (this.statsResults[mediaType][sendrecvType].packetsReceived + this.statsResults[mediaType][sendrecvType].currentPacketsLost) : 0;
941
+ this.statsResults[mediaType][sendrecvType].currentPacketLossRatio = currentPacketsLost > 0 ? currentPacketsLost / (packetsReceivedDiff + currentPacketsLost) : 0;
863
942
  if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
864
943
  _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ".concat(idAndCsi), this.statsResults[mediaType][sendrecvType].currentPacketLossRatio);
865
944
  }
945
+ if (result.frameWidth && result.frameHeight) {
946
+ this.statsResults[mediaType][sendrecvType].width = result.frameWidth;
947
+ this.statsResults[mediaType][sendrecvType].height = result.frameHeight;
948
+ this.statsResults[mediaType][sendrecvType].framesReceived = result.framesReceived;
949
+ }
866
950
 
867
951
  // TODO: check the packet loss value is negative values here
868
952
 
@@ -878,6 +962,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
878
962
  this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;
879
963
  this.statsResults[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
880
964
  this.statsResults[mediaType][sendrecvType].keyFramesDecoded = result.keyFramesDecoded;
965
+ this.statsResults[mediaType][sendrecvType].framesDropped = result.framesDropped;
881
966
  this.statsResults[mediaType][sendrecvType].decoderImplementation = result.decoderImplementation;
882
967
  this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
883
968
  this.statsResults[mediaType][sendrecvType].fecPacketsDiscarded = result.fecPacketsDiscarded;
@@ -897,49 +982,19 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
897
982
  }
898
983
 
899
984
  /**
900
- * Processes remote and local candidate result and stores
985
+ * extracts the local Ip address from the statsResult object by looking at stats results candidates
986
+ * and matches that ID with the successful candidate pair. It looks at the type of local candidate it is
987
+ * and then extracts the IP address from the relatedAddress or address property based on conditions known in webrtc
988
+ * note, there are known incompatibilities and it is possible for this to set undefined, or for the IP address to be the public IP address
989
+ * for example, firefox does not set the relayProtocol, and if the user is behind a NAT it might be the public IP
901
990
  * @private
902
- * @param {*} result
903
- * @param {*} type
904
- * @param {boolean} isSender
905
- * @param {boolean} isRemote
906
- *
991
+ * @param {string} successfulCandidatePairId - The ID of the successful candidate pair.
992
+ * @param {Object} candidates - the stats result candidates
907
993
  * @returns {void}
908
994
  */
909
995
  }, {
910
- key: "processTrackResult",
996
+ key: "compareSentAndReceived",
911
997
  value:
912
- /**
913
- * Process Track results
914
- *
915
- * @private
916
- * @param {*} result
917
- * @param {*} mediaType
918
- * @returns {void}
919
- * @memberof StatsAnalyzer
920
- */
921
- function processTrackResult(result, mediaType) {
922
- if (!result || result.type !== 'track') {
923
- return;
924
- }
925
- var sendrecvType = result.remoteSource === true ? _constants.STATS.RECEIVE_DIRECTION : _constants.STATS.SEND_DIRECTION;
926
- if (sendrecvType === _constants.STATS.RECEIVE_DIRECTION) {
927
- this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
928
- this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
929
- this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;
930
- }
931
- if (result.trackIdentifier && !mediaType.includes('audio')) {
932
- this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier = result.trackIdentifier;
933
- var jitterBufferDelay = result && result.jitterBufferDelay;
934
- var jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;
935
- this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay = jitterBufferEmittedCount && +jitterBufferDelay / +jitterBufferEmittedCount;
936
-
937
- // Used to calculate the jitter
938
- this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay = result.jitterBufferDelay;
939
- this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount = result.jitterBufferEmittedCount;
940
- }
941
- }
942
-
943
998
  /**
944
999
  *
945
1000
  * @private
@@ -948,19 +1003,13 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
948
1003
  * @returns {void}
949
1004
  * @memberof StatsAnalyzer
950
1005
  */
951
- }, {
952
- key: "compareSentAndReceived",
953
- value: function compareSentAndReceived(result, type) {
1006
+ function compareSentAndReceived(result, type) {
954
1007
  // Don't compare on transceivers without a sender.
955
- if (!type || !this.statsResults.internal[type].send) {
1008
+ if (!type || !this.statsResults[type].send) {
956
1009
  return;
957
1010
  }
958
1011
  var mediaType = type;
959
- if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) {
960
- this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
961
- }
962
- var currentPacketLoss = result.packetsLost - this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver;
963
- this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
1012
+ var currentPacketLoss = result.packetsLost - this.statsResults[mediaType].send.totalPacketsLostOnReceiver;
964
1013
  this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;
965
1014
  this.statsResults[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
966
1015
  this.statsResults[mediaType].send.meanRemoteJitter.push(result.jitter);