@webex/plugin-meetings 3.0.0-beta.4 → 3.0.0-beta.400

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 (629) hide show
  1. package/README.md +58 -8
  2. package/UPGRADING.md +9 -9
  3. package/browsers.js +19 -24
  4. package/dist/annotation/annotation.types.js +7 -0
  5. package/dist/annotation/annotation.types.js.map +1 -0
  6. package/dist/annotation/constants.js +49 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +342 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +216 -0
  11. package/dist/breakouts/breakout.js.map +1 -0
  12. package/dist/breakouts/collection.js +23 -0
  13. package/dist/breakouts/collection.js.map +1 -0
  14. package/dist/breakouts/edit-lock-error.js +52 -0
  15. package/dist/breakouts/edit-lock-error.js.map +1 -0
  16. package/dist/breakouts/events.js +45 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +1048 -0
  19. package/dist/breakouts/index.js.map +1 -0
  20. package/dist/breakouts/request.js +78 -0
  21. package/dist/breakouts/request.js.map +1 -0
  22. package/dist/breakouts/utils.js +67 -0
  23. package/dist/breakouts/utils.js.map +1 -0
  24. package/dist/common/browser-detection.js +1 -20
  25. package/dist/common/browser-detection.js.map +1 -1
  26. package/dist/common/collection.js +5 -20
  27. package/dist/common/collection.js.map +1 -1
  28. package/dist/common/config.js +0 -7
  29. package/dist/common/config.js.map +1 -1
  30. package/dist/common/errors/captcha-error.js +10 -24
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +11 -24
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +12 -25
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +10 -24
  37. package/dist/common/errors/media.js.map +1 -1
  38. package/dist/common/errors/no-meeting-info.js +51 -0
  39. package/dist/common/errors/no-meeting-info.js.map +1 -0
  40. package/dist/common/errors/parameter.js +5 -33
  41. package/dist/common/errors/parameter.js.map +1 -1
  42. package/dist/common/errors/password-error.js +10 -24
  43. package/dist/common/errors/password-error.js.map +1 -1
  44. package/dist/common/errors/permission.js +9 -23
  45. package/dist/common/errors/permission.js.map +1 -1
  46. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  47. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  48. package/dist/common/errors/reconnection-in-progress.js +0 -17
  49. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  50. package/dist/common/errors/reconnection.js +10 -24
  51. package/dist/common/errors/reconnection.js.map +1 -1
  52. package/dist/common/errors/stats.js +10 -24
  53. package/dist/common/errors/stats.js.map +1 -1
  54. package/dist/common/errors/webex-errors.js +54 -48
  55. package/dist/common/errors/webex-errors.js.map +1 -1
  56. package/dist/common/errors/webex-meetings-error.js +5 -25
  57. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  58. package/dist/common/events/events-scope.js +0 -22
  59. package/dist/common/events/events-scope.js.map +1 -1
  60. package/dist/common/events/events.js +0 -23
  61. package/dist/common/events/events.js.map +1 -1
  62. package/dist/common/events/trigger-proxy.js +0 -12
  63. package/dist/common/events/trigger-proxy.js.map +1 -1
  64. package/dist/common/events/util.js +0 -15
  65. package/dist/common/events/util.js.map +1 -1
  66. package/dist/common/logs/logger-config.js +0 -4
  67. package/dist/common/logs/logger-config.js.map +1 -1
  68. package/dist/common/logs/logger-proxy.js +1 -8
  69. package/dist/common/logs/logger-proxy.js.map +1 -1
  70. package/dist/common/logs/request.js +41 -60
  71. package/dist/common/logs/request.js.map +1 -1
  72. package/dist/common/queue.js +28 -23
  73. package/dist/common/queue.js.map +1 -1
  74. package/dist/config.js +11 -15
  75. package/dist/config.js.map +1 -1
  76. package/dist/constants.js +347 -74
  77. package/dist/constants.js.map +1 -1
  78. package/dist/controls-options-manager/constants.js +14 -0
  79. package/dist/controls-options-manager/constants.js.map +1 -0
  80. package/dist/controls-options-manager/enums.js +27 -0
  81. package/dist/controls-options-manager/enums.js.map +1 -0
  82. package/dist/controls-options-manager/index.js +297 -0
  83. package/dist/controls-options-manager/index.js.map +1 -0
  84. package/dist/controls-options-manager/types.js +7 -0
  85. package/dist/controls-options-manager/types.js.map +1 -0
  86. package/dist/controls-options-manager/util.js +319 -0
  87. package/dist/controls-options-manager/util.js.map +1 -0
  88. package/dist/index.js +125 -18
  89. package/dist/index.js.map +1 -1
  90. package/dist/interceptors/index.js +15 -0
  91. package/dist/interceptors/index.js.map +1 -0
  92. package/dist/interceptors/locusRetry.js +93 -0
  93. package/dist/interceptors/locusRetry.js.map +1 -0
  94. package/dist/interpretation/collection.js +23 -0
  95. package/dist/interpretation/collection.js.map +1 -0
  96. package/dist/interpretation/index.js +380 -0
  97. package/dist/interpretation/index.js.map +1 -0
  98. package/dist/interpretation/siLanguage.js +25 -0
  99. package/dist/interpretation/siLanguage.js.map +1 -0
  100. package/dist/locus-info/controlsUtils.js +101 -29
  101. package/dist/locus-info/controlsUtils.js.map +1 -1
  102. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  103. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  104. package/dist/locus-info/fullState.js +0 -15
  105. package/dist/locus-info/fullState.js.map +1 -1
  106. package/dist/locus-info/hostUtils.js +4 -12
  107. package/dist/locus-info/hostUtils.js.map +1 -1
  108. package/dist/locus-info/index.js +564 -246
  109. package/dist/locus-info/index.js.map +1 -1
  110. package/dist/locus-info/infoUtils.js +10 -38
  111. package/dist/locus-info/infoUtils.js.map +1 -1
  112. package/dist/locus-info/mediaSharesUtils.js +82 -38
  113. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  114. package/dist/locus-info/parser.js +314 -163
  115. package/dist/locus-info/parser.js.map +1 -1
  116. package/dist/locus-info/selfUtils.js +110 -92
  117. package/dist/locus-info/selfUtils.js.map +1 -1
  118. package/dist/media/index.js +107 -231
  119. package/dist/media/index.js.map +1 -1
  120. package/dist/media/properties.js +137 -222
  121. package/dist/media/properties.js.map +1 -1
  122. package/dist/media/util.js +2 -9
  123. package/dist/media/util.js.map +1 -1
  124. package/dist/mediaQualityMetrics/config.js +316 -501
  125. package/dist/mediaQualityMetrics/config.js.map +1 -1
  126. package/dist/meeting/in-meeting-actions.js +97 -14
  127. package/dist/meeting/in-meeting-actions.js.map +1 -1
  128. package/dist/meeting/index.js +5311 -3871
  129. package/dist/meeting/index.js.map +1 -1
  130. package/dist/meeting/locusMediaRequest.js +292 -0
  131. package/dist/meeting/locusMediaRequest.js.map +1 -0
  132. package/dist/meeting/muteState.js +260 -183
  133. package/dist/meeting/muteState.js.map +1 -1
  134. package/dist/meeting/request.js +421 -347
  135. package/dist/meeting/request.js.map +1 -1
  136. package/dist/meeting/request.type.js +7 -0
  137. package/dist/meeting/request.type.js.map +1 -0
  138. package/dist/meeting/state.js +21 -31
  139. package/dist/meeting/state.js.map +1 -1
  140. package/dist/meeting/util.js +672 -585
  141. package/dist/meeting/util.js.map +1 -1
  142. package/dist/meeting/voicea-meeting.js +172 -0
  143. package/dist/meeting/voicea-meeting.js.map +1 -0
  144. package/dist/meeting-info/collection.js +6 -25
  145. package/dist/meeting-info/collection.js.map +1 -1
  146. package/dist/meeting-info/index.js +87 -39
  147. package/dist/meeting-info/index.js.map +1 -1
  148. package/dist/meeting-info/meeting-info-v2.js +352 -283
  149. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  150. package/dist/meeting-info/request.js +3 -15
  151. package/dist/meeting-info/request.js.map +1 -1
  152. package/dist/meeting-info/util.js +99 -183
  153. package/dist/meeting-info/util.js.map +1 -1
  154. package/dist/meeting-info/utilv2.js +147 -234
  155. package/dist/meeting-info/utilv2.js.map +1 -1
  156. package/dist/meetings/collection.js +43 -19
  157. package/dist/meetings/collection.js.map +1 -1
  158. package/dist/meetings/index.js +895 -600
  159. package/dist/meetings/index.js.map +1 -1
  160. package/dist/meetings/meetings.types.js +7 -0
  161. package/dist/meetings/meetings.types.js.map +1 -0
  162. package/dist/meetings/request.js +26 -41
  163. package/dist/meetings/request.js.map +1 -1
  164. package/dist/meetings/util.js +184 -157
  165. package/dist/meetings/util.js.map +1 -1
  166. package/dist/member/index.js +134 -85
  167. package/dist/member/index.js.map +1 -1
  168. package/dist/member/types.js +25 -0
  169. package/dist/member/types.js.map +1 -0
  170. package/dist/member/util.js +158 -88
  171. package/dist/member/util.js.map +1 -1
  172. package/dist/members/collection.js +13 -12
  173. package/dist/members/collection.js.map +1 -1
  174. package/dist/members/index.js +194 -204
  175. package/dist/members/index.js.map +1 -1
  176. package/dist/members/request.js +113 -68
  177. package/dist/members/request.js.map +1 -1
  178. package/dist/members/types.js +15 -0
  179. package/dist/members/types.js.map +1 -0
  180. package/dist/members/util.js +324 -259
  181. package/dist/members/util.js.map +1 -1
  182. package/dist/metrics/constants.js +19 -7
  183. package/dist/metrics/constants.js.map +1 -1
  184. package/dist/metrics/index.js +11 -558
  185. package/dist/metrics/index.js.map +1 -1
  186. package/dist/multistream/mediaRequestManager.js +263 -50
  187. package/dist/multistream/mediaRequestManager.js.map +1 -1
  188. package/dist/multistream/receiveSlot.js +58 -65
  189. package/dist/multistream/receiveSlot.js.map +1 -1
  190. package/dist/multistream/receiveSlotManager.js +76 -95
  191. package/dist/multistream/receiveSlotManager.js.map +1 -1
  192. package/dist/multistream/remoteMedia.js +62 -76
  193. package/dist/multistream/remoteMedia.js.map +1 -1
  194. package/dist/multistream/remoteMediaGroup.js +82 -45
  195. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  196. package/dist/multistream/remoteMediaManager.js +657 -448
  197. package/dist/multistream/remoteMediaManager.js.map +1 -1
  198. package/dist/multistream/sendSlotManager.js +255 -0
  199. package/dist/multistream/sendSlotManager.js.map +1 -0
  200. package/dist/networkQualityMonitor/index.js +40 -59
  201. package/dist/networkQualityMonitor/index.js.map +1 -1
  202. package/dist/personal-meeting-room/index.js +21 -45
  203. package/dist/personal-meeting-room/index.js.map +1 -1
  204. package/dist/personal-meeting-room/request.js +1 -31
  205. package/dist/personal-meeting-room/request.js.map +1 -1
  206. package/dist/personal-meeting-room/util.js +0 -13
  207. package/dist/personal-meeting-room/util.js.map +1 -1
  208. package/dist/reachability/clusterReachability.js +356 -0
  209. package/dist/reachability/clusterReachability.js.map +1 -0
  210. package/dist/reachability/index.js +297 -460
  211. package/dist/reachability/index.js.map +1 -1
  212. package/dist/reachability/request.js +20 -26
  213. package/dist/reachability/request.js.map +1 -1
  214. package/dist/reachability/util.js +29 -0
  215. package/dist/reachability/util.js.map +1 -0
  216. package/dist/reactions/constants.js +13 -0
  217. package/dist/reactions/constants.js.map +1 -0
  218. package/dist/reactions/reactions.js +109 -0
  219. package/dist/reactions/reactions.js.map +1 -0
  220. package/dist/reactions/reactions.type.js +36 -0
  221. package/dist/reactions/reactions.type.js.map +1 -0
  222. package/dist/reconnection-manager/index.js +413 -483
  223. package/dist/reconnection-manager/index.js.map +1 -1
  224. package/dist/recording-controller/enums.js +17 -0
  225. package/dist/recording-controller/enums.js.map +1 -0
  226. package/dist/recording-controller/index.js +362 -0
  227. package/dist/recording-controller/index.js.map +1 -0
  228. package/dist/recording-controller/util.js +64 -0
  229. package/dist/recording-controller/util.js.map +1 -0
  230. package/dist/roap/index.js +102 -86
  231. package/dist/roap/index.js.map +1 -1
  232. package/dist/roap/request.js +131 -135
  233. package/dist/roap/request.js.map +1 -1
  234. package/dist/roap/turnDiscovery.js +437 -116
  235. package/dist/roap/turnDiscovery.js.map +1 -1
  236. package/dist/rtcMetrics/constants.js +12 -0
  237. package/dist/rtcMetrics/constants.js.map +1 -0
  238. package/dist/rtcMetrics/index.js +179 -0
  239. package/dist/rtcMetrics/index.js.map +1 -0
  240. package/dist/statsAnalyzer/global.js +1 -95
  241. package/dist/statsAnalyzer/global.js.map +1 -1
  242. package/dist/statsAnalyzer/index.js +557 -583
  243. package/dist/statsAnalyzer/index.js.map +1 -1
  244. package/dist/statsAnalyzer/mqaUtil.js +326 -130
  245. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  246. package/dist/transcription/index.js +22 -47
  247. package/dist/transcription/index.js.map +1 -1
  248. package/dist/types/annotation/annotation.types.d.ts +42 -0
  249. package/dist/types/annotation/constants.d.ts +31 -0
  250. package/dist/types/annotation/index.d.ts +117 -0
  251. package/dist/types/breakouts/breakout.d.ts +8 -0
  252. package/dist/types/breakouts/collection.d.ts +5 -0
  253. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  254. package/dist/types/breakouts/events.d.ts +8 -0
  255. package/dist/types/breakouts/index.d.ts +5 -0
  256. package/dist/types/breakouts/request.d.ts +22 -0
  257. package/dist/types/breakouts/utils.d.ts +15 -0
  258. package/dist/types/common/browser-detection.d.ts +9 -0
  259. package/dist/types/common/collection.d.ts +48 -0
  260. package/dist/types/common/config.d.ts +2 -0
  261. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  262. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  263. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  264. package/dist/types/common/errors/media.d.ts +15 -0
  265. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  266. package/dist/types/common/errors/parameter.d.ts +15 -0
  267. package/dist/types/common/errors/password-error.d.ts +15 -0
  268. package/dist/types/common/errors/permission.d.ts +14 -0
  269. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  270. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  271. package/dist/types/common/errors/reconnection.d.ts +15 -0
  272. package/dist/types/common/errors/stats.d.ts +15 -0
  273. package/dist/types/common/errors/webex-errors.d.ts +93 -0
  274. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  275. package/dist/types/common/events/events-scope.d.ts +17 -0
  276. package/dist/types/common/events/events.d.ts +12 -0
  277. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  278. package/dist/types/common/events/util.d.ts +2 -0
  279. package/dist/types/common/logs/logger-config.d.ts +2 -0
  280. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  281. package/dist/types/common/logs/request.d.ts +36 -0
  282. package/dist/types/common/queue.d.ts +34 -0
  283. package/dist/types/config.d.ts +72 -0
  284. package/dist/types/constants.d.ts +1088 -0
  285. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  286. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  287. package/dist/types/controls-options-manager/index.d.ts +136 -0
  288. package/dist/types/controls-options-manager/types.d.ts +43 -0
  289. package/dist/types/controls-options-manager/util.d.ts +1 -0
  290. package/dist/types/index.d.ts +7 -0
  291. package/dist/types/interceptors/index.d.ts +2 -0
  292. package/dist/types/interceptors/locusRetry.d.ts +27 -0
  293. package/dist/types/interpretation/collection.d.ts +5 -0
  294. package/dist/types/interpretation/index.d.ts +5 -0
  295. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  296. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  297. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  298. package/dist/types/locus-info/fullState.d.ts +2 -0
  299. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  300. package/dist/types/locus-info/index.d.ts +322 -0
  301. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  302. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  303. package/dist/types/locus-info/parser.d.ts +272 -0
  304. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  305. package/dist/types/media/index.d.ts +34 -0
  306. package/dist/types/media/properties.d.ts +93 -0
  307. package/dist/types/media/util.d.ts +2 -0
  308. package/dist/types/mediaQualityMetrics/config.d.ts +241 -0
  309. package/dist/types/meeting/in-meeting-actions.d.ts +167 -0
  310. package/dist/types/meeting/index.d.ts +1824 -0
  311. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  312. package/dist/types/meeting/muteState.d.ts +178 -0
  313. package/dist/types/meeting/request.d.ts +293 -0
  314. package/dist/types/meeting/request.type.d.ts +11 -0
  315. package/dist/types/meeting/state.d.ts +9 -0
  316. package/dist/types/meeting/util.d.ts +118 -0
  317. package/dist/types/meeting/voicea-meeting.d.ts +16 -0
  318. package/dist/types/meeting-info/collection.d.ts +20 -0
  319. package/dist/types/meeting-info/index.d.ts +69 -0
  320. package/dist/types/meeting-info/meeting-info-v2.d.ts +123 -0
  321. package/dist/types/meeting-info/request.d.ts +22 -0
  322. package/dist/types/meeting-info/util.d.ts +2 -0
  323. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  324. package/dist/types/meetings/collection.d.ts +40 -0
  325. package/dist/types/meetings/index.d.ts +389 -0
  326. package/dist/types/meetings/meetings.types.d.ts +4 -0
  327. package/dist/types/meetings/request.d.ts +27 -0
  328. package/dist/types/meetings/util.d.ts +18 -0
  329. package/dist/types/member/index.d.ts +160 -0
  330. package/dist/types/member/types.d.ts +32 -0
  331. package/dist/types/member/util.d.ts +2 -0
  332. package/dist/types/members/collection.d.ts +29 -0
  333. package/dist/types/members/index.d.ts +353 -0
  334. package/dist/types/members/request.d.ts +114 -0
  335. package/dist/types/members/types.d.ts +25 -0
  336. package/dist/types/members/util.d.ts +215 -0
  337. package/dist/types/metrics/constants.d.ts +70 -0
  338. package/dist/types/metrics/index.d.ts +45 -0
  339. package/dist/types/multistream/mediaRequestManager.d.ts +120 -0
  340. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  341. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  342. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  343. package/dist/types/multistream/remoteMediaGroup.d.ts +49 -0
  344. package/dist/types/multistream/remoteMediaManager.d.ts +301 -0
  345. package/dist/types/multistream/sendSlotManager.d.ts +70 -0
  346. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  347. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  348. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  349. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  350. package/dist/types/reachability/clusterReachability.d.ts +109 -0
  351. package/dist/types/reachability/index.d.ts +105 -0
  352. package/dist/types/reachability/request.d.ts +39 -0
  353. package/dist/types/reachability/util.d.ts +8 -0
  354. package/dist/types/reactions/constants.d.ts +3 -0
  355. package/dist/types/reactions/reactions.d.ts +4 -0
  356. package/dist/types/reactions/reactions.type.d.ts +52 -0
  357. package/dist/types/reconnection-manager/index.d.ts +136 -0
  358. package/dist/types/recording-controller/enums.d.ts +7 -0
  359. package/dist/types/recording-controller/index.d.ts +207 -0
  360. package/dist/types/recording-controller/util.d.ts +14 -0
  361. package/dist/types/roap/index.d.ts +86 -0
  362. package/dist/types/roap/request.d.ts +39 -0
  363. package/dist/types/roap/turnDiscovery.d.ts +155 -0
  364. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  365. package/dist/types/rtcMetrics/index.d.ts +61 -0
  366. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  367. package/dist/types/statsAnalyzer/index.d.ts +217 -0
  368. package/dist/types/statsAnalyzer/mqaUtil.d.ts +48 -0
  369. package/dist/types/transcription/index.d.ts +64 -0
  370. package/dist/types/webinar/collection.d.ts +16 -0
  371. package/dist/types/webinar/index.d.ts +5 -0
  372. package/dist/webinar/collection.js +44 -0
  373. package/dist/webinar/collection.js.map +1 -0
  374. package/dist/webinar/index.js +69 -0
  375. package/dist/webinar/index.js.map +1 -0
  376. package/internal-README.md +7 -6
  377. package/package.json +30 -21
  378. package/src/annotation/annotation.types.ts +50 -0
  379. package/src/annotation/constants.ts +36 -0
  380. package/src/annotation/index.ts +328 -0
  381. package/src/breakouts/README.md +220 -0
  382. package/src/breakouts/breakout.ts +188 -0
  383. package/src/breakouts/collection.ts +19 -0
  384. package/src/breakouts/edit-lock-error.ts +25 -0
  385. package/src/breakouts/events.ts +56 -0
  386. package/src/breakouts/index.ts +925 -0
  387. package/src/breakouts/request.ts +55 -0
  388. package/src/breakouts/utils.ts +57 -0
  389. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  390. package/src/common/collection.ts +9 -7
  391. package/src/common/{config.js → config.ts} +1 -1
  392. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  393. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  394. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  395. package/src/common/errors/{media.js → media.ts} +11 -7
  396. package/src/common/errors/no-meeting-info.ts +24 -0
  397. package/src/common/errors/parameter.ts +11 -7
  398. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  399. package/src/common/errors/{permission.js → permission.ts} +10 -6
  400. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  401. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  402. package/src/common/errors/{stats.js → stats.ts} +11 -7
  403. package/src/common/errors/{webex-errors.js → webex-errors.ts} +51 -8
  404. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  405. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  406. package/src/common/events/{events.js → events.ts} +5 -1
  407. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  408. package/src/common/events/{util.js → util.ts} +2 -3
  409. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  410. package/src/common/logs/logger-proxy.ts +44 -0
  411. package/src/common/logs/{request.js → request.ts} +26 -9
  412. package/src/common/queue.ts +22 -9
  413. package/src/{config.js → config.ts} +19 -21
  414. package/src/constants.ts +296 -27
  415. package/src/controls-options-manager/constants.ts +5 -0
  416. package/src/controls-options-manager/enums.ts +18 -0
  417. package/src/controls-options-manager/index.ts +278 -0
  418. package/src/controls-options-manager/types.ts +59 -0
  419. package/src/controls-options-manager/util.ts +300 -0
  420. package/src/index.ts +45 -0
  421. package/src/interceptors/index.ts +3 -0
  422. package/src/interceptors/locusRetry.ts +67 -0
  423. package/src/interpretation/README.md +60 -0
  424. package/src/interpretation/collection.ts +19 -0
  425. package/src/interpretation/index.ts +349 -0
  426. package/src/interpretation/siLanguage.ts +18 -0
  427. package/src/locus-info/controlsUtils.ts +222 -0
  428. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  429. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  430. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  431. package/src/locus-info/{index.js → index.ts} +561 -119
  432. package/src/locus-info/{infoUtils.js → infoUtils.ts} +29 -10
  433. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +97 -17
  434. package/src/locus-info/{parser.js → parser.ts} +303 -104
  435. package/src/locus-info/{selfUtils.js → selfUtils.ts} +199 -68
  436. package/src/media/index.ts +460 -0
  437. package/src/media/properties.ts +283 -0
  438. package/src/media/{util.js → util.ts} +2 -2
  439. package/src/mediaQualityMetrics/config.ts +249 -0
  440. package/src/meeting/in-meeting-actions.ts +199 -3
  441. package/src/meeting/index.ts +8494 -0
  442. package/src/meeting/locusMediaRequest.ts +313 -0
  443. package/src/meeting/muteState.ts +465 -0
  444. package/src/meeting/request.ts +912 -0
  445. package/src/meeting/request.type.ts +13 -0
  446. package/src/meeting/{state.js → state.ts} +50 -35
  447. package/src/meeting/util.ts +799 -0
  448. package/src/meeting/voicea-meeting.ts +122 -0
  449. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  450. package/src/meeting-info/index.ts +210 -0
  451. package/src/meeting-info/meeting-info-v2.ts +423 -0
  452. package/src/meeting-info/{request.js → request.ts} +14 -4
  453. package/src/meeting-info/{util.js → util.ts} +70 -58
  454. package/src/meeting-info/{utilv2.js → utilv2.ts} +99 -82
  455. package/src/meetings/collection.ts +76 -0
  456. package/src/meetings/index.ts +1539 -0
  457. package/src/meetings/meetings.types.ts +12 -0
  458. package/src/meetings/{request.js → request.ts} +34 -25
  459. package/src/meetings/{util.js → util.ts} +133 -38
  460. package/src/member/{index.js → index.ts} +159 -56
  461. package/src/member/types.ts +38 -0
  462. package/src/member/util.ts +397 -0
  463. package/src/members/{collection.js → collection.ts} +10 -2
  464. package/src/members/{index.js → index.ts} +351 -146
  465. package/src/members/request.ts +255 -0
  466. package/src/members/types.ts +29 -0
  467. package/src/members/util.ts +353 -0
  468. package/src/metrics/{constants.js → constants.ts} +17 -6
  469. package/src/metrics/index.ts +73 -0
  470. package/src/multistream/mediaRequestManager.ts +341 -64
  471. package/src/multistream/receiveSlot.ts +69 -26
  472. package/src/multistream/receiveSlotManager.ts +66 -42
  473. package/src/multistream/remoteMedia.ts +40 -5
  474. package/src/multistream/remoteMediaGroup.ts +82 -3
  475. package/src/multistream/remoteMediaManager.ts +401 -81
  476. package/src/multistream/sendSlotManager.ts +199 -0
  477. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  478. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  479. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  480. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  481. package/src/reachability/clusterReachability.ts +320 -0
  482. package/src/reachability/index.ts +371 -0
  483. package/src/reachability/request.ts +50 -35
  484. package/src/reachability/util.ts +24 -0
  485. package/src/reactions/constants.ts +4 -0
  486. package/src/reactions/reactions.ts +104 -0
  487. package/src/reactions/reactions.type.ts +62 -0
  488. package/src/reconnection-manager/index.ts +643 -0
  489. package/src/recording-controller/enums.ts +8 -0
  490. package/src/recording-controller/index.ts +332 -0
  491. package/src/recording-controller/util.ts +75 -0
  492. package/src/roap/index.ts +288 -0
  493. package/src/roap/request.ts +153 -0
  494. package/src/roap/turnDiscovery.ts +374 -70
  495. package/src/rtcMetrics/constants.ts +3 -0
  496. package/src/rtcMetrics/index.ts +166 -0
  497. package/src/statsAnalyzer/global.ts +37 -0
  498. package/src/statsAnalyzer/index.ts +1275 -0
  499. package/src/statsAnalyzer/mqaUtil.ts +440 -0
  500. package/src/transcription/{index.js → index.ts} +46 -39
  501. package/src/webinar/collection.ts +31 -0
  502. package/src/webinar/index.ts +62 -0
  503. package/test/integration/spec/converged-space-meetings.js +233 -0
  504. package/test/integration/spec/journey.js +791 -531
  505. package/test/integration/spec/space-meeting.js +391 -204
  506. package/test/integration/spec/transcription.js +7 -8
  507. package/test/unit/spec/annotation/index.ts +418 -0
  508. package/test/unit/spec/breakouts/breakout.ts +238 -0
  509. package/test/unit/spec/breakouts/collection.ts +15 -0
  510. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  511. package/test/unit/spec/breakouts/events.ts +89 -0
  512. package/test/unit/spec/breakouts/index.ts +1793 -0
  513. package/test/unit/spec/breakouts/request.ts +104 -0
  514. package/test/unit/spec/breakouts/utils.js +72 -0
  515. package/test/unit/spec/common/browser-detection.js +9 -28
  516. package/test/unit/spec/common/queue.js +31 -2
  517. package/test/unit/spec/controls-options-manager/index.js +287 -0
  518. package/test/unit/spec/controls-options-manager/util.js +582 -0
  519. package/test/unit/spec/fixture/locus.js +93 -90
  520. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  521. package/test/unit/spec/interpretation/collection.ts +15 -0
  522. package/test/unit/spec/interpretation/index.ts +625 -0
  523. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  524. package/test/unit/spec/locus-info/controlsUtils.js +325 -32
  525. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  526. package/test/unit/spec/locus-info/index.js +1458 -21
  527. package/test/unit/spec/locus-info/infoUtils.js +71 -40
  528. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  529. package/test/unit/spec/locus-info/lib/SeqCmp.json +529 -685
  530. package/test/unit/spec/locus-info/mediaSharesUtils.ts +41 -0
  531. package/test/unit/spec/locus-info/parser.js +119 -44
  532. package/test/unit/spec/locus-info/selfConstant.js +120 -103
  533. package/test/unit/spec/locus-info/selfUtils.js +291 -12
  534. package/test/unit/spec/media/index.ts +194 -111
  535. package/test/unit/spec/media/properties.ts +11 -11
  536. package/test/unit/spec/meeting/in-meeting-actions.ts +96 -3
  537. package/test/unit/spec/meeting/index.js +8616 -1921
  538. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  539. package/test/unit/spec/meeting/muteState.js +568 -207
  540. package/test/unit/spec/meeting/request.js +602 -82
  541. package/test/unit/spec/meeting/utils.js +867 -179
  542. package/test/unit/spec/meeting/voicea-meeting.ts +266 -0
  543. package/test/unit/spec/meeting-info/index.js +300 -0
  544. package/test/unit/spec/meeting-info/meetinginfov2.js +631 -78
  545. package/test/unit/spec/meeting-info/request.js +7 -9
  546. package/test/unit/spec/meeting-info/util.js +11 -12
  547. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  548. package/test/unit/spec/meetings/collection.js +27 -1
  549. package/test/unit/spec/meetings/index.js +1826 -374
  550. package/test/unit/spec/meetings/utils.js +243 -14
  551. package/test/unit/spec/member/index.js +61 -7
  552. package/test/unit/spec/member/util.js +526 -26
  553. package/test/unit/spec/members/index.js +536 -55
  554. package/test/unit/spec/members/request.js +228 -40
  555. package/test/unit/spec/members/utils.js +217 -4
  556. package/test/unit/spec/metrics/index.js +13 -68
  557. package/test/unit/spec/multistream/mediaRequestManager.ts +1032 -110
  558. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  559. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  560. package/test/unit/spec/multistream/remoteMedia.ts +40 -2
  561. package/test/unit/spec/multistream/remoteMediaGroup.ts +350 -5
  562. package/test/unit/spec/multistream/remoteMediaManager.ts +937 -65
  563. package/test/unit/spec/multistream/sendSlotManager.ts +274 -0
  564. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  565. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  566. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  567. package/test/unit/spec/reachability/index.ts +606 -26
  568. package/test/unit/spec/reachability/request.js +68 -0
  569. package/test/unit/spec/reachability/util.ts +40 -0
  570. package/test/unit/spec/reconnection-manager/index.js +222 -34
  571. package/test/unit/spec/recording-controller/index.js +306 -0
  572. package/test/unit/spec/recording-controller/util.js +229 -0
  573. package/test/unit/spec/roap/index.ts +238 -82
  574. package/test/unit/spec/roap/request.ts +255 -0
  575. package/test/unit/spec/roap/turnDiscovery.ts +707 -110
  576. package/test/unit/spec/rtcMetrics/index.ts +122 -0
  577. package/test/unit/spec/stats-analyzer/index.js +1331 -62
  578. package/test/unit/spec/webinar/collection.ts +13 -0
  579. package/test/unit/spec/webinar/index.ts +60 -0
  580. package/test/utils/cmr.js +44 -42
  581. package/test/utils/constants.js +9 -0
  582. package/test/utils/integrationTestUtils.js +46 -0
  583. package/test/utils/testUtils.js +63 -99
  584. package/test/utils/webex-config.js +22 -18
  585. package/test/utils/webex-test-users.js +65 -50
  586. package/tsconfig.json +6 -0
  587. package/dist/media/internal-media-core-wrapper.js +0 -22
  588. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  589. package/dist/meeting/effectsState.js +0 -327
  590. package/dist/meeting/effectsState.js.map +0 -1
  591. package/dist/metrics/config.js +0 -301
  592. package/dist/metrics/config.js.map +0 -1
  593. package/dist/multistream/multistreamMedia.js +0 -116
  594. package/dist/multistream/multistreamMedia.js.map +0 -1
  595. package/dist/peer-connection-manager/util.js +0 -124
  596. package/dist/peer-connection-manager/util.js.map +0 -1
  597. package/src/common/logs/logger-proxy.js +0 -33
  598. package/src/index.js +0 -15
  599. package/src/locus-info/controlsUtils.js +0 -102
  600. package/src/media/index.js +0 -459
  601. package/src/media/internal-media-core-wrapper.ts +0 -9
  602. package/src/media/properties.js +0 -289
  603. package/src/mediaQualityMetrics/config.js +0 -382
  604. package/src/meeting/effectsState.js +0 -205
  605. package/src/meeting/index.js +0 -6284
  606. package/src/meeting/muteState.js +0 -318
  607. package/src/meeting/request.js +0 -684
  608. package/src/meeting/util.js +0 -506
  609. package/src/meeting-info/index.js +0 -131
  610. package/src/meeting-info/meeting-info-v2.js +0 -255
  611. package/src/meetings/collection.js +0 -40
  612. package/src/meetings/index.js +0 -1015
  613. package/src/member/util.js +0 -254
  614. package/src/members/request.js +0 -131
  615. package/src/members/util.js +0 -258
  616. package/src/metrics/config.js +0 -324
  617. package/src/metrics/index.js +0 -530
  618. package/src/multistream/multistreamMedia.ts +0 -92
  619. package/src/peer-connection-manager/util.ts +0 -117
  620. package/src/reachability/index.js +0 -464
  621. package/src/reconnection-manager/index.js +0 -519
  622. package/src/roap/index.js +0 -220
  623. package/src/roap/request.js +0 -127
  624. package/src/statsAnalyzer/global.js +0 -133
  625. package/src/statsAnalyzer/index.js +0 -1006
  626. package/src/statsAnalyzer/mqaUtil.js +0 -173
  627. package/test/unit/spec/meeting/effectsState.js +0 -291
  628. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  629. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -1,55 +1,40 @@
