@webex/plugin-meetings 3.0.0-beta.31 → 3.0.0-beta.310

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 (378) hide show
  1. package/README.md +46 -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/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +709 -35
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/utils.js +45 -1
  17. package/dist/breakouts/utils.js.map +1 -1
  18. package/dist/common/errors/no-meeting-info.js +51 -0
  19. package/dist/common/errors/no-meeting-info.js.map +1 -0
  20. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  21. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +48 -7
  23. package/dist/common/errors/webex-errors.js.map +1 -1
  24. package/dist/common/logs/logger-proxy.js +1 -1
  25. package/dist/common/logs/logger-proxy.js.map +1 -1
  26. package/dist/common/logs/request.js +5 -1
  27. package/dist/common/logs/request.js.map +1 -1
  28. package/dist/common/queue.js +24 -9
  29. package/dist/common/queue.js.map +1 -1
  30. package/dist/config.js +5 -11
  31. package/dist/config.js.map +1 -1
  32. package/dist/constants.js +233 -29
  33. package/dist/constants.js.map +1 -1
  34. package/dist/controls-options-manager/enums.js +14 -2
  35. package/dist/controls-options-manager/enums.js.map +1 -1
  36. package/dist/controls-options-manager/index.js +109 -15
  37. package/dist/controls-options-manager/index.js.map +1 -1
  38. package/dist/controls-options-manager/types.js +7 -0
  39. package/dist/controls-options-manager/types.js.map +1 -0
  40. package/dist/controls-options-manager/util.js +309 -18
  41. package/dist/controls-options-manager/util.js.map +1 -1
  42. package/dist/index.js +112 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/interpretation/collection.js +23 -0
  45. package/dist/interpretation/collection.js.map +1 -0
  46. package/dist/interpretation/index.js +366 -0
  47. package/dist/interpretation/index.js.map +1 -0
  48. package/dist/interpretation/siLanguage.js +25 -0
  49. package/dist/interpretation/siLanguage.js.map +1 -0
  50. package/dist/locus-info/controlsUtils.js +91 -2
  51. package/dist/locus-info/controlsUtils.js.map +1 -1
  52. package/dist/locus-info/index.js +383 -62
  53. package/dist/locus-info/index.js.map +1 -1
  54. package/dist/locus-info/infoUtils.js +7 -1
  55. package/dist/locus-info/infoUtils.js.map +1 -1
  56. package/dist/locus-info/mediaSharesUtils.js +57 -1
  57. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  58. package/dist/locus-info/parser.js +249 -72
  59. package/dist/locus-info/parser.js.map +1 -1
  60. package/dist/locus-info/selfUtils.js +89 -14
  61. package/dist/locus-info/selfUtils.js.map +1 -1
  62. package/dist/media/index.js +61 -116
  63. package/dist/media/index.js.map +1 -1
  64. package/dist/media/properties.js +73 -124
  65. package/dist/media/properties.js.map +1 -1
  66. package/dist/meeting/in-meeting-actions.js +82 -2
  67. package/dist/meeting/in-meeting-actions.js.map +1 -1
  68. package/dist/meeting/index.js +3777 -2929
  69. package/dist/meeting/index.js.map +1 -1
  70. package/dist/meeting/locusMediaRequest.js +292 -0
  71. package/dist/meeting/locusMediaRequest.js.map +1 -0
  72. package/dist/meeting/muteState.js +230 -124
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +260 -196
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +601 -417
  77. package/dist/meeting/util.js.map +1 -1
  78. package/dist/meeting-info/index.js +73 -7
  79. package/dist/meeting-info/index.js.map +1 -1
  80. package/dist/meeting-info/meeting-info-v2.js +192 -51
  81. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  82. package/dist/meeting-info/util.js +1 -1
  83. package/dist/meeting-info/util.js.map +1 -1
  84. package/dist/meeting-info/utilv2.js +36 -36
  85. package/dist/meeting-info/utilv2.js.map +1 -1
  86. package/dist/meetings/collection.js +39 -0
  87. package/dist/meetings/collection.js.map +1 -1
  88. package/dist/meetings/index.js +415 -115
  89. package/dist/meetings/index.js.map +1 -1
  90. package/dist/meetings/meetings.types.js +7 -0
  91. package/dist/meetings/meetings.types.js.map +1 -0
  92. package/dist/meetings/request.js +2 -0
  93. package/dist/meetings/request.js.map +1 -1
  94. package/dist/meetings/util.js +72 -6
  95. package/dist/meetings/util.js.map +1 -1
  96. package/dist/member/index.js +58 -0
  97. package/dist/member/index.js.map +1 -1
  98. package/dist/member/types.js +25 -0
  99. package/dist/member/types.js.map +1 -0
  100. package/dist/member/util.js +132 -25
  101. package/dist/member/util.js.map +1 -1
  102. package/dist/members/collection.js +10 -0
  103. package/dist/members/collection.js.map +1 -1
  104. package/dist/members/index.js +102 -6
  105. package/dist/members/index.js.map +1 -1
  106. package/dist/members/request.js +106 -38
  107. package/dist/members/request.js.map +1 -1
  108. package/dist/members/types.js +15 -0
  109. package/dist/members/types.js.map +1 -0
  110. package/dist/members/util.js +326 -232
  111. package/dist/members/util.js.map +1 -1
  112. package/dist/metrics/constants.js +13 -5
  113. package/dist/metrics/constants.js.map +1 -1
  114. package/dist/metrics/index.js +1 -468
  115. package/dist/metrics/index.js.map +1 -1
  116. package/dist/multistream/mediaRequestManager.js +238 -49
  117. package/dist/multistream/mediaRequestManager.js.map +1 -1
  118. package/dist/multistream/receiveSlot.js +29 -16
  119. package/dist/multistream/receiveSlot.js.map +1 -1
  120. package/dist/multistream/receiveSlotManager.js +39 -36
  121. package/dist/multistream/receiveSlotManager.js.map +1 -1
  122. package/dist/multistream/remoteMedia.js +44 -18
  123. package/dist/multistream/remoteMedia.js.map +1 -1
  124. package/dist/multistream/remoteMediaGroup.js +60 -3
  125. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  126. package/dist/multistream/remoteMediaManager.js +209 -59
  127. package/dist/multistream/remoteMediaManager.js.map +1 -1
  128. package/dist/multistream/sendSlotManager.js +233 -0
  129. package/dist/multistream/sendSlotManager.js.map +1 -0
  130. package/dist/reachability/index.js +225 -59
  131. package/dist/reachability/index.js.map +1 -1
  132. package/dist/reachability/request.js +17 -8
  133. package/dist/reachability/request.js.map +1 -1
  134. package/dist/reconnection-manager/index.js +201 -156
  135. package/dist/reconnection-manager/index.js.map +1 -1
  136. package/dist/recording-controller/index.js +21 -2
  137. package/dist/recording-controller/index.js.map +1 -1
  138. package/dist/recording-controller/util.js +9 -8
  139. package/dist/recording-controller/util.js.map +1 -1
  140. package/dist/roap/index.js +62 -32
  141. package/dist/roap/index.js.map +1 -1
  142. package/dist/roap/request.js +112 -97
  143. package/dist/roap/request.js.map +1 -1
  144. package/dist/roap/turnDiscovery.js +95 -36
  145. package/dist/roap/turnDiscovery.js.map +1 -1
  146. package/dist/rtcMetrics/constants.js +12 -0
  147. package/dist/rtcMetrics/constants.js.map +1 -0
  148. package/dist/rtcMetrics/index.js +117 -0
  149. package/dist/rtcMetrics/index.js.map +1 -0
  150. package/dist/statsAnalyzer/index.js +86 -78
  151. package/dist/statsAnalyzer/index.js.map +1 -1
  152. package/dist/statsAnalyzer/mqaUtil.js +11 -10
  153. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  154. package/dist/types/annotation/annotation.types.d.ts +42 -0
  155. package/dist/types/annotation/constants.d.ts +31 -0
  156. package/dist/types/annotation/index.d.ts +117 -0
  157. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  158. package/dist/types/breakouts/events.d.ts +8 -0
  159. package/dist/types/breakouts/utils.d.ts +14 -0
  160. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  161. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  162. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  163. package/dist/types/common/logs/request.d.ts +2 -0
  164. package/dist/types/common/queue.d.ts +9 -7
  165. package/dist/types/config.d.ts +1 -7
  166. package/dist/types/constants.d.ts +194 -24
  167. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  168. package/dist/types/controls-options-manager/index.d.ts +17 -1
  169. package/dist/types/controls-options-manager/types.d.ts +43 -0
  170. package/dist/types/controls-options-manager/util.d.ts +1 -7
  171. package/dist/types/index.d.ts +6 -4
  172. package/dist/types/interpretation/collection.d.ts +5 -0
  173. package/dist/types/interpretation/index.d.ts +5 -0
  174. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  175. package/dist/types/locus-info/index.d.ts +57 -4
  176. package/dist/types/locus-info/parser.d.ts +67 -6
  177. package/dist/types/media/index.d.ts +2 -0
  178. package/dist/types/media/properties.d.ts +34 -48
  179. package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
  180. package/dist/types/meeting/index.d.ts +463 -510
  181. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  182. package/dist/types/meeting/muteState.d.ts +99 -23
  183. package/dist/types/meeting/request.d.ts +72 -43
  184. package/dist/types/meeting/util.d.ts +101 -1
  185. package/dist/types/meeting-info/index.d.ts +13 -1
  186. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  187. package/dist/types/meetings/collection.d.ts +17 -0
  188. package/dist/types/meetings/index.d.ts +98 -20
  189. package/dist/types/meetings/meetings.types.d.ts +4 -0
  190. package/dist/types/member/index.d.ts +14 -0
  191. package/dist/types/member/types.d.ts +32 -0
  192. package/dist/types/members/collection.d.ts +5 -0
  193. package/dist/types/members/index.d.ts +35 -2
  194. package/dist/types/members/request.d.ts +73 -9
  195. package/dist/types/members/types.d.ts +25 -0
  196. package/dist/types/members/util.d.ts +214 -1
  197. package/dist/types/metrics/constants.d.ts +12 -4
  198. package/dist/types/metrics/index.d.ts +4 -119
  199. package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
  200. package/dist/types/multistream/receiveSlot.d.ts +13 -11
  201. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  202. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  203. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  204. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  205. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  206. package/dist/types/reachability/index.d.ts +61 -7
  207. package/dist/types/reachability/request.d.ts +7 -3
  208. package/dist/types/reconnection-manager/index.d.ts +9 -0
  209. package/dist/types/recording-controller/index.d.ts +15 -1
  210. package/dist/types/recording-controller/util.d.ts +5 -4
  211. package/dist/types/roap/index.d.ts +2 -1
  212. package/dist/types/roap/request.d.ts +15 -11
  213. package/dist/types/roap/turnDiscovery.d.ts +21 -3
  214. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  215. package/dist/types/rtcMetrics/index.d.ts +47 -0
  216. package/dist/types/statsAnalyzer/index.d.ts +7 -1
  217. package/dist/types/webinar/collection.d.ts +16 -0
  218. package/dist/types/webinar/index.d.ts +5 -0
  219. package/dist/webinar/collection.js +44 -0
  220. package/dist/webinar/collection.js.map +1 -0
  221. package/dist/webinar/index.js +69 -0
  222. package/dist/webinar/index.js.map +1 -0
  223. package/package.json +23 -20
  224. package/src/annotation/annotation.types.ts +50 -0
  225. package/src/annotation/constants.ts +36 -0
  226. package/src/annotation/index.ts +328 -0
  227. package/src/breakouts/README.md +42 -12
  228. package/src/breakouts/breakout.ts +67 -9
  229. package/src/breakouts/edit-lock-error.ts +25 -0
  230. package/src/breakouts/events.ts +56 -0
  231. package/src/breakouts/index.ts +592 -20
  232. package/src/breakouts/utils.ts +42 -0
  233. package/src/common/errors/no-meeting-info.ts +24 -0
  234. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  235. package/src/common/errors/webex-errors.ts +44 -2
  236. package/src/common/logs/logger-proxy.ts +1 -1
  237. package/src/common/logs/request.ts +5 -1
  238. package/src/common/queue.ts +22 -8
  239. package/src/config.ts +4 -10
  240. package/src/constants.ts +221 -19
  241. package/src/controls-options-manager/enums.ts +12 -0
  242. package/src/controls-options-manager/index.ts +116 -21
  243. package/src/controls-options-manager/types.ts +59 -0
  244. package/src/controls-options-manager/util.ts +294 -14
  245. package/src/index.ts +40 -0
  246. package/src/interpretation/README.md +60 -0
  247. package/src/interpretation/collection.ts +19 -0
  248. package/src/interpretation/index.ts +332 -0
  249. package/src/interpretation/siLanguage.ts +18 -0
  250. package/src/locus-info/controlsUtils.ts +108 -0
  251. package/src/locus-info/index.ts +413 -59
  252. package/src/locus-info/infoUtils.ts +10 -2
  253. package/src/locus-info/mediaSharesUtils.ts +64 -0
  254. package/src/locus-info/parser.ts +258 -47
  255. package/src/locus-info/selfUtils.ts +81 -5
  256. package/src/media/index.ts +102 -122
  257. package/src/media/properties.ts +87 -110
  258. package/src/meeting/in-meeting-actions.ts +163 -3
  259. package/src/meeting/index.ts +3132 -2541
  260. package/src/meeting/locusMediaRequest.ts +313 -0
  261. package/src/meeting/muteState.ts +229 -131
  262. package/src/meeting/request.ts +177 -121
  263. package/src/meeting/util.ts +588 -394
  264. package/src/meeting-info/index.ts +81 -8
  265. package/src/meeting-info/meeting-info-v2.ts +170 -14
  266. package/src/meeting-info/util.ts +1 -1
  267. package/src/meeting-info/utilv2.ts +23 -23
  268. package/src/meetings/collection.ts +33 -0
  269. package/src/meetings/index.ts +445 -123
  270. package/src/meetings/meetings.types.ts +12 -0
  271. package/src/meetings/request.ts +2 -0
  272. package/src/meetings/util.ts +80 -11
  273. package/src/member/index.ts +58 -0
  274. package/src/member/types.ts +38 -0
  275. package/src/member/util.ts +141 -25
  276. package/src/members/collection.ts +8 -0
  277. package/src/members/index.ts +134 -8
  278. package/src/members/request.ts +97 -17
  279. package/src/members/types.ts +29 -0
  280. package/src/members/util.ts +333 -240
  281. package/src/metrics/constants.ts +12 -4
  282. package/src/metrics/index.ts +1 -490
  283. package/src/multistream/mediaRequestManager.ts +289 -79
  284. package/src/multistream/receiveSlot.ts +31 -17
  285. package/src/multistream/receiveSlotManager.ts +34 -24
  286. package/src/multistream/remoteMedia.ts +27 -2
  287. package/src/multistream/remoteMediaGroup.ts +59 -0
  288. package/src/multistream/remoteMediaManager.ts +148 -30
  289. package/src/multistream/sendSlotManager.ts +170 -0
  290. package/src/reachability/index.ts +228 -37
  291. package/src/reachability/request.ts +17 -8
  292. package/src/reconnection-manager/index.ts +83 -56
  293. package/src/recording-controller/index.ts +20 -3
  294. package/src/recording-controller/util.ts +26 -9
  295. package/src/roap/index.ts +63 -32
  296. package/src/roap/request.ts +100 -104
  297. package/src/roap/turnDiscovery.ts +48 -26
  298. package/src/rtcMetrics/constants.ts +3 -0
  299. package/src/rtcMetrics/index.ts +100 -0
  300. package/src/statsAnalyzer/index.ts +105 -91
  301. package/src/statsAnalyzer/mqaUtil.ts +13 -14
  302. package/src/webinar/collection.ts +31 -0
  303. package/src/webinar/index.ts +62 -0
  304. package/test/integration/spec/converged-space-meetings.js +60 -3
  305. package/test/integration/spec/journey.js +320 -261
  306. package/test/integration/spec/space-meeting.js +76 -3
  307. package/test/unit/spec/annotation/index.ts +418 -0
  308. package/test/unit/spec/breakouts/breakout.ts +118 -28
  309. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  310. package/test/unit/spec/breakouts/events.ts +89 -0
  311. package/test/unit/spec/breakouts/index.ts +1395 -69
  312. package/test/unit/spec/breakouts/utils.js +52 -1
  313. package/test/unit/spec/common/queue.js +31 -2
  314. package/test/unit/spec/controls-options-manager/index.js +163 -0
  315. package/test/unit/spec/controls-options-manager/util.js +576 -60
  316. package/test/unit/spec/fixture/locus.js +1 -0
  317. package/test/unit/spec/interpretation/collection.ts +15 -0
  318. package/test/unit/spec/interpretation/index.ts +589 -0
  319. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  320. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  321. package/test/unit/spec/locus-info/index.js +1304 -33
  322. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  323. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  324. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  325. package/test/unit/spec/locus-info/parser.js +116 -35
  326. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  327. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  328. package/test/unit/spec/media/index.ts +104 -37
  329. package/test/unit/spec/media/properties.ts +2 -2
  330. package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
  331. package/test/unit/spec/meeting/index.js +5216 -1956
  332. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  333. package/test/unit/spec/meeting/muteState.js +408 -208
  334. package/test/unit/spec/meeting/request.js +483 -49
  335. package/test/unit/spec/meeting/utils.js +679 -64
  336. package/test/unit/spec/meeting-info/index.js +300 -0
  337. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  338. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  339. package/test/unit/spec/meetings/collection.js +26 -0
  340. package/test/unit/spec/meetings/index.js +1011 -205
  341. package/test/unit/spec/meetings/utils.js +202 -2
  342. package/test/unit/spec/member/index.js +61 -6
  343. package/test/unit/spec/member/util.js +510 -34
  344. package/test/unit/spec/members/index.js +432 -1
  345. package/test/unit/spec/members/request.js +206 -27
  346. package/test/unit/spec/members/utils.js +210 -0
  347. package/test/unit/spec/metrics/index.js +1 -50
  348. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  349. package/test/unit/spec/multistream/receiveSlot.ts +28 -20
  350. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  351. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  352. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  353. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  354. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  355. package/test/unit/spec/reachability/index.ts +549 -9
  356. package/test/unit/spec/reachability/request.js +68 -0
  357. package/test/unit/spec/reconnection-manager/index.js +85 -9
  358. package/test/unit/spec/recording-controller/index.js +294 -218
  359. package/test/unit/spec/recording-controller/util.js +223 -96
  360. package/test/unit/spec/roap/index.ts +178 -64
  361. package/test/unit/spec/roap/request.ts +203 -85
  362. package/test/unit/spec/roap/turnDiscovery.ts +82 -36
  363. package/test/unit/spec/rtcMetrics/index.ts +73 -0
  364. package/test/unit/spec/stats-analyzer/index.js +136 -2
  365. package/test/unit/spec/webinar/collection.ts +13 -0
  366. package/test/unit/spec/webinar/index.ts +60 -0
  367. package/test/utils/integrationTestUtils.js +46 -0
  368. package/test/utils/testUtils.js +0 -52
  369. package/dist/meeting/effectsState.js +0 -262
  370. package/dist/meeting/effectsState.js.map +0 -1
  371. package/dist/metrics/config.js +0 -299
  372. package/dist/metrics/config.js.map +0 -1
  373. package/dist/types/meeting/effectsState.d.ts +0 -42
  374. package/dist/types/metrics/config.d.ts +0 -178
  375. package/src/index.js +0 -16
  376. package/src/meeting/effectsState.ts +0 -211
  377. package/src/metrics/config.ts +0 -495
  378. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -0,0 +1,100 @@
