@webex/plugin-meetings 3.0.0-beta.20 → 3.0.0-beta.201

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 (424) hide show
  1. package/README.md +45 -7
  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 +114 -14
  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 +841 -19
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/request.js +78 -0
  17. package/dist/breakouts/request.js.map +1 -0
  18. package/dist/breakouts/utils.js +67 -0
  19. package/dist/breakouts/utils.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +3 -2
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/queue.js +24 -9
  25. package/dist/common/queue.js.map +1 -1
  26. package/dist/config.js +3 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +172 -30
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/constants.js +14 -0
  31. package/dist/controls-options-manager/constants.js.map +1 -0
  32. package/dist/controls-options-manager/enums.js +27 -0
  33. package/dist/controls-options-manager/enums.js.map +1 -0
  34. package/dist/controls-options-manager/index.js +297 -0
  35. package/dist/controls-options-manager/index.js.map +1 -0
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +319 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +107 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +366 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +91 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +355 -57
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/mediaSharesUtils.js +43 -1
  53. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  54. package/dist/locus-info/parser.js +219 -63
  55. package/dist/locus-info/parser.js.map +1 -1
  56. package/dist/locus-info/selfUtils.js +89 -14
  57. package/dist/locus-info/selfUtils.js.map +1 -1
  58. package/dist/media/index.js +48 -135
  59. package/dist/media/index.js.map +1 -1
  60. package/dist/media/properties.js +29 -90
  61. package/dist/media/properties.js.map +1 -1
  62. package/dist/mediaQualityMetrics/config.js +505 -493
  63. package/dist/mediaQualityMetrics/config.js.map +1 -1
  64. package/dist/meeting/in-meeting-actions.js +80 -2
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +2692 -2544
  67. package/dist/meeting/index.js.map +1 -1
  68. package/dist/meeting/locusMediaRequest.js +291 -0
  69. package/dist/meeting/locusMediaRequest.js.map +1 -0
  70. package/dist/meeting/muteState.js +229 -124
  71. package/dist/meeting/muteState.js.map +1 -1
  72. package/dist/meeting/request.js +196 -190
  73. package/dist/meeting/request.js.map +1 -1
  74. package/dist/meeting/util.js +529 -414
  75. package/dist/meeting/util.js.map +1 -1
  76. package/dist/meeting-info/index.js +48 -7
  77. package/dist/meeting-info/index.js.map +1 -1
  78. package/dist/meeting-info/meeting-info-v2.js +171 -51
  79. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  80. package/dist/meeting-info/utilv2.js +20 -5
  81. package/dist/meeting-info/utilv2.js.map +1 -1
  82. package/dist/meetings/collection.js +22 -0
  83. package/dist/meetings/collection.js.map +1 -1
  84. package/dist/meetings/index.js +357 -66
  85. package/dist/meetings/index.js.map +1 -1
  86. package/dist/meetings/meetings.types.js +7 -0
  87. package/dist/meetings/meetings.types.js.map +1 -0
  88. package/dist/meetings/request.js +2 -0
  89. package/dist/meetings/request.js.map +1 -1
  90. package/dist/meetings/util.js +88 -1
  91. package/dist/meetings/util.js.map +1 -1
  92. package/dist/member/index.js +49 -0
  93. package/dist/member/index.js.map +1 -1
  94. package/dist/member/types.js +25 -0
  95. package/dist/member/types.js.map +1 -0
  96. package/dist/member/util.js +121 -25
  97. package/dist/member/util.js.map +1 -1
  98. package/dist/members/collection.js +10 -0
  99. package/dist/members/collection.js.map +1 -1
  100. package/dist/members/index.js +86 -5
  101. package/dist/members/index.js.map +1 -1
  102. package/dist/members/request.js +106 -38
  103. package/dist/members/request.js.map +1 -1
  104. package/dist/members/types.js +15 -0
  105. package/dist/members/types.js.map +1 -0
  106. package/dist/members/util.js +316 -233
  107. package/dist/members/util.js.map +1 -1
  108. package/dist/metrics/constants.js +3 -5
  109. package/dist/metrics/constants.js.map +1 -1
  110. package/dist/metrics/index.js +1 -468
  111. package/dist/metrics/index.js.map +1 -1
  112. package/dist/multistream/mediaRequestManager.js +238 -49
  113. package/dist/multistream/mediaRequestManager.js.map +1 -1
  114. package/dist/multistream/receiveSlot.js +49 -16
  115. package/dist/multistream/receiveSlot.js.map +1 -1
  116. package/dist/multistream/receiveSlotManager.js +52 -34
  117. package/dist/multistream/receiveSlotManager.js.map +1 -1
  118. package/dist/multistream/remoteMedia.js +44 -18
  119. package/dist/multistream/remoteMedia.js.map +1 -1
  120. package/dist/multistream/remoteMediaGroup.js +60 -3
  121. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  122. package/dist/multistream/remoteMediaManager.js +173 -59
  123. package/dist/multistream/remoteMediaManager.js.map +1 -1
  124. package/dist/networkQualityMonitor/index.js +4 -2
  125. package/dist/networkQualityMonitor/index.js.map +1 -1
  126. package/dist/reachability/index.js +72 -27
  127. package/dist/reachability/index.js.map +1 -1
  128. package/dist/reachability/request.js +12 -5
  129. package/dist/reachability/request.js.map +1 -1
  130. package/dist/reactions/reactions.js +2 -2
  131. package/dist/reactions/reactions.js.map +1 -1
  132. package/dist/reactions/reactions.type.js +18 -18
  133. package/dist/reactions/reactions.type.js.map +1 -1
  134. package/dist/reconnection-manager/index.js +196 -155
  135. package/dist/reconnection-manager/index.js.map +1 -1
  136. package/dist/recording-controller/index.js +21 -1
  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 +21 -29
  141. package/dist/roap/index.js.map +1 -1
  142. package/dist/roap/request.js +110 -89
  143. package/dist/roap/request.js.map +1 -1
  144. package/dist/roap/turnDiscovery.js +93 -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 +115 -0
  149. package/dist/rtcMetrics/index.js.map +1 -0
  150. package/dist/statsAnalyzer/global.js +1 -93
  151. package/dist/statsAnalyzer/global.js.map +1 -1
  152. package/dist/statsAnalyzer/index.js +326 -311
  153. package/dist/statsAnalyzer/index.js.map +1 -1
  154. package/dist/statsAnalyzer/mqaUtil.js +90 -53
  155. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  156. package/dist/types/annotation/annotation.types.d.ts +42 -0
  157. package/dist/types/annotation/constants.d.ts +31 -0
  158. package/dist/types/annotation/index.d.ts +117 -0
  159. package/dist/types/breakouts/breakout.d.ts +8 -0
  160. package/dist/types/breakouts/collection.d.ts +5 -0
  161. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  162. package/dist/types/breakouts/events.d.ts +8 -0
  163. package/dist/types/breakouts/index.d.ts +5 -0
  164. package/dist/types/breakouts/request.d.ts +22 -0
  165. package/dist/types/breakouts/utils.d.ts +15 -0
  166. package/dist/types/common/browser-detection.d.ts +9 -0
  167. package/dist/types/common/collection.d.ts +48 -0
  168. package/dist/types/common/config.d.ts +2 -0
  169. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  170. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  171. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  172. package/dist/types/common/errors/media.d.ts +15 -0
  173. package/dist/types/common/errors/parameter.d.ts +15 -0
  174. package/dist/types/common/errors/password-error.d.ts +15 -0
  175. package/dist/types/common/errors/permission.d.ts +14 -0
  176. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  177. package/dist/types/common/errors/reconnection.d.ts +15 -0
  178. package/dist/types/common/errors/stats.d.ts +15 -0
  179. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  180. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  181. package/dist/types/common/events/events-scope.d.ts +17 -0
  182. package/dist/types/common/events/events.d.ts +12 -0
  183. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  184. package/dist/types/common/events/util.d.ts +2 -0
  185. package/dist/types/common/logs/logger-config.d.ts +2 -0
  186. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  187. package/dist/types/common/logs/request.d.ts +34 -0
  188. package/dist/types/common/queue.d.ts +34 -0
  189. package/dist/types/config.d.ts +72 -0
  190. package/dist/types/constants.d.ts +1016 -0
  191. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  192. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  193. package/dist/types/controls-options-manager/index.d.ts +136 -0
  194. package/dist/types/controls-options-manager/types.d.ts +43 -0
  195. package/dist/types/controls-options-manager/util.d.ts +1 -0
  196. package/dist/types/index.d.ts +7 -0
  197. package/dist/types/interpretation/collection.d.ts +5 -0
  198. package/dist/types/interpretation/index.d.ts +5 -0
  199. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  200. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  201. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  202. package/dist/types/locus-info/fullState.d.ts +2 -0
  203. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  204. package/dist/types/locus-info/index.d.ts +322 -0
  205. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  206. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  207. package/dist/types/locus-info/parser.d.ts +271 -0
  208. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  209. package/dist/types/media/index.d.ts +34 -0
  210. package/dist/types/media/properties.d.ts +93 -0
  211. package/dist/types/media/util.d.ts +2 -0
  212. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  213. package/dist/types/meeting/in-meeting-actions.d.ts +153 -0
  214. package/dist/types/meeting/index.d.ts +1471 -0
  215. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  216. package/dist/types/meeting/muteState.d.ts +184 -0
  217. package/dist/types/meeting/request.d.ts +257 -0
  218. package/dist/types/meeting/request.type.d.ts +11 -0
  219. package/dist/types/meeting/state.d.ts +9 -0
  220. package/dist/types/meeting/util.d.ts +78 -0
  221. package/dist/types/meeting-info/collection.d.ts +20 -0
  222. package/dist/types/meeting-info/index.d.ts +62 -0
  223. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  224. package/dist/types/meeting-info/request.d.ts +22 -0
  225. package/dist/types/meeting-info/util.d.ts +2 -0
  226. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  227. package/dist/types/meetings/collection.d.ts +31 -0
  228. package/dist/types/meetings/index.d.ts +367 -0
  229. package/dist/types/meetings/meetings.types.d.ts +4 -0
  230. package/dist/types/meetings/request.d.ts +27 -0
  231. package/dist/types/meetings/util.d.ts +18 -0
  232. package/dist/types/member/index.d.ts +159 -0
  233. package/dist/types/member/types.d.ts +32 -0
  234. package/dist/types/member/util.d.ts +2 -0
  235. package/dist/types/members/collection.d.ts +29 -0
  236. package/dist/types/members/index.d.ts +353 -0
  237. package/dist/types/members/request.d.ts +114 -0
  238. package/dist/types/members/types.d.ts +24 -0
  239. package/dist/types/members/util.d.ts +210 -0
  240. package/dist/types/metrics/constants.d.ts +55 -0
  241. package/dist/types/metrics/index.d.ts +45 -0
  242. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  243. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  244. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  245. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  246. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  247. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  248. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  249. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  250. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  251. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  252. package/dist/types/reachability/index.d.ts +152 -0
  253. package/dist/types/reachability/request.d.ts +37 -0
  254. package/dist/types/reactions/constants.d.ts +3 -0
  255. package/dist/types/reactions/reactions.d.ts +4 -0
  256. package/dist/types/reactions/reactions.type.d.ts +52 -0
  257. package/dist/types/reconnection-manager/index.d.ts +126 -0
  258. package/dist/types/recording-controller/enums.d.ts +7 -0
  259. package/dist/types/recording-controller/index.d.ts +208 -0
  260. package/dist/types/recording-controller/util.d.ts +14 -0
  261. package/dist/types/roap/index.d.ts +77 -0
  262. package/dist/types/roap/request.d.ts +36 -0
  263. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  264. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  265. package/dist/types/rtcMetrics/index.d.ts +46 -0
  266. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  267. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  268. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  269. package/dist/types/transcription/index.d.ts +64 -0
  270. package/package.json +25 -22
  271. package/src/annotation/annotation.types.ts +50 -0
  272. package/src/annotation/constants.ts +36 -0
  273. package/src/annotation/index.ts +328 -0
  274. package/src/breakouts/README.md +44 -14
  275. package/src/breakouts/breakout.ts +87 -9
  276. package/src/breakouts/edit-lock-error.ts +25 -0
  277. package/src/breakouts/events.ts +56 -0
  278. package/src/breakouts/index.ts +710 -10
  279. package/src/breakouts/request.ts +55 -0
  280. package/src/breakouts/utils.ts +57 -0
  281. package/src/common/errors/webex-errors.ts +6 -2
  282. package/src/common/logs/logger-proxy.ts +1 -1
  283. package/src/common/queue.ts +22 -8
  284. package/src/config.ts +2 -7
  285. package/src/constants.ts +157 -21
  286. package/src/controls-options-manager/constants.ts +5 -0
  287. package/src/controls-options-manager/enums.ts +18 -0
  288. package/src/controls-options-manager/index.ts +278 -0
  289. package/src/controls-options-manager/types.ts +59 -0
  290. package/src/controls-options-manager/util.ts +300 -0
  291. package/src/index.ts +39 -0
  292. package/src/interpretation/README.md +60 -0
  293. package/src/interpretation/collection.ts +19 -0
  294. package/src/interpretation/index.ts +332 -0
  295. package/src/interpretation/siLanguage.ts +18 -0
  296. package/src/locus-info/controlsUtils.ts +108 -0
  297. package/src/locus-info/index.ts +375 -52
  298. package/src/locus-info/mediaSharesUtils.ts +48 -0
  299. package/src/locus-info/parser.ts +224 -39
  300. package/src/locus-info/selfUtils.ts +81 -5
  301. package/src/media/index.ts +87 -140
  302. package/src/media/properties.ts +49 -90
  303. package/src/mediaQualityMetrics/config.ts +379 -377
  304. package/src/meeting/in-meeting-actions.ts +159 -3
  305. package/src/meeting/index.ts +1980 -2030
  306. package/src/meeting/locusMediaRequest.ts +309 -0
  307. package/src/meeting/muteState.ts +228 -132
  308. package/src/meeting/request.ts +102 -112
  309. package/src/meeting/util.ts +509 -397
  310. package/src/meeting-info/index.ts +54 -8
  311. package/src/meeting-info/meeting-info-v2.ts +148 -14
  312. package/src/meeting-info/utilv2.ts +13 -3
  313. package/src/meetings/collection.ts +20 -0
  314. package/src/meetings/index.ts +392 -84
  315. package/src/meetings/meetings.types.ts +12 -0
  316. package/src/meetings/request.ts +2 -0
  317. package/src/meetings/util.ts +103 -4
  318. package/src/member/index.ts +49 -0
  319. package/src/member/types.ts +38 -0
  320. package/src/member/util.ts +127 -25
  321. package/src/members/collection.ts +8 -0
  322. package/src/members/index.ts +107 -6
  323. package/src/members/request.ts +97 -17
  324. package/src/members/types.ts +28 -0
  325. package/src/members/util.ts +319 -240
  326. package/src/metrics/constants.ts +2 -4
  327. package/src/metrics/index.ts +1 -490
  328. package/src/multistream/mediaRequestManager.ts +289 -79
  329. package/src/multistream/receiveSlot.ts +55 -18
  330. package/src/multistream/receiveSlotManager.ts +46 -24
  331. package/src/multistream/remoteMedia.ts +27 -2
  332. package/src/multistream/remoteMediaGroup.ts +59 -0
  333. package/src/multistream/remoteMediaManager.ts +113 -32
  334. package/src/networkQualityMonitor/index.ts +6 -6
  335. package/src/reachability/index.ts +62 -15
  336. package/src/reachability/request.ts +10 -5
  337. package/src/reactions/reactions.ts +4 -4
  338. package/src/reactions/reactions.type.ts +3 -3
  339. package/src/reconnection-manager/index.ts +68 -43
  340. package/src/recording-controller/index.ts +20 -2
  341. package/src/recording-controller/util.ts +26 -9
  342. package/src/roap/index.ts +21 -30
  343. package/src/roap/request.ts +101 -95
  344. package/src/roap/turnDiscovery.ts +47 -25
  345. package/src/rtcMetrics/constants.ts +3 -0
  346. package/src/rtcMetrics/index.ts +96 -0
  347. package/src/statsAnalyzer/global.ts +1 -94
  348. package/src/statsAnalyzer/index.ts +376 -386
  349. package/src/statsAnalyzer/mqaUtil.ts +100 -99
  350. package/test/integration/spec/converged-space-meetings.js +233 -0
  351. package/test/integration/spec/journey.js +336 -259
  352. package/test/integration/spec/space-meeting.js +77 -4
  353. package/test/unit/spec/annotation/index.ts +418 -0
  354. package/test/unit/spec/breakouts/breakout.ts +142 -24
  355. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  356. package/test/unit/spec/breakouts/events.ts +89 -0
  357. package/test/unit/spec/breakouts/index.ts +1545 -48
  358. package/test/unit/spec/breakouts/request.ts +104 -0
  359. package/test/unit/spec/breakouts/utils.js +72 -0
  360. package/test/unit/spec/common/queue.js +31 -2
  361. package/test/unit/spec/controls-options-manager/index.js +287 -0
  362. package/test/unit/spec/controls-options-manager/util.js +582 -0
  363. package/test/unit/spec/fixture/locus.js +1 -0
  364. package/test/unit/spec/interpretation/collection.ts +15 -0
  365. package/test/unit/spec/interpretation/index.ts +589 -0
  366. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  367. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  368. package/test/unit/spec/locus-info/index.js +1094 -38
  369. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  370. package/test/unit/spec/locus-info/parser.js +62 -22
  371. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  372. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  373. package/test/unit/spec/media/index.ts +138 -28
  374. package/test/unit/spec/meeting/in-meeting-actions.ts +79 -3
  375. package/test/unit/spec/meeting/index.js +3092 -1571
  376. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  377. package/test/unit/spec/meeting/muteState.js +370 -208
  378. package/test/unit/spec/meeting/request.js +338 -43
  379. package/test/unit/spec/meeting/utils.js +449 -53
  380. package/test/unit/spec/meeting-info/index.js +181 -0
  381. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  382. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  383. package/test/unit/spec/meetings/collection.js +14 -0
  384. package/test/unit/spec/meetings/index.js +866 -124
  385. package/test/unit/spec/meetings/utils.js +206 -2
  386. package/test/unit/spec/member/index.js +58 -4
  387. package/test/unit/spec/member/util.js +479 -35
  388. package/test/unit/spec/members/index.js +319 -1
  389. package/test/unit/spec/members/request.js +206 -27
  390. package/test/unit/spec/members/utils.js +184 -0
  391. package/test/unit/spec/metrics/index.js +1 -50
  392. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  393. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  394. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  395. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  396. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  397. package/test/unit/spec/multistream/remoteMediaManager.ts +318 -0
  398. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  399. package/test/unit/spec/reachability/index.ts +125 -8
  400. package/test/unit/spec/reachability/request.js +66 -0
  401. package/test/unit/spec/reconnection-manager/index.js +59 -6
  402. package/test/unit/spec/recording-controller/index.js +294 -218
  403. package/test/unit/spec/recording-controller/util.js +223 -96
  404. package/test/unit/spec/roap/index.ts +26 -51
  405. package/test/unit/spec/roap/request.ts +196 -85
  406. package/test/unit/spec/roap/turnDiscovery.ts +30 -7
  407. package/test/unit/spec/rtcMetrics/index.ts +60 -0
  408. package/test/unit/spec/stats-analyzer/index.js +92 -41
  409. package/test/utils/constants.js +9 -0
  410. package/test/utils/integrationTestUtils.js +46 -0
  411. package/test/utils/testUtils.js +0 -45
  412. package/test/utils/webex-config.js +4 -0
  413. package/test/utils/webex-test-users.js +6 -3
  414. package/dist/meeting/effectsState.js +0 -262
  415. package/dist/meeting/effectsState.js.map +0 -1
  416. package/dist/metrics/config.js +0 -299
  417. package/dist/metrics/config.js.map +0 -1
  418. package/dist/multistream/multistreamMedia.js +0 -110
  419. package/dist/multistream/multistreamMedia.js.map +0 -1
  420. package/src/index.js +0 -15
  421. package/src/meeting/effectsState.ts +0 -211
  422. package/src/metrics/config.ts +0 -495
  423. package/src/multistream/multistreamMedia.ts +0 -97
  424. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -1,30 +1,41 @@
