@webex/plugin-meetings 2.37.0 → 2.37.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/common/browser-detection.js +1 -20
  4. package/dist/common/browser-detection.js.map +1 -1
  5. package/dist/common/collection.js +5 -20
  6. package/dist/common/collection.js.map +1 -1
  7. package/dist/common/config.js +0 -7
  8. package/dist/common/config.js.map +1 -1
  9. package/dist/common/errors/captcha-error.js +5 -26
  10. package/dist/common/errors/captcha-error.js.map +1 -1
  11. package/dist/common/errors/intent-to-join.js +5 -26
  12. package/dist/common/errors/intent-to-join.js.map +1 -1
  13. package/dist/common/errors/join-meeting.js +6 -27
  14. package/dist/common/errors/join-meeting.js.map +1 -1
  15. package/dist/common/errors/media.js +5 -26
  16. package/dist/common/errors/media.js.map +1 -1
  17. package/dist/common/errors/parameter.js +5 -33
  18. package/dist/common/errors/parameter.js.map +1 -1
  19. package/dist/common/errors/password-error.js +5 -26
  20. package/dist/common/errors/password-error.js.map +1 -1
  21. package/dist/common/errors/permission.js +4 -25
  22. package/dist/common/errors/permission.js.map +1 -1
  23. package/dist/common/errors/reconnection-in-progress.js +0 -17
  24. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  25. package/dist/common/errors/reconnection.js +5 -26
  26. package/dist/common/errors/reconnection.js.map +1 -1
  27. package/dist/common/errors/stats.js +5 -26
  28. package/dist/common/errors/stats.js.map +1 -1
  29. package/dist/common/errors/webex-errors.js +7 -46
  30. package/dist/common/errors/webex-errors.js.map +1 -1
  31. package/dist/common/errors/webex-meetings-error.js +1 -24
  32. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  33. package/dist/common/events/events-scope.js +0 -22
  34. package/dist/common/events/events-scope.js.map +1 -1
  35. package/dist/common/events/events.js +0 -23
  36. package/dist/common/events/events.js.map +1 -1
  37. package/dist/common/events/trigger-proxy.js +0 -12
  38. package/dist/common/events/trigger-proxy.js.map +1 -1
  39. package/dist/common/events/util.js +0 -15
  40. package/dist/common/events/util.js.map +1 -1
  41. package/dist/common/logs/logger-config.js +0 -4
  42. package/dist/common/logs/logger-config.js.map +1 -1
  43. package/dist/common/logs/logger-proxy.js +1 -8
  44. package/dist/common/logs/logger-proxy.js.map +1 -1
  45. package/dist/common/logs/request.js +35 -61
  46. package/dist/common/logs/request.js.map +1 -1
  47. package/dist/common/queue.js +4 -14
  48. package/dist/common/queue.js.map +1 -1
  49. package/dist/config.js +1 -5
  50. package/dist/config.js.map +1 -1
  51. package/dist/constants.js +46 -42
  52. package/dist/constants.js.map +1 -1
  53. package/dist/index.js +1 -17
  54. package/dist/index.js.map +1 -1
  55. package/dist/locus-info/controlsUtils.js +10 -28
  56. package/dist/locus-info/controlsUtils.js.map +1 -1
  57. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  58. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  59. package/dist/locus-info/fullState.js +0 -15
  60. package/dist/locus-info/fullState.js.map +1 -1
  61. package/dist/locus-info/hostUtils.js +4 -12
  62. package/dist/locus-info/hostUtils.js.map +1 -1
  63. package/dist/locus-info/index.js +101 -193
  64. package/dist/locus-info/index.js.map +1 -1
  65. package/dist/locus-info/infoUtils.js +0 -37
  66. package/dist/locus-info/infoUtils.js.map +1 -1
  67. package/dist/locus-info/mediaSharesUtils.js +12 -38
  68. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  69. package/dist/locus-info/parser.js +87 -123
  70. package/dist/locus-info/parser.js.map +1 -1
  71. package/dist/locus-info/selfUtils.js +16 -81
  72. package/dist/locus-info/selfUtils.js.map +1 -1
  73. package/dist/media/index.js +74 -137
  74. package/dist/media/index.js.map +1 -1
  75. package/dist/media/properties.js +64 -110
  76. package/dist/media/properties.js.map +1 -1
  77. package/dist/media/util.js +3 -17
  78. package/dist/media/util.js.map +1 -1
  79. package/dist/mediaQualityMetrics/config.js +10 -12
  80. package/dist/mediaQualityMetrics/config.js.map +1 -1
  81. package/dist/meeting/effectsState.js +120 -192
  82. package/dist/meeting/effectsState.js.map +1 -1
  83. package/dist/meeting/in-meeting-actions.js +0 -13
  84. package/dist/meeting/in-meeting-actions.js.map +1 -1
  85. package/dist/meeting/index.js +812 -1487
  86. package/dist/meeting/index.js.map +1 -1
  87. package/dist/meeting/muteState.js +31 -78
  88. package/dist/meeting/muteState.js.map +1 -1
  89. package/dist/meeting/request.js +157 -227
  90. package/dist/meeting/request.js.map +1 -1
  91. package/dist/meeting/state.js +21 -31
  92. package/dist/meeting/state.js.map +1 -1
  93. package/dist/meeting/util.js +25 -169
  94. package/dist/meeting/util.js.map +1 -1
  95. package/dist/meeting-info/collection.js +3 -25
  96. package/dist/meeting-info/collection.js.map +1 -1
  97. package/dist/meeting-info/index.js +10 -33
  98. package/dist/meeting-info/index.js.map +1 -1
  99. package/dist/meeting-info/meeting-info-v2.js +179 -268
  100. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  101. package/dist/meeting-info/request.js +1 -16
  102. package/dist/meeting-info/request.js.map +1 -1
  103. package/dist/meeting-info/util.js +98 -183
  104. package/dist/meeting-info/util.js.map +1 -1
  105. package/dist/meeting-info/utilv2.js +137 -228
  106. package/dist/meeting-info/utilv2.js.map +1 -1
  107. package/dist/meetings/collection.js +3 -21
  108. package/dist/meetings/collection.js.map +1 -1
  109. package/dist/meetings/index.js +451 -570
  110. package/dist/meetings/index.js.map +1 -1
  111. package/dist/meetings/request.js +7 -30
  112. package/dist/meetings/request.js.map +1 -1
  113. package/dist/meetings/util.js +94 -148
  114. package/dist/meetings/util.js.map +1 -1
  115. package/dist/member/index.js +49 -89
  116. package/dist/member/index.js.map +1 -1
  117. package/dist/member/util.js +17 -68
  118. package/dist/member/util.js.map +1 -1
  119. package/dist/members/collection.js +2 -12
  120. package/dist/members/collection.js.map +1 -1
  121. package/dist/members/index.js +68 -184
  122. package/dist/members/index.js.map +1 -1
  123. package/dist/members/request.js +21 -56
  124. package/dist/members/request.js.map +1 -1
  125. package/dist/members/util.js +9 -38
  126. package/dist/members/util.js.map +1 -1
  127. package/dist/metrics/config.js +0 -2
  128. package/dist/metrics/config.js.map +1 -1
  129. package/dist/metrics/constants.js +1 -2
  130. package/dist/metrics/constants.js.map +1 -1
  131. package/dist/metrics/index.js +48 -136
  132. package/dist/metrics/index.js.map +1 -1
  133. package/dist/networkQualityMonitor/index.js +28 -57
  134. package/dist/networkQualityMonitor/index.js.map +1 -1
  135. package/dist/peer-connection-manager/index.js +60 -190
  136. package/dist/peer-connection-manager/index.js.map +1 -1
  137. package/dist/peer-connection-manager/util.js +10 -24
  138. package/dist/peer-connection-manager/util.js.map +1 -1
  139. package/dist/personal-meeting-room/index.js +10 -45
  140. package/dist/personal-meeting-room/index.js.map +1 -1
  141. package/dist/personal-meeting-room/request.js +2 -33
  142. package/dist/personal-meeting-room/request.js.map +1 -1
  143. package/dist/personal-meeting-room/util.js +0 -13
  144. package/dist/personal-meeting-room/util.js.map +1 -1
  145. package/dist/reachability/index.js +100 -166
  146. package/dist/reachability/index.js.map +1 -1
  147. package/dist/reachability/request.js +2 -18
  148. package/dist/reachability/request.js.map +1 -1
  149. package/dist/reactions/reactions.js +0 -2
  150. package/dist/reactions/reactions.js.map +1 -1
  151. package/dist/reactions/reactions.type.js +0 -5
  152. package/dist/reactions/reactions.type.js.map +1 -1
  153. package/dist/reconnection-manager/index.js +294 -468
  154. package/dist/reconnection-manager/index.js.map +1 -1
  155. package/dist/roap/collection.js +1 -12
  156. package/dist/roap/collection.js.map +1 -1
  157. package/dist/roap/handler.js +15 -85
  158. package/dist/roap/handler.js.map +1 -1
  159. package/dist/roap/index.js +42 -94
  160. package/dist/roap/index.js.map +1 -1
  161. package/dist/roap/request.js +81 -148
  162. package/dist/roap/request.js.map +1 -1
  163. package/dist/roap/state.js +2 -39
  164. package/dist/roap/state.js.map +1 -1
  165. package/dist/roap/turnDiscovery.js +8 -52
  166. package/dist/roap/turnDiscovery.js.map +1 -1
  167. package/dist/roap/util.js +0 -26
  168. package/dist/roap/util.js.map +1 -1
  169. package/dist/statsAnalyzer/global.js +0 -2
  170. package/dist/statsAnalyzer/global.js.map +1 -1
  171. package/dist/statsAnalyzer/index.js +68 -168
  172. package/dist/statsAnalyzer/index.js.map +1 -1
  173. package/dist/statsAnalyzer/mqaUtil.js +54 -53
  174. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  175. package/dist/transcription/index.js +13 -45
  176. package/dist/transcription/index.js.map +1 -1
  177. package/internal-README.md +7 -6
  178. package/package.json +17 -17
  179. package/src/common/browser-detection.ts +9 -6
  180. package/src/common/collection.ts +3 -1
  181. package/src/common/errors/captcha-error.ts +6 -6
  182. package/src/common/errors/intent-to-join.ts +6 -6
  183. package/src/common/errors/join-meeting.ts +12 -8
  184. package/src/common/errors/media.ts +6 -6
  185. package/src/common/errors/parameter.ts +9 -6
  186. package/src/common/errors/password-error.ts +6 -6
  187. package/src/common/errors/permission.ts +5 -5
  188. package/src/common/errors/reconnection.ts +6 -6
  189. package/src/common/errors/stats.ts +6 -6
  190. package/src/common/errors/webex-errors.ts +7 -5
  191. package/src/common/errors/webex-meetings-error.ts +1 -1
  192. package/src/common/events/events-scope.ts +5 -1
  193. package/src/common/events/events.ts +5 -1
  194. package/src/common/events/trigger-proxy.ts +8 -3
  195. package/src/common/events/util.ts +1 -2
  196. package/src/common/logs/logger-proxy.ts +21 -10
  197. package/src/common/logs/request.ts +11 -8
  198. package/src/config.ts +11 -11
  199. package/src/constants.ts +138 -119
  200. package/src/index.js +1 -1
  201. package/src/locus-info/controlsUtils.ts +34 -24
  202. package/src/locus-info/fullState.ts +15 -11
  203. package/src/locus-info/hostUtils.ts +4 -3
  204. package/src/locus-info/index.ts +25 -34
  205. package/src/locus-info/infoUtils.ts +12 -4
  206. package/src/locus-info/mediaSharesUtils.ts +4 -4
  207. package/src/locus-info/parser.ts +45 -68
  208. package/src/locus-info/selfUtils.ts +106 -57
  209. package/src/media/index.ts +118 -109
  210. package/src/media/properties.ts +26 -20
  211. package/src/media/util.ts +2 -2
  212. package/src/mediaQualityMetrics/config.ts +46 -46
  213. package/src/meeting/effectsState.ts +35 -35
  214. package/src/meeting/in-meeting-actions.ts +7 -3
  215. package/src/meeting/index.ts +1435 -1210
  216. package/src/meeting/muteState.ts +62 -31
  217. package/src/meeting/request.ts +160 -113
  218. package/src/meeting/state.ts +45 -30
  219. package/src/meeting/util.ts +131 -90
  220. package/src/meeting-info/collection.ts +2 -1
  221. package/src/meeting-info/index.ts +32 -30
  222. package/src/meeting-info/meeting-info-v2.ts +106 -108
  223. package/src/meeting-info/request.ts +9 -3
  224. package/src/meeting-info/util.ts +54 -46
  225. package/src/meeting-info/utilv2.ts +59 -53
  226. package/src/meetings/collection.ts +1 -1
  227. package/src/meetings/index.ts +513 -441
  228. package/src/meetings/request.ts +26 -24
  229. package/src/meetings/util.ts +26 -23
  230. package/src/member/index.ts +55 -49
  231. package/src/member/util.ts +26 -13
  232. package/src/members/collection.ts +0 -1
  233. package/src/members/index.ts +172 -121
  234. package/src/members/request.ts +46 -14
  235. package/src/members/util.ts +44 -42
  236. package/src/metrics/config.ts +254 -81
  237. package/src/metrics/constants.ts +0 -2
  238. package/src/metrics/index.ts +84 -71
  239. package/src/networkQualityMonitor/index.ts +20 -23
  240. package/src/peer-connection-manager/index.ts +321 -241
  241. package/src/peer-connection-manager/util.ts +4 -2
  242. package/src/personal-meeting-room/index.ts +12 -16
  243. package/src/personal-meeting-room/request.ts +10 -3
  244. package/src/personal-meeting-room/util.ts +3 -3
  245. package/src/reachability/index.ts +61 -59
  246. package/src/reachability/request.ts +36 -32
  247. package/src/reactions/reactions.ts +4 -4
  248. package/src/reactions/reactions.type.ts +2 -3
  249. package/src/reconnection-manager/index.ts +159 -98
  250. package/src/roap/collection.ts +2 -4
  251. package/src/roap/handler.ts +63 -32
  252. package/src/roap/index.ts +78 -58
  253. package/src/roap/request.ts +69 -54
  254. package/src/roap/state.ts +17 -11
  255. package/src/roap/turnDiscovery.ts +60 -31
  256. package/src/roap/util.ts +39 -31
  257. package/src/statsAnalyzer/global.ts +30 -33
  258. package/src/statsAnalyzer/index.ts +397 -169
  259. package/src/statsAnalyzer/mqaUtil.ts +178 -72
  260. package/src/transcription/index.ts +34 -32
  261. package/test/integration/spec/journey.js +666 -462
  262. package/test/integration/spec/space-meeting.js +318 -203
  263. package/test/integration/spec/transcription.js +6 -7
  264. package/test/unit/spec/common/browser-detection.js +9 -28
  265. package/test/unit/spec/fixture/locus.js +92 -90
  266. package/test/unit/spec/locus-info/controlsUtils.js +5 -5
  267. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  268. package/test/unit/spec/locus-info/index.js +1 -2
  269. package/test/unit/spec/locus-info/infoUtils.js +24 -31
  270. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  271. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  272. package/test/unit/spec/locus-info/parser.js +3 -9
  273. package/test/unit/spec/locus-info/selfConstant.js +72 -103
  274. package/test/unit/spec/locus-info/selfUtils.js +21 -12
  275. package/test/unit/spec/meeting/effectsState.js +33 -45
  276. package/test/unit/spec/meeting/in-meeting-actions.ts +2 -3
  277. package/test/unit/spec/meeting/index.js +1141 -649
  278. package/test/unit/spec/meeting/muteState.js +42 -33
  279. package/test/unit/spec/meeting/request.js +56 -45
  280. package/test/unit/spec/meeting/utils.js +66 -49
  281. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  282. package/test/unit/spec/meeting-info/request.js +7 -9
  283. package/test/unit/spec/meeting-info/util.js +11 -12
  284. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  285. package/test/unit/spec/meetings/collection.js +1 -1
  286. package/test/unit/spec/meetings/index.js +438 -257
  287. package/test/unit/spec/meetings/utils.js +14 -12
  288. package/test/unit/spec/member/index.js +0 -1
  289. package/test/unit/spec/member/util.js +5 -6
  290. package/test/unit/spec/members/index.js +84 -35
  291. package/test/unit/spec/members/request.js +29 -20
  292. package/test/unit/spec/members/utils.js +8 -5
  293. package/test/unit/spec/metrics/index.js +16 -21
  294. package/test/unit/spec/networkQualityMonitor/index.js +21 -15
  295. package/test/unit/spec/peerconnection-manager/index.js +88 -58
  296. package/test/unit/spec/peerconnection-manager/utils.js +5 -4
  297. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +7 -8
  298. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  299. package/test/unit/spec/reachability/index.ts +9 -11
  300. package/test/unit/spec/reconnection-manager/index.js +14 -17
  301. package/test/unit/spec/roap/index.ts +18 -8
  302. package/test/unit/spec/roap/turnDiscovery.ts +22 -19
  303. package/test/unit/spec/roap/util.js +3 -3
  304. package/test/unit/spec/stats-analyzer/index.js +29 -24
  305. package/test/utils/cmr.js +44 -42
  306. package/test/utils/testUtils.js +83 -74
  307. package/test/utils/webex-config.js +18 -18
  308. package/test/utils/webex-test-users.js +53 -50
