@webex/plugin-meetings 2.60.0-next.9 → 2.60.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 (516) hide show
  1. package/README.md +8 -46
  2. package/dist/common/browser-detection.js +3 -2
  3. package/dist/common/browser-detection.js.map +1 -1
  4. package/dist/common/collection.js +4 -3
  5. package/dist/common/collection.js.map +1 -1
  6. package/dist/common/config.js +2 -1
  7. package/dist/common/config.js.map +1 -1
  8. package/dist/common/errors/captcha-error.js +2 -1
  9. package/dist/common/errors/captcha-error.js.map +1 -1
  10. package/dist/common/errors/intent-to-join.js +2 -1
  11. package/dist/common/errors/intent-to-join.js.map +1 -1
  12. package/dist/common/errors/join-meeting.js +2 -1
  13. package/dist/common/errors/join-meeting.js.map +1 -1
  14. package/dist/common/errors/media.js +2 -1
  15. package/dist/common/errors/media.js.map +1 -1
  16. package/dist/common/errors/parameter.js +4 -3
  17. package/dist/common/errors/parameter.js.map +1 -1
  18. package/dist/common/errors/password-error.js +2 -1
  19. package/dist/common/errors/password-error.js.map +1 -1
  20. package/dist/common/errors/permission.js +2 -1
  21. package/dist/common/errors/permission.js.map +1 -1
  22. package/dist/common/errors/{reclaim-host-role-errors.js → reclaim-host-role-error.js} +11 -7
  23. package/dist/common/errors/reclaim-host-role-error.js.map +1 -0
  24. package/dist/common/errors/reconnection-in-progress.js +2 -1
  25. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  26. package/dist/common/errors/reconnection.js +2 -1
  27. package/dist/common/errors/reconnection.js.map +1 -1
  28. package/dist/common/errors/stats.js +2 -1
  29. package/dist/common/errors/stats.js.map +1 -1
  30. package/dist/common/errors/webex-errors.d.ts +8 -20
  31. package/dist/common/errors/webex-errors.js +28 -48
  32. package/dist/common/errors/webex-errors.js.map +1 -1
  33. package/dist/common/errors/webex-meetings-error.js +2 -1
  34. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  35. package/dist/common/events/events-scope.js +2 -1
  36. package/dist/common/events/events-scope.js.map +1 -1
  37. package/dist/common/events/events.js +2 -1
  38. package/dist/common/events/events.js.map +1 -1
  39. package/dist/common/events/trigger-proxy.js +2 -1
  40. package/dist/common/events/trigger-proxy.js.map +1 -1
  41. package/dist/common/events/util.js +2 -1
  42. package/dist/common/events/util.js.map +1 -1
  43. package/dist/common/logs/logger-config.js +2 -1
  44. package/dist/common/logs/logger-config.js.map +1 -1
  45. package/dist/common/logs/logger-proxy.js +3 -2
  46. package/dist/common/logs/logger-proxy.js.map +1 -1
  47. package/dist/common/logs/request.d.ts +1 -3
  48. package/dist/common/logs/request.js +5 -8
  49. package/dist/common/logs/request.js.map +1 -1
  50. package/dist/common/queue.d.ts +7 -9
  51. package/dist/common/queue.js +9 -22
  52. package/dist/common/queue.js.map +1 -1
  53. package/dist/config.d.ts +7 -5
  54. package/dist/config.js +11 -8
  55. package/dist/config.js.map +1 -1
  56. package/dist/constants.d.ts +97 -217
  57. package/dist/constants.js +441 -416
  58. package/dist/constants.js.map +1 -1
  59. package/dist/controls-options-manager/constants.js +6 -3
  60. package/dist/controls-options-manager/constants.js.map +1 -1
  61. package/dist/controls-options-manager/enums.d.ts +1 -11
  62. package/dist/controls-options-manager/enums.js +6 -15
  63. package/dist/controls-options-manager/enums.js.map +1 -1
  64. package/dist/controls-options-manager/index.d.ts +1 -17
  65. package/dist/controls-options-manager/index.js +38 -127
  66. package/dist/controls-options-manager/index.js.map +1 -1
  67. package/dist/controls-options-manager/util.d.ts +7 -1
  68. package/dist/controls-options-manager/util.js +19 -309
  69. package/dist/controls-options-manager/util.js.map +1 -1
  70. package/dist/index.d.ts +3 -6
  71. package/dist/index.js +4 -116
  72. package/dist/index.js.map +1 -1
  73. package/dist/locus-info/controlsUtils.js +11 -100
  74. package/dist/locus-info/controlsUtils.js.map +1 -1
  75. package/dist/locus-info/embeddedAppsUtils.js +4 -3
  76. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  77. package/dist/locus-info/fullState.js +2 -1
  78. package/dist/locus-info/fullState.js.map +1 -1
  79. package/dist/locus-info/hostUtils.js +2 -1
  80. package/dist/locus-info/hostUtils.js.map +1 -1
  81. package/dist/locus-info/index.d.ts +4 -57
  82. package/dist/locus-info/index.js +84 -425
  83. package/dist/locus-info/index.js.map +1 -1
  84. package/dist/locus-info/infoUtils.js +5 -13
  85. package/dist/locus-info/infoUtils.js.map +1 -1
  86. package/dist/locus-info/mediaSharesUtils.js +3 -58
  87. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  88. package/dist/locus-info/parser.d.ts +6 -66
  89. package/dist/locus-info/parser.js +80 -253
  90. package/dist/locus-info/parser.js.map +1 -1
  91. package/dist/locus-info/selfUtils.js +13 -97
  92. package/dist/locus-info/selfUtils.js.map +1 -1
  93. package/dist/media/index.d.ts +0 -2
  94. package/dist/media/index.js +319 -107
  95. package/dist/media/index.js.map +1 -1
  96. package/dist/media/properties.d.ts +53 -38
  97. package/dist/media/properties.js +153 -96
  98. package/dist/media/properties.js.map +1 -1
  99. package/dist/media/util.js +22 -1
  100. package/dist/media/util.js.map +1 -1
  101. package/dist/mediaQualityMetrics/config.d.ts +230 -234
  102. package/dist/mediaQualityMetrics/config.js +498 -302
  103. package/dist/mediaQualityMetrics/config.js.map +1 -1
  104. package/dist/meeting/effectsState.d.ts +42 -0
  105. package/dist/meeting/effectsState.js +260 -0
  106. package/dist/meeting/effectsState.js.map +1 -0
  107. package/dist/meeting/in-meeting-actions.d.ts +0 -88
  108. package/dist/meeting/in-meeting-actions.js +3 -94
  109. package/dist/meeting/in-meeting-actions.js.map +1 -1
  110. package/dist/meeting/index.d.ts +494 -591
  111. package/dist/meeting/index.js +2969 -4707
  112. package/dist/meeting/index.js.map +1 -1
  113. package/dist/meeting/muteState.d.ts +25 -93
  114. package/dist/meeting/muteState.js +133 -224
  115. package/dist/meeting/muteState.js.map +1 -1
  116. package/dist/meeting/request.d.ts +47 -82
  117. package/dist/meeting/request.js +199 -297
  118. package/dist/meeting/request.js.map +1 -1
  119. package/dist/meeting/state.js +2 -1
  120. package/dist/meeting/state.js.map +1 -1
  121. package/dist/meeting/util.d.ts +1 -102
  122. package/dist/meeting/util.js +435 -605
  123. package/dist/meeting/util.js.map +1 -1
  124. package/dist/meeting-info/collection.js +4 -3
  125. package/dist/meeting-info/collection.js.map +1 -1
  126. package/dist/meeting-info/index.d.ts +1 -13
  127. package/dist/meeting-info/index.js +7 -74
  128. package/dist/meeting-info/index.js.map +1 -1
  129. package/dist/meeting-info/meeting-info-v2.d.ts +1 -31
  130. package/dist/meeting-info/meeting-info-v2.js +63 -200
  131. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  132. package/dist/meeting-info/request.js +2 -1
  133. package/dist/meeting-info/request.js.map +1 -1
  134. package/dist/meeting-info/util.js +3 -2
  135. package/dist/meeting-info/util.js.map +1 -1
  136. package/dist/meeting-info/utilv2.js +41 -39
  137. package/dist/meeting-info/utilv2.js.map +1 -1
  138. package/dist/meetings/collection.d.ts +0 -17
  139. package/dist/meetings/collection.js +4 -42
  140. package/dist/meetings/collection.js.map +1 -1
  141. package/dist/meetings/index.d.ts +21 -103
  142. package/dist/meetings/index.js +124 -486
  143. package/dist/meetings/index.js.map +1 -1
  144. package/dist/meetings/request.js +3 -4
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +6 -107
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.d.ts +1 -13
  149. package/dist/member/index.js +2 -45
  150. package/dist/member/index.js.map +1 -1
  151. package/dist/member/member.types.js +4 -3
  152. package/dist/member/member.types.js.map +1 -1
  153. package/dist/member/util.js +29 -120
  154. package/dist/member/util.js.map +1 -1
  155. package/dist/members/collection.d.ts +0 -5
  156. package/dist/members/collection.js +2 -11
  157. package/dist/members/collection.js.map +1 -1
  158. package/dist/members/index.d.ts +11 -56
  159. package/dist/members/index.js +47 -174
  160. package/dist/members/index.js.map +1 -1
  161. package/dist/members/request.d.ts +11 -67
  162. package/dist/members/request.js +54 -102
  163. package/dist/members/request.js.map +1 -1
  164. package/dist/members/types.js +4 -3
  165. package/dist/members/types.js.map +1 -1
  166. package/dist/members/util.d.ts +1 -214
  167. package/dist/members/util.js +284 -327
  168. package/dist/members/util.js.map +1 -1
  169. package/dist/metrics/config.d.ts +169 -0
  170. package/dist/metrics/config.js +289 -0
  171. package/dist/metrics/config.js.map +1 -0
  172. package/dist/metrics/constants.d.ts +6 -15
  173. package/dist/metrics/constants.js +9 -17
  174. package/dist/metrics/constants.js.map +1 -1
  175. package/dist/metrics/index.d.ts +111 -4
  176. package/dist/metrics/index.js +452 -4
  177. package/dist/metrics/index.js.map +1 -1
  178. package/dist/networkQualityMonitor/index.js +4 -5
  179. package/dist/networkQualityMonitor/index.js.map +1 -1
  180. package/dist/peer-connection-manager/index.d.ts +6 -0
  181. package/dist/peer-connection-manager/index.js +671 -0
  182. package/dist/peer-connection-manager/index.js.map +1 -0
  183. package/dist/peer-connection-manager/util.d.ts +6 -0
  184. package/dist/peer-connection-manager/util.js +110 -0
  185. package/dist/peer-connection-manager/util.js.map +1 -0
  186. package/dist/personal-meeting-room/index.js +3 -2
  187. package/dist/personal-meeting-room/index.js.map +1 -1
  188. package/dist/personal-meeting-room/request.js +3 -2
  189. package/dist/personal-meeting-room/request.js.map +1 -1
  190. package/dist/personal-meeting-room/util.js +2 -1
  191. package/dist/personal-meeting-room/util.js.map +1 -1
  192. package/dist/reachability/index.d.ts +7 -62
  193. package/dist/reachability/index.js +72 -265
  194. package/dist/reachability/index.js.map +1 -1
  195. package/dist/reachability/request.d.ts +3 -7
  196. package/dist/reachability/request.js +10 -18
  197. package/dist/reachability/request.js.map +1 -1
  198. package/dist/reactions/reactions.d.ts +2 -2
  199. package/dist/reactions/reactions.js +6 -4
  200. package/dist/reactions/reactions.js.map +1 -1
  201. package/dist/reactions/reactions.type.d.ts +3 -23
  202. package/dist/reactions/reactions.type.js +23 -21
  203. package/dist/reactions/reactions.type.js.map +1 -1
  204. package/dist/reconnection-manager/index.d.ts +8 -32
  205. package/dist/reconnection-manager/index.js +231 -282
  206. package/dist/reconnection-manager/index.js.map +1 -1
  207. package/dist/recording-controller/enums.js +5 -4
  208. package/dist/recording-controller/enums.js.map +1 -1
  209. package/dist/recording-controller/index.d.ts +1 -15
  210. package/dist/recording-controller/index.js +46 -57
  211. package/dist/recording-controller/index.js.map +1 -1
  212. package/dist/recording-controller/util.d.ts +4 -5
  213. package/dist/recording-controller/util.js +10 -10
  214. package/dist/recording-controller/util.js.map +1 -1
  215. package/dist/roap/collection.d.ts +10 -0
  216. package/dist/roap/collection.js +63 -0
  217. package/dist/roap/collection.js.map +1 -0
  218. package/dist/roap/handler.d.ts +47 -0
  219. package/dist/roap/handler.js +279 -0
  220. package/dist/roap/handler.js.map +1 -0
  221. package/dist/roap/index.d.ts +47 -9
  222. package/dist/roap/index.js +235 -101
  223. package/dist/roap/index.js.map +1 -1
  224. package/dist/roap/request.d.ts +12 -18
  225. package/dist/roap/request.js +180 -126
  226. package/dist/roap/request.js.map +1 -1
  227. package/dist/roap/state.d.ts +9 -0
  228. package/dist/roap/state.js +127 -0
  229. package/dist/roap/state.js.map +1 -0
  230. package/dist/roap/turnDiscovery.d.ts +16 -27
  231. package/dist/roap/turnDiscovery.js +105 -115
  232. package/dist/roap/turnDiscovery.js.map +1 -1
  233. package/dist/roap/util.d.ts +2 -0
  234. package/dist/roap/util.js +76 -0
  235. package/dist/roap/util.js.map +1 -0
  236. package/dist/statsAnalyzer/global.d.ts +83 -1
  237. package/dist/statsAnalyzer/global.js +85 -2
  238. package/dist/statsAnalyzer/global.js.map +1 -1
  239. package/dist/statsAnalyzer/index.d.ts +30 -28
  240. package/dist/statsAnalyzer/index.js +509 -374
  241. package/dist/statsAnalyzer/index.js.map +1 -1
  242. package/dist/statsAnalyzer/mqaUtil.d.ts +6 -8
  243. package/dist/statsAnalyzer/mqaUtil.js +83 -116
  244. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  245. package/dist/transcription/index.js +2 -1
  246. package/dist/transcription/index.js.map +1 -1
  247. package/package.json +26 -35
  248. package/src/common/errors/webex-errors.ts +12 -36
  249. package/src/common/logs/logger-proxy.ts +1 -1
  250. package/src/common/logs/request.ts +1 -5
  251. package/src/common/queue.ts +8 -22
  252. package/src/config.ts +7 -5
  253. package/src/constants.ts +97 -244
  254. package/src/controls-options-manager/enums.ts +0 -12
  255. package/src/controls-options-manager/index.ts +21 -116
  256. package/src/controls-options-manager/util.ts +14 -294
  257. package/src/index.js +15 -0
  258. package/src/locus-info/controlsUtils.ts +0 -110
  259. package/src/locus-info/index.ts +61 -449
  260. package/src/locus-info/infoUtils.ts +2 -14
  261. package/src/locus-info/mediaSharesUtils.ts +0 -64
  262. package/src/locus-info/parser.ts +47 -258
  263. package/src/locus-info/selfUtils.ts +2 -85
  264. package/src/media/index.ts +370 -153
  265. package/src/media/properties.ts +136 -106
  266. package/src/media/util.ts +21 -0
  267. package/src/mediaQualityMetrics/config.ts +377 -244
  268. package/src/meeting/effectsState.ts +209 -0
  269. package/src/meeting/in-meeting-actions.ts +0 -176
  270. package/src/meeting/index.ts +2482 -3929
  271. package/src/meeting/muteState.ts +138 -224
  272. package/src/meeting/request.ts +127 -207
  273. package/src/meeting/util.ts +423 -590
  274. package/src/meeting-info/index.ts +8 -81
  275. package/src/meeting-info/meeting-info-v2.ts +13 -163
  276. package/src/meeting-info/util.ts +1 -1
  277. package/src/meeting-info/utilv2.ts +28 -28
  278. package/src/meetings/collection.ts +0 -33
  279. package/src/meetings/index.ts +126 -486
  280. package/src/meetings/request.ts +0 -2
  281. package/src/meetings/util.ts +5 -116
  282. package/src/member/index.ts +1 -43
  283. package/src/member/util.ts +28 -125
  284. package/src/members/collection.ts +0 -8
  285. package/src/members/index.ts +52 -187
  286. package/src/members/request.ts +27 -87
  287. package/src/members/util.ts +291 -332
  288. package/src/metrics/config.ts +485 -0
  289. package/src/metrics/constants.ts +6 -15
  290. package/src/metrics/index.ts +471 -1
  291. package/src/networkQualityMonitor/index.ts +6 -6
  292. package/src/peer-connection-manager/index.ts +847 -0
  293. package/src/peer-connection-manager/util.ts +119 -0
  294. package/src/reachability/index.ts +45 -238
  295. package/src/reachability/request.ts +8 -17
  296. package/src/reactions/reactions.ts +4 -4
  297. package/src/reactions/reactions.type.ts +4 -30
  298. package/src/reconnection-manager/index.ts +156 -168
  299. package/src/recording-controller/index.ts +3 -20
  300. package/src/recording-controller/util.ts +9 -26
  301. package/src/roap/collection.ts +62 -0
  302. package/src/roap/handler.ts +294 -0
  303. package/src/roap/index.ts +241 -98
  304. package/src/roap/request.ts +148 -74
  305. package/src/roap/state.ts +156 -0
  306. package/src/roap/turnDiscovery.ts +56 -62
  307. package/src/roap/util.ts +100 -0
  308. package/src/statsAnalyzer/global.ts +84 -1
  309. package/src/statsAnalyzer/index.ts +642 -413
  310. package/src/statsAnalyzer/mqaUtil.ts +114 -111
  311. package/test/integration/spec/journey.js +264 -320
  312. package/test/integration/spec/space-meeting.js +4 -77
  313. package/test/unit/spec/common/queue.js +2 -31
  314. package/test/unit/spec/controls-options-manager/index.js +0 -163
  315. package/test/unit/spec/controls-options-manager/util.js +60 -576
  316. package/test/unit/spec/fixture/locus.js +0 -1
  317. package/test/unit/spec/locus-info/controlsUtils.js +30 -323
  318. package/test/unit/spec/locus-info/index.js +15 -1389
  319. package/test/unit/spec/locus-info/infoUtils.js +16 -54
  320. package/test/unit/spec/locus-info/lib/SeqCmp.json +0 -16
  321. package/test/unit/spec/locus-info/lib/selfConstant.js +0 -48
  322. package/test/unit/spec/locus-info/parser.js +35 -116
  323. package/test/unit/spec/locus-info/selfUtils.js +0 -275
  324. package/test/unit/spec/media/properties.ts +84 -75
  325. package/test/unit/spec/meeting/effectsState.js +281 -0
  326. package/test/unit/spec/meeting/in-meeting-actions.ts +0 -86
  327. package/test/unit/spec/meeting/index.js +3136 -8547
  328. package/test/unit/spec/meeting/muteState.js +213 -409
  329. package/test/unit/spec/meeting/request.js +42 -512
  330. package/test/unit/spec/meeting/utils.js +24 -741
  331. package/test/unit/spec/meeting-info/meetinginfov2.js +5 -527
  332. package/test/unit/spec/meeting-info/utilv2.js +0 -21
  333. package/test/unit/spec/meetings/collection.js +0 -26
  334. package/test/unit/spec/meetings/index.js +211 -1278
  335. package/test/unit/spec/meetings/utils.js +2 -202
  336. package/test/unit/spec/member/index.js +9 -32
  337. package/test/unit/spec/member/util.js +61 -499
  338. package/test/unit/spec/members/index.js +5 -394
  339. package/test/unit/spec/members/request.js +27 -206
  340. package/test/unit/spec/members/utils.js +38 -173
  341. package/test/unit/spec/metrics/index.js +50 -1
  342. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  343. package/test/unit/spec/peerconnection-manager/index.js +218 -0
  344. package/test/unit/spec/peerconnection-manager/utils.js +49 -0
  345. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +388 -0
  346. package/test/unit/spec/reachability/index.ts +24 -598
  347. package/test/unit/spec/reconnection-manager/index.js +24 -162
  348. package/test/unit/spec/recording-controller/index.js +218 -293
  349. package/test/unit/spec/recording-controller/util.js +96 -223
  350. package/test/unit/spec/roap/index.ts +76 -200
  351. package/test/unit/spec/roap/turnDiscovery.ts +48 -86
  352. package/test/unit/spec/roap/util.js +30 -0
  353. package/test/unit/spec/stats-analyzer/index.js +174 -188
  354. package/test/utils/testUtils.js +45 -0
  355. package/test/utils/webex-config.js +0 -4
  356. package/test/utils/webex-test-users.js +3 -7
  357. package/dist/annotation/annotation.types.d.ts +0 -42
  358. package/dist/annotation/annotation.types.js +0 -7
  359. package/dist/annotation/annotation.types.js.map +0 -1
  360. package/dist/annotation/constants.d.ts +0 -31
  361. package/dist/annotation/constants.js +0 -41
  362. package/dist/annotation/constants.js.map +0 -1
  363. package/dist/annotation/index.d.ts +0 -117
  364. package/dist/annotation/index.js +0 -357
  365. package/dist/annotation/index.js.map +0 -1
  366. package/dist/breakouts/breakout.d.ts +0 -8
  367. package/dist/breakouts/breakout.js +0 -215
  368. package/dist/breakouts/breakout.js.map +0 -1
  369. package/dist/breakouts/collection.d.ts +0 -5
  370. package/dist/breakouts/collection.js +0 -22
  371. package/dist/breakouts/collection.js.map +0 -1
  372. package/dist/breakouts/edit-lock-error.d.ts +0 -15
  373. package/dist/breakouts/edit-lock-error.js +0 -51
  374. package/dist/breakouts/edit-lock-error.js.map +0 -1
  375. package/dist/breakouts/events.d.ts +0 -8
  376. package/dist/breakouts/events.js +0 -44
  377. package/dist/breakouts/events.js.map +0 -1
  378. package/dist/breakouts/index.d.ts +0 -5
  379. package/dist/breakouts/index.js +0 -1047
  380. package/dist/breakouts/index.js.map +0 -1
  381. package/dist/breakouts/request.d.ts +0 -22
  382. package/dist/breakouts/request.js +0 -77
  383. package/dist/breakouts/request.js.map +0 -1
  384. package/dist/breakouts/utils.d.ts +0 -15
  385. package/dist/breakouts/utils.js +0 -64
  386. package/dist/breakouts/utils.js.map +0 -1
  387. package/dist/common/errors/no-meeting-info.d.ts +0 -14
  388. package/dist/common/errors/no-meeting-info.js +0 -50
  389. package/dist/common/errors/no-meeting-info.js.map +0 -1
  390. package/dist/common/errors/reclaim-host-role-errors.js.map +0 -1
  391. package/dist/controls-options-manager/types.d.ts +0 -43
  392. package/dist/controls-options-manager/types.js +0 -7
  393. package/dist/controls-options-manager/types.js.map +0 -1
  394. package/dist/interpretation/collection.d.ts +0 -5
  395. package/dist/interpretation/collection.js +0 -22
  396. package/dist/interpretation/collection.js.map +0 -1
  397. package/dist/interpretation/index.d.ts +0 -5
  398. package/dist/interpretation/index.js +0 -365
  399. package/dist/interpretation/index.js.map +0 -1
  400. package/dist/interpretation/siLanguage.d.ts +0 -5
  401. package/dist/interpretation/siLanguage.js +0 -24
  402. package/dist/interpretation/siLanguage.js.map +0 -1
  403. package/dist/meeting/locusMediaRequest.d.ts +0 -74
  404. package/dist/meeting/locusMediaRequest.js +0 -291
  405. package/dist/meeting/locusMediaRequest.js.map +0 -1
  406. package/dist/meeting/request.type.d.ts +0 -11
  407. package/dist/meeting/request.type.js +0 -7
  408. package/dist/meeting/request.type.js.map +0 -1
  409. package/dist/meetings/meetings.types.d.ts +0 -4
  410. package/dist/meetings/meetings.types.js +0 -7
  411. package/dist/meetings/meetings.types.js.map +0 -1
  412. package/dist/member/types.d.ts +0 -32
  413. package/dist/member/types.js +0 -23
  414. package/dist/member/types.js.map +0 -1
  415. package/dist/multistream/mediaRequestManager.d.ts +0 -118
  416. package/dist/multistream/mediaRequestManager.js +0 -344
  417. package/dist/multistream/mediaRequestManager.js.map +0 -1
  418. package/dist/multistream/receiveSlot.d.ts +0 -68
  419. package/dist/multistream/receiveSlot.js +0 -200
  420. package/dist/multistream/receiveSlot.js.map +0 -1
  421. package/dist/multistream/receiveSlotManager.d.ts +0 -56
  422. package/dist/multistream/receiveSlotManager.js +0 -174
  423. package/dist/multistream/receiveSlotManager.js.map +0 -1
  424. package/dist/multistream/remoteMedia.d.ts +0 -72
  425. package/dist/multistream/remoteMedia.js +0 -268
  426. package/dist/multistream/remoteMedia.js.map +0 -1
  427. package/dist/multistream/remoteMediaGroup.d.ts +0 -47
  428. package/dist/multistream/remoteMediaGroup.js +0 -267
  429. package/dist/multistream/remoteMediaGroup.js.map +0 -1
  430. package/dist/multistream/remoteMediaManager.d.ts +0 -285
  431. package/dist/multistream/remoteMediaManager.js +0 -1211
  432. package/dist/multistream/remoteMediaManager.js.map +0 -1
  433. package/dist/multistream/sendSlotManager.d.ts +0 -61
  434. package/dist/multistream/sendSlotManager.js +0 -236
  435. package/dist/multistream/sendSlotManager.js.map +0 -1
  436. package/dist/reactions/constants.d.ts +0 -3
  437. package/dist/reactions/constants.js +0 -12
  438. package/dist/reactions/constants.js.map +0 -1
  439. package/dist/rtcMetrics/constants.d.ts +0 -4
  440. package/dist/rtcMetrics/constants.js +0 -11
  441. package/dist/rtcMetrics/constants.js.map +0 -1
  442. package/dist/rtcMetrics/index.d.ts +0 -54
  443. package/dist/rtcMetrics/index.js +0 -140
  444. package/dist/rtcMetrics/index.js.map +0 -1
  445. package/dist/webinar/collection.d.ts +0 -16
  446. package/dist/webinar/collection.js +0 -43
  447. package/dist/webinar/collection.js.map +0 -1
  448. package/dist/webinar/index.d.ts +0 -5
  449. package/dist/webinar/index.js +0 -68
  450. package/dist/webinar/index.js.map +0 -1
  451. package/src/annotation/annotation.types.ts +0 -50
  452. package/src/annotation/constants.ts +0 -36
  453. package/src/annotation/index.ts +0 -328
  454. package/src/breakouts/README.md +0 -220
  455. package/src/breakouts/breakout.ts +0 -188
  456. package/src/breakouts/collection.ts +0 -19
  457. package/src/breakouts/edit-lock-error.ts +0 -25
  458. package/src/breakouts/events.ts +0 -56
  459. package/src/breakouts/index.ts +0 -925
  460. package/src/breakouts/request.ts +0 -55
  461. package/src/breakouts/utils.ts +0 -57
  462. package/src/common/errors/no-meeting-info.ts +0 -24
  463. package/src/controls-options-manager/types.ts +0 -59
  464. package/src/index.ts +0 -40
  465. package/src/interpretation/README.md +0 -60
  466. package/src/interpretation/collection.ts +0 -19
  467. package/src/interpretation/index.ts +0 -332
  468. package/src/interpretation/siLanguage.ts +0 -18
  469. package/src/meeting/locusMediaRequest.ts +0 -313
  470. package/src/meeting/request.type.ts +0 -13
  471. package/src/meetings/meetings.types.ts +0 -12
  472. package/src/member/types.ts +0 -38
  473. package/src/multistream/mediaRequestManager.ts +0 -440
  474. package/src/multistream/receiveSlot.ts +0 -184
  475. package/src/multistream/receiveSlotManager.ts +0 -166
  476. package/src/multistream/remoteMedia.ts +0 -254
  477. package/src/multistream/remoteMediaGroup.ts +0 -284
  478. package/src/multistream/remoteMediaManager.ts +0 -1145
  479. package/src/multistream/sendSlotManager.ts +0 -170
  480. package/src/reactions/constants.ts +0 -4
  481. package/src/rtcMetrics/constants.ts +0 -3
  482. package/src/rtcMetrics/index.ts +0 -124
  483. package/src/webinar/collection.ts +0 -31
  484. package/src/webinar/index.ts +0 -62
  485. package/test/integration/spec/converged-space-meetings.js +0 -233
  486. package/test/unit/spec/annotation/index.ts +0 -418
  487. package/test/unit/spec/breakouts/breakout.ts +0 -237
  488. package/test/unit/spec/breakouts/collection.ts +0 -15
  489. package/test/unit/spec/breakouts/edit-lock-error.ts +0 -30
  490. package/test/unit/spec/breakouts/events.ts +0 -89
  491. package/test/unit/spec/breakouts/index.ts +0 -1790
  492. package/test/unit/spec/breakouts/request.ts +0 -104
  493. package/test/unit/spec/breakouts/utils.js +0 -72
  494. package/test/unit/spec/interpretation/collection.ts +0 -15
  495. package/test/unit/spec/interpretation/index.ts +0 -589
  496. package/test/unit/spec/interpretation/siLanguage.ts +0 -28
  497. package/test/unit/spec/locus-info/mediaSharesUtils.ts +0 -32
  498. package/test/unit/spec/media/index.ts +0 -290
  499. package/test/unit/spec/meeting/locusMediaRequest.ts +0 -442
  500. package/test/unit/spec/meeting-info/index.js +0 -300
  501. package/test/unit/spec/multistream/mediaRequestManager.ts +0 -1418
  502. package/test/unit/spec/multistream/receiveSlot.ts +0 -163
  503. package/test/unit/spec/multistream/receiveSlotManager.ts +0 -203
  504. package/test/unit/spec/multistream/remoteMedia.ts +0 -255
  505. package/test/unit/spec/multistream/remoteMediaGroup.ts +0 -662
  506. package/test/unit/spec/multistream/remoteMediaManager.ts +0 -1924
  507. package/test/unit/spec/multistream/sendSlotManager.ts +0 -242
  508. package/test/unit/spec/reachability/request.js +0 -68
  509. package/test/unit/spec/roap/request.ts +0 -232
  510. package/test/unit/spec/rtcMetrics/index.ts +0 -93
  511. package/test/unit/spec/webinar/collection.ts +0 -13
  512. package/test/unit/spec/webinar/index.ts +0 -60
  513. package/test/utils/constants.js +0 -9
  514. package/test/utils/integrationTestUtils.js +0 -46
  515. /package/dist/common/errors/{reclaim-host-role-errors.d.ts → reclaim-host-role-error.d.ts} +0 -0
  516. /package/src/common/errors/{reclaim-host-role-errors.ts → reclaim-host-role-error.ts} +0 -0