1
- /* eslint-disable prefer-destructuring */
1
+ /* eslint-disable no-param-reassign, prefer-destructuring */
2
2
 
3
3
  import {mean, max} from 'lodash';
4
4
 
5
5
  import {STATS} from '../constants';
6
6
 
7
- export const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSent}) => {
8
- const mediaType = STATS.AUDIO_CORRELATE;
7
+ export const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSent, mediaType}) => {
9
8
  const sendrecvType = STATS.RECEIVE_DIRECTION;
10
9
 
10
+ const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;
11
+ const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;
12
+ const lastPacketsDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesDecoded || 0;
13
+ const lastSamplesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesReceived || 0;
14
+ const lastConcealedSamples = lastMqaDataSent[mediaType]?.[sendrecvType].concealedSamples || 0;
15
+ const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;
16
+ const lastFecPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsReceived || 0;
17
+ const lastFecPacketsDiscarded =
18
+ lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsDiscarded || 0;
19
+
20
+ const {csi} = statsResults[mediaType];
21
+ if (csi && !audioReceiver.streams[0].common.csi.includes(csi)) {
22
+ audioReceiver.streams[0].common.csi.push(csi);
23
+ }
24
+
11
25
  audioReceiver.common.common.direction = statsResults[mediaType].direction;
12
26
  audioReceiver.common.transportType = statsResults.connectionType.remote.transport[0];
27
+
13
28
  // add rtpPacket info inside common as also for call analyzer
14
29
  audioReceiver.common.rtpPackets =
15
- statsResults[mediaType][sendrecvType].totalPacketsReceived -
16
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsReceived || 0;
30
+ statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
17
31
  // Hop by hop are numbers and not percentage so we compare on what we sent the last min
18
32
  // collect the packets received for the last min
19
33
  audioReceiver.streams[0].common.rtpPackets = audioReceiver.common.rtpPackets;
20
34
  audioReceiver.common.mediaHopByHopLost =
21
- statsResults[mediaType][sendrecvType].totalPacketsLost -
22
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;
35
+ statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;
23
36
  audioReceiver.common.rtpHopByHopLost =
24
- statsResults[mediaType][sendrecvType].totalPacketsLost -
25
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;
37
+ statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;
26
38
 
27
- // @ts-ignore
28
39
  audioReceiver.streams[0].common.maxRtpJitter =
29
40
  // @ts-ignore
30
41
  max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;
@@ -35,43 +46,45 @@ export const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSen
35
46
  // Fec packets do come in as part of the FEC only for audio
36
47
  const fecRecovered =
37
48
  statsResults[mediaType][sendrecvType].fecPacketsReceived -
38
- lastMqaDataSent[mediaType][sendrecvType].fecPacketsReceived -
39
- (statsResults[mediaType][sendrecvType].fecPacketsDiscarded -
40
- lastMqaDataSent[mediaType][sendrecvType].fecPacketsDiscarded);
49
+ lastFecPacketsReceived -
50
+ (statsResults[mediaType][sendrecvType].fecPacketsDiscarded - lastFecPacketsDiscarded);
41
51
 
42
52
  audioReceiver.streams[0].common.rtpEndToEndLost =
43
- statsResults[mediaType][sendrecvType].totalPacketsLost -
44
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost -
45
- fecRecovered || 0;
53
+ statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost - fecRecovered || 0;
46
54
 
47
55
  audioReceiver.streams[0].common.framesDropped =
48
- statsResults[mediaType][sendrecvType].totalSamplesDecoded -
49
- lastMqaDataSent[mediaType][sendrecvType].totalSamplesDecoded || 0;
56
+ statsResults[mediaType][sendrecvType].totalSamplesDecoded - lastPacketsDecoded || 0;
50
57
  audioReceiver.streams[0].common.renderedFrameRate =
51
58
  (audioReceiver.streams[0].common.framesDropped * 100) / 60 || 0;
59
+
52
60
  audioReceiver.streams[0].common.framesReceived =
53
- statsResults[mediaType][sendrecvType].totalSamplesReceived -
54
- lastMqaDataSent[mediaType][sendrecvType].totalSamplesReceived || 0;
61
+ statsResults[mediaType][sendrecvType].totalSamplesReceived - lastSamplesReceived || 0;
55
62
  audioReceiver.streams[0].common.concealedFrames =
56
- statsResults[mediaType][sendrecvType].concealedSamples -
57
- lastMqaDataSent[mediaType][sendrecvType].concealedSamples || 0;
63
+ statsResults[mediaType][sendrecvType].concealedSamples - lastConcealedSamples || 0;
58
64
  audioReceiver.streams[0].common.receivedBitrate =
59
- ((statsResults[mediaType][sendrecvType].totalBytesReceived -
60
- lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived) *
61
- 8) /
62
- 60 || 0;
65
+ ((statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived) * 8) / 60 || 0;
63
66
 
64
67
  audioReceiver.common.rtpBitrate = audioReceiver.streams[0].common.receivedBitrate;
65
68
  };