1
1
  "use strict";
2
2
 
3
3
  var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
4
-
4
+ var _Object$keys2 = require("@babel/runtime-corejs2/core-js/object/keys");
5
+ var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
6
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
7
+ var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
8
+ var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
5
9
  var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
6
-
7
10
  var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
8
-
9
11
  _Object$defineProperty(exports, "__esModule", {
10
12
  value: true
11
13
  });
12
-
13
14
  exports.StatsAnalyzer = exports.EVENTS = void 0;
14
-
15
+ var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
15
16
  var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
16
-
17
17
  var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
18
-
19
18
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
20
-
21
19
  var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
22
-
23
20
  var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
24
-
25
21
  var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
26
-
27
22
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
28
-
29
23
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
30
-
31
24
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
32
-
25
+ var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty"));
33
26
  var _cloneDeep2 = _interopRequireDefault(require("lodash/cloneDeep"));
34
-
35
27
  var _internalMediaCore = require("@webex/internal-media-core");
36
-
37
28
  var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
38
-
39
29
  var _constants = require("../constants");
40
-
41
- var _config = _interopRequireDefault(require("../mediaQualityMetrics/config"));
42
-
30
+ var _config = require("../mediaQualityMetrics/config");
43
31
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
44
-
45
32
  var _global = _interopRequireDefault(require("./global"));