@@ -1,24 +1,18 @@
1
1
  /* eslint-disable prefer-destructuring */
2
2
 
3
3
  import {cloneDeep} from 'lodash';
4
- import {ConnectionState} from '@webex/internal-media-core';
5
4
 
6
5
  import EventsScope from '../common/events/events-scope';
7
6
  import {
8
7
  DEFAULT_GET_STATS_FILTER,
8
+ CONNECTION_STATE,
9
9
  STATS,
10
10
  MQA_INTEVAL,
11
11
  NETWORK_TYPE,
12
12
  MEDIA_DEVICES,
13
13
  _UNKNOWN_,
14
14
  } from '../constants';
15
- import {
16
- emptyAudioReceive,
17
- emptyAudioTransmit,
18
- emptyMqaInterval,
19
- emptyVideoReceive,
20
- emptyVideoTransmit,
21
- } from '../mediaQualityMetrics/config';
15
+ import mqaData from '../mediaQualityMetrics/config';
22
16
  import LoggerProxy from '../common/logs/logger-proxy';
23
17
 
24
18
  import defaultStats from './global';
@@ -28,34 +22,17 @@ import {
28
22
  getVideoSenderMqa,
29
23
  getVideoReceiverMqa,
30
24
  } from './mqaUtil';
31
- import {ReceiveSlot} from '../multistream/receiveSlot';
32
25
 
