@webex/plugin-meetings 3.0.0-beta.42 → 3.0.0-beta.420

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