1
+ import RTC_METRICS from './constants';
2
+
3
+ /**
4
+ * Rtc Metrics
5
+ */
6
+ export default class RtcMetrics {
7
+ /**
8
+ * Array of MetricData items to be sent to the metrics service.
9
+ */
10
+ metricsQueue = [];
11
+
12
+ intervalId: number;
13
+
14
+ webex: any;
15
+
16
+ meetingId: string;
17
+
18
+ correlationId: string;
19
+
20
+ /**
21
+ * Initialize the interval.
22
+ *
23
+ * @param {object} webex - The main `webex` object.
24
+ * @param {string} meetingId - The meeting id.
25
+ * @param {string} correlationId - The correlation id.
26
+ */
27
+ constructor(webex, meetingId, correlationId) {
28
+ // `window` is used to prevent typescript from returning a NodeJS.Timer.
29
+ this.intervalId = window.setInterval(this.sendMetricsInQueue.bind(this), 30 * 1000);
30
+ this.meetingId = meetingId;
31
+ this.webex = webex;
32
+ this.correlationId = correlationId;
33
+ // Send the first set of metrics at 5 seconds in the case of a user leaving the call shortly after joining.
34
+ setTimeout(this.sendMetricsInQueue.bind(this), 5 * 1000);
35
+ }
36
+
37
+ /**
38
+ * Check to see if the metrics queue has any items.
39
+ *
40
+ * @returns {void}
41
+ */
42
+ public sendMetricsInQueue() {
43
+ if (this.metricsQueue.length) {
44
+ this.sendMetrics();
45
+ this.metricsQueue = [];
46
+ }
47
+ }
48
+
49
+ /**
50
+ * Add metrics items to the metrics queue.
51
+ *
52
+ * @param {object} data - An object with a payload array of metrics items.
53
+ *
54
+ * @returns {void}
55
+ */
56
+ addMetrics(data) {
57
+ if (data.payload.length) {
58
+ this.metricsQueue.push(data);
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Clear the metrics interval.
64
+ *
65
+ * @returns {void}
66
+ */
67
+ closeMetrics() {
68
+ this.sendMetricsInQueue();
69
+ clearInterval(this.intervalId);
70
+ }
71
+
72
+ /**
73
+ * Send metrics to the metrics service.
74
+ *
75
+ * @returns {void}
76
+ */
77
+ private sendMetrics() {
78
+ this.webex.request({
79
+ method: 'POST',
80
+ service: 'unifiedTelemetry',
81
+ resource: 'metric/v2',
82
+ headers: {
83
+ type: 'webrtcMedia',
84
+ appId: RTC_METRICS.APP_ID,
85
+ },
86
+ body: {
87
+ metrics: [
88
+ {
89
+ type: 'webrtc',
90
+ version: '1.0.1',
91
+ userId: this.webex.internal.device.userId,
92
+ meetingId: this.meetingId,
93
+ correlationId: this.correlationId,
94
+ data: this.metricsQueue,
95
+ },
96
+ ],
97
+ },
98
+ });
99
+ }
100
+ }
@@ -28,6 +28,7 @@ import {
28
28
  getVideoSenderMqa,
29
29
  getVideoReceiverMqa,
30
30
  } from './mqaUtil';
31
+ import {ReceiveSlot} from '../multistream/receiveSlot';
31
32
 
32
33
  export const EVENTS = {
33
34
  MEDIA_QUALITY: 'MEDIA_QUALITY',
@@ -53,6 +54,8 @@ const emptyReceiver = {
53
54
  meanRoundTripTime: [],
54
55
  };
55
56
 
57
+ type ReceiveSlotCallback = (csi: number) => ReceiveSlot | undefined;
58
+
56
59
  /**
57
60
  * Stats Analyzer class that will emit events based on detected quality
58
61
  *
@@ -74,17 +77,21 @@ export class StatsAnalyzer extends EventsScope {
74
77
  statsInterval: NodeJS.Timeout;
75
78
  statsResults: any;
76
79
  statsStarted: any;
80
+ successfulCandidatePair: any;
81
+ receiveSlotCallback: ReceiveSlotCallback;
77
82
 
78
83
  /**
79
84
  * Creates a new instance of StatsAnalyzer
80
85
  * @constructor
81
86
  * @public
82
87
  * @param {Object} config SDK Configuration Object
88
+ * @param {Function} receiveSlotCallback Callback used to access receive slots.
83
89
  * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)
84
90
  * @param {Object} statsResults Default properties for stats
85
91
  */
86
92
  constructor(
87
93
  config: any,
94
+ receiveSlotCallback: ReceiveSlotCallback = () => undefined,
88
95
  networkQualityMonitor: object = {},
89
96
  statsResults: object = defaultStats
90
97
  ) {
@@ -98,6 +105,8 @@ export class StatsAnalyzer extends EventsScope {
98
105
  this.mqaSentCount = -1;
99
106
  this.lastMqaDataSent = {};
100
107
  this.lastEmittedStartStopEvent = {};
108
+ this.receiveSlotCallback = receiveSlotCallback;
109
+ this.successfulCandidatePair = {};
101
110
  }
102
111
 
103
112
  /**
@@ -186,21 +195,19 @@ export class StatsAnalyzer extends EventsScope {
186
195
  }
187
196
  });
188
197
 
189
- newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress[0];
198
+ newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;
190
199
 
191
200
  // Adding peripheral information
192
- newMqa.intervalMetadata.peripherals = [];
193
-
194
201
  newMqa.intervalMetadata.peripherals.push({information: _UNKNOWN_, name: MEDIA_DEVICES.SPEAKER});
195
202
  if (this.statsResults['audio-send']) {
196
203
  newMqa.intervalMetadata.peripherals.push({
197
- information: this.statsResults['audio-send']?.trackLabel,
204
+ information: this.statsResults['audio-send'].trackLabel || _UNKNOWN_,
198
205
  name: MEDIA_DEVICES.MICROPHONE,
199
206
  });
200
207
  }
201
208
  if (this.statsResults['video-send']) {
202
209
  newMqa.intervalMetadata.peripherals.push({
203
- information: this.statsResults['video-send']?.trackLabel,
210
+ information: this.statsResults['video-send'].trackLabel || _UNKNOWN_,
204
211
  name: MEDIA_DEVICES.CAMERA,
205
212
  });
206
213
  }
@@ -293,7 +300,6 @@ export class StatsAnalyzer extends EventsScope {
293
300
  this.mediaConnection = null;
294
301
  });
295
302
  }
296
- this.mediaConnection = null;
297
303
 
298
304
  return Promise.resolve();
299
305
  }
@@ -386,6 +392,13 @@ export class StatsAnalyzer extends EventsScope {
386
392
  filterAndParseGetStatsResults(statsItem: any, type: string, isSender: boolean) {
387
393
  const {types} = DEFAULT_GET_STATS_FILTER;
388
394
 
395
+ // get the successful candidate pair before parsing stats.
396
+ statsItem.report.forEach((report) => {
397
+ if (report.type === 'candidate-pair' && report.state === 'succeeded') {
398
+ this.successfulCandidatePair = report;
399
+ }
400
+ });
401
+
389
402
  statsItem.report.forEach((result) => {
390
403
  if (types.includes(result.type)) {
391
404
  this.parseGetStatsResult(result, type, isSender);
@@ -396,6 +409,8 @@ export class StatsAnalyzer extends EventsScope {
396
409
  this.statsResults[type].direction = statsItem.currentDirection;
397
410
  this.statsResults[type].trackLabel = statsItem.localTrackLabel;
398
411
  this.statsResults[type].csi = statsItem.csi;
412
+ // reset the successful candidate pair.
413
+ this.successfulCandidatePair = {};
399
414
  }
400
415
  }
401
416
 
@@ -492,23 +507,23 @@ export class StatsAnalyzer extends EventsScope {
492
507
  const getCurrentStatsTotals = (keyPrefix: string, value: string): number =>
493
508
  Object.keys(this.statsResults)
494
509
  .filter((key) => key.startsWith(keyPrefix))
495
- .reduce((prev, cur) => prev + (this.statsResults[cur].recv[value] || 0), 0);
510
+ .reduce((prev, cur) => prev + (this.statsResults[cur]?.recv[value] || 0), 0);
496
511
 
497
512
  const getPreviousStatsTotals = (keyPrefix: string, value: string): number =>
498
513
  Object.keys(this.statsResults)
499
514
  .filter((key) => key.startsWith(keyPrefix))
500
- .reduce((prev, cur) => prev + (this.lastStatsResults[cur].recv[value] || 0), 0);
515
+ .reduce((prev, cur) => prev + (this.lastStatsResults[cur]?.recv[value] || 0), 0);
501
516
 
502
517
  const getCurrentResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
503
518
  Object.keys(this.statsResults)
504
519
  .filter((key) => key.startsWith(keyPrefix))
505
- .reduce((prev, cur) => prev + (this.statsResults.resolutions[cur].recv[value] || 0), 0);
520
+ .reduce((prev, cur) => prev + (this.statsResults.resolutions[cur]?.recv[value] || 0), 0);
506
521
 
507
522
  const getPreviousResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
508
523
  Object.keys(this.statsResults)
509
524
  .filter((key) => key.startsWith(keyPrefix))
510
525
  .reduce(
511
- (prev, cur) => prev + (this.lastStatsResults.resolutions[cur].recv[value] || 0),
526
+ (prev, cur) => prev + (this.lastStatsResults.resolutions[cur]?.recv[value] || 0),
512
527
  0
513
528
  );
514
529
 
@@ -523,7 +538,8 @@ export class StatsAnalyzer extends EventsScope {
523
538
  currentStats.totalPacketsSent === 0
524
539
  ) {
525
540
  LoggerProxy.logger.info(
526
- `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`
541
+ `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`,
542
+ currentStats.totalPacketsSent
527
543
  );
528
544
  } else {
529
545
  if (
@@ -531,7 +547,8 @@ export class StatsAnalyzer extends EventsScope {
531
547
  currentStats.totalAudioEnergy === 0
532
548
  ) {
533
549
  LoggerProxy.logger.info(
534
- `StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`
550
+ `StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`,
551
+ currentStats.totalAudioEnergy
535
552
  );
536
553
  }
537
554
 
@@ -565,14 +582,16 @@ export class StatsAnalyzer extends EventsScope {
565
582
 
566
583
  if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
567
584
  LoggerProxy.logger.info(
568
- `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received`
585
+ `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received`,
586
+ currentPacketsReceived
569
587
  );
570
588
  } else if (
571
589
  currentSamplesReceived === previousSamplesReceived ||
572
590
  currentSamplesReceived === 0
573
591
  ) {
574
592
  LoggerProxy.logger.info(
575
- `StatsAnalyzer:index#compareLastStatsResult --> No audio samples received`
593
+ `StatsAnalyzer:index#compareLastStatsResult --> No audio samples received`,
594
+ currentSamplesReceived
576
595
  );
577
596
  }
578
597
 
@@ -589,7 +608,8 @@ export class StatsAnalyzer extends EventsScope {
589
608
  currentStats.totalPacketsSent === 0
590
609
  ) {
591
610
  LoggerProxy.logger.info(
592
- `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`
611
+ `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`,
612
+ currentStats.totalPacketsSent
593
613
  );
594
614
  } else {
595
615
  if (
@@ -597,7 +617,8 @@ export class StatsAnalyzer extends EventsScope {
597
617
  currentStats.framesEncoded === 0
598
618
  ) {
599
619
  LoggerProxy.logger.info(
600
- `StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`
620
+ `StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`,
621
+ currentStats.framesEncoded
601
622
  );
602
623
  }
603
624
 
@@ -607,7 +628,8 @@ export class StatsAnalyzer extends EventsScope {
607
628
  this.statsResults.resolutions['video-send'].send.framesSent === 0
608
629
  ) {
609
630
  LoggerProxy.logger.info(
610
- `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`
631
+ `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,
632
+ this.statsResults.resolutions['video-send'].send.framesSent
611
633
  );
612
634
  }
613
635
  }
@@ -643,24 +665,28 @@ export class StatsAnalyzer extends EventsScope {
643
665
 
644
666
  if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
645
667
  LoggerProxy.logger.info(
646
- `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received`
668
+ `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received`,
669
+ currentPacketsReceived
647
670
  );
648
671
  } else {
649
672
  if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
650
673
  LoggerProxy.logger.info(
651
- `StatsAnalyzer:index#compareLastStatsResult --> No video frames received`
674
+ `StatsAnalyzer:index#compareLastStatsResult --> No video frames received`,
675
+ currentFramesReceived
652
676
  );
653
677
  }
654
678
 
655
679
  if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
656
680
  LoggerProxy.logger.info(
657
- `StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded`
681
+ `StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded`,
682
+ currentFramesDecoded
658
683
  );
659
684
  }
660
685
 
661
686
  if (currentFramesDropped - previousFramesDropped > 10) {
662
687
  LoggerProxy.logger.info(
663
- `StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped`
688
+ `StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped`,
689
+ currentFramesDropped - previousFramesDropped
664
690
  );
665
691
  }
666
692
  }
@@ -679,7 +705,8 @@ export class StatsAnalyzer extends EventsScope {
679
705
  currentStats.totalPacketsSent === 0
680
706
  ) {
681
707
  LoggerProxy.logger.info(
682
- `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`
708
+ `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`,
709
+ currentStats.totalPacketsSent
683
710
  );
684
711
  } else {
685
712
  if (
@@ -687,7 +714,8 @@ export class StatsAnalyzer extends EventsScope {
687
714
  currentStats.framesEncoded === 0
688
715
  ) {
689
716
  LoggerProxy.logger.info(
690
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`
717
+ `StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`,
718
+ currentStats.framesEncoded
691
719
  );
692
720
  }
693
721
 
@@ -697,7 +725,8 @@ export class StatsAnalyzer extends EventsScope {
697
725
  this.statsResults.resolutions['video-share-send'].send.framesSent === 0
698
726
  ) {
699
727
  LoggerProxy.logger.info(
700
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`
728
+ `StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`,
729
+ this.statsResults.resolutions['video-share-send'].send.framesSent
701
730
  );
702
731
  }
703
732
  }
@@ -735,24 +764,28 @@ export class StatsAnalyzer extends EventsScope {
735
764
 
736
765
  if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
737
766
  LoggerProxy.logger.info(
738
- `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received`
767
+ `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received`,
768
+ currentPacketsReceived
739
769
  );
740
770
  } else {
741
771
  if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
742
772
  LoggerProxy.logger.info(
743
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames received`
773
+ `StatsAnalyzer:index#compareLastStatsResult --> No share frames received`,
774
+ currentFramesReceived
744
775
  );
745
776
  }
746
777
 
747
778
  if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
748
779
  LoggerProxy.logger.info(
749
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded`
780
+ `StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded`,
781
+ currentFramesDecoded
750
782
  );
751
783
  }
752
784
 
753
785
  if (currentFramesDropped - previousFramesDropped > 10) {
754
786
  LoggerProxy.logger.info(
755
- `StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped`
787
+ `StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped`,
788
+ currentFramesDropped - previousFramesDropped
756
789
  );
757
790
  }
758
791
  }
@@ -853,6 +886,14 @@ export class StatsAnalyzer extends EventsScope {
853
886
  if (result.bytesSent) {
854
887
  let kilobytes = 0;
855
888
 
889
+ if (result.frameWidth && result.frameHeight) {
890
+ this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
891
+ this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
892
+ this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
893
+ this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent =
894
+ result.hugeFramesSent;
895
+ }
896
+
856
897
  if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {
857
898
  this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
858
899
  }
@@ -925,6 +966,17 @@ export class StatsAnalyzer extends EventsScope {
925
966
 
926
967
  if (result.bytesReceived) {
927
968
  let kilobytes = 0;
969
+ const receiveSlot = this.receiveSlotCallback(result.ssrc);
970
+ const idAndCsi = receiveSlot
971
+ ? `id: "${receiveSlot.id || ''}"${receiveSlot.csi ? ` and csi: ${receiveSlot.csi}` : ''}`
972
+ : '';
973
+
974
+ if (result.frameWidth && result.frameHeight) {
975
+ this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
976
+ this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
977
+ this.statsResults.resolutions[mediaType][sendrecvType].framesReceived =
978
+ result.framesReceived;
979
+ }
928
980
 
929
981
  if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
930
982
  this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =
@@ -974,10 +1026,12 @@ export class StatsAnalyzer extends EventsScope {
974
1026
  result.packetsReceived;
975
1027
 
976
1028
  if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {
977
- LoggerProxy.logger.info(
978
- `StatsAnalyzer:index#processInboundRTPResult --> No packets received for ${mediaType} `,
979
- this.statsResults[mediaType][sendrecvType].packetsReceived
980
- );
1029
+ if (receiveSlot) {
1030
+ LoggerProxy.logger.info(
1031
+ `StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ${idAndCsi}`,
1032
+ this.statsResults[mediaType][sendrecvType].packetsReceived
1033
+ );
1034
+ }
981
1035
  }
982
1036
 
983
1037
  // Check the over all packet Lost ratio
@@ -989,7 +1043,7 @@ export class StatsAnalyzer extends EventsScope {
989
1043
  : 0;
990
1044
  if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
991
1045
  LoggerProxy.logger.info(
992
- 'StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver ',
1046
+ `StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ${idAndCsi}`,
993
1047
  this.statsResults[mediaType][sendrecvType].currentPacketLossRatio
994
1048
  );
995
1049
  }
@@ -1049,73 +1103,40 @@ export class StatsAnalyzer extends EventsScope {
1049
1103
  if (!result || !result.id) {
1050
1104
  return;
1051
1105
  }
1052
- const RemoteCandidateType = {};
1053
- const RemoteTransport = {};
1054
- const RemoteIpAddress = {};
1055
- const RemoteNetworkType = {};
1056
-
1057
- if (!result.id) return;
1058
-
1059
- const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
1060
- const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
1061
-
1062
- if (!RemoteCandidateType[result.id]) {
1063
- RemoteCandidateType[result.id] = [];
1064
- }
1065
-
1066
- if (!RemoteTransport[result.id]) {
1067
- RemoteTransport[result.id] = [];
1068
- }
1069
-
1070
- if (!RemoteIpAddress[result.id]) {
1071
- RemoteIpAddress[result.id] = [];
1072
- }
1073
- if (!RemoteNetworkType[result.id]) {
1074
- RemoteNetworkType[result.id] = [];
1075
- }
1076
-
1077
- if (
1078
- result.candidateType &&
1079
- RemoteCandidateType[result.id].indexOf(result.candidateType) === -1
1080
- ) {
1081
- RemoteCandidateType[result.id].push(result.candidateType);
1082
- }
1083
1106
 
1084
- if (result.protocol && RemoteTransport[result.id].indexOf(result.protocol) === -1) {
1085
- RemoteTransport[result.id].push(result.protocol.toUpperCase());
1107
+ // We only care about the successful local candidate
1108
+ if (this.successfulCandidatePair?.localCandidateId !== result.id) {
1109
+ return;
1086
1110
  }
1087
1111
 
1088
- if (
1089
- result.ip &&
1090
- RemoteIpAddress[result.id].indexOf(`${result.ip}:${result.portNumber}`) === -1
1091
- ) {
1092
- RemoteIpAddress[result.id].push(`${result.ip}`); // TODO: Add ports
1112
+ let transport;
1113
+ if (result.relayProtocol) {
1114
+ transport = result.relayProtocol.toUpperCase();
1115
+ } else if (result.protocol) {
1116
+ transport = result.protocol.toUpperCase();
1093
1117
  }
1094
1118
 
1095
- if (result.networkType && RemoteNetworkType[result.id].indexOf(result.networkType) === -1) {
1096
- RemoteNetworkType[result.id].push(result.networkType);
1097
- }
1119
+ const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
1120
+ const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
1098
1121
 
1099
1122
  this.statsResults.internal.candidates[result.id] = {
1100
- candidateType: RemoteCandidateType[result.id],
1101
- ipAddress: RemoteIpAddress[result.id],
1123
+ candidateType: result.candidateType,
1124
+ ipAddress: result.ip, // TODO: add ports
1102
1125
  portNumber: result.port,
1103
- networkType: RemoteNetworkType[result.id],
1126
+ networkType: result.networkType,
1104
1127
  priority: result.priority,
1105
- transport: RemoteTransport[result.id],
1128
+ transport,
1106
1129
  timestamp: result.time,
1107
1130
  id: result.id,
1108
1131
  type: result.type,
1109
1132
  };
1110
1133
 
1111
- this.statsResults.connectionType[ipType].candidateType = RemoteCandidateType[result.id];
1112
- this.statsResults.connectionType[ipType].ipAddress = RemoteIpAddress[result.id];
1134
+ this.statsResults.connectionType[ipType].candidateType = result.candidateType;
1135
+ this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;
1113
1136
 
1114
1137
  this.statsResults.connectionType[ipType].networkType =
1115
- RemoteNetworkType[result.id][0] === NETWORK_TYPE.VPN
1116
- ? NETWORK_TYPE.UNKNOWN
1117
- : RemoteNetworkType[result.id][0];
1118
- this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];
1138
+ result.networkType === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : result.networkType;
1139
+ this.statsResults.connectionType[ipType].transport = transport;
1119
1140
 
1120
1141
  this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
1121
1142
  };
@@ -1137,13 +1158,6 @@ export class StatsAnalyzer extends EventsScope {
1137
1158
  const sendrecvType =
1138
1159
  result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;
1139
1160
 
1140
- if (result.frameWidth && result.frameHeight) {
1141
- this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
1142
- this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
1143
- this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
1144
- this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
1145
- }
1146
-
1147
1161
  if (sendrecvType === STATS.RECEIVE_DIRECTION) {
1148
1162
  this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
1149
1163
  this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
@@ -23,7 +23,7 @@ export const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSen
23
23
  }
24
24
 
25
25
  audioReceiver.common.common.direction = statsResults[mediaType].direction;
26
- audioReceiver.common.transportType = statsResults.connectionType.remote.transport[0];
26
+ audioReceiver.common.transportType = statsResults.connectionType.local.transport;
27
27
 
28
28
  // add rtpPacket info inside common as also for call analyzer
29
29
  audioReceiver.common.rtpPackets =
@@ -83,7 +83,7 @@ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent, m
83
83
  }
84
84
 
85
85
  audioSender.common.common.direction = statsResults[mediaType].direction;
86
- audioSender.common.transportType = statsResults.connectionType.local.transport[0];
86
+ audioSender.common.transportType = statsResults.connectionType.local.transport;
87
87
 
88
88
  audioSender.common.maxRemoteJitter =
89
89
  // @ts-ignore
@@ -146,7 +146,8 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
146
146
  }
147
147
 
148
148
  videoReceiver.common.common.direction = statsResults[mediaType].direction;
149
- videoReceiver.common.transportType = statsResults.connectionType.remote.transport[0];
149
+ videoReceiver.common.transportType = statsResults.connectionType.local.transport;
150
+
150
151
  // collect the packets received for the last min
151
152
  videoReceiver.common.rtpPackets =
152
153
  statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
@@ -199,12 +200,11 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
199
200
  videoReceiver.streams[0].common.framesDropped =
200
201
  statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastFramesDropped;
201
202
  videoReceiver.streams[0].receivedHeight =
202
- statsResults.resolutions[mediaType][sendrecvType].height;
203
- videoReceiver.streams[0].receivedWidth = statsResults.resolutions[mediaType][sendrecvType].width;
203
+ statsResults.resolutions[mediaType][sendrecvType].height || 0;
204
+ videoReceiver.streams[0].receivedWidth =
205
+ statsResults.resolutions[mediaType][sendrecvType].width || 0;
204
206
  videoReceiver.streams[0].receivedFrameSize =
205
- (statsResults.resolutions[mediaType][sendrecvType].height *
206
- statsResults.resolutions[mediaType][sendrecvType].height) /
207
- 256;
207
+ (videoReceiver.streams[0].receivedHeight * videoReceiver.streams[0].receivedWidth) / 256;
208
208
 
209
209
  videoReceiver.streams[0].receivedKeyFrames =
210
210
  statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;
@@ -229,7 +229,7 @@ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, m
229
229
  }
230
230
 
231
231
  videoSender.common.common.direction = statsResults[mediaType].direction;
232
- videoSender.common.transportType = statsResults.connectionType.local.transport[0];
232
+ videoSender.common.transportType = statsResults.connectionType.local.transport;
233
233
 
234
234
  // @ts-ignore
235
235
  videoSender.common.maxRemoteJitter =
@@ -284,10 +284,9 @@ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, m
284
284
  ? (totalFrameSentInaMin * 100) / 60
285
285
  : 0;
286
286
  videoSender.streams[0].transmittedHeight =
287
- statsResults.resolutions[mediaType][sendrecvType].height;
288
- videoSender.streams[0].transmittedWidth = statsResults.resolutions[mediaType][sendrecvType].width;
287
+ statsResults.resolutions[mediaType][sendrecvType].height || 0;
288
+ videoSender.streams[0].transmittedWidth =
289
+ statsResults.resolutions[mediaType][sendrecvType].width || 0;
289
290
  videoSender.streams[0].transmittedFrameSize =
290
- (statsResults.resolutions[mediaType][sendrecvType].height *
291
- statsResults.resolutions[mediaType][sendrecvType].width) /
292
- 254;
291
+ (videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;
293
292
  };
@@ -0,0 +1,31 @@
1
+ /*!
2
+ * Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.
3
+ */
4
+
5
+ import {MEETINGS} from '../constants';
6
+
7
+ class WebinarCollection {
8
+ webinarInfo: any;
9
+
10
+ namespace = MEETINGS;
11
+
12
+ mainIndex = 'sessionId';
13
+
14
+ constructor() {
15
+ this.webinarInfo = {};
16
+ }
17
+
18
+ set(id, info) {
19
+ this.webinarInfo[id] = info;
20
+ }
21
+
22
+ /**
23
+ * @param {String} id
24
+ * @returns {Member}
25
+ */
26
+ get(id: string) {
27
+ return this.webinarInfo[id];
28
+ }
29
+ }
30
+
31
+ export default WebinarCollection;