33
26
  export const EVENTS = {
34
27
  MEDIA_QUALITY: 'MEDIA_QUALITY',
28
+ NO_FRAMES_SENT: 'NO_FRAMES_SENT',
29
+ NO_VIDEO_ENCODED: 'NO_VIDEO_ENCODED',
35
30
  LOCAL_MEDIA_STARTED: 'LOCAL_MEDIA_STARTED',
36
31
  LOCAL_MEDIA_STOPPED: 'LOCAL_MEDIA_STOPPED',
37
32
  REMOTE_MEDIA_STARTED: 'REMOTE_MEDIA_STARTED',
38
33
  REMOTE_MEDIA_STOPPED: 'REMOTE_MEDIA_STOPPED',
39
34
  };
40
35
 
41
- const emptySender = {
42
- trackLabel: '',
43
- maxPacketLossRatio: 0,
44
- availableBandwidth: 0,
45
- bytesSent: 0,
46
- meanRemoteJitter: [],
47
- meanRoundTripTime: [],
48
- };
49
-
50
- const emptyReceiver = {
51
- availableBandwidth: 0,
52
- bytesReceived: 0,
53
- meanRtpJitter: [],
54
- meanRoundTripTime: [],
55
- };
56
-
57
- type ReceiveSlotCallback = (csi: number) => ReceiveSlot | undefined;
58
-
59
36
  /**
60
37
  * Stats Analyzer class that will emit events based on detected quality
61
38
  *
@@ -69,29 +46,26 @@ export class StatsAnalyzer extends EventsScope {
69
46
  lastEmittedStartStopEvent: any;
70
47
  lastMqaDataSent: any;
71
48
  lastStatsResults: any;
49
+ localMQEStats: any;
72
50
  meetingMediaStatus: any;
73
51
  mqaInterval: NodeJS.Timeout;
74
52
  mqaSentCount: any;
75
53
  networkQualityMonitor: any;
76
- mediaConnection: any;
54
+ peerConnection: any;
77
55
  statsInterval: NodeJS.Timeout;
78
56
  statsResults: any;
79
57
  statsStarted: any;
80
- successfulCandidatePair: any;
81
- receiveSlotCallback: ReceiveSlotCallback;
82
58
 
83
59
  /**
84
60
  * Creates a new instance of StatsAnalyzer
85
61
  * @constructor
86
62
  * @public
87
63
  * @param {Object} config SDK Configuration Object
88
- * @param {Function} receiveSlotCallback Callback used to access receive slots.
89
64
  * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)
90
65
  * @param {Object} statsResults Default properties for stats
91
66
  */