66
69
 
67
- export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent}) => {
68
- const mediaType = STATS.AUDIO_CORRELATE;
70
+ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent, mediaType}) => {
69
71
  const sendrecvType = STATS.SEND_DIRECTION;
70
72
 
73
+ const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;
74
+ const lastPacketsLost =
75
+ lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;
76
+ const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;
77
+ const lastFramesEncoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;
78
+ const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;
79
+
80
+ const {csi} = statsResults[mediaType];
81
+ if (csi && !audioSender.streams[0].common.csi.includes(csi)) {
82
+ audioSender.streams[0].common.csi.push(csi);
83
+ }
84
+
71
85
  audioSender.common.common.direction = statsResults[mediaType].direction;
72
86
  audioSender.common.transportType = statsResults.connectionType.local.transport[0];
73
87
 
74
- // @ts-ignore
75
88
  audioSender.common.maxRemoteJitter =
76
89
  // @ts-ignore
77
90
  max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
@@ -79,8 +92,7 @@ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent})
79
92
  mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
80
93
 
81
94
  audioSender.common.rtpPackets =
82
- statsResults[mediaType][sendrecvType].totalPacketsSent -
83
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;
95
+ statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
84
96
  audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;
85
97
  // From candidate-pair
86
98
  audioSender.common.availableBitrate =