46
-
47
33
  var _mqaUtil = require("./mqaUtil");
48
-
34
+ function ownKeys(object, enumerableOnly) { var keys = _Object$keys2(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
35
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
49
36
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
50
-
51
37
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
52
-
53
38
  var EVENTS = {
54
39
  MEDIA_QUALITY: 'MEDIA_QUALITY',
55
40
  LOCAL_MEDIA_STARTED: 'LOCAL_MEDIA_STARTED',
@@ -57,6 +42,21 @@ var EVENTS = {
57
42
  REMOTE_MEDIA_STARTED: 'REMOTE_MEDIA_STARTED',
58
43
  REMOTE_MEDIA_STOPPED: 'REMOTE_MEDIA_STOPPED'
59
44
  };
45
+ exports.EVENTS = EVENTS;
46
+ var emptySender = {
47
+ trackLabel: '',
48
+ maxPacketLossRatio: 0,
49
+ availableBandwidth: 0,
50
+ bytesSent: 0,
51
+ meanRemoteJitter: [],
52
+ meanRoundTripTime: []
53
+ };
54
+ var emptyReceiver = {
55
+ availableBandwidth: 0,
56
+ bytesReceived: 0,
57
+ meanRtpJitter: [],
58
+ meanRoundTripTime: []
59
+ };
60
60
  /**
61
61
  * Stats Analyzer class that will emit events based on detected quality
62
62
  *
@@ -64,54 +64,70 @@ var EVENTS = {
64
64
  * @class StatsAnalyzer
65
65
  * @extends {EventsScope}
66
66
  */
67
-
68
- exports.EVENTS = EVENTS;
69
-
70
67
  var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
71
68
  (0, _inherits2.default)(StatsAnalyzer, _EventsScope);
72
-
73
69
  var _super = _createSuper(StatsAnalyzer);
70
+ // Returns the local IP address for diagnostics. this is the local IP of the interface used for the current media connection a host can have many local Ip Addresses
74
71
 
75
72
  /**
76
73
  * Creates a new instance of StatsAnalyzer
77
74
  * @constructor
78
75
  * @public
79
76
  * @param {Object} config SDK Configuration Object
77
+ * @param {Function} receiveSlotCallback Callback used to access receive slots.
80
78
  * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)
81
79
  * @param {Object} statsResults Default properties for stats
82
80
  */
83
81
  function StatsAnalyzer(config) {
84
82
  var _this;
85
-
86
- var networkQualityMonitor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
87
- var statsResults = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _global.default;
83
+ var receiveSlotCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
84
+ return undefined;
85
+ };
86
+ var networkQualityMonitor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
87
+ var statsResults = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _global.default;
88
88
  (0, _classCallCheck2.default)(this, StatsAnalyzer);
89
89
  _this = _super.call(this);
90
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "config", void 0);
91
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "correlationId", void 0);
92
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "lastEmittedStartStopEvent", void 0);
93
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "lastMqaDataSent", void 0);
94
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "lastStatsResults", void 0);
95
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "meetingMediaStatus", void 0);
96
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mqaInterval", void 0);
97
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mqaSentCount", void 0);
98
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "networkQualityMonitor", void 0);
99
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mediaConnection", void 0);
100
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "statsInterval", void 0);
101
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "statsResults", void 0);
102
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "statsStarted", void 0);
103
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "successfulCandidatePair", void 0);
104
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "localIpAddress", void 0);
105
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "receiveSlotCallback", void 0);
90
106
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "emitStartStopEvents", function (mediaType, previousValue, currentValue, isLocal) {
91
107
  if (mediaType !== 'audio' && mediaType !== 'video' && mediaType !== 'share') {
92
108
  throw new Error("Unsupported mediaType: ".concat(mediaType));
93
- } // eslint-disable-next-line no-param-reassign
94
-
95
-
96
- if (previousValue === undefined) previousValue = 0; // eslint-disable-next-line no-param-reassign
109
+ }
97
110
 
111
+ // eslint-disable-next-line no-param-reassign
112
+ if (previousValue === undefined) previousValue = 0;
113
+ // eslint-disable-next-line no-param-reassign
98
114
  if (currentValue === undefined) currentValue = 0;
115
+ if (!_this.lastEmittedStartStopEvent[mediaType]) {
116
+ _this.lastEmittedStartStopEvent[mediaType] = {};
117
+ }
99
118
  var lastEmittedEvent = isLocal ? _this.lastEmittedStartStopEvent[mediaType].local : _this.lastEmittedStartStopEvent[mediaType].remote;
100
119
  var newEvent;
101
-
102
120
  if (currentValue - previousValue > 0) {
103
121
  newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STARTED : EVENTS.REMOTE_MEDIA_STARTED;
104
122
  } else if (currentValue === previousValue && currentValue > 0) {
105
123
  newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STOPPED : EVENTS.REMOTE_MEDIA_STOPPED;
106
124
  }
107
-
108
125
  if (newEvent && lastEmittedEvent !== newEvent) {
109
126
  if (isLocal) {
110
127
  _this.lastEmittedStartStopEvent[mediaType].local = newEvent;
111
128
  } else {
112
129
  _this.lastEmittedStartStopEvent[mediaType].remote = newEvent;
113
130
  }
114
-
115
131
  _this.emit({
116
132
  file: 'statsAnalyzer/index',
117
133
  function: 'compareLastStatsResult'
@@ -120,66 +136,75 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
120
136
  });
121
137
  }
122
138
  });
