@webex/plugin-meetings 3.0.0-beta.30 → 3.0.0-beta.301

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 +3767 -2924
  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 +256 -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 +22 -0
  87. package/dist/meetings/collection.js.map +1 -1
  88. package/dist/meetings/index.js +402 -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 +84 -73
  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 +188 -21
  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 +460 -508
  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 +8 -0
  188. package/dist/types/meetings/index.d.ts +90 -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 +216 -18
  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 +3112 -2527
  260. package/src/meeting/locusMediaRequest.ts +313 -0
  261. package/src/meeting/muteState.ts +229 -131
  262. package/src/meeting/request.ts +172 -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 +20 -0
  269. package/src/meetings/index.ts +434 -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 +103 -87
  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 +5146 -1933
  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 +440 -45
  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 +14 -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 +112 -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,7 +195,7 @@ 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
201
  newMqa.intervalMetadata.peripherals = [];
@@ -293,7 +302,6 @@ export class StatsAnalyzer extends EventsScope {
293
302
  this.mediaConnection = null;
294
303
  });
295
304
  }
296
- this.mediaConnection = null;
297
305
 
298
306
  return Promise.resolve();
299
307
  }
@@ -386,6 +394,13 @@ export class StatsAnalyzer extends EventsScope {
386
394
  filterAndParseGetStatsResults(statsItem: any, type: string, isSender: boolean) {
387
395
  const {types} = DEFAULT_GET_STATS_FILTER;
388
396
 
397
+ // get the successful candidate pair before parsing stats.
398
+ statsItem.report.forEach((report) => {
399
+ if (report.type === 'candidate-pair' && report.state === 'succeeded') {
400
+ this.successfulCandidatePair = report;
401
+ }
402
+ });
403
+
389
404
  statsItem.report.forEach((result) => {
390
405
  if (types.includes(result.type)) {
391
406
  this.parseGetStatsResult(result, type, isSender);
@@ -396,6 +411,8 @@ export class StatsAnalyzer extends EventsScope {
396
411
  this.statsResults[type].direction = statsItem.currentDirection;
397
412
  this.statsResults[type].trackLabel = statsItem.localTrackLabel;
398
413
  this.statsResults[type].csi = statsItem.csi;
414
+ // reset the successful candidate pair.
415
+ this.successfulCandidatePair = {};
399
416
  }
400
417
  }
401
418
 
@@ -492,23 +509,23 @@ export class StatsAnalyzer extends EventsScope {
492
509
  const getCurrentStatsTotals = (keyPrefix: string, value: string): number =>
493
510
  Object.keys(this.statsResults)
494
511
  .filter((key) => key.startsWith(keyPrefix))
495
- .reduce((prev, cur) => prev + (this.statsResults[cur].recv[value] || 0), 0);
512
+ .reduce((prev, cur) => prev + (this.statsResults[cur]?.recv[value] || 0), 0);
496
513
 
497
514
  const getPreviousStatsTotals = (keyPrefix: string, value: string): number =>
498
515
  Object.keys(this.statsResults)
499
516
  .filter((key) => key.startsWith(keyPrefix))
500
- .reduce((prev, cur) => prev + (this.lastStatsResults[cur].recv[value] || 0), 0);
517
+ .reduce((prev, cur) => prev + (this.lastStatsResults[cur]?.recv[value] || 0), 0);
501
518
 
502
519
  const getCurrentResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
503
520
  Object.keys(this.statsResults)
504
521
  .filter((key) => key.startsWith(keyPrefix))
505
- .reduce((prev, cur) => prev + (this.statsResults.resolutions[cur].recv[value] || 0), 0);
522
+ .reduce((prev, cur) => prev + (this.statsResults.resolutions[cur]?.recv[value] || 0), 0);
506
523
 
507
524
  const getPreviousResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
508
525
  Object.keys(this.statsResults)
509
526
  .filter((key) => key.startsWith(keyPrefix))
510
527
  .reduce(
511
- (prev, cur) => prev + (this.lastStatsResults.resolutions[cur].recv[value] || 0),
528
+ (prev, cur) => prev + (this.lastStatsResults.resolutions[cur]?.recv[value] || 0),
512
529
  0
513
530
  );
514
531
 
@@ -523,7 +540,8 @@ export class StatsAnalyzer extends EventsScope {
523
540
  currentStats.totalPacketsSent === 0
524
541
  ) {
525
542
  LoggerProxy.logger.info(
526
- `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`
543
+ `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`,
544
+ currentStats.totalPacketsSent
527
545
  );
528
546
  } else {
529
547
  if (
@@ -531,7 +549,8 @@ export class StatsAnalyzer extends EventsScope {
531
549
  currentStats.totalAudioEnergy === 0
532
550
  ) {
533
551
  LoggerProxy.logger.info(
534
- `StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`
552
+ `StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`,
553
+ currentStats.totalAudioEnergy
535
554
  );
536
555
  }
537
556
 
@@ -565,14 +584,16 @@ export class StatsAnalyzer extends EventsScope {
565
584
 
566
585
  if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
567
586
  LoggerProxy.logger.info(
568
- `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received`
587
+ `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received`,
588
+ currentPacketsReceived
569
589
  );
570
590
  } else if (
571
591
  currentSamplesReceived === previousSamplesReceived ||
572
592
  currentSamplesReceived === 0
573
593
  ) {
574
594
  LoggerProxy.logger.info(
575
- `StatsAnalyzer:index#compareLastStatsResult --> No audio samples received`
595
+ `StatsAnalyzer:index#compareLastStatsResult --> No audio samples received`,
596
+ currentSamplesReceived
576
597
  );
577
598
  }
578
599
 
@@ -589,7 +610,8 @@ export class StatsAnalyzer extends EventsScope {
589
610
  currentStats.totalPacketsSent === 0
590
611
  ) {
591
612
  LoggerProxy.logger.info(
592
- `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`
613
+ `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`,
614
+ currentStats.totalPacketsSent
593
615
  );
594
616
  } else {
595
617
  if (
@@ -597,7 +619,8 @@ export class StatsAnalyzer extends EventsScope {
597
619
  currentStats.framesEncoded === 0
598
620
  ) {
599
621
  LoggerProxy.logger.info(
600
- `StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`
622
+ `StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`,
623
+ currentStats.framesEncoded
601
624
  );
602
625
  }
603
626
 
@@ -607,7 +630,8 @@ export class StatsAnalyzer extends EventsScope {
607
630
  this.statsResults.resolutions['video-send'].send.framesSent === 0
608
631
  ) {
609
632
  LoggerProxy.logger.info(
610
- `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`
633
+ `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,
634
+ this.statsResults.resolutions['video-send'].send.framesSent
611
635
  );
612
636
  }
613
637
  }
@@ -643,24 +667,28 @@ export class StatsAnalyzer extends EventsScope {
643
667
 
644
668
  if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
645
669
  LoggerProxy.logger.info(
646
- `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received`
670
+ `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received`,
671
+ currentPacketsReceived
647
672
  );
648
673
  } else {
649
674
  if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
650
675
  LoggerProxy.logger.info(
651
- `StatsAnalyzer:index#compareLastStatsResult --> No video frames received`
676
+ `StatsAnalyzer:index#compareLastStatsResult --> No video frames received`,
677
+ currentFramesReceived
652
678
  );
653
679
  }
654
680
 
655
681
  if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
656
682
  LoggerProxy.logger.info(
657
- `StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded`
683
+ `StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded`,
684
+ currentFramesDecoded
658
685
  );
659
686
  }
660
687
 
661
688
  if (currentFramesDropped - previousFramesDropped > 10) {
662
689
  LoggerProxy.logger.info(
663
- `StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped`
690
+ `StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped`,
691
+ currentFramesDropped - previousFramesDropped
664
692
  );
665
693
  }
666
694
  }
@@ -679,7 +707,8 @@ export class StatsAnalyzer extends EventsScope {
679
707
  currentStats.totalPacketsSent === 0
680
708
  ) {
681
709
  LoggerProxy.logger.info(
682
- `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`
710
+ `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`,
711
+ currentStats.totalPacketsSent
683
712
  );
684
713
  } else {
685
714
  if (
@@ -687,7 +716,8 @@ export class StatsAnalyzer extends EventsScope {
687
716
  currentStats.framesEncoded === 0
688
717
  ) {
689
718
  LoggerProxy.logger.info(
690
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`
719
+ `StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`,
720
+ currentStats.framesEncoded
691
721
  );
692
722
  }
693
723
 
@@ -697,7 +727,8 @@ export class StatsAnalyzer extends EventsScope {
697
727
  this.statsResults.resolutions['video-share-send'].send.framesSent === 0
698
728
  ) {
699
729
  LoggerProxy.logger.info(
700
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`
730
+ `StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`,
731
+ this.statsResults.resolutions['video-share-send'].send.framesSent
701
732
  );
702
733
  }
703
734
  }
@@ -735,24 +766,28 @@ export class StatsAnalyzer extends EventsScope {
735
766
 
736
767
  if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
737
768
  LoggerProxy.logger.info(
738
- `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received`
769
+ `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received`,
770
+ currentPacketsReceived
739
771
  );
740
772
  } else {
741
773
  if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
742
774
  LoggerProxy.logger.info(
743
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames received`
775
+ `StatsAnalyzer:index#compareLastStatsResult --> No share frames received`,
776
+ currentFramesReceived
744
777
  );
745
778
  }
746
779
 
747
780
  if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
748
781
  LoggerProxy.logger.info(
749
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded`
782
+ `StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded`,
783
+ currentFramesDecoded
750
784
  );
751
785
  }
752
786
 
753
787
  if (currentFramesDropped - previousFramesDropped > 10) {
754
788
  LoggerProxy.logger.info(
755
- `StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped`
789
+ `StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped`,
790
+ currentFramesDropped - previousFramesDropped
756
791
  );
757
792
  }
758
793
  }
@@ -853,6 +888,14 @@ export class StatsAnalyzer extends EventsScope {
853
888
  if (result.bytesSent) {
854
889
  let kilobytes = 0;
855
890
 
891
+ if (result.frameWidth && result.frameHeight) {
892
+ this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
893
+ this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
894
+ this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
895
+ this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent =
896
+ result.hugeFramesSent;
897
+ }
898
+
856
899
  if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {
857
900
  this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
858
901
  }
@@ -925,6 +968,17 @@ export class StatsAnalyzer extends EventsScope {
925
968
 
926
969
  if (result.bytesReceived) {
927
970
  let kilobytes = 0;
971
+ const receiveSlot = this.receiveSlotCallback(result.ssrc);
972
+ const idAndCsi = receiveSlot
973
+ ? `id: "${receiveSlot.id || ''}"${receiveSlot.csi ? ` and csi: ${receiveSlot.csi}` : ''}`
974
+ : '';
975
+
976
+ if (result.frameWidth && result.frameHeight) {
977
+ this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
978
+ this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
979
+ this.statsResults.resolutions[mediaType][sendrecvType].framesReceived =
980
+ result.framesReceived;
981
+ }
928
982
 
929
983
  if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
930
984
  this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =
@@ -974,10 +1028,12 @@ export class StatsAnalyzer extends EventsScope {
974
1028
  result.packetsReceived;
975
1029
 
976
1030
  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
- );
1031
+ if (receiveSlot) {
1032
+ LoggerProxy.logger.info(
1033
+ `StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ${idAndCsi}`,
1034
+ this.statsResults[mediaType][sendrecvType].packetsReceived
1035
+ );
1036
+ }
981
1037
  }
982
1038
 
983
1039
  // Check the over all packet Lost ratio
@@ -989,7 +1045,7 @@ export class StatsAnalyzer extends EventsScope {
989
1045
  : 0;
990
1046
  if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
991
1047
  LoggerProxy.logger.info(
992
- 'StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver ',
1048
+ `StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ${idAndCsi}`,
993
1049
  this.statsResults[mediaType][sendrecvType].currentPacketLossRatio
994
1050
  );
995
1051
  }
@@ -1049,73 +1105,40 @@ export class StatsAnalyzer extends EventsScope {
1049
1105
  if (!result || !result.id) {
1050
1106
  return;
1051
1107
  }
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
1108
 
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
-
1084
- if (result.protocol && RemoteTransport[result.id].indexOf(result.protocol) === -1) {
1085
- RemoteTransport[result.id].push(result.protocol.toUpperCase());
1109
+ // We only care about the successful local candidate
1110
+ if (this.successfulCandidatePair?.localCandidateId !== result.id) {
1111
+ return;
1086
1112
  }
1087
1113
 
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
1114
+ let transport;
1115
+ if (result.relayProtocol) {
1116
+ transport = result.relayProtocol.toUpperCase();
1117
+ } else if (result.protocol) {
1118
+ transport = result.protocol.toUpperCase();
1093
1119
  }
1094
1120
 
1095
- if (result.networkType && RemoteNetworkType[result.id].indexOf(result.networkType) === -1) {
1096
- RemoteNetworkType[result.id].push(result.networkType);
1097
- }
1121
+ const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
1122
+ const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
1098
1123
 
1099
1124
  this.statsResults.internal.candidates[result.id] = {
1100
- candidateType: RemoteCandidateType[result.id],
1101
- ipAddress: RemoteIpAddress[result.id],
1125
+ candidateType: result.candidateType,
1126
+ ipAddress: result.ip, // TODO: add ports
1102
1127
  portNumber: result.port,
1103
- networkType: RemoteNetworkType[result.id],
1128
+ networkType: result.networkType,
1104
1129
  priority: result.priority,
1105
- transport: RemoteTransport[result.id],
1130
+ transport,
1106
1131
  timestamp: result.time,
1107
1132
  id: result.id,
1108
1133
  type: result.type,
1109
1134
  };
1110
1135
 
1111
- this.statsResults.connectionType[ipType].candidateType = RemoteCandidateType[result.id];
1112
- this.statsResults.connectionType[ipType].ipAddress = RemoteIpAddress[result.id];
1136
+ this.statsResults.connectionType[ipType].candidateType = result.candidateType;
1137
+ this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;
1113
1138
 
1114
1139
  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];
1140
+ result.networkType === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : result.networkType;
1141
+ this.statsResults.connectionType[ipType].transport = transport;
1119
1142
 
1120
1143
  this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
1121
1144
  };
@@ -1137,13 +1160,6 @@ export class StatsAnalyzer extends EventsScope {
1137
1160
  const sendrecvType =
1138
1161
  result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;
1139
1162
 
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
1163
  if (sendrecvType === STATS.RECEIVE_DIRECTION) {
1148
1164
  this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
1149
1165
  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;