92
67
  constructor(
93
68
  config: any,
94
- receiveSlotCallback: ReceiveSlotCallback = () => undefined,
95
69
  networkQualityMonitor: object = {},
96
70
  statsResults: object = defaultStats
97
71
  ) {
@@ -103,30 +77,147 @@ export class StatsAnalyzer extends EventsScope {
103
77
  this.networkQualityMonitor = networkQualityMonitor;
104
78
  this.correlationId = config.correlationId;
105
79
  this.mqaSentCount = -1;
106
- this.lastMqaDataSent = {};
107
- this.lastEmittedStartStopEvent = {};
108
- this.receiveSlotCallback = receiveSlotCallback;
109
- this.successfulCandidatePair = {};
80
+ this.lastMqaDataSent = {
81
+ resolutions: {
82
+ video: {send: {}, recv: {}},
83
+ audio: {send: {}, recv: {}},
84
+ share: {send: {}, recv: {}},
85
+ },
86
+ video: {send: {}, recv: {}},
87
+ audio: {send: {}, recv: {}},
88
+ share: {send: {}, recv: {}},
89
+ };
90
+ this.localMQEStats = {
91
+ audio: {
92
+ RX: {
93
+ packetsLost: [],
94
+ jitter: [],
95
+ latency: [],
96
+ bitRate: [],
97
+ },
98
+ TX: {
99
+ packetsLost: [],
100
+ jitter: [],
101
+ latency: [],
102
+ bitRate: [],
103
+ },
104
+ },
105
+ video: {
106
+ RX: {
107
+ packetsLost: [],
108
+ jitter: [],
109
+ latency: [],
110
+ bitRate: [],
111
+ frameRate: [],
112
+ resolutionWidth: [],
113
+ resolutionHeight: [],
114
+ requestedKeyFrame: [],
115
+ receivedKeyFrame: [],
116
+ },
117
+ TX: {
118
+ packetsLost: [],
119
+ jitter: [],
120
+ latency: [],
121
+ bitRate: [],
122
+ frameRate: [],
123
+ resolutionWidth: [],
124
+ resolutionHeight: [],
125
+ requestedKeyFrame: [],
126
+ receivedKeyFrame: [],
127
+ },
128
+ },
129
+ };
130
+ this.lastEmittedStartStopEvent = {
131
+ audio: {
132
+ local: undefined,
133
+ remote: undefined,
134
+ },
135
+ video: {
136
+ local: undefined,
137
+ remote: undefined,
138
+ },
139
+ share: {
140
+ local: undefined,
141
+ remote: undefined,
142
+ },
143
+ };
144
+ }
145
+
146
+ populateResults(lastMqa) {
147
+ // Audio
148
+
149
+ this.localMQEStats.audio.RX.packetsLost.push(lastMqa.audioReceive[0].common.mediaHopByHopLost);
150
+ this.localMQEStats.audio.RX.jitter.push(lastMqa.audioReceive[0].streams[0].common.rtpJitter);
151
+ this.localMQEStats.audio.RX.latency.push(lastMqa.audioReceive[0].common.roundTripTime);
152
+ this.localMQEStats.audio.RX.bitRate.push(
153
+ lastMqa.audioReceive[0].streams[0].common.receivedBitrate
154
+ );
155
+
156
+ this.localMQEStats.audio.TX.packetsLost.push(lastMqa.audioTransmit[0].common.remoteLossRate);
157
+ this.localMQEStats.audio.TX.jitter.push(lastMqa.audioTransmit[0].common.remoteJitter);
158
+ this.localMQEStats.audio.TX.latency.push(lastMqa.audioTransmit[0].common.roundTripTime);
159
+ this.localMQEStats.audio.TX.bitRate.push(
160
+ lastMqa.audioTransmit[0].streams[0].common.transmittedBitrate
161
+ );
162
+
163
+ // Video
164
+
165
+ this.localMQEStats.video.RX.packetsLost.push(lastMqa.videoReceive[0].common.mediaHopByHopLost);
166
+ this.localMQEStats.video.RX.jitter.push(lastMqa.videoReceive[0].streams[0].common.rtpJitter);
167
+ this.localMQEStats.video.RX.latency.push(
168
+ lastMqa.videoReceive[0].streams[0].common.roundTripTime
169
+ );
170
+ this.localMQEStats.video.RX.bitRate.push(
171
+ lastMqa.videoReceive[0].streams[0].common.receivedBitrate
172
+ );
173
+ this.localMQEStats.video.RX.frameRate.push(
174
+ lastMqa.videoReceive[0].streams[0].common.receivedFrameRate
175
+ );
176
+ this.localMQEStats.video.RX.resolutionWidth.push(
177
+ lastMqa.videoReceive[0].streams[0].receivedWidth
178
+ );
179
+ this.localMQEStats.video.RX.resolutionHeight.push(
180
+ lastMqa.videoReceive[0].streams[0].receivedHeight
181
+ );
182
+ this.localMQEStats.video.RX.requestedKeyFrame.push();
183
+ this.localMQEStats.video.RX.receivedKeyFrame.push();
184
+
185
+ this.localMQEStats.video.TX.packetsLost.push(lastMqa.videoTransmit[0].common.remoteLossRate);
186
+ this.localMQEStats.video.TX.jitter.push(lastMqa.videoTransmit[0].common.remoteJitter);
187
+ this.localMQEStats.video.TX.latency.push(lastMqa.videoTransmit[0].common.roundTripTime);
188
+ this.localMQEStats.video.TX.bitRate.push(
189
+ lastMqa.videoTransmit[0].streams[0].common.transmittedBitrate
190
+ );
191
+ this.localMQEStats.video.TX.frameRate.push(
192
+ lastMqa.videoTransmit[0].streams[0].common.transmittedFrameRate
193
+ );
194
+ this.localMQEStats.video.TX.resolutionWidth.push(
195
+ lastMqa.videoTransmit[0].streams[0].transmittedWidth
196
+ );
197
+ this.localMQEStats.video.TX.resolutionHeight.push(
198
+ lastMqa.videoTransmit[0].streams[0].transmittedHeight
199
+ );
200
+ this.localMQEStats.video.TX.requestedKeyFrame.push(
201
+ lastMqa.videoTransmit[0].streams[0].requestedKeyFrames
202
+ );
203
+ this.localMQEStats.video.TX.receivedKeyFrame.push();
110
204
  }
111
205
 
112
- /**
113
- * Resets cumulative stats arrays.
114
- *
115
- * @public
116
- * @memberof StatsAnalyzer
117
- * @returns {void}
118
- */
119
206
  resetStatsResults() {
120
- Object.keys(this.statsResults).forEach((mediaType) => {
121
- if (mediaType.includes('recv')) {
122
- this.statsResults[mediaType].recv.meanRtpJitter = [];
123
- }
207
+ this.statsResults.audio.send.meanRemoteJitter = [];
208
+ this.statsResults.video.send.meanRemoteJitter = [];
209
+ this.statsResults.share.send.meanRemoteJitter = [];
124
210
 
125
- if (mediaType.includes('send')) {
126
- this.statsResults[mediaType].send.meanRemoteJitter = [];
127
- this.statsResults[mediaType].send.meanRoundTripTime = [];
128
- }
129
- });
211
+ this.statsResults.audio.recv.meanRtpJitter = [];
212
+
213
+ // TODO: currently no values are present
214
+ this.statsResults.video.recv.meanRtpJitter = [];
215
+ this.statsResults.share.recv.meanRtpJitter = [];
216
+
217
+ // Reset the roundTripTime
218
+ this.statsResults.audio.send.meanRoundTripTime = [];
219
+ this.statsResults.video.send.meanRoundTripTime = [];
220
+ this.statsResults.share.send.meanRoundTripTime = [];
130
221
  }
131
222
 
132
223
  /**
@@ -142,101 +233,86 @@ export class StatsAnalyzer extends EventsScope {
142
233
  }
143
234
 
144
235
  /**
145
- * captures MQA data from media connection
236
+ * captures MQA data from peerconnection
146
237
  *
147
238
  * @public
148
239
  * @memberof StatsAnalyzer
149
240
  * @returns {void}
150
241
  */
151
- sendMqaData() {
152
- const newMqa = cloneDeep(emptyMqaInterval);
153
-
154
- Object.keys(this.statsResults).forEach((mediaType) => {
155
- if (!this.lastMqaDataSent[mediaType]) {
156
- this.lastMqaDataSent[mediaType] = {};
157
- }
158
-
159
- if (!this.lastMqaDataSent[mediaType].send && mediaType.includes('-send')) {
160
- this.lastMqaDataSent[mediaType].send = {};
161
- }
162
-
163
- if (!this.lastMqaDataSent[mediaType].recv && mediaType.includes('-recv')) {
164
- this.lastMqaDataSent[mediaType].recv = {};
165
- }
166
-
167
- if (mediaType.includes('audio-send') || mediaType.includes('audio-share-send')) {
168
- const audioSender = cloneDeep(emptyAudioTransmit);
169
-
170
- getAudioSenderMqa({
171
- audioSender,
172
- statsResults: this.statsResults,
173
- lastMqaDataSent: this.lastMqaDataSent,
174
- mediaType,
175
- });
176
- newMqa.audioTransmit.push(audioSender);
177
-
178
- this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);
179
- } else if (mediaType.includes('audio-recv') || mediaType.includes('audio-share-recv')) {
180
- const audioReceiver = cloneDeep(emptyAudioReceive);
181
-
182
- getAudioReceiverMqa({
183
- audioReceiver,
184
- statsResults: this.statsResults,
185
- lastMqaDataSent: this.lastMqaDataSent,
186
- mediaType,
187
- });
188
- newMqa.audioReceive.push(audioReceiver);
189
-
190
- this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);
191
- } else if (mediaType.includes('video-send') || mediaType.includes('video-share-send')) {
192
- const videoSender = cloneDeep(emptyVideoTransmit);
193
-
194
- getVideoSenderMqa({
195
- videoSender,
196
- statsResults: this.statsResults,
197
- lastMqaDataSent: this.lastMqaDataSent,
198
- mediaType,
199
- });
200
- newMqa.videoTransmit.push(videoSender);
242
+ public sendMqaData() {
243
+ const audioReceiver = mqaData.intervals[0].audioReceive[0];
244
+ const audioSender = mqaData.intervals[0].audioTransmit[0];
245
+ const videoReceiver = mqaData.intervals[0].videoReceive[0];
246
+ const videoSender = mqaData.intervals[0].videoTransmit[0];
247
+ const shareSender = mqaData.intervals[0].videoTransmit[1];
248
+ const shareReceiver = mqaData.intervals[0].videoReceive[1];
249
+
250
+ getAudioSenderMqa({
251
+ audioSender,
252
+ statsResults: this.statsResults,
253
+ lastMqaDataSent: this.lastMqaDataSent,
254
+ });
255
+ getAudioReceiverMqa({
256
+ audioReceiver,
257
+ statsResults: this.statsResults,
258
+ lastMqaDataSent: this.lastMqaDataSent,
259
+ });
201
260
 
202
- this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);
203
- } else if (mediaType.includes('video-recv') || mediaType.includes('video-share-recv')) {
204
- const videoReceiver = cloneDeep(emptyVideoReceive);
261
+ getVideoReceiverMqa({
262
+ videoReceiver,
263
+ statsResults: this.statsResults,
264
+ lastMqaDataSent: this.lastMqaDataSent,
265
+ });
266
+ getVideoSenderMqa({
267
+ videoSender,
268
+ statsResults: this.statsResults,
269
+ lastMqaDataSent: this.lastMqaDataSent,
270
+ });
205
271
 
206
- getVideoReceiverMqa({
207
- videoReceiver,
208
- statsResults: this.statsResults,
209
- lastMqaDataSent: this.lastMqaDataSent,
210
- mediaType,
211
- });
212
- newMqa.videoReceive.push(videoReceiver);
272
+ // Capture mqa for share scenario
213
273
 
214
- this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);
215
- }
274
+ getVideoSenderMqa({
275
+ videoSender: shareSender,
276
+ statsResults: this.statsResults,
277
+ lastMqaDataSent: this.lastMqaDataSent,
278
+ isShareStream: true,
216
279
  });
217
280
 
218
- newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;
281
+ getVideoReceiverMqa({
282
+ videoReceiver: shareReceiver,
283
+ statsResults: this.statsResults,
284
+ lastMqaDataSent: this.lastMqaDataSent,
285
+ isShareStream: true,
286
+ });
287
+ mqaData.intervals[0].intervalMetadata.peerReflexiveIP =
288
+ this.statsResults.connectionType.local.ipAddress[0];
219
289
 
220
290
  // Adding peripheral information
221
- newMqa.intervalMetadata.peripherals.push({information: _UNKNOWN_, name: MEDIA_DEVICES.SPEAKER});
222
- if (this.statsResults['audio-send']) {
223
- newMqa.intervalMetadata.peripherals.push({
224
- information: this.statsResults['audio-send'].trackLabel || _UNKNOWN_,
225
- name: MEDIA_DEVICES.MICROPHONE,
226
- });
227
- }
228
- if (this.statsResults['video-send']) {
229
- newMqa.intervalMetadata.peripherals.push({
230
- information: this.statsResults['video-send'].trackLabel || _UNKNOWN_,
231
- name: MEDIA_DEVICES.CAMERA,
232
- });
233
- }
291
+ mqaData.intervals[0].intervalMetadata.peripherals = [];
292
+ mqaData.intervals[0].intervalMetadata.peripherals.push({
293
+ information: _UNKNOWN_,
294
+ name: MEDIA_DEVICES.SPEAKER,
295
+ });
296
+ mqaData.intervals[0].intervalMetadata.peripherals.push({
297
+ information: this.peerConnection?.audioTransceiver?.sender?.track?.label || _UNKNOWN_,
298
+ name: MEDIA_DEVICES.MICROPHONE,
299
+ });
300
+ mqaData.intervals[0].intervalMetadata.peripherals.push({
301
+ information: this.peerConnection?.videoTransceiver?.sender?.track?.label || _UNKNOWN_,
302
+ name: MEDIA_DEVICES.CAMERA,
303
+ });
234
304
 
235
- newMqa.networkType = this.statsResults.connectionType.local.networkType;
305
+ // @ts-ignore
306
+ mqaData.networkType = this.statsResults.connectionType.local.networkType;
236
307
 
237
308
  this.mqaSentCount += 1;
238
309
 
239
- newMqa.intervalNumber = this.mqaSentCount;
310
+ mqaData.intervals[0].intervalNumber = this.mqaSentCount;
311
+
312
+ // DO Deep copy, for some reason it takes the reference all the time rather then old value set
313
+ this.lastMqaDataSent = cloneDeep(this.statsResults);
314
+
315
+ this.populateResults(mqaData.intervals[0]);
240
316
 
241
317
  this.resetStatsResults();
242
318
 
@@ -247,23 +323,23 @@ export class StatsAnalyzer extends EventsScope {
247
323
  },
248
324
  EVENTS.MEDIA_QUALITY,
249
325
  {
250
- data: newMqa,
326
+ data: mqaData.intervals[0],
251
327
  // @ts-ignore
252
- networkType: newMqa.networkType,
328
+ networkType: mqaData.networkType,
253
329
  }
254
330
  );