139
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "extractAndSetLocalIpAddressInfoForDiagnostics", function (successfulCandidatePairId, candidates) {
140
+ var newIpAddress = '';
141
+ if (successfulCandidatePairId && !(0, _isEmpty2.default)(candidates)) {
142
+ var localCandidate = candidates[successfulCandidatePairId];
143
+ if (localCandidate) {
144
+ if (localCandidate.candidateType === 'host') {
145
+ // if it's a host candidate, use the address property - it will be the local IP
146
+ newIpAddress = "".concat(localCandidate.address);
147
+ } else if (localCandidate.candidateType === 'prflx') {
148
+ // if it's a peer reflexive candidate and we're not using a relay (there is no relayProtocol set)
149
+ // then look at the relatedAddress - it will be the local
150
+ //
151
+ // Firefox doesn't populate the relayProtocol property
152
+ if (!localCandidate.relayProtocol) {
153
+ newIpAddress = "".concat(localCandidate.relatedAddress);
154
+ } else {
155
+ // if it's a peer reflexive candidate and we are using a relay -
156
+ // in that case the relatedAddress will be the IP of the TURN server (Linus),
157
+ // so we can only look at the address, but it might be local IP or public IP,
158
+ // depending on if the user is behind a NAT or not
159
+ newIpAddress = "".concat(localCandidate.address);
160
+ }
161
+ }
162
+ }
163
+ }
164
+ _this.localIpAddress = newIpAddress;
165
+ });
123
166
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "parseCandidate", function (result, type, isSender, isRemote) {
167
+ var _this$successfulCandi;
124
168
  if (!result || !result.id) {
125
169
  return;
126
170
  }
127
171
 
128
- var RemoteCandidateType = {};
129
- var RemoteTransport = {};
130
- var RemoteIpAddress = {};
131
- var RemoteNetworkType = {};
132
- if (!result.id) return;
133
- var sendRecvType = isSender ? _constants.STATS.SEND_DIRECTION : _constants.STATS.RECEIVE_DIRECTION;
134
- var ipType = isRemote ? _constants.STATS.REMOTE : _constants.STATS.LOCAL;
135
-
136
- if (!RemoteCandidateType[result.id]) {
137
- RemoteCandidateType[result.id] = [];
138
- }
139
-
140
- if (!RemoteTransport[result.id]) {
141
- RemoteTransport[result.id] = [];
142
- }
143
-
144
- if (!RemoteIpAddress[result.id]) {
145
- RemoteIpAddress[result.id] = [];
146
- }
147
-
148
- if (!RemoteNetworkType[result.id]) {
149
- RemoteNetworkType[result.id] = [];
150
- }
151
-
152
- if (result.candidateType && RemoteCandidateType[result.id].indexOf(result.candidateType) === -1) {
153
- RemoteCandidateType[result.id].push(result.candidateType);
154
- }
155
-
156
- if (result.protocol && RemoteTransport[result.id].indexOf(result.protocol) === -1) {
157
- RemoteTransport[result.id].push(result.protocol.toUpperCase());
172
+ // We only care about the successful local candidate
173
+ if (((_this$successfulCandi = _this.successfulCandidatePair) === null || _this$successfulCandi === void 0 ? void 0 : _this$successfulCandi.localCandidateId) !== result.id) {
174
+ return;
158
175
  }
159
-
160
- if (result.ip && RemoteIpAddress[result.id].indexOf("".concat(result.ip, ":").concat(result.portNumber)) === -1) {
161
- RemoteIpAddress[result.id].push("".concat(result.ip)); // TODO: Add ports
176
+ var transport;
177
+ if (result.relayProtocol) {
178
+ transport = result.relayProtocol.toUpperCase();
179
+ } else if (result.protocol) {
180
+ transport = result.protocol.toUpperCase();
162
181
  }
163
-
164
- if (result.networkType && RemoteNetworkType[result.id].indexOf(result.networkType) === -1) {
165
- RemoteNetworkType[result.id].push(result.networkType);
182
+ var sendRecvType = isSender ? _constants.STATS.SEND_DIRECTION : _constants.STATS.RECEIVE_DIRECTION;
183
+ var ipType = isRemote ? _constants.STATS.REMOTE : _constants.STATS.LOCAL;
184
+ if (!_this.statsResults.candidates) {
185
+ _this.statsResults.candidates = {};
166
186
  }
167
-
168
- _this.statsResults.internal.candidates[result.id] = {
169
- candidateType: RemoteCandidateType[result.id],
170
- ipAddress: RemoteIpAddress[result.id],
187
+ _this.statsResults.candidates[result.id] = {
188
+ candidateType: result.candidateType,
189
+ ipAddress: result.ip,
190
+ // TODO: add ports
191
+ relatedAddress: result.relatedAddress,
192
+ relatedPort: result.relatedPort,
193
+ relayProtocol: result.relayProtocol,
194
+ protocol: result.protocol,
195
+ address: result.address,
171
196
  portNumber: result.port,
172
- networkType: RemoteNetworkType[result.id],
197
+ networkType: result.networkType,
173
198
  priority: result.priority,
174
- transport: RemoteTransport[result.id],
199
+ transport: transport,
175
200
  timestamp: result.time,
176
201
  id: result.id,
177
202
  type: result.type
178
203
  };
179
- _this.statsResults.connectionType[ipType].candidateType = RemoteCandidateType[result.id];
180
- _this.statsResults.connectionType[ipType].ipAddress = RemoteIpAddress[result.id];
181
- _this.statsResults.connectionType[ipType].networkType = RemoteNetworkType[result.id][0] === _constants.NETWORK_TYPE.VPN ? _constants.NETWORK_TYPE.UNKNOWN : RemoteNetworkType[result.id][0];
182
- _this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];
204
+ _this.statsResults.connectionType[ipType].candidateType = result.candidateType;
205
+ _this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;
206
+ _this.statsResults.connectionType[ipType].networkType = result.networkType === _constants.NETWORK_TYPE.VPN ? _constants.NETWORK_TYPE.UNKNOWN : result.networkType;
207
+ _this.statsResults.connectionType[ipType].transport = transport;
183
208
  _this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
184
209
  });
185
210
  _this.statsStarted = false;
@@ -189,138 +214,36 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
189
214
  _this.networkQualityMonitor = networkQualityMonitor;
190
215
  _this.correlationId = config.correlationId;
191
216
  _this.mqaSentCount = -1;
192
- _this.lastMqaDataSent = {
193
- resolutions: {
194
- video: {
195
- send: {},
196
- recv: {}
197
- },
198
- audio: {
199
- send: {},
200
- recv: {}
201
- },
202
- share: {
203
- send: {},
204
- recv: {}
205
- }
206
- },
207
- video: {
208
- send: {},
209
- recv: {}
210
- },
211
- audio: {
212
- send: {},
213
- recv: {}
214
- },
215
- share: {
216
- send: {},
217
- recv: {}
218
- }
219
- };
220
- _this.localMQEStats = {
221
- audio: {
222
- RX: {
223
- packetsLost: [],
224
- jitter: [],
225
- latency: [],
226
- bitRate: []
227
- },
228
- TX: {
229
- packetsLost: [],
230
- jitter: [],
231
- latency: [],
232
- bitRate: []
233
- }
234
- },
235
- video: {
236
- RX: {
237
- packetsLost: [],
238
- jitter: [],
239
- latency: [],
240
- bitRate: [],
241
- frameRate: [],
242
- resolutionWidth: [],
243
- resolutionHeight: [],
244
- requestedKeyFrame: [],
245
- receivedKeyFrame: []
246
- },
247
- TX: {
248
- packetsLost: [],
249
- jitter: [],
250
- latency: [],
251
- bitRate: [],
252
- frameRate: [],
253
- resolutionWidth: [],
254
- resolutionHeight: [],
255
- requestedKeyFrame: [],
256
- receivedKeyFrame: []
257
- }
258
- }
259
- };
260
- _this.lastEmittedStartStopEvent = {
261
- audio: {
262
- local: undefined,
263
- remote: undefined
264
- },
265
- video: {
266
- local: undefined,
267
- remote: undefined
268
- },
269
- share: {
270
- local: undefined,
271
- remote: undefined
272
- }
273
- };
217
+ _this.lastMqaDataSent = {};
218
+ _this.lastEmittedStartStopEvent = {};
219
+ _this.receiveSlotCallback = receiveSlotCallback;
220
+ _this.successfulCandidatePair = {};
221
+ _this.localIpAddress = '';
274
222
  return _this;
275
223
  }
276
224
 
225
+ /**
226
+ * Resets cumulative stats arrays.
227
+ *
228
+ * @public
229
+ * @memberof StatsAnalyzer
230
+ * @returns {void}
231
+ */
277
232
  (0, _createClass2.default)(StatsAnalyzer, [{
278
- key: "populateResults",
279
- value: function populateResults(lastMqa) {
280
- // Audio
281
- this.localMQEStats.audio.RX.packetsLost.push(lastMqa.audioReceive[0].common.mediaHopByHopLost);
282
- this.localMQEStats.audio.RX.jitter.push(lastMqa.audioReceive[0].streams[0].common.rtpJitter);
283
- this.localMQEStats.audio.RX.latency.push(lastMqa.audioReceive[0].common.roundTripTime);
284
- this.localMQEStats.audio.RX.bitRate.push(lastMqa.audioReceive[0].streams[0].common.receivedBitrate);
285
- this.localMQEStats.audio.TX.packetsLost.push(lastMqa.audioTransmit[0].common.remoteLossRate);
286
- this.localMQEStats.audio.TX.jitter.push(lastMqa.audioTransmit[0].common.remoteJitter);
287
- this.localMQEStats.audio.TX.latency.push(lastMqa.audioTransmit[0].common.roundTripTime);
288
- this.localMQEStats.audio.TX.bitRate.push(lastMqa.audioTransmit[0].streams[0].common.transmittedBitrate); // Video
289
-
290
- this.localMQEStats.video.RX.packetsLost.push(lastMqa.videoReceive[0].common.mediaHopByHopLost);
291
- this.localMQEStats.video.RX.jitter.push(lastMqa.videoReceive[0].streams[0].common.rtpJitter);
292
- this.localMQEStats.video.RX.latency.push(lastMqa.videoReceive[0].streams[0].common.roundTripTime);
293
- this.localMQEStats.video.RX.bitRate.push(lastMqa.videoReceive[0].streams[0].common.receivedBitrate);
294
- this.localMQEStats.video.RX.frameRate.push(lastMqa.videoReceive[0].streams[0].common.receivedFrameRate);
295
- this.localMQEStats.video.RX.resolutionWidth.push(lastMqa.videoReceive[0].streams[0].receivedWidth);
296
- this.localMQEStats.video.RX.resolutionHeight.push(lastMqa.videoReceive[0].streams[0].receivedHeight);
297
- this.localMQEStats.video.RX.requestedKeyFrame.push();
298
- this.localMQEStats.video.RX.receivedKeyFrame.push();
299
- this.localMQEStats.video.TX.packetsLost.push(lastMqa.videoTransmit[0].common.remoteLossRate);
300
- this.localMQEStats.video.TX.jitter.push(lastMqa.videoTransmit[0].common.remoteJitter);
301
- this.localMQEStats.video.TX.latency.push(lastMqa.videoTransmit[0].common.roundTripTime);
302
- this.localMQEStats.video.TX.bitRate.push(lastMqa.videoTransmit[0].streams[0].common.transmittedBitrate);
303
- this.localMQEStats.video.TX.frameRate.push(lastMqa.videoTransmit[0].streams[0].common.transmittedFrameRate);
304
- this.localMQEStats.video.TX.resolutionWidth.push(lastMqa.videoTransmit[0].streams[0].transmittedWidth);
305
- this.localMQEStats.video.TX.resolutionHeight.push(lastMqa.videoTransmit[0].streams[0].transmittedHeight);
306
- this.localMQEStats.video.TX.requestedKeyFrame.push(lastMqa.videoTransmit[0].streams[0].requestedKeyFrames);
307
- this.localMQEStats.video.TX.receivedKeyFrame.push();
308
- }
309
- }, {
310
233
  key: "resetStatsResults",
311
234
  value: function resetStatsResults() {
312
- this.statsResults.audio.send.meanRemoteJitter = [];
313
- this.statsResults.video.send.meanRemoteJitter = [];
314
- this.statsResults.share.send.meanRemoteJitter = [];
315
- this.statsResults.audio.recv.meanRtpJitter = []; // TODO: currently no values are present
316
-
317
- this.statsResults.video.recv.meanRtpJitter = [];
318
- this.statsResults.share.recv.meanRtpJitter = []; // Reset the roundTripTime
319
-
320
- this.statsResults.audio.send.meanRoundTripTime = [];
321
- this.statsResults.video.send.meanRoundTripTime = [];
322
- this.statsResults.share.send.meanRoundTripTime = [];
235
+ var _this2 = this;
236
+ (0, _keys.default)(this.statsResults).forEach(function (mediaType) {
237
+ if (mediaType.includes('recv')) {
238
+ _this2.statsResults[mediaType].recv.meanRtpJitter = [];
239
+ }
240
+ if (mediaType.includes('send')) {
241
+ _this2.statsResults[mediaType].send.meanRemoteJitter = [];
242
+ _this2.statsResults[mediaType].send.meanRoundTripTime = [];
243
+ }
244
+ });
323
245
  }
246
+
324
247
  /**
325
248
  * sets mediaStatus status for analyzing metrics
326
249
  *
@@ -329,12 +252,16 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
329
252
  * @memberof StatsAnalyzer
330
253
  * @returns {void}
331
254
  */
332
-
333
255
  }, {
334
256
  key: "updateMediaStatus",
335
257
  value: function updateMediaStatus(status) {
336
- this.meetingMediaStatus = status;
258
+ var _this$meetingMediaSta, _this$meetingMediaSta2;
259
+ this.meetingMediaStatus = {
260
+ actual: _objectSpread(_objectSpread({}, (_this$meetingMediaSta = this.meetingMediaStatus) === null || _this$meetingMediaSta === void 0 ? void 0 : _this$meetingMediaSta.actual), status === null || status === void 0 ? void 0 : status.actual),
261
+ expected: _objectSpread(_objectSpread({}, (_this$meetingMediaSta2 = this.meetingMediaStatus) === null || _this$meetingMediaSta2 === void 0 ? void 0 : _this$meetingMediaSta2.expected), status === null || status === void 0 ? void 0 : status.expected)
262
+ };
337
263
  }
264
+
338
265
  /**
339
266
  * captures MQA data from media connection
340
267
  *
@@ -342,129 +269,263 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
342
269
  * @memberof StatsAnalyzer
343
270
  * @returns {void}
344
271
  */
345
-
346
272
  }, {
347
273
  key: "sendMqaData",
348
274
  value: function sendMqaData() {
349
- var audioReceiver = _config.default.intervals[0].audioReceive[0];
350
- var audioSender = _config.default.intervals[0].audioTransmit[0];
351
- var videoReceiver = _config.default.intervals[0].videoReceive[0];
352
- var videoSender = _config.default.intervals[0].videoTransmit[0];
353
- var shareSender = _config.default.intervals[0].videoTransmit[1];
354
- var shareReceiver = _config.default.intervals[0].videoReceive[1];
275
+ var _this3 = this;
276
+ var newMqa = (0, _cloneDeep2.default)(_config.emptyMqaInterval);
277
+
278
+ // Fill in empty stats items for lastMqaDataSent
279
+ (0, _keys.default)(this.statsResults).forEach(function (mediaType) {
280
+ if (!_this3.lastMqaDataSent[mediaType]) {
281
+ _this3.lastMqaDataSent[mediaType] = {};
282
+ }
283
+ if (!_this3.lastMqaDataSent[mediaType].send && mediaType.includes('-send')) {
284
+ _this3.lastMqaDataSent[mediaType].send = {};
285
+ }
286
+ if (!_this3.lastMqaDataSent[mediaType].recv && mediaType.includes('-recv')) {
287
+ _this3.lastMqaDataSent[mediaType].recv = {};
288
+ }
289
+ });
290
+
291
+ // Create stats the first level, totals for senders and receivers
292
+ var audioSender = (0, _cloneDeep2.default)(_config.emptyAudioTransmit);
293
+ var audioShareSender = (0, _cloneDeep2.default)(_config.emptyAudioTransmit);
294
+ var audioReceiver = (0, _cloneDeep2.default)(_config.emptyAudioReceive);
295
+ var audioShareReceiver = (0, _cloneDeep2.default)(_config.emptyAudioReceive);
296
+ var videoSender = (0, _cloneDeep2.default)(_config.emptyVideoTransmit);
297
+ var videoShareSender = (0, _cloneDeep2.default)(_config.emptyVideoTransmit);
298
+ var videoReceiver = (0, _cloneDeep2.default)(_config.emptyVideoReceive);
299
+ var videoShareReceiver = (0, _cloneDeep2.default)(_config.emptyVideoReceive);
355
300
  (0, _mqaUtil.getAudioSenderMqa)({
356
301
  audioSender: audioSender,
357
302
  statsResults: this.statsResults,
358
- lastMqaDataSent: this.lastMqaDataSent
303
+ lastMqaDataSent: this.lastMqaDataSent,
304
+ baseMediaType: 'audio-send'
305
+ });
306
+ newMqa.audioTransmit.push(audioSender);
307
+ (0, _mqaUtil.getAudioSenderMqa)({
308
+ audioSender: audioShareSender,
309
+ statsResults: this.statsResults,
310
+ lastMqaDataSent: this.lastMqaDataSent,
311
+ baseMediaType: 'audio-share-send'
359
312
  });
313
+ newMqa.audioTransmit.push(audioShareSender);
360
314
  (0, _mqaUtil.getAudioReceiverMqa)({
361
315
  audioReceiver: audioReceiver,
362
316
  statsResults: this.statsResults,
363
- lastMqaDataSent: this.lastMqaDataSent
317
+ lastMqaDataSent: this.lastMqaDataSent,
318
+ baseMediaType: 'audio-recv'
364
319
  });
365
- (0, _mqaUtil.getVideoReceiverMqa)({
366
- videoReceiver: videoReceiver,
320
+ newMqa.audioReceive.push(audioReceiver);
321
+ (0, _mqaUtil.getAudioReceiverMqa)({
322
+ audioReceiver: audioShareReceiver,
367
323
  statsResults: this.statsResults,
368
- lastMqaDataSent: this.lastMqaDataSent
324
+ lastMqaDataSent: this.lastMqaDataSent,
325
+ baseMediaType: 'audio-share-recv'
369
326
  });
327
+ newMqa.audioReceive.push(audioShareReceiver);
370
328
  (0, _mqaUtil.getVideoSenderMqa)({
371
329
  videoSender: videoSender,
372
330
  statsResults: this.statsResults,
373
- lastMqaDataSent: this.lastMqaDataSent
374
- }); // Capture mqa for share scenario
375
-
331
+ lastMqaDataSent: this.lastMqaDataSent,
332
+ baseMediaType: 'video-send'
333
+ });
334
+ newMqa.videoTransmit.push(videoSender);
376
335
  (0, _mqaUtil.getVideoSenderMqa)({
377
- videoSender: shareSender,
336
+ videoSender: videoShareSender,
378
337
  statsResults: this.statsResults,
379
338
  lastMqaDataSent: this.lastMqaDataSent,
380
- isShareStream: true
339
+ baseMediaType: 'video-share-send'
381
340
  });
341
+ newMqa.videoTransmit.push(videoShareSender);
382
342
  (0, _mqaUtil.getVideoReceiverMqa)({
383
- videoReceiver: shareReceiver,
343
+ videoReceiver: videoReceiver,
384
344
  statsResults: this.statsResults,
385
345
  lastMqaDataSent: this.lastMqaDataSent,
386
- isShareStream: true
346
+ baseMediaType: 'video-recv'
387
347
  });
388
- _config.default.intervals[0].intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress[0]; // Adding peripheral information
389
-
390
- _config.default.intervals[0].intervalMetadata.peripherals = [];
391
-
392
- _config.default.intervals[0].intervalMetadata.peripherals.push({
393
- information: _constants._UNKNOWN_,
394
- name: _constants.MEDIA_DEVICES.SPEAKER
348
+ newMqa.videoReceive.push(videoReceiver);
349
+ (0, _mqaUtil.getVideoReceiverMqa)({
350
+ videoReceiver: videoShareReceiver,
351
+ statsResults: this.statsResults,
352
+ lastMqaDataSent: this.lastMqaDataSent,
353
+ baseMediaType: 'video-share-recv'
395
354
  });
396
-
397
- _config.default.intervals[0].intervalMetadata.peripherals.push({
398
- information: this.statsResults[_constants.STATS.AUDIO_CORRELATE][_constants.STATS.SEND_DIRECTION].trackLabel || _constants._UNKNOWN_,
399
- name: _constants.MEDIA_DEVICES.MICROPHONE
355
+ newMqa.videoReceive.push(videoShareReceiver);
356
+
357
+ // Add stats for individual streams
358
+ (0, _keys.default)(this.statsResults).forEach(function (mediaType) {
359
+ if (mediaType.includes('audio-send')) {
360
+ var audioSenderStream = (0, _cloneDeep2.default)(_config.emptyAudioTransmitStream);
361
+ (0, _mqaUtil.getAudioSenderStreamMqa)({
362
+ audioSenderStream: audioSenderStream,
363
+ statsResults: _this3.statsResults,
364
+ lastMqaDataSent: _this3.lastMqaDataSent,
365
+ mediaType: mediaType
366
+ });
367
+ newMqa.audioTransmit[0].streams.push(audioSenderStream);
368
+ _this3.lastMqaDataSent[mediaType].send = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].send);
369
+ } else if (mediaType.includes('audio-share-send')) {
370
+ var _audioSenderStream = (0, _cloneDeep2.default)(_config.emptyAudioTransmitStream);
371
+ (0, _mqaUtil.getAudioSenderStreamMqa)({
372
+ audioSenderStream: _audioSenderStream,
373
+ statsResults: _this3.statsResults,
374
+ lastMqaDataSent: _this3.lastMqaDataSent,
375
+ mediaType: mediaType
376
+ });
377
+ newMqa.audioTransmit[1].streams.push(_audioSenderStream);
378
+ _this3.lastMqaDataSent[mediaType].send = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].send);
379
+ } else if (mediaType.includes('audio-recv')) {
380
+ var audioReceiverStream = (0, _cloneDeep2.default)(_config.emptyAudioReceiveStream);
381
+ (0, _mqaUtil.getAudioReceiverStreamMqa)({
382
+ audioReceiverStream: audioReceiverStream,
383
+ statsResults: _this3.statsResults,
384
+ lastMqaDataSent: _this3.lastMqaDataSent,
385
+ mediaType: mediaType
386
+ });
387
+ newMqa.audioReceive[0].streams.push(audioReceiverStream);
388
+ _this3.lastMqaDataSent[mediaType].recv = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].recv);
389
+ } else if (mediaType.includes('audio-share-recv')) {
390
+ var _audioReceiverStream = (0, _cloneDeep2.default)(_config.emptyAudioReceiveStream);
391
+ (0, _mqaUtil.getAudioReceiverStreamMqa)({
392
+ audioReceiverStream: _audioReceiverStream,
393
+ statsResults: _this3.statsResults,
394
+ lastMqaDataSent: _this3.lastMqaDataSent,
395
+ mediaType: mediaType
396
+ });
397
+ newMqa.audioReceive[1].streams.push(_audioReceiverStream);
398
+ _this3.lastMqaDataSent[mediaType].recv = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].recv);
399
+ } else if (mediaType.includes('video-send')) {
400
+ var videoSenderStream = (0, _cloneDeep2.default)(_config.emptyVideoTransmitStream);
401
+ (0, _mqaUtil.getVideoSenderStreamMqa)({
402
+ videoSenderStream: videoSenderStream,
403
+ statsResults: _this3.statsResults,
404
+ lastMqaDataSent: _this3.lastMqaDataSent,
405
+ mediaType: mediaType
406
+ });
407
+ newMqa.videoTransmit[0].streams.push(videoSenderStream);
408
+ _this3.lastMqaDataSent[mediaType].send = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].send);
409
+ } else if (mediaType.includes('video-share-send')) {
410
+ var _videoSenderStream = (0, _cloneDeep2.default)(_config.emptyVideoTransmitStream);
411
+ (0, _mqaUtil.getVideoSenderStreamMqa)({
412
+ videoSenderStream: _videoSenderStream,
413
+ statsResults: _this3.statsResults,
414
+ lastMqaDataSent: _this3.lastMqaDataSent,
415
+ mediaType: mediaType
416
+ });
417
+ newMqa.videoTransmit[1].streams.push(_videoSenderStream);
418
+ _this3.lastMqaDataSent[mediaType].send = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].send);
419
+ } else if (mediaType.includes('video-recv')) {
420
+ var videoReceiverStream = (0, _cloneDeep2.default)(_config.emptyVideoReceiveStream);
421
+ (0, _mqaUtil.getVideoReceiverStreamMqa)({
422
+ videoReceiverStream: videoReceiverStream,
423
+ statsResults: _this3.statsResults,
424
+ lastMqaDataSent: _this3.lastMqaDataSent,
425
+ mediaType: mediaType
426
+ });
427
+ newMqa.videoReceive[0].streams.push(videoReceiverStream);
428
+ _this3.lastMqaDataSent[mediaType].recv = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].recv);
429
+ } else if (mediaType.includes('video-share-recv')) {
430
+ var _videoReceiverStream = (0, _cloneDeep2.default)(_config.emptyVideoReceiveStream);
431
+ (0, _mqaUtil.getVideoReceiverStreamMqa)({
432
+ videoReceiverStream: _videoReceiverStream,
433
+ statsResults: _this3.statsResults,
434
+ lastMqaDataSent: _this3.lastMqaDataSent,
435
+ mediaType: mediaType
436
+ });
437
+ newMqa.videoReceive[1].streams.push(_videoReceiverStream);
438
+ _this3.lastMqaDataSent[mediaType].recv = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].recv);
439
+ }
400
440
  });
