@webex/plugin-meetings 3.0.0-beta.39 → 3.0.0-beta.391

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 (393) 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 +671 -81
  13. package/dist/breakouts/index.js.map +1 -1
  14. package/dist/breakouts/utils.js +45 -1
  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 +5 -10
  29. package/dist/config.js.map +1 -1
  30. package/dist/constants.js +242 -33
  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 +110 -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 +4075 -2827
  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 +224 -136
  77. package/dist/meeting/muteState.js.map +1 -1
  78. package/dist/meeting/request.js +177 -152
  79. package/dist/meeting/request.js.map +1 -1
  80. package/dist/meeting/util.js +672 -417
  81. package/dist/meeting/util.js.map +1 -1
  82. package/dist/meeting-info/index.js +73 -7
  83. package/dist/meeting-info/index.js.map +1 -1
  84. package/dist/meeting-info/meeting-info-v2.js +192 -51
  85. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  86. package/dist/meeting-info/util.js +1 -1
  87. package/dist/meeting-info/util.js.map +1 -1
  88. package/dist/meeting-info/utilv2.js +36 -36
  89. package/dist/meeting-info/utilv2.js.map +1 -1
  90. package/dist/meetings/collection.js +39 -0
  91. package/dist/meetings/collection.js.map +1 -1
  92. package/dist/meetings/index.js +484 -119
  93. package/dist/meetings/index.js.map +1 -1
  94. package/dist/meetings/meetings.types.js +7 -0
  95. package/dist/meetings/meetings.types.js.map +1 -0
  96. package/dist/meetings/request.js +2 -0
  97. package/dist/meetings/request.js.map +1 -1
  98. package/dist/meetings/util.js +73 -7
  99. package/dist/meetings/util.js.map +1 -1
  100. package/dist/member/index.js +58 -0
  101. package/dist/member/index.js.map +1 -1
  102. package/dist/member/types.js +25 -0
  103. package/dist/member/types.js.map +1 -0
  104. package/dist/member/util.js +132 -25
  105. package/dist/member/util.js.map +1 -1
  106. package/dist/members/collection.js +10 -0
  107. package/dist/members/collection.js.map +1 -1
  108. package/dist/members/index.js +102 -6
  109. package/dist/members/index.js.map +1 -1
  110. package/dist/members/request.js +106 -38
  111. package/dist/members/request.js.map +1 -1
  112. package/dist/members/types.js +15 -0
  113. package/dist/members/types.js.map +1 -0
  114. package/dist/members/util.js +326 -232
  115. package/dist/members/util.js.map +1 -1
  116. package/dist/metrics/constants.js +18 -1
  117. package/dist/metrics/constants.js.map +1 -1
  118. package/dist/metrics/index.js +1 -446
  119. package/dist/metrics/index.js.map +1 -1
  120. package/dist/multistream/mediaRequestManager.js +223 -32
  121. package/dist/multistream/mediaRequestManager.js.map +1 -1
  122. package/dist/multistream/receiveSlot.js +10 -0
  123. package/dist/multistream/receiveSlot.js.map +1 -1
  124. package/dist/multistream/receiveSlotManager.js +39 -36
  125. package/dist/multistream/receiveSlotManager.js.map +1 -1
  126. package/dist/multistream/remoteMedia.js +3 -1
  127. package/dist/multistream/remoteMedia.js.map +1 -1
  128. package/dist/multistream/remoteMediaGroup.js +76 -5
  129. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  130. package/dist/multistream/remoteMediaManager.js +366 -104
  131. package/dist/multistream/remoteMediaManager.js.map +1 -1
  132. package/dist/multistream/sendSlotManager.js +255 -0
  133. package/dist/multistream/sendSlotManager.js.map +1 -0
  134. package/dist/reachability/clusterReachability.js +356 -0
  135. package/dist/reachability/clusterReachability.js.map +1 -0
  136. package/dist/reachability/index.js +263 -390
  137. package/dist/reachability/index.js.map +1 -1
  138. package/dist/reachability/request.js +6 -4
  139. package/dist/reachability/request.js.map +1 -1
  140. package/dist/reachability/util.js +29 -0
  141. package/dist/reachability/util.js.map +1 -0
  142. package/dist/reconnection-manager/index.js +266 -202
  143. package/dist/reconnection-manager/index.js.map +1 -1
  144. package/dist/recording-controller/index.js +21 -2
  145. package/dist/recording-controller/index.js.map +1 -1
  146. package/dist/recording-controller/util.js +9 -8
  147. package/dist/recording-controller/util.js.map +1 -1
  148. package/dist/roap/index.js +51 -28
  149. package/dist/roap/index.js.map +1 -1
  150. package/dist/roap/request.js +48 -64
  151. package/dist/roap/request.js.map +1 -1
  152. package/dist/roap/turnDiscovery.js +220 -70
  153. package/dist/roap/turnDiscovery.js.map +1 -1
  154. package/dist/rtcMetrics/constants.js +12 -0
  155. package/dist/rtcMetrics/constants.js.map +1 -0
  156. package/dist/rtcMetrics/index.js +179 -0
  157. package/dist/rtcMetrics/index.js.map +1 -0
  158. package/dist/statsAnalyzer/index.js +357 -295
  159. package/dist/statsAnalyzer/index.js.map +1 -1
  160. package/dist/statsAnalyzer/mqaUtil.js +296 -156
  161. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  162. package/dist/types/annotation/annotation.types.d.ts +42 -0
  163. package/dist/types/annotation/constants.d.ts +31 -0
  164. package/dist/types/annotation/index.d.ts +117 -0
  165. package/dist/types/breakouts/events.d.ts +8 -0
  166. package/dist/types/breakouts/utils.d.ts +14 -0
  167. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  168. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  169. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  170. package/dist/types/common/logs/request.d.ts +2 -0
  171. package/dist/types/common/queue.d.ts +9 -7
  172. package/dist/types/config.d.ts +2 -7
  173. package/dist/types/constants.d.ts +203 -31
  174. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  175. package/dist/types/controls-options-manager/index.d.ts +17 -1
  176. package/dist/types/controls-options-manager/types.d.ts +43 -0
  177. package/dist/types/controls-options-manager/util.d.ts +1 -7
  178. package/dist/types/index.d.ts +6 -5
  179. package/dist/types/interceptors/index.d.ts +2 -0
  180. package/dist/types/interceptors/locusRetry.d.ts +27 -0
  181. package/dist/types/interpretation/collection.d.ts +5 -0
  182. package/dist/types/interpretation/index.d.ts +5 -0
  183. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  184. package/dist/types/locus-info/index.d.ts +57 -4
  185. package/dist/types/locus-info/parser.d.ts +66 -6
  186. package/dist/types/media/index.d.ts +2 -0
  187. package/dist/types/media/properties.d.ts +34 -49
  188. package/dist/types/mediaQualityMetrics/config.d.ts +99 -223
  189. package/dist/types/meeting/in-meeting-actions.d.ts +86 -2
  190. package/dist/types/meeting/index.d.ts +567 -496
  191. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  192. package/dist/types/meeting/muteState.d.ts +93 -25
  193. package/dist/types/meeting/request.d.ts +64 -43
  194. package/dist/types/meeting/util.d.ts +117 -1
  195. package/dist/types/meeting-info/index.d.ts +13 -1
  196. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  197. package/dist/types/meetings/collection.d.ts +17 -0
  198. package/dist/types/meetings/index.d.ts +113 -21
  199. package/dist/types/meetings/meetings.types.d.ts +4 -0
  200. package/dist/types/member/index.d.ts +14 -0
  201. package/dist/types/member/types.d.ts +32 -0
  202. package/dist/types/members/collection.d.ts +5 -0
  203. package/dist/types/members/index.d.ts +35 -2
  204. package/dist/types/members/request.d.ts +73 -9
  205. package/dist/types/members/types.d.ts +25 -0
  206. package/dist/types/members/util.d.ts +214 -1
  207. package/dist/types/metrics/constants.d.ts +17 -0
  208. package/dist/types/metrics/index.d.ts +4 -111
  209. package/dist/types/multistream/mediaRequestManager.d.ts +72 -3
  210. package/dist/types/multistream/receiveSlot.d.ts +7 -3
  211. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  212. package/dist/types/multistream/remoteMedia.d.ts +3 -31
  213. package/dist/types/multistream/remoteMediaGroup.d.ts +2 -9
  214. package/dist/types/multistream/remoteMediaManager.d.ts +62 -2
  215. package/dist/types/multistream/sendSlotManager.d.ts +70 -0
  216. package/dist/types/reachability/clusterReachability.d.ts +109 -0
  217. package/dist/types/reachability/index.d.ts +60 -95
  218. package/dist/types/reachability/request.d.ts +3 -1
  219. package/dist/types/reachability/util.d.ts +8 -0
  220. package/dist/types/reconnection-manager/index.d.ts +19 -0
  221. package/dist/types/recording-controller/index.d.ts +15 -1
  222. package/dist/types/recording-controller/util.d.ts +5 -4
  223. package/dist/types/roap/index.d.ts +2 -1
  224. package/dist/types/roap/request.d.ts +9 -8
  225. package/dist/types/roap/turnDiscovery.d.ts +39 -5
  226. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  227. package/dist/types/rtcMetrics/index.d.ts +61 -0
  228. package/dist/types/statsAnalyzer/index.d.ts +34 -12
  229. package/dist/types/statsAnalyzer/mqaUtil.d.ts +28 -4
  230. package/dist/types/webinar/collection.d.ts +16 -0
  231. package/dist/types/webinar/index.d.ts +5 -0
  232. package/dist/webinar/collection.js +44 -0
  233. package/dist/webinar/collection.js.map +1 -0
  234. package/dist/webinar/index.js +69 -0
  235. package/dist/webinar/index.js.map +1 -0
  236. package/package.json +22 -19
  237. package/src/annotation/annotation.types.ts +50 -0
  238. package/src/annotation/constants.ts +36 -0
  239. package/src/annotation/index.ts +328 -0
  240. package/src/breakouts/README.md +35 -11
  241. package/src/breakouts/breakout.ts +67 -9
  242. package/src/breakouts/events.ts +56 -0
  243. package/src/breakouts/index.ts +558 -59
  244. package/src/breakouts/utils.ts +42 -0
  245. package/src/common/errors/no-meeting-info.ts +24 -0
  246. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  247. package/src/common/errors/webex-errors.ts +44 -2
  248. package/src/common/logs/logger-proxy.ts +1 -1
  249. package/src/common/logs/request.ts +5 -1
  250. package/src/common/queue.ts +22 -8
  251. package/src/config.ts +4 -9
  252. package/src/constants.ts +229 -21
  253. package/src/controls-options-manager/enums.ts +12 -0
  254. package/src/controls-options-manager/index.ts +116 -21
  255. package/src/controls-options-manager/types.ts +59 -0
  256. package/src/controls-options-manager/util.ts +294 -14
  257. package/src/index.ts +44 -0
  258. package/src/interceptors/index.ts +3 -0
  259. package/src/interceptors/locusRetry.ts +67 -0
  260. package/src/interpretation/README.md +60 -0
  261. package/src/interpretation/collection.ts +19 -0
  262. package/src/interpretation/index.ts +349 -0
  263. package/src/interpretation/siLanguage.ts +18 -0
  264. package/src/locus-info/controlsUtils.ts +108 -0
  265. package/src/locus-info/index.ts +417 -59
  266. package/src/locus-info/infoUtils.ts +10 -2
  267. package/src/locus-info/mediaSharesUtils.ts +80 -0
  268. package/src/locus-info/parser.ts +258 -47
  269. package/src/locus-info/selfUtils.ts +81 -5
  270. package/src/media/index.ts +100 -108
  271. package/src/media/properties.ts +88 -117
  272. package/src/mediaQualityMetrics/config.ts +103 -238
  273. package/src/meeting/in-meeting-actions.ts +171 -3
  274. package/src/meeting/index.ts +3411 -2435
  275. package/src/meeting/locusMediaRequest.ts +313 -0
  276. package/src/meeting/muteState.ts +223 -136
  277. package/src/meeting/request.ts +155 -120
  278. package/src/meeting/util.ts +685 -395
  279. package/src/meeting-info/index.ts +81 -8
  280. package/src/meeting-info/meeting-info-v2.ts +170 -14
  281. package/src/meeting-info/util.ts +1 -1
  282. package/src/meeting-info/utilv2.ts +23 -23
  283. package/src/meetings/collection.ts +33 -0
  284. package/src/meetings/index.ts +507 -127
  285. package/src/meetings/meetings.types.ts +12 -0
  286. package/src/meetings/request.ts +2 -0
  287. package/src/meetings/util.ts +81 -12
  288. package/src/member/index.ts +58 -0
  289. package/src/member/types.ts +38 -0
  290. package/src/member/util.ts +141 -25
  291. package/src/members/collection.ts +8 -0
  292. package/src/members/index.ts +134 -8
  293. package/src/members/request.ts +97 -17
  294. package/src/members/types.ts +29 -0
  295. package/src/members/util.ts +333 -240
  296. package/src/metrics/constants.ts +17 -0
  297. package/src/metrics/index.ts +1 -469
  298. package/src/multistream/mediaRequestManager.ts +271 -56
  299. package/src/multistream/receiveSlot.ts +11 -4
  300. package/src/multistream/receiveSlotManager.ts +34 -24
  301. package/src/multistream/remoteMedia.ts +5 -3
  302. package/src/multistream/remoteMediaGroup.ts +78 -0
  303. package/src/multistream/remoteMediaManager.ts +248 -44
  304. package/src/multistream/sendSlotManager.ts +199 -0
  305. package/src/reachability/clusterReachability.ts +320 -0
  306. package/src/reachability/index.ts +229 -346
  307. package/src/reachability/request.ts +8 -4
  308. package/src/reachability/util.ts +24 -0
  309. package/src/reconnection-manager/index.ts +128 -97
  310. package/src/recording-controller/index.ts +20 -3
  311. package/src/recording-controller/util.ts +26 -9
  312. package/src/roap/index.ts +52 -23
  313. package/src/roap/request.ts +48 -67
  314. package/src/roap/turnDiscovery.ts +147 -49
  315. package/src/rtcMetrics/constants.ts +3 -0
  316. package/src/rtcMetrics/index.ts +166 -0
  317. package/src/statsAnalyzer/index.ts +457 -416
  318. package/src/statsAnalyzer/mqaUtil.ts +317 -170
  319. package/src/webinar/collection.ts +31 -0
  320. package/src/webinar/index.ts +62 -0
  321. package/test/integration/spec/converged-space-meetings.js +60 -3
  322. package/test/integration/spec/journey.js +320 -261
  323. package/test/integration/spec/space-meeting.js +76 -3
  324. package/test/unit/spec/annotation/index.ts +418 -0
  325. package/test/unit/spec/breakouts/breakout.ts +118 -28
  326. package/test/unit/spec/breakouts/events.ts +89 -0
  327. package/test/unit/spec/breakouts/index.ts +1349 -114
  328. package/test/unit/spec/breakouts/utils.js +52 -1
  329. package/test/unit/spec/common/queue.js +31 -2
  330. package/test/unit/spec/controls-options-manager/index.js +163 -0
  331. package/test/unit/spec/controls-options-manager/util.js +576 -60
  332. package/test/unit/spec/fixture/locus.js +1 -0
  333. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  334. package/test/unit/spec/interpretation/collection.ts +15 -0
  335. package/test/unit/spec/interpretation/index.ts +625 -0
  336. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  337. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  338. package/test/unit/spec/locus-info/index.js +1363 -37
  339. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  340. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  341. package/test/unit/spec/locus-info/mediaSharesUtils.ts +41 -0
  342. package/test/unit/spec/locus-info/parser.js +116 -35
  343. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  344. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  345. package/test/unit/spec/media/index.ts +173 -81
  346. package/test/unit/spec/media/properties.ts +2 -2
  347. package/test/unit/spec/meeting/in-meeting-actions.ts +85 -3
  348. package/test/unit/spec/meeting/index.js +6821 -2172
  349. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  350. package/test/unit/spec/meeting/muteState.js +402 -212
  351. package/test/unit/spec/meeting/request.js +473 -54
  352. package/test/unit/spec/meeting/utils.js +773 -67
  353. package/test/unit/spec/meeting-info/index.js +300 -0
  354. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  355. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  356. package/test/unit/spec/meetings/collection.js +26 -0
  357. package/test/unit/spec/meetings/index.js +1415 -213
  358. package/test/unit/spec/meetings/utils.js +229 -2
  359. package/test/unit/spec/member/index.js +61 -6
  360. package/test/unit/spec/member/util.js +510 -34
  361. package/test/unit/spec/members/index.js +432 -1
  362. package/test/unit/spec/members/request.js +206 -27
  363. package/test/unit/spec/members/utils.js +210 -0
  364. package/test/unit/spec/metrics/index.js +1 -50
  365. package/test/unit/spec/multistream/mediaRequestManager.ts +781 -114
  366. package/test/unit/spec/multistream/receiveSlot.ts +9 -1
  367. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  368. package/test/unit/spec/multistream/remoteMedia.ts +2 -0
  369. package/test/unit/spec/multistream/remoteMediaGroup.ts +345 -0
  370. package/test/unit/spec/multistream/remoteMediaManager.ts +525 -0
  371. package/test/unit/spec/multistream/sendSlotManager.ts +274 -0
  372. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  373. package/test/unit/spec/reachability/index.ts +551 -14
  374. package/test/unit/spec/reachability/request.js +3 -1
  375. package/test/unit/spec/reachability/util.ts +40 -0
  376. package/test/unit/spec/reconnection-manager/index.js +171 -11
  377. package/test/unit/spec/recording-controller/index.js +294 -218
  378. package/test/unit/spec/recording-controller/util.js +223 -96
  379. package/test/unit/spec/roap/index.ts +180 -83
  380. package/test/unit/spec/roap/request.ts +100 -62
  381. package/test/unit/spec/roap/turnDiscovery.ts +388 -96
  382. package/test/unit/spec/rtcMetrics/index.ts +122 -0
  383. package/test/unit/spec/stats-analyzer/index.js +1252 -12
  384. package/test/unit/spec/webinar/collection.ts +13 -0
  385. package/test/unit/spec/webinar/index.ts +60 -0
  386. package/test/utils/integrationTestUtils.js +46 -0
  387. package/test/utils/testUtils.js +0 -57
  388. package/test/utils/webex-test-users.js +12 -4
  389. package/dist/metrics/config.js +0 -289
  390. package/dist/metrics/config.js.map +0 -1
  391. package/dist/types/metrics/config.d.ts +0 -169
  392. package/src/index.js +0 -18
  393. 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,186 @@ 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