@@ -1,7 +1,17 @@
1
+ /* eslint-disable prefer-destructuring */
2
+
1
3
  import {cloneDeep} from 'lodash';
2
4
 
3
5
  import EventsScope from '../common/events/events-scope';
4
- import {DEFAULT_GET_STATS_FILTER, CONNECTION_STATE, STATS, MQA_INTEVAL, NETWORK_TYPE, MEDIA_DEVICES, _UNKNOWN_} from '../constants';
6
+ import {
7
+ DEFAULT_GET_STATS_FILTER,
8
+ CONNECTION_STATE,
9
+ STATS,
10
+ MQA_INTEVAL,
11
+ NETWORK_TYPE,
12
+ MEDIA_DEVICES,
13
+ _UNKNOWN_,
14
+ } from '../constants';
5
15
  import mqaData from '../mediaQualityMetrics/config';
6
16
  import LoggerProxy from '../common/logs/logger-proxy';
7
17
 
@@ -10,7 +20,7 @@ import {
10
20
  getAudioSenderMqa,
11
21
  getAudioReceiverMqa,
12
22
  getVideoSenderMqa,
13
- getVideoReceiverMqa
23
+ getVideoReceiverMqa,
14
24
  } from './mqaUtil';
15
25
 
16
26
  export const EVENTS = {
@@ -52,7 +62,11 @@ export class StatsAnalyzer extends EventsScope {
52
62
  * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)
53
63
  * @param {Object} statsResults Default properties for stats
54
64
  */
55
- constructor(config: any, networkQualityMonitor: object = {}, statsResults: object = defaultStats) {
65
+ constructor(
66
+ config: any,
67
+ networkQualityMonitor: object = {},
68
+ statsResults: object = defaultStats
69
+ ) {
56
70
  super();
57
71
  this.statsStarted = false;
58
72
  this.statsResults = statsResults;
@@ -62,10 +76,14 @@ export class StatsAnalyzer extends EventsScope {
62
76
  this.correlationId = config.correlationId;
63
77
  this.mqaSentCount = -1;
64
78
  this.lastMqaDataSent = {
65
- resolutions: {video: {send: {}, recv: {}}, audio: {send: {}, recv: {}}, share: {send: {}, recv: {}}},
79
+ resolutions: {
80
+ video: {send: {}, recv: {}},
81
+ audio: {send: {}, recv: {}},
82
+ share: {send: {}, recv: {}},
83
+ },
66
84
  video: {send: {}, recv: {}},
67
85
  audio: {send: {}, recv: {}},
68
- share: {send: {}, recv: {}}
86
+ share: {send: {}, recv: {}},
69
87
  };
70
88
  this.localMQEStats = {
71
89
  audio: {
@@ -73,14 +91,14 @@ export class StatsAnalyzer extends EventsScope {
73
91
  packetsLost: [],
74
92
  jitter: [],
75
93
  latency: [],
76
- bitRate: []
94
+ bitRate: [],
77
95
  },
78
96
  TX: {
79
97
  packetsLost: [],
80
98
  jitter: [],
81
99
  latency: [],
82
- bitRate: []
83
- }
100
+ bitRate: [],
101
+ },
84
102
  },
85
103
  video: {
86
104
  RX: {
@@ -92,7 +110,7 @@ export class StatsAnalyzer extends EventsScope {
92
110
  resolutionWidth: [],
93
111
  resolutionHeight: [],
94
112
  requestedKeyFrame: [],
95
- receivedKeyFrame: []
113
+ receivedKeyFrame: [],
96
114
  },
97
115
  TX: {
98
116
  packetsLost: [],
@@ -103,9 +121,9 @@ export class StatsAnalyzer extends EventsScope {
103
121
  resolutionWidth: [],
104
122
  resolutionHeight: [],
105
123
  requestedKeyFrame: [],
106
- receivedKeyFrame: []
107
- }
108
- }
124
+ receivedKeyFrame: [],
125
+ },
126
+ },
109
127
  };
110
128
  this.lastEmittedStartStopEvent = {
111
129
  audio: {
@@ -129,37 +147,60 @@ export class StatsAnalyzer extends EventsScope {
129
147
  this.localMQEStats.audio.RX.packetsLost.push(lastMqa.audioReceive[0].common.mediaHopByHopLost);
130
148
  this.localMQEStats.audio.RX.jitter.push(lastMqa.audioReceive[0].streams[0].common.rtpJitter);
131
149
  this.localMQEStats.audio.RX.latency.push(lastMqa.audioReceive[0].common.roundTripTime);
132
- this.localMQEStats.audio.RX.bitRate.push(lastMqa.audioReceive[0].streams[0].common.receivedBitrate);
150
+ this.localMQEStats.audio.RX.bitRate.push(
151
+ lastMqa.audioReceive[0].streams[0].common.receivedBitrate
152
+ );
133
153
 
134
154
  this.localMQEStats.audio.TX.packetsLost.push(lastMqa.audioTransmit[0].common.remoteLossRate);
135
155
  this.localMQEStats.audio.TX.jitter.push(lastMqa.audioTransmit[0].common.remoteJitter);
136
156
  this.localMQEStats.audio.TX.latency.push(lastMqa.audioTransmit[0].common.roundTripTime);
137
- this.localMQEStats.audio.TX.bitRate.push(lastMqa.audioTransmit[0].streams[0].common.transmittedBitrate);
157
+ this.localMQEStats.audio.TX.bitRate.push(
158
+ lastMqa.audioTransmit[0].streams[0].common.transmittedBitrate
159
+ );
138
160
 
139
161
  // Video
140
162
 
141
163
  this.localMQEStats.video.RX.packetsLost.push(lastMqa.videoReceive[0].common.mediaHopByHopLost);
142
164
  this.localMQEStats.video.RX.jitter.push(lastMqa.videoReceive[0].streams[0].common.rtpJitter);
143
- this.localMQEStats.video.RX.latency.push(lastMqa.videoReceive[0].streams[0].common.roundTripTime);
144
- this.localMQEStats.video.RX.bitRate.push(lastMqa.videoReceive[0].streams[0].common.receivedBitrate);
145
- this.localMQEStats.video.RX.frameRate.push(lastMqa.videoReceive[0].streams[0].common.receivedFrameRate);
146
- this.localMQEStats.video.RX.resolutionWidth.push(lastMqa.videoReceive[0].streams[0].receivedWidth);
147
- this.localMQEStats.video.RX.resolutionHeight.push(lastMqa.videoReceive[0].streams[0].receivedHeight);
165
+ this.localMQEStats.video.RX.latency.push(
166
+ lastMqa.videoReceive[0].streams[0].common.roundTripTime
167
+ );
168
+ this.localMQEStats.video.RX.bitRate.push(
169
+ lastMqa.videoReceive[0].streams[0].common.receivedBitrate
170
+ );
171
+ this.localMQEStats.video.RX.frameRate.push(
172
+ lastMqa.videoReceive[0].streams[0].common.receivedFrameRate
173
+ );
174
+ this.localMQEStats.video.RX.resolutionWidth.push(
175
+ lastMqa.videoReceive[0].streams[0].receivedWidth
176
+ );
177
+ this.localMQEStats.video.RX.resolutionHeight.push(
178
+ lastMqa.videoReceive[0].streams[0].receivedHeight
179
+ );
148
180
  this.localMQEStats.video.RX.requestedKeyFrame.push();
149
181
  this.localMQEStats.video.RX.receivedKeyFrame.push();
150
182
 
151
183
  this.localMQEStats.video.TX.packetsLost.push(lastMqa.videoTransmit[0].common.remoteLossRate);
152
184
  this.localMQEStats.video.TX.jitter.push(lastMqa.videoTransmit[0].common.remoteJitter);
153
185
  this.localMQEStats.video.TX.latency.push(lastMqa.videoTransmit[0].common.roundTripTime);
154
- this.localMQEStats.video.TX.bitRate.push(lastMqa.videoTransmit[0].streams[0].common.transmittedBitrate);
155
- this.localMQEStats.video.TX.frameRate.push(lastMqa.videoTransmit[0].streams[0].common.transmittedFrameRate);
156
- this.localMQEStats.video.TX.resolutionWidth.push(lastMqa.videoTransmit[0].streams[0].transmittedWidth);
157
- this.localMQEStats.video.TX.resolutionHeight.push(lastMqa.videoTransmit[0].streams[0].transmittedHeight);
158
- this.localMQEStats.video.TX.requestedKeyFrame.push(lastMqa.videoTransmit[0].streams[0].requestedKeyFrames);
186
+ this.localMQEStats.video.TX.bitRate.push(
187
+ lastMqa.videoTransmit[0].streams[0].common.transmittedBitrate
188
+ );
189
+ this.localMQEStats.video.TX.frameRate.push(
190
+ lastMqa.videoTransmit[0].streams[0].common.transmittedFrameRate
191
+ );
192
+ this.localMQEStats.video.TX.resolutionWidth.push(
193
+ lastMqa.videoTransmit[0].streams[0].transmittedWidth
194
+ );
195
+ this.localMQEStats.video.TX.resolutionHeight.push(
196
+ lastMqa.videoTransmit[0].streams[0].transmittedHeight
197
+ );
198
+ this.localMQEStats.video.TX.requestedKeyFrame.push(
199
+ lastMqa.videoTransmit[0].streams[0].requestedKeyFrames
200
+ );
159
201
  this.localMQEStats.video.TX.receivedKeyFrame.push();
160
202
  }
161
203
 
162
-
163
204
  resetStatsResults() {
164
205
  this.statsResults.audio.send.meanRemoteJitter = [];
165
206
  this.statsResults.video.send.meanRemoteJitter = [];
@@ -207,23 +248,23 @@ export class StatsAnalyzer extends EventsScope {
207
248
  getAudioSenderMqa({
208
249
  audioSender,
209
250
  statsResults: this.statsResults,
210
- lastMqaDataSent: this.lastMqaDataSent
251
+ lastMqaDataSent: this.lastMqaDataSent,
211
252
  });
212
253
  getAudioReceiverMqa({
213
254
  audioReceiver,
214
255
  statsResults: this.statsResults,
215
- lastMqaDataSent: this.lastMqaDataSent
256
+ lastMqaDataSent: this.lastMqaDataSent,
216
257
  });
217
258
 
218
259
  getVideoReceiverMqa({
219
260
  videoReceiver,
220
261
  statsResults: this.statsResults,
221
- lastMqaDataSent: this.lastMqaDataSent
262
+ lastMqaDataSent: this.lastMqaDataSent,
222
263
  });
223
264
  getVideoSenderMqa({
224
265
  videoSender,
225
266
  statsResults: this.statsResults,
226
- lastMqaDataSent: this.lastMqaDataSent
267
+ lastMqaDataSent: this.lastMqaDataSent,
227
268
  });
228
269
 
229
270
  // Capture mqa for share scenario
@@ -232,24 +273,32 @@ export class StatsAnalyzer extends EventsScope {
232
273
  videoSender: shareSender,
233
274
  statsResults: this.statsResults,
234
275
  lastMqaDataSent: this.lastMqaDataSent,
235
- isShareStream: true
276
+ isShareStream: true,
236
277
  });
237
278
 
238
279
  getVideoReceiverMqa({
239
280
  videoReceiver: shareReceiver,
240
281
  statsResults: this.statsResults,
241
282
  lastMqaDataSent: this.lastMqaDataSent,
242
- isShareStream: true
283
+ isShareStream: true,
243
284
  });
244
-
245
- mqaData.intervals[0].intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress[0];
285
+ mqaData.intervals[0].intervalMetadata.peerReflexiveIP =
286
+ this.statsResults.connectionType.local.ipAddress[0];
246
287
 
247
288
  // Adding peripheral information
248
289
  mqaData.intervals[0].intervalMetadata.peripherals = [];
249
- mqaData.intervals[0].intervalMetadata.peripherals.push({information: _UNKNOWN_, name: MEDIA_DEVICES.SPEAKER});
250
- mqaData.intervals[0].intervalMetadata.peripherals.push({information: this.peerConnection?.audioTransceiver?.sender?.track?.label || _UNKNOWN_, name: MEDIA_DEVICES.MICROPHONE});
251
- mqaData.intervals[0].intervalMetadata.peripherals.push({information: this.peerConnection?.videoTransceiver?.sender?.track?.label || _UNKNOWN_, name: MEDIA_DEVICES.CAMERA});
252
-
290
+ mqaData.intervals[0].intervalMetadata.peripherals.push({
291
+ information: _UNKNOWN_,
292
+ name: MEDIA_DEVICES.SPEAKER,
293
+ });
294
+ mqaData.intervals[0].intervalMetadata.peripherals.push({
295
+ information: this.peerConnection?.audioTransceiver?.sender?.track?.label || _UNKNOWN_,
296
+ name: MEDIA_DEVICES.MICROPHONE,
297
+ });
298
+ mqaData.intervals[0].intervalMetadata.peripherals.push({
299
+ information: this.peerConnection?.videoTransceiver?.sender?.track?.label || _UNKNOWN_,
300
+ name: MEDIA_DEVICES.CAMERA,
301
+ });
253
302
 
254
303
  // @ts-ignore
255
304
  mqaData.networkType = this.statsResults.connectionType.local.networkType;
@@ -268,13 +317,13 @@ export class StatsAnalyzer extends EventsScope {
268
317
  this.emit(
269
318
  {
270
319
  file: 'statsAnalyzer',
271
- function: 'sendMqaData'
320
+ function: 'sendMqaData',
272
321
  },
273
322
  EVENTS.MEDIA_QUALITY,
274
323
  {
275
324
  data: mqaData.intervals[0],
276
325
  // @ts-ignore
277
- networkType: mqaData.networkType
326
+ networkType: mqaData.networkType,
278
327
  }
279
328
  );
280
329
  }
@@ -304,17 +353,16 @@ export class StatsAnalyzer extends EventsScope {
304
353
  this.statsStarted = true;
305
354
  this.peerConnection = peerConnection;
306
355
 
307
- return this.getStatsAndParse()
308
- .then(() => {
309
- this.statsInterval = setInterval(() => {
310
- this.getStatsAndParse();
311
- }, this.config.analyzerInterval);
312
- // Trigger initial fetch
356
+ return this.getStatsAndParse().then(() => {
357
+ this.statsInterval = setInterval(() => {
358
+ this.getStatsAndParse();
359
+ }, this.config.analyzerInterval);
360
+ // Trigger initial fetch
361
+ this.sendMqaData();
362
+ this.mqaInterval = setInterval(() => {
313
363
  this.sendMqaData();
314
- this.mqaInterval = setInterval(() => {
315
- this.sendMqaData();
316
- }, MQA_INTEVAL);
317
- });
364
+ }, MQA_INTEVAL);
365
+ });
318
366
  }
319
367
 
320
368
  return Promise.resolve();
@@ -405,7 +453,11 @@ export class StatsAnalyzer extends EventsScope {
405
453
  * @param {boolean} isSender
406
454
  * @returns {void}
407
455
  */
408
- private filterAndParseGetStatsResults(getStatsResults: Array<any>, type: string, isSender: boolean) {
456
+ private filterAndParseGetStatsResults(
457
+ getStatsResults: Array<any>,
458
+ type: string,
459
+ isSender: boolean
460
+ ) {
409
461
  const {types} = DEFAULT_GET_STATS_FILTER;
410
462
 
411
463
  getStatsResults.forEach((result) => {
@@ -446,7 +498,12 @@ export class StatsAnalyzer extends EventsScope {
446
498
  * @memberof StatsAnalyzer
447
499
  * @returns {void}
448
500
  */
449
- emitStartStopEvents = (mediaType: string, previousValue: number, currentValue: number, isLocal: boolean) => {
501
+ emitStartStopEvents = (
502
+ mediaType: string,
503
+ previousValue: number,
504
+ currentValue: number,
505
+ isLocal: boolean
506
+ ) => {
450
507
  if (mediaType !== 'audio' && mediaType !== 'video' && mediaType !== 'share') {
451
508
  throw new Error(`Unsupported mediaType: ${mediaType}`);
452
509
  }
@@ -456,32 +513,32 @@ export class StatsAnalyzer extends EventsScope {
456
513
  // eslint-disable-next-line no-param-reassign
457
514
  if (currentValue === undefined) currentValue = 0;
458
515
 
459
- const lastEmittedEvent = isLocal ? this.lastEmittedStartStopEvent[mediaType].local : this.lastEmittedStartStopEvent[mediaType].remote;
516
+ const lastEmittedEvent = isLocal
517
+ ? this.lastEmittedStartStopEvent[mediaType].local
518
+ : this.lastEmittedStartStopEvent[mediaType].remote;
460
519
 
461
520
  let newEvent;
462
521
 
463
- if ((currentValue - previousValue) > 0) {
522
+ if (currentValue - previousValue > 0) {
464
523
  newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STARTED : EVENTS.REMOTE_MEDIA_STARTED;
465
- }
466
- else if ((currentValue === previousValue) && currentValue > 0) {
524
+ } else if (currentValue === previousValue && currentValue > 0) {
467
525
  newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STOPPED : EVENTS.REMOTE_MEDIA_STOPPED;
468
526
  }
469
527
 
470
528
  if (newEvent && lastEmittedEvent !== newEvent) {
471
529
  if (isLocal) {
472
530
  this.lastEmittedStartStopEvent[mediaType].local = newEvent;
473
- }
474
- else {
531
+ } else {
475
532
  this.lastEmittedStartStopEvent[mediaType].remote = newEvent;
476
533
  }
477
534
  this.emit(
478
535
  {
479
536
  file: 'statsAnalyzer/index',
480
- function: 'compareLastStatsResult'
537
+ function: 'compareLastStatsResult',
481
538
  },
482
539
  newEvent,
483
540
  {
484
- type: mediaType
541
+ type: mediaType,
485
542
  }
486
543
  );
487
544
  }
@@ -505,54 +562,98 @@ export class StatsAnalyzer extends EventsScope {
505
562
  currentStats = this.statsResults[mediaType].send;
506
563
  previousStats = this.lastStatsResults[mediaType].send;
507
564
 
508
- if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
509
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`);
510
- }
511
- else {
512
- if (currentStats.totalAudioEnergy === previousStats.totalAudioEnergy || currentStats.totalAudioEnergy === 0) {
513
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Energy present`);
565
+ if (
566
+ currentStats.totalPacketsSent === previousStats.totalPacketsSent ||
567
+ currentStats.totalPacketsSent === 0
568
+ ) {
569
+ LoggerProxy.logger.info(
570
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`
571
+ );
572
+ } else {
573
+ if (
574
+ currentStats.totalAudioEnergy === previousStats.totalAudioEnergy ||
575
+ currentStats.totalAudioEnergy === 0
576
+ ) {
577
+ LoggerProxy.logger.info(
578
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Energy present`
579
+ );
514
580
  }
515
581
 
516
582
  if (currentStats.audioLevel === 0) {
517
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} level is 0 for the user`);
583
+ LoggerProxy.logger.info(
584
+ `StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} level is 0 for the user`
585
+ );
518
586
  }
519
587
  }
520
588
 
521
- this.emitStartStopEvents(mediaType, previousStats.totalPacketsSent, currentStats.totalPacketsSent, true);
589
+ this.emitStartStopEvents(
590
+ mediaType,
591
+ previousStats.totalPacketsSent,
592
+ currentStats.totalPacketsSent,
593
+ true
594
+ );
522
595
  }
523
596
 
524
597
  if (this.meetingMediaStatus.expected.receiveAudio) {
525
- // compare audio stats received
598
+ // compare audio stats received
526
599
  currentStats = this.statsResults[mediaType].recv;
527
600
  previousStats = this.lastStatsResults[mediaType].recv;
528
601
 
529
- if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsReceived === 0) {
530
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`);
531
- }
532
- else if (currentStats.totalSamplesReceived === previousStats.totalSamplesReceived ||
533
- currentStats.totalSamplesReceived === 0) {
534
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} samples received`);
602
+ if (
603
+ currentStats.totalPacketsReceived === previousStats.totalPacketsReceived ||
604
+ currentStats.totalPacketsReceived === 0
605
+ ) {
606
+ LoggerProxy.logger.info(
607
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`
608
+ );
609
+ } else if (
610
+ currentStats.totalSamplesReceived === previousStats.totalSamplesReceived ||
611
+ currentStats.totalSamplesReceived === 0
612
+ ) {
613
+ LoggerProxy.logger.info(
614
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} samples received`
615
+ );
535
616
  }
536
617
 
537
- this.emitStartStopEvents(mediaType, previousStats.totalPacketsReceived, currentStats.totalPacketsReceived, false);
618
+ this.emitStartStopEvents(
619
+ mediaType,
620
+ previousStats.totalPacketsReceived,
621
+ currentStats.totalPacketsReceived,
622
+ false
623
+ );
538
624
  }
539
625
 
540
626
  mediaType = STATS.VIDEO_CORRELATE;
541
627
  if (this.meetingMediaStatus.expected.sendVideo) {
542
- // compare video stats sent
628
+ // compare video stats sent
543
629
  currentStats = this.statsResults[mediaType].send;
544
630
  previousStats = this.lastStatsResults[mediaType].send;
545
631
 
546
- if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
547
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`);
548
- }
549
- else {
550
- if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {
551
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames Encoded`);
632
+ if (
633
+ currentStats.totalPacketsSent === previousStats.totalPacketsSent ||
634
+ currentStats.totalPacketsSent === 0
635
+ ) {
636
+ LoggerProxy.logger.info(
637
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`
638
+ );
639
+ } else {
640
+ if (
641
+ currentStats.framesEncoded === previousStats.framesEncoded ||
642
+ currentStats.framesEncoded === 0
643
+ ) {
644
+ LoggerProxy.logger.info(
645
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames Encoded`
646
+ );
552
647
  }
553
648
 
554
- if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {
555
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames sent`);
649
+ if (
650
+ this.statsResults.resolutions[mediaType].send.framesSent ===
651
+ this.lastStatsResults.resolutions[mediaType].send.framesSent ||
652
+ this.statsResults.resolutions[mediaType].send.framesSent === 0
653
+ ) {
654
+ LoggerProxy.logger.info(
655
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames sent`
656
+ );
556
657
  }
557
658
  }
558
659
 
@@ -564,27 +665,48 @@ export class StatsAnalyzer extends EventsScope {
564
665
  );
565
666
  }
566
667
 
567
-
568
668
  if (this.meetingMediaStatus.expected.receiveVideo) {
569
- // compare video stats reveived
669
+ // compare video stats reveived
570
670
 
571
671
  currentStats = this.statsResults[mediaType].recv;
572
672
  previousStats = this.lastStatsResults[mediaType].recv;
573
673
 
574
- if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsReceived === 0) {
575
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`);
576
- }
577
- else {
578
- if (this.statsResults.resolutions[mediaType].recv.framesReceived === this.lastStatsResults.resolutions[mediaType].recv.framesReceived || this.statsResults.resolutions[mediaType].recv.framesReceived === 0) {
579
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`);
674
+ if (
675
+ currentStats.totalPacketsReceived === previousStats.totalPacketsReceived ||
676
+ currentStats.totalPacketsReceived === 0
677
+ ) {
678
+ LoggerProxy.logger.info(
679
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`
680
+ );
681
+ } else {
682
+ if (
683
+ this.statsResults.resolutions[mediaType].recv.framesReceived ===
684
+ this.lastStatsResults.resolutions[mediaType].recv.framesReceived ||
685
+ this.statsResults.resolutions[mediaType].recv.framesReceived === 0
686
+ ) {
687
+ LoggerProxy.logger.info(
688
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`
689
+ );
580
690
  }
581
691
 
582
- if (this.statsResults[mediaType].recv.framesDecoded === this.lastStatsResults[mediaType].recv.framesDecoded || this.statsResults.resolutions[mediaType].send.framesDecoded === 0) {
583
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`);
692
+ if (
693
+ this.statsResults[mediaType].recv.framesDecoded ===
694
+ this.lastStatsResults[mediaType].recv.framesDecoded ||
695
+ this.statsResults.resolutions[mediaType].send.framesDecoded === 0
696
+ ) {
697
+ LoggerProxy.logger.info(
698
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`
699
+ );
584
700
  }
585
701
 
586
- if (this.statsResults.resolutions[mediaType].recv.framesDropped - this.lastStatsResults.resolutions[mediaType].recv.framesDropped > 10) {
587
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`);
702
+ if (
703
+ this.statsResults.resolutions[mediaType].recv.framesDropped -
704
+ this.lastStatsResults.resolutions[mediaType].recv.framesDropped >
705
+ 10
706
+ ) {
707
+ LoggerProxy.logger.info(
708
+ `StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`
709
+ );
588
710
  }
589
711
  }
590
712
 
@@ -598,21 +720,36 @@ export class StatsAnalyzer extends EventsScope {
598
720
 
599
721
  mediaType = STATS.SHARE_CORRELATE;
600
722
  if (this.meetingMediaStatus.expected.sendShare) {
601
- // compare share stats sent
723
+ // compare share stats sent
602
724
 
603
725
  currentStats = this.statsResults[mediaType].send;
604
726
  previousStats = this.lastStatsResults[mediaType].send;
605
727
 
606
- if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
607
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`);
608
- }
609
- else {
610
- if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {
611
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames getting encoded`);
728
+ if (
729
+ currentStats.totalPacketsSent === previousStats.totalPacketsSent ||
730
+ currentStats.totalPacketsSent === 0
731
+ ) {
732
+ LoggerProxy.logger.info(
733
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`
734
+ );
735
+ } else {
736
+ if (
737
+ currentStats.framesEncoded === previousStats.framesEncoded ||
738
+ currentStats.framesEncoded === 0
739
+ ) {
740
+ LoggerProxy.logger.info(
741
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames getting encoded`
742
+ );
612
743
  }
613
744
 
614
- if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {
615
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames sent`);
745
+ if (
746
+ this.statsResults.resolutions[mediaType].send.framesSent ===
747
+ this.lastStatsResults.resolutions[mediaType].send.framesSent ||
748
+ this.statsResults.resolutions[mediaType].send.framesSent === 0
749
+ ) {
750
+ LoggerProxy.logger.info(
751
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames sent`
752
+ );
616
753
  }
617
754
  }
618
755
 
@@ -621,20 +758,42 @@ export class StatsAnalyzer extends EventsScope {
621
758
  currentStats = this.statsResults[mediaType].recv;
622
759
  previousStats = this.lastStatsResults[mediaType].recv;
623
760
 
624
- if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsSent === 0) {
625
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`);
626
- }
627
- else {
628
- if (this.statsResults.resolutions[mediaType].recv.framesReceived === this.lastStatsResults.resolutions[mediaType].recv.framesReceived || this.statsResults.resolutions[mediaType].recv.framesReceived === 0) {
629
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`);
761
+ if (
762
+ currentStats.totalPacketsReceived === previousStats.totalPacketsReceived ||
763
+ currentStats.totalPacketsSent === 0
764
+ ) {
765
+ LoggerProxy.logger.info(
766
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`
767
+ );
768
+ } else {
769
+ if (
770
+ this.statsResults.resolutions[mediaType].recv.framesReceived ===
771
+ this.lastStatsResults.resolutions[mediaType].recv.framesReceived ||
772
+ this.statsResults.resolutions[mediaType].recv.framesReceived === 0
773
+ ) {
774
+ LoggerProxy.logger.info(
775
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`
776
+ );
630
777
  }
631
778
 
632
- if (this.statsResults[mediaType].recv.framesDecoded === this.lastStatsResults[mediaType].recv.framesDecoded || this.statsResults.resolutions[mediaType].send.framesDecoded === 0) {
633
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`);
779
+ if (
780
+ this.statsResults[mediaType].recv.framesDecoded ===
781
+ this.lastStatsResults[mediaType].recv.framesDecoded ||
782
+ this.statsResults.resolutions[mediaType].send.framesDecoded === 0
783
+ ) {
784
+ LoggerProxy.logger.info(
785
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`
786
+ );
634
787
  }
635
788
 
636
- if (this.statsResults.resolutions[mediaType].recv.framesDropped - this.lastStatsResults.resolutions[mediaType].recv.framesDropped > 10) {
637
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`);
789
+ if (
790
+ this.statsResults.resolutions[mediaType].recv.framesDropped -
791
+ this.lastStatsResults.resolutions[mediaType].recv.framesDropped >
792
+ 10
793
+ ) {
794
+ LoggerProxy.logger.info(
795
+ `StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`
796
+ );
638
797
  }
639
798
  }
640
799
 
@@ -658,7 +817,9 @@ export class StatsAnalyzer extends EventsScope {
658
817
  }
659
818
 
660
819
  if (this.peerConnection && this.peerConnection.connectionState === CONNECTION_STATE.FAILED) {
661
- LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> PeerConnection is in failed state');
820
+ LoggerProxy.logger.trace(
821
+ 'StatsAnalyzer:index#getStatsAndParse --> PeerConnection is in failed state'
822
+ );
662
823
 
663
824
  return Promise.resolve();
664
825
  }
@@ -690,11 +851,13 @@ export class StatsAnalyzer extends EventsScope {
690
851
  this.peerConnection.shareTransceiver.receiver.getStats().then((res) => {
691
852
  this.filterAndParseGetStatsResults(res, STATS.SHARE_CORRELATE, false);
692
853
  }),
693
-
694
854
  ]).then(() => {
695
- this.statsResults[STATS.AUDIO_CORRELATE].direction = this.peerConnection.audioTransceiver.currentDirection;
696
- this.statsResults[STATS.VIDEO_CORRELATE].direction = this.peerConnection.videoTransceiver.currentDirection;
697
- this.statsResults[STATS.SHARE_CORRELATE].direction = this.peerConnection.shareTransceiver.currentDirection;
855
+ this.statsResults[STATS.AUDIO_CORRELATE].direction =
856
+ this.peerConnection.audioTransceiver.currentDirection;
857
+ this.statsResults[STATS.VIDEO_CORRELATE].direction =
858
+ this.peerConnection.videoTransceiver.currentDirection;
859
+ this.statsResults[STATS.SHARE_CORRELATE].direction =
860
+ this.peerConnection.shareTransceiver.currentDirection;
698
861
 
699
862
  // Process Stats results every 5 seconds
700
863
  this.compareLastStatsResult();
@@ -702,7 +865,9 @@ export class StatsAnalyzer extends EventsScope {
702
865
  // Save the last results to compare with the current
703
866
  this.lastStatsResults = JSON.parse(JSON.stringify(this.statsResults));
704
867
 
705
- LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Finished Collecting Stats');
868
+ LoggerProxy.logger.trace(
869
+ 'StatsAnalyzer:index#getStatsAndParse --> Finished Collecting Stats'
870
+ );
706
871
  });
707
872
  }
708
873
 
@@ -727,10 +892,12 @@ export class StatsAnalyzer extends EventsScope {
727
892
  this.statsResults.internal[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
728
893
  }
729
894
  if (!this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded) {
730
- this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;
895
+ this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded =
896
+ result.keyFramesEncoded;
731
897
  }
732
898
 
733
- const bytes = result.bytesSent - this.statsResults.internal[mediaType][sendrecvType].prevBytesSent;
899
+ const bytes =
900
+ result.bytesSent - this.statsResults.internal[mediaType][sendrecvType].prevBytesSent;
734
901
 
735
902
  this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
736
903
 
@@ -739,15 +906,19 @@ export class StatsAnalyzer extends EventsScope {
739
906
  this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
740
907
  this.statsResults[mediaType].bytesSent = kilobytes;
741
908
 
742
- this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded - this.statsResults.internal[mediaType][sendrecvType].framesEncoded;
743
- this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded - this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded;
909
+ this.statsResults[mediaType][sendrecvType].framesEncoded =
910
+ result.framesEncoded - this.statsResults.internal[mediaType][sendrecvType].framesEncoded;
911
+ this.statsResults[mediaType][sendrecvType].keyFramesEncoded =
912
+ result.keyFramesEncoded -
913
+ this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded;
744
914
  this.statsResults.internal[mediaType].outboundRtpId = result.id;
745
915
 
746
916
  if (!this.statsResults.internal[mediaType][sendrecvType].packetsSent) {
747
917
  this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
748
918
  }
749
919
 
750
- this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent - this.statsResults.internal[mediaType][sendrecvType].packetsSent;
920
+ this.statsResults[mediaType][sendrecvType].packetsSent =
921
+ result.packetsSent - this.statsResults.internal[mediaType][sendrecvType].packetsSent;
751
922
  this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
752
923
 
753
924
  // Data saved to send MQA metrics
@@ -759,17 +930,21 @@ export class StatsAnalyzer extends EventsScope {
759
930
  this.statsResults[mediaType][sendrecvType].totalFirCount = result.firCount;
760
931
  this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;
761
932
  this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
762
- this.statsResults[mediaType][sendrecvType].encoderImplementation = result.encoderImplementation;
763
- this.statsResults[mediaType][sendrecvType].qualityLimitationReason = result.qualityLimitationReason;
764
- this.statsResults[mediaType][sendrecvType].qualityLimitationResolutionChanges = result.qualityLimitationResolutionChanges;
765
- this.statsResults[mediaType][sendrecvType].retransmittedPacketsSent = result.retransmittedPacketsSent;
933
+ this.statsResults[mediaType][sendrecvType].encoderImplementation =
934
+ result.encoderImplementation;
935
+ this.statsResults[mediaType][sendrecvType].qualityLimitationReason =
936
+ result.qualityLimitationReason;
937
+ this.statsResults[mediaType][sendrecvType].qualityLimitationResolutionChanges =
938
+ result.qualityLimitationResolutionChanges;
939
+ this.statsResults[mediaType][sendrecvType].retransmittedPacketsSent =
940
+ result.retransmittedPacketsSent;
766
941
  this.statsResults[mediaType][sendrecvType].totalBytesSent = result.bytesSent;
767
942
  this.statsResults[mediaType][sendrecvType].headerBytesSent = result.headerBytesSent;
768
- this.statsResults[mediaType][sendrecvType].retransmittedBytesSent = result.retransmittedBytesSent;
943
+ this.statsResults[mediaType][sendrecvType].retransmittedBytesSent =
944
+ result.retransmittedBytesSent;
769
945
  }
770
946
  }
771
947
 
772
-
773
948
  /**
774
949
  * Processes InboundRTP stats result and stores
775
950
  * @private
@@ -785,7 +960,8 @@ export class StatsAnalyzer extends EventsScope {
785
960
  let kilobytes = 0;
786
961
 
787
962
  if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
788
- this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;
963
+ this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =
964
+ result.bytesReceived;
789
965
  }
790
966
 
791
967
  if (!this.statsResults.internal[mediaType][sendrecvType].pliCount) {
@@ -797,14 +973,18 @@ export class StatsAnalyzer extends EventsScope {
797
973
  }
798
974
 
799
975
  if (!this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived) {
800
- this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
976
+ this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =
977
+ result.packetsReceived;
801
978
  }
802
979
 
803
980
  if (!this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp) {
804
- this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp = result.lastPacketReceivedTimestamp;
981
+ this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp =
982
+ result.lastPacketReceivedTimestamp;
805
983
  }
806
984
 
807
- const bytes = result.bytesReceived - (this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived);
985
+ const bytes =
986
+ result.bytesReceived -
987
+ this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived;
808
988
 
809
989
  this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;
810
990
 
@@ -812,35 +992,52 @@ export class StatsAnalyzer extends EventsScope {
812
992
  this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
813
993
  this.statsResults[mediaType].bytesReceived = kilobytes.toFixed(1);
814
994
 
815
- this.statsResults[mediaType][sendrecvType].pliCount = result.pliCount - this.statsResults.internal[mediaType][sendrecvType].pliCount;
816
- this.statsResults[mediaType][sendrecvType].currentPacketsLost = result.packetsLost - this.statsResults.internal[mediaType][sendrecvType].packetsLost;
995
+ this.statsResults[mediaType][sendrecvType].pliCount =
996
+ result.pliCount - this.statsResults.internal[mediaType][sendrecvType].pliCount;
997
+ this.statsResults[mediaType][sendrecvType].currentPacketsLost =
998
+ result.packetsLost - this.statsResults.internal[mediaType][sendrecvType].packetsLost;
817
999
  if (this.statsResults[mediaType][sendrecvType].currentPacketsLost < 0) {
818
1000
  this.statsResults[mediaType][sendrecvType].currentPacketsLost = 0;
819
1001
  }
820
1002
 
821
- this.statsResults[mediaType][sendrecvType].packetsReceived = result.packetsReceived - this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived;
822
- this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
1003
+ this.statsResults[mediaType][sendrecvType].packetsReceived =
1004
+ result.packetsReceived -
1005
+ this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived;
1006
+ this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =
1007
+ result.packetsReceived;
823
1008
 
824
1009
  if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {
825
- LoggerProxy.logger.info(`StatsAnalyzer:index#processInboundRTPResult --> No packets received for ${mediaType} `, this.statsResults[mediaType][sendrecvType].packetsReceived);
1010
+ LoggerProxy.logger.info(
1011
+ `StatsAnalyzer:index#processInboundRTPResult --> No packets received for ${mediaType} `,
1012
+ this.statsResults[mediaType][sendrecvType].packetsReceived
1013
+ );
826
1014
  }
827
1015
 
828
1016
  // Check the over all packet Lost ratio
829
- 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;
1017
+ this.statsResults[mediaType][sendrecvType].currentPacketLossRatio =
1018
+ this.statsResults[mediaType][sendrecvType].currentPacketsLost > 0
1019
+ ? this.statsResults[mediaType][sendrecvType].currentPacketsLost /
1020
+ (this.statsResults[mediaType][sendrecvType].packetsReceived +
1021
+ this.statsResults[mediaType][sendrecvType].currentPacketsLost)
1022
+ : 0;
830
1023
  if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
831
- LoggerProxy.logger.info('StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver ', this.statsResults[mediaType][sendrecvType].currentPacketLossRatio);
1024
+ LoggerProxy.logger.info(
1025
+ 'StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver ',
1026
+ this.statsResults[mediaType][sendrecvType].currentPacketLossRatio
1027
+ );
832
1028
  }
833
1029
 
834
1030
  // TODO: check the packet loss value is negative values here
835
1031
 
836
1032
  if (result.packetsLost) {
837
- this.statsResults[mediaType][sendrecvType].totalPacketsLost = result.packetsLost > 0 ? result.packetsLost : -result.packetsLost;
838
- }
839
- else {
1033
+ this.statsResults[mediaType][sendrecvType].totalPacketsLost =
1034
+ result.packetsLost > 0 ? result.packetsLost : -result.packetsLost;
1035
+ } else {
840
1036
  this.statsResults[mediaType][sendrecvType].totalPacketsLost = 0;
841
1037
  }
842
1038
 
843
- this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp = result.lastPacketReceivedTimestamp;
1039
+ this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp =
1040
+ result.lastPacketReceivedTimestamp;
844
1041
 
845
1042
  // From Thin
846
1043
  this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;
@@ -848,10 +1045,10 @@ export class StatsAnalyzer extends EventsScope {
848
1045
  this.statsResults[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
849
1046
  this.statsResults[mediaType][sendrecvType].keyFramesDecoded = result.keyFramesDecoded;
850
1047
 
851
- this.statsResults[mediaType][sendrecvType].decoderImplementation = result.decoderImplementation;
1048
+ this.statsResults[mediaType][sendrecvType].decoderImplementation =
1049
+ result.decoderImplementation;
852
1050
  this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
853
1051
 
854
-
855
1052
  this.statsResults[mediaType][sendrecvType].fecPacketsDiscarded = result.fecPacketsDiscarded;
856
1053
  this.statsResults[mediaType][sendrecvType].fecPacketsReceived = result.fecPacketsReceived;
857
1054
  this.statsResults[mediaType][sendrecvType].totalBytesReceived = result.bytesReceived;
@@ -863,8 +1060,10 @@ export class StatsAnalyzer extends EventsScope {
863
1060
 
864
1061
  this.statsResults[mediaType][sendrecvType].audioLevel = result.audioLevel;
865
1062
  this.statsResults[mediaType][sendrecvType].totalAudioEnergy = result.totalAudioEnergy;
866
- this.statsResults[mediaType][sendrecvType].totalSamplesReceived = result.totalSamplesReceived || 0;
867
- this.statsResults[mediaType][sendrecvType].totalSamplesDecoded = result.totalSamplesDecoded || 0;
1063
+ this.statsResults[mediaType][sendrecvType].totalSamplesReceived =
1064
+ result.totalSamplesReceived || 0;
1065
+ this.statsResults[mediaType][sendrecvType].totalSamplesDecoded =
1066
+ result.totalSamplesDecoded || 0;
868
1067
  this.statsResults[mediaType][sendrecvType].concealedSamples = result.concealedSamples || 0;
869
1068
  }
870
1069
  }
@@ -908,7 +1107,10 @@ export class StatsAnalyzer extends EventsScope {
908
1107
  RemoteNetworkType[result.id] = [];
909
1108
  }
910
1109
 
911
- if (result.candidateType && RemoteCandidateType[result.id].indexOf(result.candidateType) === -1) {
1110
+ if (
1111
+ result.candidateType &&
1112
+ RemoteCandidateType[result.id].indexOf(result.candidateType) === -1
1113
+ ) {
912
1114
  RemoteCandidateType[result.id].push(result.candidateType);
913
1115
  }
914
1116
 
@@ -916,7 +1118,10 @@ export class StatsAnalyzer extends EventsScope {
916
1118
  RemoteTransport[result.id].push(result.protocol.toUpperCase());
917
1119
  }
918
1120
 
919
- if (result.ip && RemoteIpAddress[result.id].indexOf(`${result.ip}:${result.portNumber}`) === -1) {
1121
+ if (
1122
+ result.ip &&
1123
+ RemoteIpAddress[result.id].indexOf(`${result.ip}:${result.portNumber}`) === -1
1124
+ ) {
920
1125
  RemoteIpAddress[result.id].push(`${result.ip}`); // TODO: Add ports
921
1126
  }
922
1127
 
@@ -933,13 +1138,16 @@ export class StatsAnalyzer extends EventsScope {
933
1138
  transport: RemoteTransport[result.id],
934
1139
  timestamp: result.time,
935
1140
  id: result.id,
936
- type: result.type
1141
+ type: result.type,
937
1142
  };
938
1143
 
939
1144
  this.statsResults.connectionType[ipType].candidateType = RemoteCandidateType[result.id];
940
1145
  this.statsResults.connectionType[ipType].ipAddress = RemoteIpAddress[result.id];
941
1146
 
942
- this.statsResults.connectionType[ipType].networkType = RemoteNetworkType[result.id][0] === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : RemoteNetworkType[result.id][0];
1147
+ this.statsResults.connectionType[ipType].networkType =
1148
+ RemoteNetworkType[result.id][0] === NETWORK_TYPE.VPN
1149
+ ? NETWORK_TYPE.UNKNOWN
1150
+ : RemoteNetworkType[result.id][0];
943
1151
  this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];
944
1152
 
945
1153
  this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
@@ -960,7 +1168,8 @@ export class StatsAnalyzer extends EventsScope {
960
1168
  }
961
1169
  if (result.type !== 'track') return;
962
1170
 
963
- const sendrecvType = result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;
1171
+ const sendrecvType =
1172
+ result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;
964
1173
 
965
1174
  if (result.frameWidth && result.frameHeight) {
966
1175
  this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
@@ -975,18 +1184,21 @@ export class StatsAnalyzer extends EventsScope {
975
1184
  this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;
976
1185
  }
977
1186
 
978
-
979
1187
  if (result.trackIdentifier && mediaType !== STATS.AUDIO_CORRELATE) {
980
- this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier = result.trackIdentifier;
1188
+ this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier =
1189
+ result.trackIdentifier;
981
1190
 
982
1191
  const jitterBufferDelay = result && result.jitterBufferDelay;
983
1192
  const jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;
984
1193
 
985
- this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay = jitterBufferEmittedCount && (+jitterBufferDelay / +jitterBufferEmittedCount);
1194
+ this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay =
1195
+ jitterBufferEmittedCount && +jitterBufferDelay / +jitterBufferEmittedCount;
986
1196
 
987
1197
  // Used to calculate the jitter
988
- this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay = result.jitterBufferDelay;
989
- this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount = result.jitterBufferEmittedCount;
1198
+ this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay =
1199
+ result.jitterBufferDelay;
1200
+ this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount =
1201
+ result.jitterBufferEmittedCount;
990
1202
  }
991
1203
  }
992
1204
 
@@ -1005,9 +1217,12 @@ export class StatsAnalyzer extends EventsScope {
1005
1217
 
1006
1218
  const mediaType = type;
1007
1219
 
1008
- if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) { this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost; }
1220
+ if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) {
1221
+ this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
1222
+ }
1009
1223
 
1010
- const currentPacketLoss = result.packetsLost - this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver;
1224
+ const currentPacketLoss =
1225
+ result.packetsLost - this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver;
1011
1226
 
1012
1227
  this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
1013
1228
  this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;
@@ -1021,18 +1236,31 @@ export class StatsAnalyzer extends EventsScope {
1021
1236
  this.statsResults[mediaType].send.reportsReceived = result.reportsReceived;
1022
1237
 
1023
1238
  // Total packloss ratio on this video section of the call
1024
- this.statsResults[mediaType].send.overAllPacketLossRatio = this.statsResults[mediaType].send.totalPacketsLostOnReceiver > 0 ? this.statsResults[mediaType].send.totalPacketsLostOnReceiver / this.statsResults[mediaType].send.totalPacketsSent : 0;
1025
- this.statsResults[mediaType].send.currentPacketLossRatio = this.statsResults[mediaType].send.packetsLostOnReceiver > 0 ? this.statsResults[mediaType].send.packetsLostOnReceiver * 100 / (this.statsResults[mediaType].send.packetsSent + this.statsResults[mediaType].send.packetsLostOnReceiver) : 0;
1026
-
1027
- if (this.statsResults[mediaType].send.maxPacketLossRatio < this.statsResults[mediaType].send.currentPacketLossRatio) {
1028
- this.statsResults[mediaType].send.maxPacketLossRatio = this.statsResults[mediaType].send.currentPacketLossRatio;
1239
+ this.statsResults[mediaType].send.overAllPacketLossRatio =
1240
+ this.statsResults[mediaType].send.totalPacketsLostOnReceiver > 0
1241
+ ? this.statsResults[mediaType].send.totalPacketsLostOnReceiver /
1242
+ this.statsResults[mediaType].send.totalPacketsSent
1243
+ : 0;
1244
+ this.statsResults[mediaType].send.currentPacketLossRatio =
1245
+ this.statsResults[mediaType].send.packetsLostOnReceiver > 0
1246
+ ? (this.statsResults[mediaType].send.packetsLostOnReceiver * 100) /
1247
+ (this.statsResults[mediaType].send.packetsSent +
1248
+ this.statsResults[mediaType].send.packetsLostOnReceiver)
1249
+ : 0;
1250
+
1251
+ if (
1252
+ this.statsResults[mediaType].send.maxPacketLossRatio <
1253
+ this.statsResults[mediaType].send.currentPacketLossRatio
1254
+ ) {
1255
+ this.statsResults[mediaType].send.maxPacketLossRatio =
1256
+ this.statsResults[mediaType].send.currentPacketLossRatio;
1029
1257
  }
1030
1258
 
1031
1259
  if (result.type === 'remote-inbound-rtp') {
1032
1260
  this.networkQualityMonitor.determineUplinkNetworkQuality({
1033
1261
  mediaType,
1034
1262
  remoteRtpResults: result,
1035
- statsAnalyzerCurrentStats: this.statsResults
1263
+ statsAnalyzerCurrentStats: this.statsResults,
1036
1264
  });
1037
1265
  }
1038
1266
  }