441
+ newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;
401
442
 
402
- _config.default.intervals[0].intervalMetadata.peripherals.push({
403
- information: this.statsResults[_constants.STATS.VIDEO_CORRELATE][_constants.STATS.SEND_DIRECTION].trackLabel || _constants._UNKNOWN_,
404
- name: _constants.MEDIA_DEVICES.CAMERA
443
+ // Adding peripheral information
444
+ newMqa.intervalMetadata.peripherals.push({
445
+ information: _constants._UNKNOWN_,
446
+ name: _constants.MEDIA_DEVICES.SPEAKER
405
447
  });
406
-
407
- _config.default.networkType = this.statsResults.connectionType.local.networkType;
448
+ if (this.statsResults['audio-send']) {
449
+ newMqa.intervalMetadata.peripherals.push({
450
+ information: this.statsResults['audio-send'].trackLabel || _constants._UNKNOWN_,
451
+ name: _constants.MEDIA_DEVICES.MICROPHONE
452
+ });
453
+ }
454
+ if (this.statsResults['video-send']) {
455
+ newMqa.intervalMetadata.peripherals.push({
456
+ information: this.statsResults['video-send'].trackLabel || _constants._UNKNOWN_,
457
+ name: _constants.MEDIA_DEVICES.CAMERA
458
+ });
459
+ }
460
+ newMqa.networkType = this.statsResults.connectionType.local.networkType;
408
461
  this.mqaSentCount += 1;
409
- _config.default.intervals[0].intervalNumber = this.mqaSentCount; // DO Deep copy, for some reason it takes the reference all the time rather then old value set
410
-
411
- this.lastMqaDataSent = (0, _cloneDeep2.default)(this.statsResults);
412
- this.populateResults(_config.default.intervals[0]);
462
+ newMqa.intervalNumber = this.mqaSentCount;
413
463
  this.resetStatsResults();
414
464
  this.emit({
415
465
  file: 'statsAnalyzer',
416
466
  function: 'sendMqaData'
417
467
  }, EVENTS.MEDIA_QUALITY, {
418
- data: _config.default.intervals[0],
419
- networkType: _config.default.networkType
468
+ data: newMqa,
469
+ // @ts-ignore
470
+ networkType: newMqa.networkType
420
471
  });
421
472
  }
473
+
422
474
  /**
423
475
  * updated the media connection when changed
424
476
  *
425
477
  * @private
426
478
  * @memberof StatsAnalyzer
427
- * @param {MC.RoapMediaConnection} mediaConnection
479
+ * @param {RoapMediaConnection} mediaConnection
428
480
  * @returns {void}
429
481
  */
430
-
431
482
  }, {
432
483
  key: "updateMediaConnection",
433
484
  value: function updateMediaConnection(mediaConnection) {
434
485
  this.mediaConnection = mediaConnection;
435
486
  }
487
+
488
+ /**
489
+ * Returns the local IP address for diagnostics.
490
+ * this is the local IP of the interface used for the current media connection
491
+ * a host can have many local Ip Addresses
492
+ * @returns {string | undefined} The local IP address.
493
+ */
494
+ }, {
495
+ key: "getLocalIpAddress",
496
+ value: function getLocalIpAddress() {
497
+ return this.localIpAddress;
498
+ }
499
+
436
500
  /**
437
501
  * Starts the stats analyzer on interval
438
502
  *
439
503
  * @public
440
504
  * @memberof StatsAnalyzer
441
- * @param {MC.RoapMediaConnection} mediaConnection
505
+ * @param {RoapMediaConnection} mediaConnection
442
506
  * @returns {Promise}
443
507
  */
444
-
445
508
  }, {
446
509
  key: "startAnalyzer",
447
510
  value: function startAnalyzer(mediaConnection) {
448
- var _this2 = this;
449
-
511
+ var _this4 = this;
450
512
  if (!this.statsStarted) {
451
513
  this.statsStarted = true;
452
514
  this.mediaConnection = mediaConnection;
453
515
  return this.getStatsAndParse().then(function () {
454
- _this2.statsInterval = setInterval(function () {
455
- _this2.getStatsAndParse();
456
- }, _this2.config.analyzerInterval); // Trigger initial fetch
457
-
458
- _this2.sendMqaData();
459
-
460
- _this2.mqaInterval = setInterval(function () {
461
- _this2.sendMqaData();
462
- }, _constants.MQA_INTEVAL);
516
+ _this4.statsInterval = setInterval(function () {
517
+ _this4.getStatsAndParse();
518
+ }, _this4.config.analyzerInterval);
519
+ // Trigger initial fetch
520
+ _this4.sendMqaData();
521
+ _this4.mqaInterval = setInterval(function () {
522
+ _this4.sendMqaData();
523
+ }, _constants.MQA_INTERVAL);
463
524
  });
464
525
  }
465
-
466
526
  return _promise.default.resolve();
467
527
  }
528
+
468
529
  /**
469
530
  * Cleans up the analyzer when done
470
531
  *
@@ -472,35 +533,28 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
472
533
  * @memberof StatsAnalyzer
473
534
  * @returns {void}
474
535
  */
475
-
476
536
  }, {
477
537
  key: "stopAnalyzer",
478
538
  value: function stopAnalyzer() {
479
- var _this3 = this;
480
-
539
+ var _this5 = this;
481
540
  var sendOneLastMqa = this.mqaInterval && this.statsInterval;
482
-
483
541
  if (this.statsInterval) {
484
542
  clearInterval(this.statsInterval);
485
543
  this.statsInterval = undefined;
486
544
  }
487
-
488
545
  if (this.mqaInterval) {
489
546
  clearInterval(this.mqaInterval);
490
547
  this.mqaInterval = undefined;
491
548
  }
492
-
493
549
  if (sendOneLastMqa) {
494
550
  return this.getStatsAndParse().then(function () {
495
- _this3.sendMqaData();
496
-
497
- _this3.mediaConnection = null;
551
+ _this5.sendMqaData();
552
+ _this5.mediaConnection = null;
498
553
  });
499
554
  }
500
-
501
- this.mediaConnection = null;
502
555
  return _promise.default.resolve();
503
556
  }
557
+
504
558
  /**
505
559
  * Parse a single result of get stats
506
560
  *
@@ -511,7 +565,6 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
511
565
  * @returns {void}
512
566
  * @memberof StatsAnalyzer
513
567
  */
514
-
515
568
  }, {
516
569
  key: "parseGetStatsResult",
517
570
  value: function parseGetStatsResult(getStatsResult, type, isSender) {
@@ -519,81 +572,95 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
519
572
  return;
520
573
  }
521
574
 
575
+ // Generate empty stats results
576
+ if (!this.statsResults[type]) {
577
+ this.statsResults[type] = {};
578
+ }
579
+ if (isSender && !this.statsResults[type].send) {
580
+ this.statsResults[type].send = (0, _cloneDeep2.default)(emptySender);
581
+ } else if (!isSender && !this.statsResults[type].recv) {
582
+ this.statsResults[type].recv = (0, _cloneDeep2.default)(emptyReceiver);
583
+ }
522
584
  switch (getStatsResult.type) {
523
585
  case 'outbound-rtp':
524
586
  this.processOutboundRTPResult(getStatsResult, type);
525
587
  break;
526
-
527
588
  case 'inbound-rtp':
528
589
  this.processInboundRTPResult(getStatsResult, type);
529
590
  break;
530
-
531
- case 'track':
532
- this.processTrackResult(getStatsResult, type);
533
- break;
534
-
535
591
  case 'remote-inbound-rtp':
536
592
  case 'remote-outbound-rtp':
537
- this.compareSentAndReceived(getStatsResult, type, isSender);
593
+ this.compareSentAndReceived(getStatsResult, type);
538
594
  break;
539
-
540
595
  case 'remotecandidate':
541
596
  case 'remote-candidate':
542
597
  this.parseCandidate(getStatsResult, type, isSender, true);
543
598
  break;
544
-
545
599
  case 'local-candidate':
546
600
  this.parseCandidate(getStatsResult, type, isSender, false);
547
601
  break;
548
-
549
602
  case 'media-source':
550
603
  this.parseAudioSource(getStatsResult, type);
551
604
  break;
552
-
553
605
  default:
554
606
  break;
555
607
  }
556
608
  }