236
279
  (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,
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
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,
241
403
  statsResults: _this3.statsResults,
242
404
  lastMqaDataSent: _this3.lastMqaDataSent,
243
405
  mediaType: mediaType
244
406
  });
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,
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,
250
413
  statsResults: _this3.statsResults,
251
414
  lastMqaDataSent: _this3.lastMqaDataSent,
252
415
  mediaType: mediaType
253
416
  });
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,
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,
259
423
  statsResults: _this3.statsResults,
260
424
  lastMqaDataSent: _this3.lastMqaDataSent,
261
425
  mediaType: mediaType
262
426
  });
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,
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,
268
433
  statsResults: _this3.statsResults,
269
434
  lastMqaDataSent: _this3.lastMqaDataSent,
270
435
  mediaType: mediaType
271
436
  });
272
- newMqa.videoReceive.push(videoReceiver);
437
+ newMqa.videoReceive[1].streams.push(_videoReceiverStream);
438
+ _this3.lastMqaDataSent[mediaType].recv = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].recv);
273
439
  }
274
440
  });
275
- newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress[0];
441
+ newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;
276
442
 
277
443
  // Adding peripheral information
278
- newMqa.intervalMetadata.peripherals = [];
279
444
  newMqa.intervalMetadata.peripherals.push({
280
445
  information: _constants._UNKNOWN_,
281
446
  name: _constants.MEDIA_DEVICES.SPEAKER
282
447
  });