@@ -88,15 +100,13 @@ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent})
88
100
  // Calculate based on how much packets lost of received compated to how to the client sent
89
101
 
90
102
  const totalpacketsLostForaMin =
91
- statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver -
92
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver;
103
+ statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;
93
104
 
94
105
  audioSender.common.remoteLossRate =
95
106
  totalpacketsLostForaMin > 0
96
107
  ? (totalpacketsLostForaMin * 100) / audioSender.common.rtpPackets
97
108
  : 0; // This is the packets sent with in last min || 0;
98
109
 
99
- // @ts-ignore
100
110
  audioSender.common.maxRoundTripTime =
101
111
  // @ts-ignore
102
112
  max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
@@ -105,9 +115,7 @@ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent})
105
115
  audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;
106
116
 
107
117
  // Calculate the outgoing bitrate
108
- const totalBytesSentInaMin =
109
- statsResults[mediaType][sendrecvType].totalBytesSent -
110
- lastMqaDataSent[mediaType][sendrecvType].totalBytesSent;
118
+ const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;
111
119
 
112
120
  audioSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin
113
121
  ? (totalBytesSentInaMin * 8) / 60
@@ -115,33 +123,37 @@ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent})
115
123
  audioSender.common.rtpBitrate = audioSender.streams[0].common.transmittedBitrate;