609
+
557
610
  /**
558
611
  * Filters the get stats results for types
559
612
  * @private
560
- * @param {Array} getStatsResults
613
+ * @param {Array} statsItem
561
614
  * @param {String} type
562
615
  * @param {boolean} isSender
563
616
  * @returns {void}
564
617
  */
565
-
566
618
  }, {
567
619
  key: "filterAndParseGetStatsResults",
568
- value: function filterAndParseGetStatsResults(getStatsResults, type, isSender) {
569
- var _this4 = this;
570
-
620
+ value: function filterAndParseGetStatsResults(statsItem, type, isSender) {
621
+ var _this6 = this;
571
622
  var types = _constants.DEFAULT_GET_STATS_FILTER.types;
572
- getStatsResults.forEach(function (result) {
623
+
624
+ // get the successful candidate pair before parsing stats.
625
+ statsItem.report.forEach(function (report) {
626
+ if (report.type === 'candidate-pair' && report.state === 'succeeded') {
627
+ _this6.successfulCandidatePair = report;
628
+ }
629
+ });
630
+ statsItem.report.forEach(function (result) {
573
631
  if (types.includes(result.type)) {
574
- _this4.parseGetStatsResult(result, type, isSender);
632
+ _this6.parseGetStatsResult(result, type, isSender);
575
633
  }
576
634
  });
635
+ if (this.statsResults[type]) {
636
+ var _this$successfulCandi2, _this$statsResults;
637
+ this.statsResults[type].direction = statsItem.currentDirection;
638
+ this.statsResults[type].trackLabel = statsItem.localTrackLabel;
639
+ this.statsResults[type].csi = statsItem.csi;
640
+ this.extractAndSetLocalIpAddressInfoForDiagnostics((_this$successfulCandi2 = this.successfulCandidatePair) === null || _this$successfulCandi2 === void 0 ? void 0 : _this$successfulCandi2.localCandidateId, (_this$statsResults = this.statsResults) === null || _this$statsResults === void 0 ? void 0 : _this$statsResults.candidates);
641
+ // reset the successful candidate pair.
642
+ this.successfulCandidatePair = {};
643
+ }
577
644
  }
645
+
578
646
  /**
579
647
  * parse the audio
580
648
  * @param {String} result
581
649
  * @param {boolean} type
582
650
  * @returns {void}
583
651
  */
584
-
585
652
  }, {
586
653
  key: "parseAudioSource",
587
654
  value: function parseAudioSource(result, type) {
588
655
  if (!result) {
589
656
  return;
590
657
  }
591
-
592
- if (type === _constants.STATS.AUDIO_CORRELATE) {
658
+ if (type.includes('audio-send')) {
593
659
  this.statsResults[type].send.audioLevel = result.audioLevel;
594
660
  this.statsResults[type].send.totalAudioEnergy = result.totalAudioEnergy;
595
661
  }
596
662
  }
663
+
597
664
  /**
598
665
  * emits started/stopped events for local/remote media by checking
599
666
  * if given values are increasing or not. The previousValue, currentValue
@@ -608,7 +675,6 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
608
675
  * @memberof StatsAnalyzer
609
676
  * @returns {void}
610
677
  */
611
-
612
678
  }, {
613
679
  key: "compareLastStatsResult",
614
680
  value:
@@ -620,136 +686,98 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
620
686
  * @returns {void}
621
687
  */
622
688
  function compareLastStatsResult() {
689
+ var _this7 = this;
623
690
  if (this.lastStatsResults !== null && this.meetingMediaStatus) {
624
- // compare audio stats sent
625
- var mediaType = _constants.STATS.AUDIO_CORRELATE;
626
- var currentStats = null;
627
- var previousStats = null;
628
-
629
- if (this.meetingMediaStatus.expected.sendAudio) {
630
- currentStats = this.statsResults[mediaType].send;
631
- previousStats = this.lastStatsResults[mediaType].send;
632
-
633
- if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
634
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets sent"));
691
+ var getCurrentStatsTotals = function getCurrentStatsTotals(keyPrefix, value) {
692
+ return (0, _keys.default)(_this7.statsResults).filter(function (key) {
693
+ return key.startsWith(keyPrefix);
694
+ }).reduce(function (prev, cur) {
695
+ var _this7$statsResults$c;
696
+ return prev + (((_this7$statsResults$c = _this7.statsResults[cur]) === null || _this7$statsResults$c === void 0 ? void 0 : _this7$statsResults$c.recv[value]) || 0);
697
+ }, 0);
698
+ };
699
+ var getPreviousStatsTotals = function getPreviousStatsTotals(keyPrefix, value) {
700
+ return (0, _keys.default)(_this7.statsResults).filter(function (key) {
701
+ return key.startsWith(keyPrefix);
702
+ }).reduce(function (prev, cur) {
703
+ var _this7$lastStatsResul;
704
+ return prev + (((_this7$lastStatsResul = _this7.lastStatsResults[cur]) === null || _this7$lastStatsResul === void 0 ? void 0 : _this7$lastStatsResul.recv[value]) || 0);
705
+ }, 0);
706
+ };
707
+
708
+ // Audio Transmit
709
+ if (this.lastStatsResults['audio-send']) {
710
+ // compare audio stats sent
711
+ // NOTE: relies on there being only one sender.
712
+ var currentStats = this.statsResults['audio-send'].send;
713
+ var previousStats = this.lastStatsResults['audio-send'].send;
714
+ if (this.meetingMediaStatus.expected.sendAudio && currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
715
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent", currentStats.totalPacketsSent);
635
716
  } else {
636
- if (currentStats.totalAudioEnergy === previousStats.totalAudioEnergy || currentStats.totalAudioEnergy === 0) {
637
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " Energy present"));
717
+ if (this.meetingMediaStatus.expected.sendAudio && currentStats.totalAudioEnergy === previousStats.totalAudioEnergy || currentStats.totalAudioEnergy === 0) {
718
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present", currentStats.totalAudioEnergy);
638
719
  }
639
-
640
- if (currentStats.audioLevel === 0) {
641
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> ".concat(mediaType, " level is 0 for the user"));
720
+ if (this.meetingMediaStatus.expected.sendAudio && currentStats.audioLevel === 0) {
721
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> audio level is 0 for the user");
642
722
  }
643
723
  }
644
-
645
- this.emitStartStopEvents(mediaType, previousStats.totalPacketsSent, currentStats.totalPacketsSent, true);
724
+ this.emitStartStopEvents('audio', previousStats.totalPacketsSent, currentStats.totalPacketsSent, true);
646
725
  }
647
726
 
648
- if (this.meetingMediaStatus.expected.receiveAudio) {
649
- // compare audio stats received
650
- currentStats = this.statsResults[mediaType].recv;
651
- previousStats = this.lastStatsResults[mediaType].recv;
727
+ // Audio Receive
728
+ var currentAudioPacketsReceived = getCurrentStatsTotals('audio-recv', 'totalPacketsReceived');
729
+ var previousAudioPacketsReceived = getPreviousStatsTotals('audio-recv', 'totalPacketsReceived');
730
+ this.emitStartStopEvents('audio', previousAudioPacketsReceived, currentAudioPacketsReceived, false);
652
731
 
653
- if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsReceived === 0) {
654
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets received"));
655
- } else if (currentStats.totalSamplesReceived === previousStats.totalSamplesReceived || currentStats.totalSamplesReceived === 0) {
656
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " samples received"));
657
- }
658
-
659
- this.emitStartStopEvents(mediaType, previousStats.totalPacketsReceived, currentStats.totalPacketsReceived, false);
660
- }
661
-
662
- mediaType = _constants.STATS.VIDEO_CORRELATE;
663
-
664
- if (this.meetingMediaStatus.expected.sendVideo) {
732
+ // Video Transmit
733
+ if (this.lastStatsResults['video-send']) {
665
734
  // compare video stats sent
666
- currentStats = this.statsResults[mediaType].send;
667
- previousStats = this.lastStatsResults[mediaType].send;
668
-
669
- if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
670
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets sent"));
671
- } else {
672
- if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {
673
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " Frames Encoded"));
674
- }
675
-
676
- if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {
677
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " Frames sent"));
678
- }
679
- }
680
-
681
- this.emitStartStopEvents(mediaType, previousStats.framesSent, currentStats.framesSent, true);
682
- }
683
-
684
- if (this.meetingMediaStatus.expected.receiveVideo) {
685
- // compare video stats reveived
686
- currentStats = this.statsResults[mediaType].recv;
687
- previousStats = this.lastStatsResults[mediaType].recv;
688
-
689
- if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsReceived === 0) {
690
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets received"));
735
+ var _currentStats = this.statsResults['video-send'].send;
736
+ var _previousStats = this.lastStatsResults['video-send'].send;
737
+ if (this.meetingMediaStatus.expected.sendVideo && (_currentStats.totalPacketsSent === _previousStats.totalPacketsSent || _currentStats.totalPacketsSent === 0)) {
738
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent", _currentStats.totalPacketsSent);
691
739
  } else {
692
- if (this.statsResults.resolutions[mediaType].recv.framesReceived === this.lastStatsResults.resolutions[mediaType].recv.framesReceived || this.statsResults.resolutions[mediaType].recv.framesReceived === 0) {
693
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames received"));
740
+ if (this.meetingMediaStatus.expected.sendVideo && (_currentStats.framesEncoded === _previousStats.framesEncoded || _currentStats.framesEncoded === 0)) {
741
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded", _currentStats.framesEncoded);
694
742
  }
695
-
696
- if (this.statsResults[mediaType].recv.framesDecoded === this.lastStatsResults[mediaType].recv.framesDecoded || this.statsResults.resolutions[mediaType].send.framesDecoded === 0) {
697
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames decoded"));
698
- }
699
-
700
- if (this.statsResults.resolutions[mediaType].recv.framesDropped - this.lastStatsResults.resolutions[mediaType].recv.framesDropped > 10) {
701
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> ".concat(mediaType, " frames are getting dropped"));
743
+ if (this.meetingMediaStatus.expected.sendVideo && (this.statsResults['video-send'].send.framesSent === this.lastStatsResults['video-send'].send.framesSent || this.statsResults['video-send'].send.framesSent === 0)) {
744
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent", this.statsResults['video-send'].send.framesSent);
702
745
  }
703
746
  }
704
-
705
- this.emitStartStopEvents(mediaType, previousStats.framesDecoded, currentStats.framesDecoded, false);
747
+ this.emitStartStopEvents('video', _previousStats.framesSent, _currentStats.framesSent, true);
706
748
  }
707
749
 
708
- mediaType = _constants.STATS.SHARE_CORRELATE;
750
+ // Video Receive
751
+ var currentVideoFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');
752
+ var previousVideoFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');
753
+ this.emitStartStopEvents('video', previousVideoFramesDecoded, currentVideoFramesDecoded, false);
709
754
 
710
- if (this.meetingMediaStatus.expected.sendShare) {
755
+ // Share Transmit
756
+ if (this.lastStatsResults['video-share-send']) {
711
757
  // compare share stats sent
712
- currentStats = this.statsResults[mediaType].send;
713
- previousStats = this.lastStatsResults[mediaType].send;
714
-
715
- if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
716
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets sent"));
717
- } else {
718
- if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {
719
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames getting encoded"));
720
- }
721
-
722
- if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {
723
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames sent"));
724
- }
725
- } // TODO:need to check receive share value
726
- // compare share stats reveived
727
-
728
-
729
- currentStats = this.statsResults[mediaType].recv;
730
- previousStats = this.lastStatsResults[mediaType].recv;
731
758
 
732
- if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsSent === 0) {
733
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets received"));
759
+ var _currentStats2 = this.statsResults['video-share-send'].send;
760
+ var _previousStats2 = this.lastStatsResults['video-share-send'].send;
761
+ if (this.meetingMediaStatus.expected.sendShare && (_currentStats2.totalPacketsSent === _previousStats2.totalPacketsSent || _currentStats2.totalPacketsSent === 0)) {
762
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent", _currentStats2.totalPacketsSent);
734
763
  } else {
735
- if (this.statsResults.resolutions[mediaType].recv.framesReceived === this.lastStatsResults.resolutions[mediaType].recv.framesReceived || this.statsResults.resolutions[mediaType].recv.framesReceived === 0) {
736
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames received"));
764
+ if (this.meetingMediaStatus.expected.sendShare && (_currentStats2.framesEncoded === _previousStats2.framesEncoded || _currentStats2.framesEncoded === 0)) {
765
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded", _currentStats2.framesEncoded);
737
766
  }
738
-
739
- if (this.statsResults[mediaType].recv.framesDecoded === this.lastStatsResults[mediaType].recv.framesDecoded || this.statsResults.resolutions[mediaType].send.framesDecoded === 0) {
740
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames decoded"));
741
- }
742
-
743
- if (this.statsResults.resolutions[mediaType].recv.framesDropped - this.lastStatsResults.resolutions[mediaType].recv.framesDropped > 10) {
744
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> ".concat(mediaType, " frames are getting dropped"));
767
+ if (this.meetingMediaStatus.expected.sendShare && (this.statsResults['video-share-send'].send.framesSent === this.lastStatsResults['video-share-send'].send.framesSent || this.statsResults['video-share-send'].send.framesSent === 0)) {
768
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames sent", this.statsResults['video-share-send'].send.framesSent);
745
769
  }
746
- } // we are not calling emitStartStopEvents() for sending or receiving share because sharing is often started and stopped
747
- // in meetings and this.meetingMediaStatus.expected values can be out of sync with the actual packet flow
748
- // so we would send "sharing stopped" events incorrectly
749
-
770
+ }
771
+ this.emitStartStopEvents('share', _previousStats2.framesSent, _currentStats2.framesSent, true);
750
772
  }
773
+
774
+ // Share receive
775
+ var currentShareFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');
776
+ var previousShareFramesDecoded = getPreviousStatsTotals('video-share-recv', 'framesDecoded');
777
+ this.emitStartStopEvents('share', previousShareFramesDecoded, currentShareFramesDecoded, false);
751
778
  }
752
779
  }
780
+
753
781
  /**
754
782
  * Does a `getStats` on all the transceivers and parses the results
755
783
  *
@@ -757,97 +785,89 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
757
785
  * @memberof StatsAnalyzer
758
786
  * @returns {Promise}
759
787
  */
760
-
761
788
  }, {
762
789
  key: "getStatsAndParse",
763
790
  value: function getStatsAndParse() {
764
- var _this5 = this;
765
-
791
+ var _this8 = this;
766
792
  if (!this.mediaConnection) {
767
793
  return _promise.default.resolve();
768
794
  }
769
-
770
- if (this.mediaConnection && this.mediaConnection.getConnectionState() === _internalMediaCore.MediaConnection.ConnectionState.Failed) {
795
+ if (this.mediaConnection && this.mediaConnection.getConnectionState() === _internalMediaCore.ConnectionState.Failed) {
771
796
  _loggerProxy.default.logger.trace('StatsAnalyzer:index#getStatsAndParse --> media connection is in failed state');
772
-
773
797
  return _promise.default.resolve();
774
798
  }
775
-
776
799
  _loggerProxy.default.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Collecting Stats');
777
-
778
800
  return this.mediaConnection.getTransceiverStats().then(function (transceiverStats) {
779
- _this5.filterAndParseGetStatsResults(transceiverStats.video.sender, _constants.STATS.VIDEO_CORRELATE, true);
780
-
781
- _this5.filterAndParseGetStatsResults(transceiverStats.video.receiver, _constants.STATS.VIDEO_CORRELATE, false);
782
-
783
- _this5.filterAndParseGetStatsResults(transceiverStats.audio.sender, _constants.STATS.AUDIO_CORRELATE, true);
784
-
785
- _this5.filterAndParseGetStatsResults(transceiverStats.audio.receiver, _constants.STATS.AUDIO_CORRELATE, false);
786
-
787
- _this5.filterAndParseGetStatsResults(transceiverStats.screenShareVideo.sender, _constants.STATS.SHARE_CORRELATE, true);
788
-
789
- _this5.filterAndParseGetStatsResults(transceiverStats.screenShareVideo.receiver, _constants.STATS.SHARE_CORRELATE, false); // updates the current direction of media
790
-
791
-
792
- _this5.statsResults[_constants.STATS.AUDIO_CORRELATE].direction = transceiverStats.audio.currentDirection;
793
- _this5.statsResults[_constants.STATS.VIDEO_CORRELATE].direction = transceiverStats.video.currentDirection;
794
- _this5.statsResults[_constants.STATS.SHARE_CORRELATE].direction = transceiverStats.screenShareVideo.currentDirection;
795
- _this5.statsResults[_constants.STATS.AUDIO_CORRELATE][_constants.STATS.SEND_DIRECTION].trackLabel = transceiverStats.audio.localTrackLabel;
796
- _this5.statsResults[_constants.STATS.VIDEO_CORRELATE][_constants.STATS.SEND_DIRECTION].trackLabel = transceiverStats.video.localTrackLabel;
801
+ transceiverStats.video.receivers.forEach(function (receiver, i) {
802
+ return _this8.filterAndParseGetStatsResults(receiver, "video-recv-".concat(i), false);
803
+ });
804
+ transceiverStats.audio.receivers.forEach(function (receiver, i) {
805
+ return _this8.filterAndParseGetStatsResults(receiver, "audio-recv-".concat(i), false);
806
+ });
807
+ transceiverStats.screenShareVideo.receivers.forEach(function (receiver, i) {
808
+ return _this8.filterAndParseGetStatsResults(receiver, "video-share-recv-".concat(i), false);
809
+ });
810
+ transceiverStats.screenShareAudio.receivers.forEach(function (receiver, i) {
811
+ return _this8.filterAndParseGetStatsResults(receiver, "audio-share-recv-".concat(i), false);
812
+ });
813
+ transceiverStats.video.senders.forEach(function (sender, i) {
814
+ if (i > 0) {
815
+ throw new Error('Stats Analyzer does not support multiple senders.');
816
+ }
817
+ _this8.filterAndParseGetStatsResults(sender, 'video-send', true);
818
+ });
819
+ transceiverStats.audio.senders.forEach(function (sender, i) {
820
+ if (i > 0) {
821
+ throw new Error('Stats Analyzer does not support multiple senders.');
822
+ }
823
+ _this8.filterAndParseGetStatsResults(sender, 'audio-send', true);
824
+ });
825
+ transceiverStats.screenShareVideo.senders.forEach(function (sender, i) {
826
+ if (i > 0) {
827
+ throw new Error('Stats Analyzer does not support multiple senders.');
828
+ }
829
+ _this8.filterAndParseGetStatsResults(sender, 'video-share-send', true);
830
+ });
831
+ transceiverStats.screenShareAudio.senders.forEach(function (sender, i) {
832
+ if (i > 0) {
833
+ throw new Error('Stats Analyzer does not support multiple senders.');
834
+ }
835
+ _this8.filterAndParseGetStatsResults(sender, 'audio-share-send', true);
836
+ });
837
+ _this8.compareLastStatsResult();
797
838
 
798
- _this5.compareLastStatsResult(); // Save the last results to compare with the current
839
+ // Save the last results to compare with the current
799
840
  // DO Deep copy, for some reason it takes the reference all the time rather then old value set
800
-
801
-
802
- _this5.lastStatsResults = JSON.parse((0, _stringify.default)(_this5.statsResults));
803
-
841
+ _this8.lastStatsResults = JSON.parse((0, _stringify.default)(_this8.statsResults));
804
842
  _loggerProxy.default.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Finished Collecting Stats');
805
843
  });
806
844
  }
845
+
807
846
  /**
808
847
  * Processes OutboundRTP stats result and stores
809
848
  * @private
810
849
  * @param {*} result
811
- * @param {*} type
850
+ * @param {*} mediaType
812
851
  * @returns {void}
813
852
  */
814
-
815
853
  }, {
816
854
  key: "processOutboundRTPResult",
817
- value: function processOutboundRTPResult(result, type) {
818
- var mediaType = type || _constants.STATS.AUDIO_CORRELATE;
855
+ value: function processOutboundRTPResult(result, mediaType) {
819
856
  var sendrecvType = _constants.STATS.SEND_DIRECTION;
820
-
821
857
  if (result.bytesSent) {
822
858
  var kilobytes = 0;
823
-
824
- if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {
825
- this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
826
- }
827
-
828
- if (!this.statsResults.internal[mediaType][sendrecvType].framesEncoded) {
829
- this.statsResults.internal[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
859
+ if (result.frameWidth && result.frameHeight) {
860
+ this.statsResults[mediaType][sendrecvType].width = result.frameWidth;
861
+ this.statsResults[mediaType][sendrecvType].height = result.frameHeight;
862
+ this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;
863
+ this.statsResults[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
830
864
  }
831
-
832
- if (!this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded) {
833
- this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;
834
- }
835
-
836
- var bytes = result.bytesSent - this.statsResults.internal[mediaType][sendrecvType].prevBytesSent;
837
- this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
838
- kilobytes = bytes / 1024;
839
865
  this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
840
- this.statsResults[mediaType].bytesSent = kilobytes;
841
- this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded - this.statsResults.internal[mediaType][sendrecvType].framesEncoded;
842
- this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded - this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded;
843
- this.statsResults.internal[mediaType].outboundRtpId = result.id;
844
-
845
- if (!this.statsResults.internal[mediaType][sendrecvType].packetsSent) {
846
- this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
847
- }
866
+ this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
867
+ this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;
868
+ this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent;
848
869
 
849
- this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent - this.statsResults.internal[mediaType][sendrecvType].packetsSent;
850
- this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent; // Data saved to send MQA metrics
870
+ // Data saved to send MQA metrics
851
871
 
852
872
  this.statsResults[mediaType][sendrecvType].totalKeyFramesEncoded = result.keyFramesEncoded;
853
873
  this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;
@@ -865,89 +885,93 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
865
885
  this.statsResults[mediaType][sendrecvType].retransmittedBytesSent = result.retransmittedBytesSent;
866
886
  }
867
887
  }
888
+
868
889
  /**
869
890
  * Processes InboundRTP stats result and stores
870
891
  * @private
871
892
  * @param {*} result
872
- * @param {*} type
893
+ * @param {*} mediaType
873
894
  * @returns {void}
874
895
  */
875
-
876
896
  }, {
877
897
  key: "processInboundRTPResult",
878
- value: function processInboundRTPResult(result, type) {
879
- var mediaType = type || _constants.STATS.AUDIO_CORRELATE;
898
+ value: function processInboundRTPResult(result, mediaType) {
880
899
  var sendrecvType = _constants.STATS.RECEIVE_DIRECTION;
881
-
882
900
  if (result.bytesReceived) {
883
901
  var kilobytes = 0;
884
-
885
- if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
886
- this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;
887
- }
888
-
889
- if (!this.statsResults.internal[mediaType][sendrecvType].pliCount) {
890
- this.statsResults.internal[mediaType][sendrecvType].pliCount = result.pliCount;
902
+ var receiveSlot = this.receiveSlotCallback(result.ssrc);
903
+ var sourceState = receiveSlot === null || receiveSlot === void 0 ? void 0 : receiveSlot.sourceState;
904
+ var idAndCsi = receiveSlot ? "id: \"".concat(receiveSlot.id || '', "\"").concat(receiveSlot.csi ? " and csi: ".concat(receiveSlot.csi) : '') : '';
905
+ var bytes = result.bytesReceived - this.statsResults[mediaType][sendrecvType].totalBytesReceived;
906
+ kilobytes = bytes / 1024;
907
+ this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
908
+ var currentPacketsLost = result.packetsLost - this.statsResults[mediaType][sendrecvType].totalPacketsLost;
909
+ if (currentPacketsLost < 0) {
910
+ currentPacketsLost = 0;
891
911
  }
892
-
893
- if (!this.statsResults.internal[mediaType][sendrecvType].packetsLost) {
894
- this.statsResults.internal[mediaType][sendrecvType].packetsLost = result.packetsLost;
912
+ var packetsReceivedDiff = result.packetsReceived - this.statsResults[mediaType][sendrecvType].totalPacketsReceived;
913
+ this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
914
+ if (packetsReceivedDiff === 0) {
915
+ if (receiveSlot && sourceState === 'live') {
916
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No packets received for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total packets received on slot: "), result.packetsReceived);
917
+ }
895
918
  }
896
-
897
- if (!this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived) {
898
- this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
919
+ if (mediaType.startsWith('video') || mediaType.startsWith('share')) {
920
+ var videoFramesReceivedDiff = result.framesReceived - this.statsResults[mediaType][sendrecvType].framesReceived;
921
+ if (videoFramesReceivedDiff === 0) {
922
+ if (receiveSlot && sourceState === 'live') {
923
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No frames received for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total frames received on slot: "), result.framesReceived);
924
+ }
925
+ }
926
+ var videoFramesDecodedDiff = result.framesDecoded - this.statsResults[mediaType][sendrecvType].framesDecoded;
927
+ if (videoFramesDecodedDiff === 0) {
928
+ if (receiveSlot && sourceState === 'live') {
929
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No frames decoded for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total frames decoded on slot: "), result.framesDecoded);
930
+ }
931
+ }
932
+ var videoFramesDroppedDiff = result.framesDropped - this.statsResults[mediaType][sendrecvType].framesDropped;
933
+ if (videoFramesDroppedDiff > 10) {
934
+ if (receiveSlot && sourceState === 'live') {
935
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> Frames dropped for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total frames dropped on slot: "), result.framesDropped);
936
+ }
937
+ }
899
938
  }
900
939
 
901
- if (!this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp) {
902
- this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp = result.lastPacketReceivedTimestamp;
940
+ // Check the over all packet Lost ratio
941
+ this.statsResults[mediaType][sendrecvType].currentPacketLossRatio = currentPacketsLost > 0 ? currentPacketsLost / (packetsReceivedDiff + currentPacketsLost) : 0;
942
+ if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
943
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ".concat(idAndCsi), this.statsResults[mediaType][sendrecvType].currentPacketLossRatio);
903
944
  }
904
-
905
- var bytes = result.bytesReceived - this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived;
906
- this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;
907
- kilobytes = bytes / 1024;
908
- this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
909
- this.statsResults[mediaType].bytesReceived = kilobytes.toFixed(1);
910
- this.statsResults[mediaType][sendrecvType].pliCount = result.pliCount - this.statsResults.internal[mediaType][sendrecvType].pliCount;
911
- this.statsResults[mediaType][sendrecvType].currentPacketsLost = result.packetsLost - this.statsResults.internal[mediaType][sendrecvType].packetsLost;
912
-
913
- if (this.statsResults[mediaType][sendrecvType].currentPacketsLost < 0) {
914
- this.statsResults[mediaType][sendrecvType].currentPacketsLost = 0;
945
+ if (result.frameWidth && result.frameHeight) {
946
+ this.statsResults[mediaType][sendrecvType].width = result.frameWidth;
947
+ this.statsResults[mediaType][sendrecvType].height = result.frameHeight;
948
+ this.statsResults[mediaType][sendrecvType].framesReceived = result.framesReceived;
915
949
  }
916
950
 
917
- this.statsResults[mediaType][sendrecvType].packetsReceived = result.packetsReceived - this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived;
918
- this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
919
-
920
- if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {
921
- _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No packets received for ".concat(mediaType, " "), this.statsResults[mediaType][sendrecvType].packetsReceived);
922
- } // Check the over all packet Lost ratio
923
-
924
-
925
- 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;
926
-
927
- if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
928
- _loggerProxy.default.logger.info('StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver ', this.statsResults[mediaType][sendrecvType].currentPacketLossRatio);
929
- } // TODO: check the packet loss value is negative values here
930
-
951
+ // TODO: check the packet loss value is negative values here
931
952
 
932
953
  if (result.packetsLost) {
933
954
  this.statsResults[mediaType][sendrecvType].totalPacketsLost = result.packetsLost > 0 ? result.packetsLost : -result.packetsLost;
934
955
  } else {
935
956
  this.statsResults[mediaType][sendrecvType].totalPacketsLost = 0;
936
957
  }
958
+ this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp = result.lastPacketReceivedTimestamp;
937
959
 
938
- this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp = result.lastPacketReceivedTimestamp; // From Thin
939
-
960
+ // From Thin
940
961
  this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;
941
962
  this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;
942
963
  this.statsResults[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
943
964
  this.statsResults[mediaType][sendrecvType].keyFramesDecoded = result.keyFramesDecoded;
965
+ this.statsResults[mediaType][sendrecvType].framesDropped = result.framesDropped;
944
966
  this.statsResults[mediaType][sendrecvType].decoderImplementation = result.decoderImplementation;
945
967
  this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
946
968
  this.statsResults[mediaType][sendrecvType].fecPacketsDiscarded = result.fecPacketsDiscarded;
947
969
  this.statsResults[mediaType][sendrecvType].fecPacketsReceived = result.fecPacketsReceived;
948
970
  this.statsResults[mediaType][sendrecvType].totalBytesReceived = result.bytesReceived;
949
971
  this.statsResults[mediaType][sendrecvType].headerBytesReceived = result.headerBytesReceived;
950
- this.statsResults[mediaType][sendrecvType].meanRtpJitter.push(result.jitter); // Audio stats
972
+ this.statsResults[mediaType][sendrecvType].meanRtpJitter.push(result.jitter);
973
+
974
+ // Audio stats
951
975
 
952
976
  this.statsResults[mediaType][sendrecvType].audioLevel = result.audioLevel;
953
977
  this.statsResults[mediaType][sendrecvType].totalAudioEnergy = result.totalAudioEnergy;
@@ -956,60 +980,21 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
956
980
  this.statsResults[mediaType][sendrecvType].concealedSamples = result.concealedSamples || 0;
957
981
  }
958
982
  }
983
+
959
984
  /**
960
- * Processes remote and local candidate result and stores
985
+ * extracts the local Ip address from the statsResult object by looking at stats results candidates
986
+ * and matches that ID with the successful candidate pair. It looks at the type of local candidate it is
987
+ * and then extracts the IP address from the relatedAddress or address property based on conditions known in webrtc
988
+ * note, there are known incompatibilities and it is possible for this to set undefined, or for the IP address to be the public IP address
989
+ * for example, firefox does not set the relayProtocol, and if the user is behind a NAT it might be the public IP
961
990
  * @private
962
- * @param {*} result
963
- * @param {*} type
964
- * @param {boolean} isSender
965
- * @param {boolean} isRemote
966
- *
991
+ * @param {string} successfulCandidatePairId - The ID of the successful candidate pair.
992
+ * @param {Object} candidates - the stats result candidates
967
993
  * @returns {void}
968
994
  */
969
-
970
995
  }, {
971
- key: "processTrackResult",
996
+ key: "compareSentAndReceived",
972
997
  value:
973
- /**
974
- * Process Track results
975
- *
976
- * @private
977
- * @param {*} result
978
- * @param {*} mediaType
979
- * @returns {void}
980
- * @memberof StatsAnalyzer
981
- */
982
- function processTrackResult(result, mediaType) {
983
- if (!result || result.type !== 'track') {
984
- return;
985
- }
986
-
987
- if (result.type !== 'track') return;
988
- var sendrecvType = result.remoteSource === true ? _constants.STATS.RECEIVE_DIRECTION : _constants.STATS.SEND_DIRECTION;
989
-
990
- if (result.frameWidth && result.frameHeight) {
991
- this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
992
- this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
993
- this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
994
- this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
995
- }
996
-
997
- if (sendrecvType === _constants.STATS.RECEIVE_DIRECTION) {
998
- this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
999
- this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
1000
- this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;
1001
- }
1002
-
1003
- if (result.trackIdentifier && mediaType !== _constants.STATS.AUDIO_CORRELATE) {
1004
- this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier = result.trackIdentifier;
1005
- var jitterBufferDelay = result && result.jitterBufferDelay;
1006
- var jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;
1007
- this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay = jitterBufferEmittedCount && +jitterBufferDelay / +jitterBufferEmittedCount; // Used to calculate the jitter
1008
-
1009
- this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay = result.jitterBufferDelay;
1010
- this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount = result.jitterBufferEmittedCount;
1011
- }
1012
- }
1013
998
  /**
1014
999
  *
1015
1000
  * @private
@@ -1018,37 +1003,27 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
1018
1003
  * @returns {void}
1019
1004
  * @memberof StatsAnalyzer
1020
1005
  */
1021
-
1022
- }, {
1023
- key: "compareSentAndReceived",
1024
- value: function compareSentAndReceived(result, type) {
1025
- if (!type) {
1006
+ function compareSentAndReceived(result, type) {
1007
+ // Don't compare on transceivers without a sender.
1008
+ if (!type || !this.statsResults[type].send) {
1026
1009
  return;
1027
1010
  }
1028
-
1029
1011
  var mediaType = type;
1030
-
1031
- if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) {
1032
- this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
1033
- }
1034
-
1035
- var currentPacketLoss = result.packetsLost - this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver;
1036
- this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
1012
+ var currentPacketLoss = result.packetsLost - this.statsResults[mediaType].send.totalPacketsLostOnReceiver;
1037
1013
  this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;
1038
1014
  this.statsResults[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
1039
1015
  this.statsResults[mediaType].send.meanRemoteJitter.push(result.jitter);
1040
1016
  this.statsResults[mediaType].send.meanRoundTripTime.push(result.roundTripTime);
1041
1017
  this.statsResults[mediaType].send.timestamp = result.timestamp;
1042
1018
  this.statsResults[mediaType].send.ssrc = result.ssrc;
1043
- this.statsResults[mediaType].send.reportsReceived = result.reportsReceived; // Total packloss ratio on this video section of the call
1019
+ this.statsResults[mediaType].send.reportsReceived = result.reportsReceived;
1044
1020
 
1021
+ // Total packloss ratio on this video section of the call
1045
1022
  this.statsResults[mediaType].send.overAllPacketLossRatio = this.statsResults[mediaType].send.totalPacketsLostOnReceiver > 0 ? this.statsResults[mediaType].send.totalPacketsLostOnReceiver / this.statsResults[mediaType].send.totalPacketsSent : 0;
1046
1023
  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;
1047
-
1048
1024
  if (this.statsResults[mediaType].send.maxPacketLossRatio < this.statsResults[mediaType].send.currentPacketLossRatio) {
1049
1025
  this.statsResults[mediaType].send.maxPacketLossRatio = this.statsResults[mediaType].send.currentPacketLossRatio;
1050
1026
  }
1051
-
1052
1027
  if (result.type === 'remote-inbound-rtp') {
1053
1028
  this.networkQualityMonitor.determineUplinkNetworkQuality({
1054
1029
  mediaType: mediaType,
@@ -1060,6 +1035,5 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
1060
1035
  }]);
1061
1036
  return StatsAnalyzer;
1062
1037
  }(_eventsScope.default);
1063
-
1064
1038
  exports.StatsAnalyzer = StatsAnalyzer;
1065
1039
  //# sourceMappingURL=index.js.map