283
448
  if (this.statsResults['audio-send']) {
284
- var _this$statsResults$au;
285
449
  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,
450
+ information: this.statsResults['audio-send'].trackLabel || _constants._UNKNOWN_,
287
451
  name: _constants.MEDIA_DEVICES.MICROPHONE
288
452
  });
289
453
  }
290
454
  if (this.statsResults['video-send']) {
291
- var _this$statsResults$vi;
292
455
  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,
456
+ information: this.statsResults['video-send'].trackLabel || _constants._UNKNOWN_,
294
457
  name: _constants.MEDIA_DEVICES.CAMERA
295
458
  });
296
459
  }
@@ -322,6 +485,18 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
322
485
  this.mediaConnection = mediaConnection;
323
486
  }
324
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
+
325
500
  /**
326
501
  * Starts the stats analyzer on interval
327
502
  *
@@ -345,7 +520,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
345
520
  _this4.sendMqaData();
346
521
  _this4.mqaInterval = setInterval(function () {
347
522
  _this4.sendMqaData();
348
- }, _constants.MQA_INTEVAL);
523
+ }, _constants.MQA_INTERVAL);
349
524
  });
350
525
  }
351
526
  return _promise.default.resolve();
@@ -377,7 +552,6 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
377
552
  _this5.mediaConnection = null;
378
553
  });
379
554
  }
380
- this.mediaConnection = null;
381
555
  return _promise.default.resolve();
382
556
  }
383
557
 
@@ -407,22 +581,6 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
407
581
  } else if (!isSender && !this.statsResults[type].recv) {
408
582
  this.statsResults[type].recv = (0, _cloneDeep2.default)(emptyReceiver);
409
583
  }
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
584
  switch (getStatsResult.type) {
427
585
  case 'outbound-rtp':
428
586
  this.processOutboundRTPResult(getStatsResult, type);
@@ -430,13 +588,9 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
430
588
  case 'inbound-rtp':
431
589
  this.processInboundRTPResult(getStatsResult, type);
432
590
  break;
433
- case 'track':
434
- this.processTrackResult(getStatsResult, type);
435
- break;
436
591
  case 'remote-inbound-rtp':
437
592
  case 'remote-outbound-rtp':
438
- // @ts-ignore
439
- this.compareSentAndReceived(getStatsResult, type, isSender);
593
+ this.compareSentAndReceived(getStatsResult, type);
440
594
  break;
441
595
  case 'remotecandidate':
442
596
  case 'remote-candidate':
@@ -446,7 +600,6 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
446
600
  this.parseCandidate(getStatsResult, type, isSender, false);
447
601
  break;
448
602
  case 'media-source':
449
- // @ts-ignore
450
603
  this.parseAudioSource(getStatsResult, type);
451
604
  break;
452
605
  default:
@@ -467,15 +620,26 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
467
620
  value: function filterAndParseGetStatsResults(statsItem, type, isSender) {
468
621
  var _this6 = this;
469
622
  var types = _constants.DEFAULT_GET_STATS_FILTER.types;
623
+
624
+ // get the successful candidate pair before parsing stats.
625
+ statsItem.report.forEach(function (report) {
626
+ if (report.type === 'candidate-pair' && report.state === 'succeeded') {
627
+ _this6.successfulCandidatePair = report;
628
+ }
629
+ });
470
630
  statsItem.report.forEach(function (result) {
471
631
  if (types.includes(result.type)) {
472
632
  _this6.parseGetStatsResult(result, type, isSender);
473
633
  }
474
634
  });
475
635
  if (this.statsResults[type]) {
636
+ var _this$successfulCandi2, _this$statsResults;
476
637
  this.statsResults[type].direction = statsItem.currentDirection;
477
638
  this.statsResults[type].trackLabel = statsItem.localTrackLabel;
478
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 = {};
479
643
  }
480
644
  }
481
645
 
@@ -540,138 +704,77 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
540
704
  return prev + (((_this7$lastStatsResul = _this7.lastStatsResults[cur]) === null || _this7$lastStatsResul === void 0 ? void 0 : _this7$lastStatsResul.recv[value]) || 0);
541
705
  }, 0);
542
706
  };
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);
549
- }, 0);
550
- };
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']) {
707
+
708
+ // Audio Transmit
709
+ if (this.lastStatsResults['audio-send']) {
560
710
  // compare audio stats sent
561
711
  // NOTE: relies on there being only one sender.
562
712
  var currentStats = this.statsResults['audio-send'].send;
563
713
  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");
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);
566
716
  } else {
567
- if (currentStats.totalAudioEnergy === previousStats.totalAudioEnergy || currentStats.totalAudioEnergy === 0) {
568
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio 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);
569
719
  }
570
- if (currentStats.audioLevel === 0) {
720
+ if (this.meetingMediaStatus.expected.sendAudio && currentStats.audioLevel === 0) {
571
721
  _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> audio level is 0 for the user");
572
722
  }
573
723
  }
574
724
  this.emitStartStopEvents('audio', previousStats.totalPacketsSent, currentStats.totalPacketsSent, true);
575
725
  }
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']) {
726
+
727
+ // Audio Receive
728
+ var currentAudioPacketsReceived = getCurrentStatsTotals('audio-recv', 'totalPacketsReceived');
729
+ var previousAudioPacketsReceived = getPreviousStatsTotals('audio-recv', 'totalPacketsReceived');
730
+ this.emitStartStopEvents('audio', previousAudioPacketsReceived, currentAudioPacketsReceived, false);
731
+
732
+ // Video Transmit
733
+ if (this.lastStatsResults['video-send']) {
590
734
  // compare video stats sent
591
735
  var _currentStats = this.statsResults['video-send'].send;
592
736
  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");
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);
595
739
  } else {
596
- if (_currentStats.framesEncoded === _previousStats.framesEncoded || _currentStats.framesEncoded === 0) {
597
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded");
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);
598
742
  }
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");
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);
601
745
  }
602
746
  }
603
747
  this.emitStartStopEvents('video', _previousStats.framesSent, _currentStats.framesSent, true);
604
748
  }
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");
617
- } 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");
623
- }
624
- if (currentFramesDropped - previousFramesDropped > 10) {
625
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped");
626
- }
627
- }
628
- this.emitStartStopEvents('video', previousFramesDecoded, currentFramesDecoded, false);
629
- }
630
- if (this.meetingMediaStatus.expected.sendShare && this.lastStatsResults['video-share-send']) {
749
+
750
+ // Video Receive
751
+ var currentVideoFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');
752
+ var previousVideoFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');
753
+ this.emitStartStopEvents('video', previousVideoFramesDecoded, currentVideoFramesDecoded, false);
754
+
755
+ // Share Transmit
756
+ if (this.lastStatsResults['video-share-send']) {
631
757
  // compare share stats sent
632
758
 
633
759
  var _currentStats2 = this.statsResults['video-share-send'].send;
634
760
  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");
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);
637
763
  } else {
638
- if (_currentStats2.framesEncoded === _previousStats2.framesEncoded || _currentStats2.framesEncoded === 0) {
639
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded");
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);
640
766
  }
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");
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);
643
769
  }
644
770
  }
771
+ this.emitStartStopEvents('share', _previousStats2.framesSent, _currentStats2.framesSent, true);
645
772
  }
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
773
 
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
- }
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);
675
778
  }
676
779
  }
677
780
 
@@ -753,28 +856,16 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
753
856
  var sendrecvType = _constants.STATS.SEND_DIRECTION;
754
857
  if (result.bytesSent) {
755
858
  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;
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;
761
864
  }
762
- if (!this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded) {
763
- this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;
764
- }
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
865
  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;
866
+ this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
867
+ this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;
868
+ this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent;
778
869
 
779
870
  // Data saved to send MQA metrics
780
871
 
@@ -808,41 +899,53 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
808
899
  var sendrecvType = _constants.STATS.RECEIVE_DIRECTION;
809
900
  if (result.bytesReceived) {
810
901
  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;
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;
828
906
  kilobytes = bytes / 1024;
829
907
  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;
908
+ var currentPacketsLost = result.packetsLost - this.statsResults[mediaType][sendrecvType].totalPacketsLost;
909
+ if (currentPacketsLost < 0) {
910
+ currentPacketsLost = 0;
835
911
  }
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);
912
+ var packetsReceivedDiff = result.packetsReceived - this.statsResults[mediaType][sendrecvType].totalPacketsReceived;
913
+ this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
914
+ if (packetsReceivedDiff === 0) {
915
+ if (receiveSlot && sourceState === 'live') {
916
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No packets received for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total packets received on slot: "), result.packetsReceived);
917
+ }
918
+ }
919
+ if (mediaType.startsWith('video') || mediaType.startsWith('share')) {
920
+ var videoFramesReceivedDiff = result.framesReceived - this.statsResults[mediaType][sendrecvType].framesReceived;
921
+ if (videoFramesReceivedDiff === 0) {
922
+ if (receiveSlot && sourceState === 'live') {
923
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No frames received for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total frames received on slot: "), result.framesReceived);
924
+ }
925
+ }
926
+ var videoFramesDecodedDiff = result.framesDecoded - this.statsResults[mediaType][sendrecvType].framesDecoded;
927
+ if (videoFramesDecodedDiff === 0) {
928
+ if (receiveSlot && sourceState === 'live') {
929
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No frames decoded for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total frames decoded on slot: "), result.framesDecoded);
930
+ }
931
+ }
932
+ var videoFramesDroppedDiff = result.framesDropped - this.statsResults[mediaType][sendrecvType].framesDropped;
933
+ if (videoFramesDroppedDiff > 10) {
934
+ if (receiveSlot && sourceState === 'live') {
935
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> Frames dropped for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total frames dropped on slot: "), result.framesDropped);
936
+ }
937
+ }
840
938
  }
841
939
 
842
940
  // 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;
941
+ this.statsResults[mediaType][sendrecvType].currentPacketLossRatio = currentPacketsLost > 0 ? currentPacketsLost / (packetsReceivedDiff + currentPacketsLost) : 0;
844
942
  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);
943
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ".concat(idAndCsi), this.statsResults[mediaType][sendrecvType].currentPacketLossRatio);
944
+ }
945
+ if (result.frameWidth && result.frameHeight) {
946
+ this.statsResults[mediaType][sendrecvType].width = result.frameWidth;
947
+ this.statsResults[mediaType][sendrecvType].height = result.frameHeight;
948
+ this.statsResults[mediaType][sendrecvType].framesReceived = result.framesReceived;
846
949
  }
847
950
 
848
951
  // TODO: check the packet loss value is negative values here
@@ -859,6 +962,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
859
962
  this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;
860
963
  this.statsResults[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
861
964
  this.statsResults[mediaType][sendrecvType].keyFramesDecoded = result.keyFramesDecoded;
965
+ this.statsResults[mediaType][sendrecvType].framesDropped = result.framesDropped;
862
966
  this.statsResults[mediaType][sendrecvType].decoderImplementation = result.decoderImplementation;
863
967
  this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
864
968
  this.statsResults[mediaType][sendrecvType].fecPacketsDiscarded = result.fecPacketsDiscarded;
@@ -878,55 +982,19 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
878
982
  }
879
983
 
880
984
  /**
881
- * 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
882
990
  * @private
883
- * @param {*} result
884
- * @param {*} type
885
- * @param {boolean} isSender
886
- * @param {boolean} isRemote
887
- *
991
+ * @param {string} successfulCandidatePairId - The ID of the successful candidate pair.
992
+ * @param {Object} candidates - the stats result candidates
888
993
  * @returns {void}
889
994
  */
890
995
  }, {
891
- key: "processTrackResult",
996
+ key: "compareSentAndReceived",
892
997
  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
998
  /**
931
999
  *
932
1000
  * @private
@@ -935,19 +1003,13 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
935
1003
  * @returns {void}
936
1004
  * @memberof StatsAnalyzer
937
1005
  */
938
- }, {
939
- key: "compareSentAndReceived",
940
- value: function compareSentAndReceived(result, type) {
1006
+ function compareSentAndReceived(result, type) {
941
1007
  // Don't compare on transceivers without a sender.
942
- if (!type || !this.statsResults.internal[type].send) {
1008
+ if (!type || !this.statsResults[type].send) {
943
1009
  return;
944
1010
  }
945
1011
  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;
1012
+ var currentPacketLoss = result.packetsLost - this.statsResults[mediaType].send.totalPacketsLostOnReceiver;
951
1013
  this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;
952
1014
  this.statsResults[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
953
1015
  this.statsResults[mediaType].send.meanRemoteJitter.push(result.jitter);