116
124
 
117
125
  audioSender.streams[0].transmittedKeyFrames =
118
- statsResults[mediaType][sendrecvType].totalKeyFramesEncoded -
119
- lastMqaDataSent[mediaType][sendrecvType].totalKeyFramesEncoded || 0;
126
+ statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastFramesEncoded || 0;
120
127
  audioSender.streams[0].requestedKeyFrames =
121
- statsResults[mediaType][sendrecvType].totalFirCount -
122
- lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0;
128
+ statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;
123
129
  };
124
130
 
125
- export const getVideoReceiverMqa = ({
126
- videoReceiver,
127
- statsResults,
128
- lastMqaDataSent,
129
- isShareStream = false,
130
- }) => {
131
- const mediaType = isShareStream ? STATS.SHARE_CORRELATE : STATS.VIDEO_CORRELATE;
131
+ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSent, mediaType}) => {
132
132
  const sendrecvType = STATS.RECEIVE_DIRECTION;
133
133
 
134
+ const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;
135
+ const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;
136
+ const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;
137
+ const lastFramesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].framesReceived || 0;
138
+ const lastFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].framesDecoded || 0;
139
+ const lastFramesDropped = lastMqaDataSent[mediaType]?.[sendrecvType].framesDropped || 0;
140
+ const lastKeyFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].keyFramesDecoded || 0;
141
+ const lastPliCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalPliCount || 0;
142
+
143
+ const {csi} = statsResults[mediaType];
144
+ if (csi && !videoReceiver.streams[0].common.csi.includes(csi)) {
145
+ videoReceiver.streams[0].common.csi.push(csi);
146
+ }
147
+
134
148
  videoReceiver.common.common.direction = statsResults[mediaType].direction;
135
149
  videoReceiver.common.transportType = statsResults.connectionType.remote.transport[0];
136
150
  // collect the packets received for the last min
137
151
  videoReceiver.common.rtpPackets =
138
- statsResults[mediaType][sendrecvType].totalPacketsReceived -
139
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsReceived || 0;
152
+ statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
140
153
  videoReceiver.streams[0].common.rtpPackets = videoReceiver.common.rtpPackets;
141
154
 
142
155
  const totalPacketLoss =
143
- statsResults[mediaType][sendrecvType].totalPacketsLost -
144
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;
156
+ statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;
145
157
 
146
158
  // Hope by hop are numbers and not percentage so we compare on what we sent the last min
147
159
  // this is including packet lost