255
331
  }
256
332
 
257
333
  /**
258
- * updated the media connection when changed
334
+ * updated the peerconnection when changed
259
335
  *
260
336
  * @private
261
- * @memberof StatsAnalyzer
262
- * @param {RoapMediaConnection} mediaConnection
337
+ * @memberof updatePeerconnection
338
+ * @param {PeerConnection} peerConnection
263
339
  * @returns {void}
264
340
  */
265
- updateMediaConnection(mediaConnection: any) {
266
- this.mediaConnection = mediaConnection;
341
+ updatePeerconnection(peerConnection: any) {
342
+ this.peerConnection = peerConnection;
267
343
  }
268
344
 
269
345
  /**
@@ -271,13 +347,13 @@ export class StatsAnalyzer extends EventsScope {
271
347
  *
272
348
  * @public
273
349
  * @memberof StatsAnalyzer
274
- * @param {RoapMediaConnection} mediaConnection
350
+ * @param {PeerConnection} peerConnection
275
351
  * @returns {Promise}
276
352
  */
277
- public startAnalyzer(mediaConnection: any) {
353
+ public startAnalyzer(peerConnection: any) {
278
354
  if (!this.statsStarted) {
279
355
  this.statsStarted = true;
280
- this.mediaConnection = mediaConnection;
356
+ this.peerConnection = peerConnection;
281
357
 
282
358
  return this.getStatsAndParse().then(() => {
283
359
  this.statsInterval = setInterval(() => {
@@ -317,7 +393,7 @@ export class StatsAnalyzer extends EventsScope {
317
393
  if (sendOneLastMqa) {
318
394
  return this.getStatsAndParse().then(() => {
319
395
  this.sendMqaData();
320
- this.mediaConnection = null;
396
+ this.peerConnection = null;
321
397
  });
322
398
  }
323
399
 
@@ -339,17 +415,6 @@ export class StatsAnalyzer extends EventsScope {
339
415
  return;
340
416
  }
341
417
 
342
- // Generate empty stats results
343
- if (!this.statsResults[type]) {
344
- this.statsResults[type] = {};
345
- }
346
-
347
- if (isSender && !this.statsResults[type].send) {
348
- this.statsResults[type].send = cloneDeep(emptySender);
349
- } else if (!isSender && !this.statsResults[type].recv) {
350
- this.statsResults[type].recv = cloneDeep(emptyReceiver);
351
- }
352
-
353
418
  switch (getStatsResult.type) {
354
419
  case 'outbound-rtp':
355
420
  this.processOutboundRTPResult(getStatsResult, type);
@@ -359,7 +424,8 @@ export class StatsAnalyzer extends EventsScope {
359
424
  break;
360
425
  case 'remote-inbound-rtp':
361
426
  case 'remote-outbound-rtp':
362
- this.compareSentAndReceived(getStatsResult, type);
427
+ // @ts-ignore
428
+ this.compareSentAndReceived(getStatsResult, type, isSender);
363
429
  break;
364
430
  case 'remotecandidate':
365
431
  case 'remote-candidate':
@@ -380,34 +446,23 @@ export class StatsAnalyzer extends EventsScope {
380
446
  /**
381
447
  * Filters the get stats results for types
382
448
  * @private
383
- * @param {Array} statsItem
449
+ * @param {Array} getStatsResults
384
450
  * @param {String} type
385
451
  * @param {boolean} isSender
386
452
  * @returns {void}
387
453
  */
388
- filterAndParseGetStatsResults(statsItem: any, type: string, isSender: boolean) {
454
+ private filterAndParseGetStatsResults(
455
+ getStatsResults: Array<any>,
456
+ type: string,
457
+ isSender: boolean
458
+ ) {
389
459
  const {types} = DEFAULT_GET_STATS_FILTER;
390
460
 
391
- // get the successful candidate pair before parsing stats.
392
- statsItem.report.forEach((report) => {
393
- if (report.type === 'candidate-pair' && report.state === 'succeeded') {
394
- this.successfulCandidatePair = report;
395
- }
396
- });
397
-
398
- statsItem.report.forEach((result) => {
461
+ getStatsResults.forEach((result) => {
399
462
  if (types.includes(result.type)) {
400
463
  this.parseGetStatsResult(result, type, isSender);
401
464
  }
402
465
  });
403
-
404
- if (this.statsResults[type]) {
405
- this.statsResults[type].direction = statsItem.currentDirection;
406
- this.statsResults[type].trackLabel = statsItem.localTrackLabel;
407
- this.statsResults[type].csi = statsItem.csi;
408
- // reset the successful candidate pair.
409
- this.successfulCandidatePair = {};
410
- }
411
466
  }
412
467
 
413
468
  /**
@@ -421,7 +476,7 @@ export class StatsAnalyzer extends EventsScope {
421
476
  return;
422
477
  }
423
478
 
424
- if (type.includes('audio-send')) {
479
+ if (type === STATS.AUDIO_CORRELATE) {
425
480
  this.statsResults[type].send.audioLevel = result.audioLevel;
426
481
  this.statsResults[type].send.totalAudioEnergy = result.totalAudioEnergy;
427
482
  }
@@ -456,10 +511,6 @@ export class StatsAnalyzer extends EventsScope {
456
511
  // eslint-disable-next-line no-param-reassign
457
512
  if (currentValue === undefined) currentValue = 0;
458
513
 
459
- if (!this.lastEmittedStartStopEvent[mediaType]) {
460
- this.lastEmittedStartStopEvent[mediaType] = {};
461
- }
462
-
463
514
  const lastEmittedEvent = isLocal
464
515
  ? this.lastEmittedStartStopEvent[mediaType].local
465
516
  : this.lastEmittedStartStopEvent[mediaType].remote;
@@ -468,7 +519,7 @@ export class StatsAnalyzer extends EventsScope {
468
519
 
469
520
  if (currentValue - previousValue > 0) {
470
521
  newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STARTED : EVENTS.REMOTE_MEDIA_STARTED;
471
- } else if (currentValue === previousValue && currentValue > 0) {
522
+ } else if (currentValue === previousValue && currentValue >= 0) {
472
523
  newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STOPPED : EVENTS.REMOTE_MEDIA_STOPPED;
473
524
  }
474
525
 
@@ -500,29 +551,21 @@ export class StatsAnalyzer extends EventsScope {
500
551
  */
501
552
  private compareLastStatsResult() {
502
553
  if (this.lastStatsResults !== null && this.meetingMediaStatus) {
503
- const getCurrentStatsTotals = (keyPrefix: string, value: string): number =>
504
- Object.keys(this.statsResults)
505
- .filter((key) => key.startsWith(keyPrefix))
506
- .reduce((prev, cur) => prev + (this.statsResults[cur]?.recv[value] || 0), 0);
507
-
508
- const getPreviousStatsTotals = (keyPrefix: string, value: string): number =>
509
- Object.keys(this.statsResults)
510
- .filter((key) => key.startsWith(keyPrefix))
511
- .reduce((prev, cur) => prev + (this.lastStatsResults[cur]?.recv[value] || 0), 0);
512
-
513
- if (this.meetingMediaStatus.expected.sendAudio && this.lastStatsResults['audio-send']) {
514
- // compare audio stats sent
515
- // NOTE: relies on there being only one sender.
516
- const currentStats = this.statsResults['audio-send'].send;
517
- const previousStats = this.lastStatsResults['audio-send'].send;
554
+ // compare audio stats sent
555
+ let mediaType = STATS.AUDIO_CORRELATE;
556
+ let currentStats = null;
557
+ let previousStats = null;
558
+
559
+ if (this.meetingMediaStatus.expected.sendAudio) {
560
+ currentStats = this.statsResults[mediaType].send;
561
+ previousStats = this.lastStatsResults[mediaType].send;
518
562
 
519
563
  if (
520
564
  currentStats.totalPacketsSent === previousStats.totalPacketsSent ||
521
565
  currentStats.totalPacketsSent === 0
522
566
  ) {
523
567
  LoggerProxy.logger.info(
524
- `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`,
525
- currentStats.totalPacketsSent
568
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`
526
569
  );
527
570
  } else {
528
571
  if (
@@ -530,20 +573,19 @@ export class StatsAnalyzer extends EventsScope {
530
573
  currentStats.totalAudioEnergy === 0
531
574
  ) {
532
575
  LoggerProxy.logger.info(
533
- `StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`,
534
- currentStats.totalAudioEnergy
576
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Energy present`
535
577
  );
536
578
  }
537
579
 
538
580
  if (currentStats.audioLevel === 0) {
539
581
  LoggerProxy.logger.info(
540
- `StatsAnalyzer:index#compareLastStatsResult --> audio level is 0 for the user`
582
+ `StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} level is 0 for the user`
541
583
  );
542
584
  }
543
585
  }
544
586
 
545
587
  this.emitStartStopEvents(
546
- 'audio',
588
+ mediaType,
547
589
  previousStats.totalPacketsSent,
548
590
  currentStats.totalPacketsSent,
549
591
  true
@@ -552,199 +594,266 @@ export class StatsAnalyzer extends EventsScope {
552
594
 
553
595
  if (this.meetingMediaStatus.expected.receiveAudio) {
554
596
  // compare audio stats received
555
- const currentPacketsReceived = getCurrentStatsTotals('audio-recv', 'totalPacketsReceived');
556
- const previousPacketsReceived = getPreviousStatsTotals(
557
- 'audio-recv',
558
- 'totalPacketsReceived'
559
- );
560
- const currentSamplesReceived = getCurrentStatsTotals('audio-recv', 'totalSamplesReceived');
561
- const previousSamplesReceived = getPreviousStatsTotals(
562
- 'audio-recv',
563
- 'totalSamplesReceived'
564
- );
597
+ currentStats = this.statsResults[mediaType].recv;
598
+ previousStats = this.lastStatsResults[mediaType].recv;
565
599
 
566
- if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
600
+ if (
601
+ currentStats.totalPacketsReceived === previousStats.totalPacketsReceived ||
602
+ currentStats.totalPacketsReceived === 0
603
+ ) {
567
604
  LoggerProxy.logger.info(
568
- `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received`,
569
- currentPacketsReceived
605
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`
570
606
  );
571
607
  } else if (
572
- currentSamplesReceived === previousSamplesReceived ||
573
- currentSamplesReceived === 0
608
+ currentStats.totalSamplesReceived === previousStats.totalSamplesReceived ||
609
+ currentStats.totalSamplesReceived === 0
574
610
  ) {
575
611
  LoggerProxy.logger.info(
576
- `StatsAnalyzer:index#compareLastStatsResult --> No audio samples received`,
577
- currentSamplesReceived
612
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} samples received`
578
613
  );
579
614
  }
580
615
 
581
- this.emitStartStopEvents('audio', previousPacketsReceived, currentPacketsReceived, false);
616
+ this.emitStartStopEvents(
617
+ mediaType,
618
+ previousStats.totalPacketsReceived,
619
+ currentStats.totalPacketsReceived,
620
+ false
621
+ );
582
622
  }
583
623
 
584
- if (this.meetingMediaStatus.expected.sendVideo && this.lastStatsResults['video-send']) {
624
+ mediaType = STATS.VIDEO_CORRELATE;
625
+ if (this.meetingMediaStatus.expected.sendVideo) {
585
626
  // compare video stats sent
586
- const currentStats = this.statsResults['video-send'].send;
587
- const previousStats = this.lastStatsResults['video-send'].send;
627
+ currentStats = this.statsResults[mediaType].send;
628
+ previousStats = this.lastStatsResults[mediaType].send;
588
629
 
589
630
  if (
590
631
  currentStats.totalPacketsSent === previousStats.totalPacketsSent ||
591
632
  currentStats.totalPacketsSent === 0
592
633
  ) {
593
634
  LoggerProxy.logger.info(
594
- `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`,
595
- currentStats.totalPacketsSent
635
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`
596
636
  );
597
- } else {
637
+ } else if (this.lastEmittedStartStopEvent[mediaType].local !== EVENTS.LOCAL_MEDIA_STOPPED) {
598
638
  if (
599
639
  currentStats.framesEncoded === previousStats.framesEncoded ||
600
640
  currentStats.framesEncoded === 0
601
641
  ) {
642
+ this.lastEmittedStartStopEvent[mediaType].local = EVENTS.NO_VIDEO_ENCODED;
602
643
  LoggerProxy.logger.info(
603
- `StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`,
604
- currentStats.framesEncoded
644
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames Encoded`
645
+ );
646
+ this.emit(
647
+ {
648
+ file: 'statsAnalyzer',
649
+ function: 'compareLastStatsResult',
650
+ },
651
+ EVENTS.NO_VIDEO_ENCODED,
652
+ {
653
+ mediaType,
654
+ }
605
655
  );
606
656
  }
607
657
 
608
658
  if (
609
- this.statsResults['video-send'].send.framesSent ===
610
- this.lastStatsResults['video-send'].send.framesSent ||
611
- this.statsResults['video-send'].send.framesSent === 0
659
+ this.statsResults.resolutions[mediaType].send.framesSent ===
660
+ this.lastStatsResults.resolutions[mediaType].send.framesSent ||
661
+ this.statsResults.resolutions[mediaType].send.framesSent === 0
612
662
  ) {
613
663
  LoggerProxy.logger.info(
614
- `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,
615
- this.statsResults['video-send'].send.framesSent
664
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames sent`
616
665
  );
617
666
  }
618
- }
619
667
 
620
- this.emitStartStopEvents('video', previousStats.framesSent, currentStats.framesSent, true);
668
+ // Video is encoded but frames are not sent
669
+ if (
670
+ currentStats.framesEncoded !== previousStats.framesEncoded &&
671
+ (currentStats.framesSent === previousStats.framesSent || currentStats.framesSent === 0)
672
+ ) {
673
+ this.lastEmittedStartStopEvent[mediaType].local = EVENTS.NO_FRAMES_SENT;
674
+ LoggerProxy.logger.info(
675
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames sent even though frames are encoded`
676
+ );
677
+ this.emit(
678
+ {
679
+ file: 'statsAnalyzer',
680
+ function: 'compareLastStatsResult',
681
+ },
682
+ EVENTS.NO_FRAMES_SENT,
683
+ {
684
+ mediaType,
685
+ }
686
+ );
687
+ }
688
+ }
689
+ this.emitStartStopEvents(
690
+ mediaType,
691
+ previousStats.framesSent,
692
+ currentStats.framesSent,
693
+ true
694
+ );
621
695
  }
622
696
 
623
697
  if (this.meetingMediaStatus.expected.receiveVideo) {
624
- // compare video stats received
625
- const currentPacketsReceived = getCurrentStatsTotals('video-recv', 'totalPacketsReceived');
626
- const previousPacketsReceived = getPreviousStatsTotals(
627
- 'video-recv',
628
- 'totalPacketsReceived'
629
- );
630
- const currentFramesReceived = getCurrentStatsTotals('video-recv', 'framesReceived');
631
- const previousFramesReceived = getPreviousStatsTotals('video-recv', 'framesReceived');
632
- const currentFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');
633
- const previousFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');
634
- const currentFramesDropped = getCurrentStatsTotals('video-recv', 'framesDropped');
635
- const previousFramesDropped = getPreviousStatsTotals('video-recv', 'framesDropped');
636
-
637
- if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
698
+ // compare video stats reveived
699
+
700
+ currentStats = this.statsResults[mediaType].recv;
701
+ previousStats = this.lastStatsResults[mediaType].recv;
702
+
703
+ if (
704
+ currentStats.totalPacketsReceived === previousStats.totalPacketsReceived ||
705
+ currentStats.totalPacketsReceived === 0
706
+ ) {
638
707
  LoggerProxy.logger.info(
639
- `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received`,
640
- currentPacketsReceived
708
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`
641
709
  );
642
710
  } else {
643
- if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
711
+ if (
712
+ this.statsResults.resolutions[mediaType].recv.framesReceived ===
713
+ this.lastStatsResults.resolutions[mediaType].recv.framesReceived ||
714
+ this.statsResults.resolutions[mediaType].recv.framesReceived === 0
715
+ ) {
644
716
  LoggerProxy.logger.info(
645
- `StatsAnalyzer:index#compareLastStatsResult --> No video frames received`,
646
- currentFramesReceived
717
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`
647
718
  );
648
719
  }
649
720
 
650
- if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
721
+ if (
722
+ this.statsResults[mediaType].recv.framesDecoded ===
723
+ this.lastStatsResults[mediaType].recv.framesDecoded ||
724
+ this.statsResults.resolutions[mediaType].send.framesDecoded === 0
725
+ ) {
651
726
  LoggerProxy.logger.info(
652
- `StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded`,
653
- currentFramesDecoded
727
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`
654
728
  );
655
729
  }
656
730
 
657
- if (currentFramesDropped - previousFramesDropped > 10) {
731
+ if (
732
+ this.statsResults.resolutions[mediaType].recv.framesDropped -
733
+ this.lastStatsResults.resolutions[mediaType].recv.framesDropped >
734
+ 10
735
+ ) {
658
736
  LoggerProxy.logger.info(
659
- `StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped`,
660
- currentFramesDropped - previousFramesDropped
737
+ `StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`
661
738
  );
662
739
  }
663
740
  }
664
741
 
665
- this.emitStartStopEvents('video', previousFramesDecoded, currentFramesDecoded, false);
742
+ this.emitStartStopEvents(
743
+ mediaType,
744
+ previousStats.framesDecoded,
745
+ currentStats.framesDecoded,
746
+ false
747
+ );
666
748
  }
667
749
 
668
- if (this.meetingMediaStatus.expected.sendShare && this.lastStatsResults['video-share-send']) {
750
+ mediaType = STATS.SHARE_CORRELATE;
751
+ if (this.meetingMediaStatus.expected.sendShare) {
669
752
  // compare share stats sent
670
753
 
671
- const currentStats = this.statsResults['video-share-send'].send;
672
- const previousStats = this.lastStatsResults['video-share-send'].send;
754
+ currentStats = this.statsResults[mediaType].send;
755
+ previousStats = this.lastStatsResults[mediaType].send;
673
756
 
674
757
  if (
675
758
  currentStats.totalPacketsSent === previousStats.totalPacketsSent ||
676
759
  currentStats.totalPacketsSent === 0
677
760
  ) {
678
761
  LoggerProxy.logger.info(
679
- `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`,
680
- currentStats.totalPacketsSent
762
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`
681
763
  );
682
- } else {
764
+ } else if (this.lastEmittedStartStopEvent[mediaType].local !== EVENTS.LOCAL_MEDIA_STOPPED) {
683
765
  if (
684
766
  currentStats.framesEncoded === previousStats.framesEncoded ||
685
767
  currentStats.framesEncoded === 0
686
768
  ) {
769
+ this.lastEmittedStartStopEvent[mediaType].local = EVENTS.NO_VIDEO_ENCODED;
687
770
  LoggerProxy.logger.info(
688
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`,
689
- currentStats.framesEncoded
771
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames getting encoded`
772
+ );
773
+ this.emit(
774
+ {
775
+ file: 'statsAnalyzer',
776
+ function: 'compareLastStatsResult',
777
+ },
778
+ EVENTS.NO_VIDEO_ENCODED,
779
+ {
780
+ mediaType,
781
+ }
690
782
  );
691
783
  }
692
784
 
693
785
  if (
694
- this.statsResults['video-share-send'].send.framesSent ===
695
- this.lastStatsResults['video-share-send'].send.framesSent ||
696
- this.statsResults['video-share-send'].send.framesSent === 0
786
+ this.statsResults.resolutions[mediaType].send.framesSent ===
787
+ this.lastStatsResults.resolutions[mediaType].send.framesSent ||
788
+ this.statsResults.resolutions[mediaType].send.framesSent === 0
697
789
  ) {
698
790
  LoggerProxy.logger.info(
699
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`,
700
- this.statsResults['video-share-send'].send.framesSent
791
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames sent`
792
+ );
793
+ }
794
+
795
+ // Share video is encoded but frames are not sent
796
+ if (
797
+ currentStats.framesEncoded !== previousStats.framesEncoded &&
798
+ (currentStats.framesSent === previousStats.framesSent || currentStats.framesSent === 0)
799
+ ) {
800
+ this.lastEmittedStartStopEvent[mediaType].local = EVENTS.NO_FRAMES_SENT;
801
+ LoggerProxy.logger.info(
802
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames sent even though frames are being encoded`
803
+ );
804
+ this.emit(
805
+ {
806
+ file: 'statsAnalyzer',
807
+ function: 'compareLastStatsResult',
808
+ },
809
+ EVENTS.NO_FRAMES_SENT,
810
+ {
811
+ mediaType,
812
+ }
701
813
  );
702
814
  }
703
815
  }
704
- }
705
816
 
706
- if (this.meetingMediaStatus.expected.sendShare) {
707
817
  // TODO:need to check receive share value
708
- // compare share stats received
709
- const currentPacketsReceived = getCurrentStatsTotals(
710
- 'video-share-recv',
711
- 'totalPacketsReceived'
712
- );
713
- const previousPacketsReceived = getPreviousStatsTotals(
714
- 'video-share-recv',
715
- 'totalPacketsReceived'
716
- );
717
- const currentFramesReceived = getCurrentStatsTotals('video-share-recv', 'framesReceived');
718
- const previousFramesReceived = getPreviousStatsTotals('video-share-recv', 'framesReceived');
719
- const currentFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');
720
- const previousFramesDecoded = getPreviousStatsTotals('video-share-recv', 'framesDecoded');
721
- const currentFramesDropped = getCurrentStatsTotals('video-share-recv', 'framesDropped');
722
- const previousFramesDropped = getPreviousStatsTotals('video-share-recv', 'framesDropped');
723
-
724
- if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
818
+ // compare share stats reveived
819
+ currentStats = this.statsResults[mediaType].recv;
820
+ previousStats = this.lastStatsResults[mediaType].recv;
821
+
822
+ if (
823
+ currentStats.totalPacketsReceived === previousStats.totalPacketsReceived ||
824
+ currentStats.totalPacketsSent === 0
825
+ ) {
725
826
  LoggerProxy.logger.info(
726
- `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received`,
727
- currentPacketsReceived
827
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`
728
828
  );
729
829
  } else {
730
- if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
830
+ if (
831
+ this.statsResults.resolutions[mediaType].recv.framesReceived ===
832
+ this.lastStatsResults.resolutions[mediaType].recv.framesReceived ||
833
+ this.statsResults.resolutions[mediaType].recv.framesReceived === 0
834
+ ) {
731
835
  LoggerProxy.logger.info(
732
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames received`,
733
- currentFramesReceived
836
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`
734
837
  );
735
838
  }
736
839
 
737
- if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
840
+ if (
841
+ this.statsResults[mediaType].recv.framesDecoded ===
842
+ this.lastStatsResults[mediaType].recv.framesDecoded ||
843
+ this.statsResults.resolutions[mediaType].send.framesDecoded === 0
844
+ ) {
738
845
  LoggerProxy.logger.info(
739
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded`,
740
- currentFramesDecoded
846
+ `StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`
741
847
  );
742
848
  }
743
849
 
744
- if (currentFramesDropped - previousFramesDropped > 10) {
850
+ if (
851
+ this.statsResults.resolutions[mediaType].recv.framesDropped -
852
+ this.lastStatsResults.resolutions[mediaType].recv.framesDropped >
853
+ 10
854
+ ) {
745
855
  LoggerProxy.logger.info(
746
- `StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped`,
747
- currentFramesDropped - previousFramesDropped
856
+ `StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`
748
857
  );
749
858
  }
750
859
  }
@@ -764,16 +873,13 @@ export class StatsAnalyzer extends EventsScope {
764
873
  * @returns {Promise}
765
874
  */
766
875
  private getStatsAndParse() {
767
- if (!this.mediaConnection) {
876
+ if (!this.peerConnection) {
768
877
  return Promise.resolve();
769
878
  }
770
879
 
771
- if (
772
- this.mediaConnection &&
773
- this.mediaConnection.getConnectionState() === ConnectionState.Failed
774
- ) {
880
+ if (this.peerConnection && this.peerConnection.connectionState === CONNECTION_STATE.FAILED) {
775
881
  LoggerProxy.logger.trace(
776
- 'StatsAnalyzer:index#getStatsAndParse --> media connection is in failed state'
882
+ 'StatsAnalyzer:index#getStatsAndParse --> PeerConnection is in failed state'
777
883
  );
778
884
 
779
885
  return Promise.resolve();
@@ -781,49 +887,43 @@ export class StatsAnalyzer extends EventsScope {
781
887
 
782
888
  LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Collecting Stats');
783
889
 
784
- return this.mediaConnection.getTransceiverStats().then((transceiverStats) => {
785
- transceiverStats.video.receivers.forEach((receiver, i) =>
786
- this.filterAndParseGetStatsResults(receiver, `video-recv-${i}`, false)
787
- );
788
- transceiverStats.audio.receivers.forEach((receiver, i) =>
789
- this.filterAndParseGetStatsResults(receiver, `audio-recv-${i}`, false)
790
- );
791
- transceiverStats.screenShareVideo.receivers.forEach((receiver, i) =>
792
- this.filterAndParseGetStatsResults(receiver, `video-share-recv-${i}`, false)
793
- );
794
- transceiverStats.screenShareAudio.receivers.forEach((receiver, i) =>
795
- this.filterAndParseGetStatsResults(receiver, `audio-share-recv-${i}`, false)
796
- );
797
-
798
- transceiverStats.video.senders.forEach((sender, i) => {
799
- if (i > 0) {
800
- throw new Error('Stats Analyzer does not support multiple senders.');
801
- }
802
- this.filterAndParseGetStatsResults(sender, 'video-send', true);
803
- });
804
- transceiverStats.audio.senders.forEach((sender, i) => {
805
- if (i > 0) {
806
- throw new Error('Stats Analyzer does not support multiple senders.');
807
- }
808
- this.filterAndParseGetStatsResults(sender, 'audio-send', true);
809
- });
810
- transceiverStats.screenShareVideo.senders.forEach((sender, i) => {
811
- if (i > 0) {
812
- throw new Error('Stats Analyzer does not support multiple senders.');
813
- }
814
- this.filterAndParseGetStatsResults(sender, 'video-share-send', true);
815
- });
816
- transceiverStats.screenShareAudio.senders.forEach((sender, i) => {
817
- if (i > 0) {
818
- throw new Error('Stats Analyzer does not support multiple senders.');
819
- }
820
- this.filterAndParseGetStatsResults(sender, 'audio-share-send', true);
821
- });
822
-
890
+ return Promise.all([
891
+ this.peerConnection.videoTransceiver.sender.getStats().then((res) => {
892
+ this.filterAndParseGetStatsResults(res, STATS.VIDEO_CORRELATE, true);
893
+ }),
894
+
895
+ this.peerConnection.videoTransceiver.receiver.getStats().then((res) => {
896
+ this.filterAndParseGetStatsResults(res, STATS.VIDEO_CORRELATE, false);
897
+ }),
898
+
899
+ this.peerConnection.audioTransceiver.sender.getStats().then((res) => {
900
+ this.filterAndParseGetStatsResults(res, STATS.AUDIO_CORRELATE, true);
901
+ }),
902
+
903
+ this.peerConnection.audioTransceiver.receiver.getStats().then((res) => {
904
+ this.filterAndParseGetStatsResults(res, STATS.AUDIO_CORRELATE, false);
905
+ }),
906
+
907
+ // TODO: add checks for screen share
908
+ this.peerConnection.shareTransceiver.sender.getStats().then((res) => {
909
+ this.filterAndParseGetStatsResults(res, STATS.SHARE_CORRELATE, true);
910
+ }),
911
+
912
+ this.peerConnection.shareTransceiver.receiver.getStats().then((res) => {
913
+ this.filterAndParseGetStatsResults(res, STATS.SHARE_CORRELATE, false);
914
+ }),
915
+ ]).then(() => {
916
+ this.statsResults[STATS.AUDIO_CORRELATE].direction =
917
+ this.peerConnection.audioTransceiver.currentDirection;
918
+ this.statsResults[STATS.VIDEO_CORRELATE].direction =
919
+ this.peerConnection.videoTransceiver.currentDirection;
920
+ this.statsResults[STATS.SHARE_CORRELATE].direction =
921
+ this.peerConnection.shareTransceiver.currentDirection;
922
+
923
+ // Process Stats results every 5 seconds
823
924
  this.compareLastStatsResult();
824
925
 
825
926
  // Save the last results to compare with the current
826
- // DO Deep copy, for some reason it takes the reference all the time rather then old value set
827
927
  this.lastStatsResults = JSON.parse(JSON.stringify(this.statsResults));
828
928
 
829
929
  LoggerProxy.logger.trace(
@@ -836,27 +936,51 @@ export class StatsAnalyzer extends EventsScope {
836
936
  * Processes OutboundRTP stats result and stores
837
937
  * @private
838
938
  * @param {*} result
839
- * @param {*} mediaType
939
+ * @param {*} type
840
940
  * @returns {void}
841
941
  */
842
- private processOutboundRTPResult(result: any, mediaType: any) {
942
+ private processOutboundRTPResult(result: any, type: any) {
943
+ const mediaType = type || STATS.AUDIO_CORRELATE;
843
944
  const sendrecvType = STATS.SEND_DIRECTION;
844
945
 
946
+ this.processTrackResult(result, type, sendrecvType);
845
947
  if (result.bytesSent) {
846
- const kilobytes = 0;
948
+ let kilobytes = 0;
847
949
 
848
- if (result.frameWidth && result.frameHeight) {
849
- this.statsResults[mediaType][sendrecvType].width = result.frameWidth;
850
- this.statsResults[mediaType][sendrecvType].height = result.frameHeight;
851
- this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;
852
- this.statsResults[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
950
+ if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {
951
+ this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
952
+ }
953
+ if (!this.statsResults.internal[mediaType][sendrecvType].framesEncoded) {
954
+ this.statsResults.internal[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
955
+ }
956
+ if (!this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded) {
957
+ this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded =
958
+ result.keyFramesEncoded;
853
959
  }
854
960
 
961
+ const bytes =
962
+ result.bytesSent - this.statsResults.internal[mediaType][sendrecvType].prevBytesSent;
963
+
964
+ this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
965
+
966
+ kilobytes = bytes / 1024;
967
+
855
968
  this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
969
+ this.statsResults[mediaType].bytesSent = kilobytes;
970
+ this.statsResults[mediaType][sendrecvType].framesEncoded =
971
+ result.framesEncoded - this.statsResults.internal[mediaType][sendrecvType].framesEncoded;
972
+ this.statsResults[mediaType][sendrecvType].keyFramesEncoded =
973
+ result.keyFramesEncoded -
974
+ this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded;
975
+ this.statsResults.internal[mediaType].outboundRtpId = result.id;
976
+
977
+ if (!this.statsResults.internal[mediaType][sendrecvType].packetsSent) {
978
+ this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
979
+ }
856
980
 
857
- this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
858
- this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;
859
- this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent;
981
+ this.statsResults[mediaType][sendrecvType].packetsSent =
982
+ result.packetsSent - this.statsResults.internal[mediaType][sendrecvType].packetsSent;
983
+ this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
860
984
 
861
985
  // Data saved to send MQA metrics
862
986
 
@@ -886,58 +1010,81 @@ export class StatsAnalyzer extends EventsScope {
886
1010
  * Processes InboundRTP stats result and stores
887
1011
  * @private
888
1012
  * @param {*} result
889
- * @param {*} mediaType
1013
+ * @param {*} type
890
1014
  * @returns {void}
891
1015
  */
892
- private processInboundRTPResult(result: any, mediaType: any) {
1016
+ private processInboundRTPResult(result: any, type: any) {
1017
+ const mediaType = type || STATS.AUDIO_CORRELATE;
893
1018
  const sendrecvType = STATS.RECEIVE_DIRECTION;
894
1019
 
1020
+ this.processTrackResult(result, type, sendrecvType);
895
1021
  if (result.bytesReceived) {
896
1022
  let kilobytes = 0;
897
- const receiveSlot = this.receiveSlotCallback(result.ssrc);
898
- const idAndCsi = receiveSlot
899
- ? `id: "${receiveSlot.id || ''}"${receiveSlot.csi ? ` and csi: ${receiveSlot.csi}` : ''}`
900
- : '';
901
-
902
- if (result.frameWidth && result.frameHeight) {
903
- this.statsResults[mediaType][sendrecvType].width = result.frameWidth;
904
- this.statsResults[mediaType][sendrecvType].height = result.frameHeight;
905
- this.statsResults[mediaType][sendrecvType].framesReceived = result.framesReceived;
1023
+
1024
+ if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
1025
+ this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =
1026
+ result.bytesReceived;
1027
+ }
1028
+
1029
+ if (!this.statsResults.internal[mediaType][sendrecvType].pliCount) {
1030
+ this.statsResults.internal[mediaType][sendrecvType].pliCount = result.pliCount;
1031
+ }
1032
+
1033
+ if (!this.statsResults.internal[mediaType][sendrecvType].packetsLost) {
1034
+ this.statsResults.internal[mediaType][sendrecvType].packetsLost = result.packetsLost;
1035
+ }
1036
+
1037
+ if (!this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived) {
1038
+ this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =
1039
+ result.packetsReceived;
1040
+ }
1041
+
1042
+ if (!this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp) {
1043
+ this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp =
1044
+ result.lastPacketReceivedTimestamp;
906
1045
  }
907
1046
 
908
1047
  const bytes =
909
- result.bytesReceived - this.statsResults[mediaType][sendrecvType].totalBytesReceived;
1048
+ result.bytesReceived -
1049
+ this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived;
1050
+
1051
+ this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;
910
1052
 
911
1053
  kilobytes = bytes / 1024;
912
1054
  this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
913
-
914
- let currentPacketsLost =
915
- result.packetsLost - this.statsResults[mediaType][sendrecvType].totalPacketsLost;
916
- if (currentPacketsLost < 0) {
917
- currentPacketsLost = 0;
1055
+ this.statsResults[mediaType].bytesReceived = kilobytes.toFixed(1);
1056
+
1057
+ this.statsResults[mediaType][sendrecvType].pliCount =
1058
+ result.pliCount - this.statsResults.internal[mediaType][sendrecvType].pliCount;
1059
+ this.statsResults[mediaType][sendrecvType].currentPacketsLost =
1060
+ result.packetsLost - this.statsResults.internal[mediaType][sendrecvType].packetsLost;
1061
+ if (this.statsResults[mediaType][sendrecvType].currentPacketsLost < 0) {
1062
+ this.statsResults[mediaType][sendrecvType].currentPacketsLost = 0;
918
1063
  }
919
1064
 
920
- const currentPacketsReceived =
921
- result.packetsReceived - this.statsResults[mediaType][sendrecvType].totalPacketsReceived;
922
- this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
1065
+ this.statsResults[mediaType][sendrecvType].packetsReceived =
1066
+ result.packetsReceived -
1067
+ this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived;
1068
+ this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =
1069
+ result.packetsReceived;
923
1070
 
924
- if (currentPacketsReceived === 0) {
925
- if (receiveSlot) {
926
- LoggerProxy.logger.info(
927
- `StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ${idAndCsi}`,
928
- currentPacketsReceived
929
- );
930
- }
1071
+ if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {
1072
+ LoggerProxy.logger.info(
1073
+ `StatsAnalyzer:index#processInboundRTPResult --> No packets received for ${mediaType} `,
1074
+ this.statsResults[mediaType][sendrecvType].packetsReceived
1075
+ );
931
1076
  }
932
1077
 
933
1078
  // Check the over all packet Lost ratio
934
1079
  this.statsResults[mediaType][sendrecvType].currentPacketLossRatio =
935
- currentPacketsLost > 0
936
- ? currentPacketsLost / (currentPacketsReceived + currentPacketsLost)
1080
+ this.statsResults[mediaType][sendrecvType].currentPacketsLost > 0
1081
+ ? this.statsResults[mediaType][sendrecvType].currentPacketsLost /
1082
+ (this.statsResults[mediaType][sendrecvType].packetsReceived +
1083
+ this.statsResults[mediaType][sendrecvType].currentPacketsLost)
937
1084
  : 0;
938
1085
  if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
939
1086
  LoggerProxy.logger.info(
940
- `StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ${idAndCsi}`,
1087
+ 'StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver ',
941
1088
  this.statsResults[mediaType][sendrecvType].currentPacketLossRatio
942
1089
  );
943
1090
  }
@@ -997,48 +1144,126 @@ export class StatsAnalyzer extends EventsScope {
997
1144
  if (!result || !result.id) {
998
1145
  return;
999
1146
  }
1147
+ const RemoteCandidateType = {};
1148
+ const RemoteTransport = {};
1149
+ const RemoteIpAddress = {};
1150
+ const RemoteNetworkType = {};
1000
1151
 
1001
- // We only care about the successful local candidate
1002
- if (this.successfulCandidatePair?.localCandidateId !== result.id) {
1003
- return;
1152
+ if (!result.id) return;
1153
+
1154
+ const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
1155
+ const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
1156
+
1157
+ if (!RemoteCandidateType[result.id]) {
1158
+ RemoteCandidateType[result.id] = [];
1004
1159
  }
1005
1160
 
1006
- let transport;
1007
- if (result.relayProtocol) {
1008
- transport = result.relayProtocol.toUpperCase();
1009
- } else if (result.protocol) {
1010
- transport = result.protocol.toUpperCase();
1161
+ if (!RemoteTransport[result.id]) {
1162
+ RemoteTransport[result.id] = [];
1011
1163
  }
1012
1164
 
1013
- const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
1014
- const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
1165
+ if (!RemoteIpAddress[result.id]) {
1166
+ RemoteIpAddress[result.id] = [];
1167
+ }
1168
+ if (!RemoteNetworkType[result.id]) {
1169
+ RemoteNetworkType[result.id] = [];
1170
+ }
1171
+
1172
+ if (
1173
+ result.candidateType &&
1174
+ RemoteCandidateType[result.id].indexOf(result.candidateType) === -1
1175
+ ) {
1176
+ RemoteCandidateType[result.id].push(result.candidateType);
1177
+ }
1015
1178
 
1016
- if (!this.statsResults.candidates) {
1017
- this.statsResults.candidates = {};
1179
+ if (result.protocol && RemoteTransport[result.id].indexOf(result.protocol) === -1) {
1180
+ RemoteTransport[result.id].push(result.protocol.toUpperCase());
1018
1181
  }
1019
1182
 
1020
- this.statsResults.candidates[result.id] = {
1021
- candidateType: result.candidateType,
1022
- ipAddress: result.ip, // TODO: add ports
1183
+ if (
1184
+ result.ip &&
1185
+ RemoteIpAddress[result.id].indexOf(`${result.ip}:${result.portNumber}`) === -1
1186
+ ) {
1187
+ RemoteIpAddress[result.id].push(`${result.ip}`); // TODO: Add ports
1188
+ }
1189
+
1190
+ if (result.networkType && RemoteNetworkType[result.id].indexOf(result.networkType) === -1) {
1191
+ RemoteNetworkType[result.id].push(result.networkType);
1192
+ }
1193
+
1194
+ this.statsResults.internal.candidates[result.id] = {
1195
+ candidateType: RemoteCandidateType[result.id],
1196
+ ipAddress: RemoteIpAddress[result.id],
1023
1197
  portNumber: result.port,
1024
- networkType: result.networkType,
1198
+ networkType: RemoteNetworkType[result.id],
1025
1199
  priority: result.priority,
1026
- transport,
1200
+ transport: RemoteTransport[result.id],
1027
1201
  timestamp: result.time,
1028
1202
  id: result.id,
1029
1203
  type: result.type,
1030
1204
  };
1031
1205
 
1032
- this.statsResults.connectionType[ipType].candidateType = result.candidateType;
1033
- this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;
1206
+ this.statsResults.connectionType[ipType].candidateType = RemoteCandidateType[result.id];
1207
+ this.statsResults.connectionType[ipType].ipAddress = RemoteIpAddress[result.id];
1034
1208
 
1035
1209
  this.statsResults.connectionType[ipType].networkType =
1036
- result.networkType === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : result.networkType;
1037
- this.statsResults.connectionType[ipType].transport = transport;
1210
+ RemoteNetworkType[result.id][0] === NETWORK_TYPE.VPN
1211
+ ? NETWORK_TYPE.UNKNOWN
1212
+ : RemoteNetworkType[result.id][0];
1213
+ this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];
1038
1214
 
1039
1215
  this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
1040
1216
  };
1041
1217
 
1218
+ /**
1219
+ * Process Track results
1220
+ *
1221
+ * @private
1222
+ * @param {*} result
1223
+ * @param {*} mediaType
1224
+ * @param {*} sendrecvType
1225
+ * @returns {void}
1226
+ * @memberof StatsAnalyzer
1227
+ */
1228
+ private processTrackResult(result: any, mediaType: any, sendrecvType: any) {
1229
+ if (!result || mediaType === STATS.AUDIO_CORRELATE) {
1230
+ return;
1231
+ }
1232
+ if (result.type !== 'inbound-rtp' && result.type !== 'outbound-rtp') {
1233
+ return;
1234
+ }
1235
+ if (result.frameWidth && result.frameHeight) {
1236
+ this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
1237
+ this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
1238
+ }
1239
+
1240
+ if (sendrecvType === STATS.RECEIVE_DIRECTION) {
1241
+ this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
1242
+ this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
1243
+ this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;
1244
+ } else if (sendrecvType === STATS.SEND_DIRECTION) {
1245
+ this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
1246
+ this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
1247
+ }
1248
+
1249
+ if (result.trackIdentifier && mediaType !== STATS.AUDIO_CORRELATE) {
1250
+ this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier =
1251
+ result.trackIdentifier;
1252
+
1253
+ const jitterBufferDelay = result && result.jitterBufferDelay;
1254
+ const jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;
1255
+
1256
+ this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay =
1257
+ jitterBufferEmittedCount && +jitterBufferDelay / +jitterBufferEmittedCount;
1258
+
1259
+ // Used to calculate the jitter
1260
+ this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay =
1261
+ result.jitterBufferDelay;
1262
+ this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount =
1263
+ result.jitterBufferEmittedCount;
1264
+ }
1265
+ }
1266
+
1042
1267
  /**
1043
1268
  *
1044
1269
  * @private
@@ -1047,17 +1272,21 @@ export class StatsAnalyzer extends EventsScope {
1047
1272
  * @returns {void}
1048
1273
  * @memberof StatsAnalyzer
1049
1274
  */
1050
- compareSentAndReceived(result, type) {
1051
- // Don't compare on transceivers without a sender.
1052
- if (!type || !this.statsResults[type].send) {
1275
+ private compareSentAndReceived(result: any, type: any) {
1276
+ if (!type) {
1053
1277
  return;
1054
1278
  }
1055
1279
 
1056
1280
  const mediaType = type;
1057
1281
 
1282
+ if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) {
1283
+ this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
1284
+ }
1285
+
1058
1286
  const currentPacketLoss =
1059
- result.packetsLost - this.statsResults[mediaType].send.totalPacketsLostOnReceiver;
1287
+ result.packetsLost - this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver;
1060
1288
 
1289
+ this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
1061
1290
  this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;
1062
1291
  this.statsResults[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
1063
1292