@@ -153,7 +165,6 @@ export const getVideoReceiverMqa = ({
153
165
 
154
166
  // calculate this values
155
167
 
156
- // @ts-ignore
157
168
  videoReceiver.common.maxRemoteJitter =
158
169
  // @ts-ignore
159
170
  max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
@@ -161,12 +172,11 @@ export const getVideoReceiverMqa = ({
161
172
  mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
162
173
 
163
174
  videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;
164
- // videoReceiver.streams[0].common.rtpJitter = (statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay - lastMqaDataSent.resolutions[mediaType][sendrecvType].jitterBufferDelay) / (statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount - lastMqaDataSent.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount) * 1000 || 0;
175
+ // videoReceiver.streams[0].common.rtpJitter = (statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay - lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].jitterBufferDelay) / (statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount - lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].jitterBufferEmittedCount) * 1000 || 0;
165
176
 
166
177
  // Calculate the outgoing bitrate
167
178
  const totalBytesReceivedInaMin =
168
- statsResults[mediaType][sendrecvType].totalBytesReceived -
169
- lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived;
179
+ statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived;
170
180
 
171
181
  videoReceiver.streams[0].common.receivedBitrate = totalBytesReceivedInaMin
172
182
  ? (totalBytesReceivedInaMin * 8) / 60
@@ -175,11 +185,9 @@ export const getVideoReceiverMqa = ({
175
185
 
176
186
  // From tracks //TODO: calculate a proper one
177
187
  const totalFrameReceivedInaMin =
178
- statsResults.resolutions[mediaType][sendrecvType].framesReceived -
179
- lastMqaDataSent.resolutions[mediaType][sendrecvType].framesReceived;
188
+ statsResults.resolutions[mediaType][sendrecvType].framesReceived - lastFramesReceived;
180
189
  const totalFrameDecodedInaMin =
181
- statsResults.resolutions[mediaType][sendrecvType].framesDecoded -
182
- lastMqaDataSent.resolutions[mediaType][sendrecvType].framesDecoded;
190
+ statsResults.resolutions[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;
183
191
 
184
192
  videoReceiver.streams[0].common.receivedFrameRate = totalFrameReceivedInaMin
185
193
  ? (totalFrameReceivedInaMin * 100) / 60
@@ -189,33 +197,36 @@ export const getVideoReceiverMqa = ({
189
197
  : 0;
190
198
 
191
199
  videoReceiver.streams[0].common.framesDropped =
192
- statsResults.resolutions[mediaType][sendrecvType].framesDropped -
193
- lastMqaDataSent.resolutions[mediaType][sendrecvType].framesDropped;
200
+ statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastFramesDropped;
194
201
  videoReceiver.streams[0].receivedHeight =
195
- statsResults.resolutions[mediaType][sendrecvType].height;
196
- videoReceiver.streams[0].receivedWidth = statsResults.resolutions[mediaType][sendrecvType].width;
202
+ statsResults.resolutions[mediaType][sendrecvType].height || 0;
203
+ videoReceiver.streams[0].receivedWidth =
204
+ statsResults.resolutions[mediaType][sendrecvType].width || 0;
197
205
  videoReceiver.streams[0].receivedFrameSize =
198
- (statsResults.resolutions[mediaType][sendrecvType].height *
199
- statsResults.resolutions[mediaType][sendrecvType].height) /
200
- 256;
206
+ (videoReceiver.streams[0].receivedHeight * videoReceiver.streams[0].receivedWidth) / 256;
201
207
 
202
208
  videoReceiver.streams[0].receivedKeyFrames =
203
- statsResults[mediaType][sendrecvType].keyFramesDecoded -
204
- lastMqaDataSent[mediaType][sendrecvType].keyFramesDecoded || 0;
209
+ statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;
205
210
  videoReceiver.streams[0].requestedKeyFrames =
206
- statsResults[mediaType][sendrecvType].totalPliCount -
207
- lastMqaDataSent[mediaType][sendrecvType].totalPliCount || 0;
211
+ statsResults[mediaType][sendrecvType].totalPliCount - lastPliCount || 0;
208
212
  };
209
213
 
210
- export const getVideoSenderMqa = ({
211
- videoSender,
212
- statsResults,
213
- lastMqaDataSent,
214
- isShareStream = false,
215
- }) => {
216
- const mediaType = isShareStream ? STATS.SHARE_CORRELATE : STATS.VIDEO_CORRELATE;
214
+ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, mediaType}) => {
217
215
  const sendrecvType = STATS.SEND_DIRECTION;
218
216
 
217
+ const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;
218
+ const lastPacketsLost =
219
+ lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;
220
+ const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;
221
+ const lastKeyFramesEncoded =
222
+ lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;
223
+ const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;
224
+ const lastFramesSent = lastMqaDataSent[mediaType]?.[sendrecvType].framesSent || 0;
225
+ const {csi} = statsResults[mediaType];
226
+ if (csi && !videoSender.streams[0].common.csi.includes(csi)) {
227
+ videoSender.streams[0].common.csi.push(csi);
228
+ }
229
+
219
230
  videoSender.common.common.direction = statsResults[mediaType].direction;
220
231
  videoSender.common.transportType = statsResults.connectionType.local.transport[0];
221
232
 
@@ -227,22 +238,19 @@ export const getVideoSenderMqa = ({
227
238
  mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
228
239
 
229
240
  videoSender.common.rtpPackets =
230
- statsResults[mediaType][sendrecvType].totalPacketsSent -
231
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;
241
+ statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
232
242
  videoSender.common.availableBitrate =
233
243
  statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;
234
244
  // Calculate based on how much packets lost of received compated to how to the client sent
235
245
 
236
246
  const totalpacketsLostForaMin =
237
- statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver -
238
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver;
247
+ statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;
239
248
 
240
249
  videoSender.common.remoteLossRate =
241
250
  totalpacketsLostForaMin > 0
242
251
  ? (totalpacketsLostForaMin * 100) / (videoSender.common.rtpPackets + totalpacketsLostForaMin)
243
252
  : 0; // This is the packets sent with in last min || 0;
244
253
 
245
- // @ts-ignore
246
254
  videoSender.common.maxRoundTripTime =
247
255
  // @ts-ignore
248
256
  max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
@@ -251,13 +259,10 @@ export const getVideoSenderMqa = ({
251
259
  videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;
252
260
 
253
261
  videoSender.streams[0].common.rtpPackets =
254
- statsResults[mediaType][sendrecvType].totalPacketsSent -
255
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;
262
+ statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
256
263
 
257
264
  // Calculate the outgoing bitrate
258
- const totalBytesSentInaMin =
259
- statsResults[mediaType][sendrecvType].totalBytesSent -
260
- lastMqaDataSent[mediaType][sendrecvType].totalBytesSent;
265
+ const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;
261
266
 
262
267
  videoSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin
263
268
  ? (totalBytesSentInaMin * 8) / 60
@@ -266,25 +271,21 @@ export const getVideoSenderMqa = ({
266
271
  videoSender.common.rtpBitrate = videoSender.streams[0].common.transmittedBitrate;
267
272
 
268
273
  videoSender.streams[0].transmittedKeyFrames =
269
- statsResults[mediaType][sendrecvType].totalKeyFramesEncoded -
270
- lastMqaDataSent[mediaType][sendrecvType].totalKeyFramesEncoded || 0;
274
+ statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastKeyFramesEncoded || 0;
271
275
  videoSender.streams[0].requestedKeyFrames =
272
- statsResults[mediaType][sendrecvType].totalFirCount -
273
- lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0;
276
+ statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;
274
277
 
275
278
  // From tracks //TODO: calculate a proper one
276
279
  const totalFrameSentInaMin =
277
- statsResults.resolutions[mediaType][sendrecvType].framesSent -
278
- (lastMqaDataSent.resolutions[mediaType][sendrecvType].framesSent || 0);
280
+ statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);
279
281
 
280
282
  videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin
281
283
  ? (totalFrameSentInaMin * 100) / 60
282
284
  : 0;
283
285
  videoSender.streams[0].transmittedHeight =
284
- statsResults.resolutions[mediaType][sendrecvType].height;
285
- videoSender.streams[0].transmittedWidth = statsResults.resolutions[mediaType][sendrecvType].width;
286
+ statsResults.resolutions[mediaType][sendrecvType].height || 0;
287
+ videoSender.streams[0].transmittedWidth =
288
+ statsResults.resolutions[mediaType][sendrecvType].width || 0;
286
289
  videoSender.streams[0].transmittedFrameSize =
287
- (statsResults.resolutions[mediaType][sendrecvType].height *
288
- statsResults.resolutions[mediaType][sendrecvType].width) /
289
- 254;
290
+ (videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;
290
291
  };
@@ -0,0 +1,233 @@
1
+ import { config } from 'dotenv';
2
+ import 'jsdom-global/register';
3
+ import {assert} from '@webex/test-helper-chai';
4
+ import {skipInNode} from '@webex/test-helper-mocha';
5
+ import BrowserDetection from '@webex/plugin-meetings/dist/common/browser-detection';
6
+ import {createCameraTrack, createMicrophoneTrack} from '@webex/plugin-meetings';
7
+
8
+ import {MEDIA_SERVERS} from '../../utils/constants';
9
+ import testUtils from '../../utils/testUtils';
10
+ import integrationTestUtils from '../../utils/integrationTestUtils';
11
+ import webexTestUsers from '../../utils/webex-test-users';
12
+
13
+ config();
14
+
15
+ const localTracks = {
16
+ alice: {
17
+ microphone: undefined,
18
+ camera: undefined,
19
+ },
20
+ bob: {
21
+ microphone: undefined,
22
+ camera: undefined,
23
+ },
24
+ chris: {
25
+ microphone: undefined,
26
+ camera: undefined,
27
+ },
28
+ };
29
+
30
+ skipInNode(describe)('plugin-meetings', () => {
31
+ const {isBrowser} = BrowserDetection();
32
+
33
+ // `addMedia()` fails on FF, this needs to be debuged and fixed in a later change
34
+ if (!isBrowser('firefox')) {
35
+ describe('converged-space-meeting', () => {
36
+ let shouldSkip = false;
37
+ let users, alice, bob, chris;
38
+ let meeting = null;
39
+ let space = null;
40
+ let mediaReadyListener = null;
41
+
42
+ before('setup users', async () => {
43
+ const userSet = await webexTestUsers.generateTestUsers({
44
+ count: 3,
45
+ whistler: process.env.WHISTLER || process.env.JENKINS,
46
+ config
47
+ });
48
+
49
+ users = userSet;
50
+ alice = users[0];
51
+ bob = users[1];
52
+ chris = users[2];
53
+ alice.name = 'alice';
54
+ bob.name = 'bob';
55
+ chris.name = 'chris';
56
+
57
+ const aliceSync = testUtils.syncAndEndMeeting(alice);
58
+ const bobSync = testUtils.syncAndEndMeeting(bob);
59
+ const chrisSync = testUtils.syncAndEndMeeting(chris);
60
+
61
+ await aliceSync;
62
+ await bobSync;
63
+ await chrisSync;
64
+ });
65
+
66
+ // Skip a test in this series if one failed.
67
+ // This beforeEach() instance function must use the `function` declaration to preserve the
68
+ // `this` context. `() => {}` will not generate the correct `this` context
69
+ beforeEach('check if should skip test', function() {
70
+ if (shouldSkip) {
71
+ this.skip();
72
+ }
73
+ });
74
+
75
+ // Store to the describe scope if a test has failed for skipping.
76
+ // This beforeEach() instance function must use the `function` declaration to preserve the
77
+ // `this` context. `() => {}` will not generate the correct `this` context
78
+ afterEach('check if test failed', function() {
79
+ if (this.currentTest.state === 'failed') {
80
+ shouldSkip = true;
81
+ }
82
+ });
83
+
84
+ it('user "alice" starts a space', async () => {
85
+ const conversation = await alice.webex.internal.conversation.create({
86
+ participants: [bob, chris],
87
+ });
88
+
89
+ assert.lengthOf(conversation.participants.items, 3);
90
+ assert.lengthOf(conversation.activities.items, 1);
91
+
92
+ space = conversation;
93
+
94
+ const destinationWithType = await alice.webex.meetings.meetingInfo.fetchMeetingInfo(space.url, 'CONVERSATION_URL');
95
+ const destinationWithoutType = await alice.webex.meetings.meetingInfo.fetchMeetingInfo(space.url);
96
+
97
+ assert.exists(destinationWithoutType);
98
+ assert.exists(destinationWithType);
99
+ assert.exists(destinationWithoutType.body.meetingNumber);
100
+ assert.exists(destinationWithType.body.meetingNumber);
101
+ });
102
+
103
+ it('user "alice" starts a meeting', async () => {
104
+ const wait = testUtils.waitForEvents([{
105
+ scope: alice.webex.meetings,
106
+ event: 'meeting:added',
107
+ user: alice,
108
+ }]);
109
+
110
+ const createdMeeting = await testUtils.delayedPromise(alice.webex.meetings.create(space.url));
111
+
112
+ await wait;
113
+
114
+ assert.exists(createdMeeting);
115
+
116
+ meeting = createdMeeting;
117
+ });
118
+
119
+ it('user "alice" joins the meeting', async () => {
120
+ const wait = testUtils.waitForEvents([
121
+ {scope: bob.webex.meetings, event: 'meeting:added', user: bob},
122
+ {scope: chris.webex.meetings, event: 'meeting:added', user: chris},
123
+ ]);
124
+
125
+ await testUtils.delayedPromise(alice.meeting.join({enableMultistream: true}));
126
+
127
+ await wait;
128
+
129
+ assert.isTrue(!!alice.webex.meetings.meetingCollection.meetings[meeting.id].joinedWith);
130
+ });
131
+
132
+ it('users "bob" and "chris" join the meeting', async () => {
133
+ await testUtils.waitForStateChange(alice.meeting, 'JOINED');
134
+
135
+ const bobIdle = testUtils.waitForStateChange(bob.meeting, 'IDLE');
136
+ const chrisIdle = testUtils.waitForStateChange(chris.meeting, 'IDLE');
137
+
138
+ await bobIdle;
139
+ await chrisIdle;
140
+
141
+ const bobJoined = testUtils.waitForStateChange(bob.meeting, 'JOINED');
142
+ const chrisJoined = testUtils.waitForStateChange(chris.meeting, 'JOINED');
143
+ const bobJoin = bob.meeting.join({enableMultistream: true});
144
+ const chrisJoin = chris.meeting.join({enableMultistream: true});
145
+
146
+ await bobJoin;
147
+ await chrisJoin;
148
+ await bobJoined;
149
+ await chrisJoined;
150
+
151
+ assert.exists(bob.meeting.joinedWith);
152
+ assert.exists(chris.meeting.joinedWith);
153
+ });
154
+
155
+ it('users "alice", "bob", and "chris" create local tracks', async () => {
156
+ localTracks.alice.microphone = await createMicrophoneTrack();
157
+ localTracks.alice.camera = await createCameraTrack();
158
+
159
+ localTracks.bob.microphone = await createMicrophoneTrack();
160
+ localTracks.bob.camera = await createCameraTrack();
161
+
162
+ localTracks.chris.microphone = await createMicrophoneTrack();
163
+ localTracks.chris.camera = await createCameraTrack();
164
+ });
165
+
166
+ it('users "alice", "bob", and "chris" add media', async () => {
167
+ mediaReadyListener = testUtils.waitForEvents([
168
+ {scope: alice.meeting, event: 'media:negotiated'},
169
+ {scope: bob.meeting, event: 'media:negotiated'},
170
+ {scope: chris.meeting, event: 'media:negotiated'},
171
+ ]);
172
+
173
+ const addMediaAlice = integrationTestUtils.addMedia(alice, {multistream: true, microphone: localTracks.alice.microphone, camera: localTracks.alice.camera});
174
+ const addMediaBob = integrationTestUtils.addMedia(bob, {multistream: true, microphone: localTracks.bob.microphone, camera: localTracks.bob.camera});
175
+ const addMediaChris = integrationTestUtils.addMedia(chris, {multistream: true, microphone: localTracks.chris.microphone, camera: localTracks.chris.camera});
176
+
177
+ await addMediaAlice;
178
+ await addMediaBob;
179
+ await addMediaChris;
180
+
181
+ assert.isTrue(alice.meeting.mediaProperties.mediaDirection.sendAudio);
182
+ assert.isTrue(alice.meeting.mediaProperties.mediaDirection.sendVideo);
183
+ assert.isTrue(alice.meeting.mediaProperties.mediaDirection.receiveAudio);
184
+ assert.isTrue(alice.meeting.mediaProperties.mediaDirection.receiveVideo);
185
+ assert.isTrue(bob.meeting.mediaProperties.mediaDirection.sendAudio);
186
+ assert.isTrue(bob.meeting.mediaProperties.mediaDirection.sendVideo);
187
+ assert.isTrue(bob.meeting.mediaProperties.mediaDirection.receiveAudio);
188
+ assert.isTrue(bob.meeting.mediaProperties.mediaDirection.receiveVideo);
189
+ assert.isTrue(chris.meeting.mediaProperties.mediaDirection.sendAudio);
190
+ assert.isTrue(chris.meeting.mediaProperties.mediaDirection.sendVideo);
191
+ assert.isTrue(chris.meeting.mediaProperties.mediaDirection.receiveAudio);
192
+ assert.isTrue(chris.meeting.mediaProperties.mediaDirection.receiveVideo);
193
+ });
194
+
195
+ it(`users "alice", "bob", and "chris" should be using the "${MEDIA_SERVERS.HOMER}" media server`, async () => {
196
+ await mediaReadyListener;
197
+
198
+ assert.equal(alice.meeting.mediaProperties.webrtcMediaConnection.mediaServer, MEDIA_SERVERS.HOMER);
199
+ assert.equal(bob.meeting.mediaProperties.webrtcMediaConnection.mediaServer, MEDIA_SERVERS.HOMER);
200
+ assert.equal(chris.meeting.mediaProperties.webrtcMediaConnection.mediaServer, MEDIA_SERVERS.HOMER);
201
+ });
202
+
203
+ it('users "alice", "bob", and "chris" stop their local tracks', () => {
204
+ if (localTracks.alice.microphone) {
205
+ localTracks.alice.microphone.stop();
206
+ localTracks.alice.microphone = undefined;
207
+ }
208
+ if (localTracks.alice.camera) {
209
+ localTracks.alice.camera.stop();
210
+ localTracks.alice.camera = undefined;
211
+ }
212
+
213
+ if (localTracks.bob.microphone) {
214
+ localTracks.bob.microphone.stop();
215
+ localTracks.bob.microphone = undefined;
216
+ }
217
+ if (localTracks.bob.camera) {
218
+ localTracks.bob.camera.stop();
219
+ localTracks.bob.camera = undefined;
220
+ }
221
+
222
+ if (localTracks.chris.microphone) {
223
+ localTracks.chris.microphone.stop();
224
+ localTracks.chris.microphone = undefined;
225
+ }
226
+ if (localTracks.chris.camera) {
227
+ localTracks.chris.camera.stop();
228
+ localTracks.chris.camera = undefined;
229
+ }
230
+ });
231
+ });
232
+ }
233
+ });