@webex/plugin-meetings 3.0.0-beta.16 → 3.0.0-beta.161

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 -1
  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 +359 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +212 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +23 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +52 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +43 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1046 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +78 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +67 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +3 -2
  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/config.js +6 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +175 -26
  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 +300 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +77 -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 +214 -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 +92 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +317 -24
  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 +2 -1
  55. package/dist/locus-info/parser.js.map +1 -1
  56. package/dist/locus-info/selfUtils.js +97 -14
  57. package/dist/locus-info/selfUtils.js.map +1 -1
  58. package/dist/media/index.js +39 -134
  59. package/dist/media/index.js.map +1 -1
  60. package/dist/media/properties.js +19 -97
  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 +79 -1
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +2349 -2178
  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 +191 -167
  73. package/dist/meeting/request.js.map +1 -1
  74. package/dist/meeting/request.type.js.map +1 -1
  75. package/dist/meeting/util.js +444 -443
  76. package/dist/meeting/util.js.map +1 -1
  77. package/dist/meeting-info/meeting-info-v2.js +157 -49
  78. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  79. package/dist/meeting-info/utilv2.js +20 -5
  80. package/dist/meeting-info/utilv2.js.map +1 -1
  81. package/dist/meetings/collection.js +22 -0
  82. package/dist/meetings/collection.js.map +1 -1
  83. package/dist/meetings/index.js +365 -73
  84. package/dist/meetings/index.js.map +1 -1
  85. package/dist/meetings/meetings.types.js +7 -0
  86. package/dist/meetings/meetings.types.js.map +1 -0
  87. package/dist/meetings/request.js +16 -12
  88. package/dist/meetings/request.js.map +1 -1
  89. package/dist/meetings/util.js +88 -1
  90. package/dist/meetings/util.js.map +1 -1
  91. package/dist/member/index.js +43 -0
  92. package/dist/member/index.js.map +1 -1
  93. package/dist/member/types.js +15 -0
  94. package/dist/member/types.js.map +1 -0
  95. package/dist/member/util.js +97 -3
  96. package/dist/member/util.js.map +1 -1
  97. package/dist/members/collection.js +10 -0
  98. package/dist/members/collection.js.map +1 -1
  99. package/dist/members/index.js +94 -11
  100. package/dist/members/index.js.map +1 -1
  101. package/dist/members/request.js +109 -39
  102. package/dist/members/request.js.map +1 -1
  103. package/dist/members/types.js +15 -0
  104. package/dist/members/types.js.map +1 -0
  105. package/dist/members/util.js +316 -233
  106. package/dist/members/util.js.map +1 -1
  107. package/dist/metrics/config.js +50 -14
  108. package/dist/metrics/config.js.map +1 -1
  109. package/dist/metrics/constants.js +3 -5
  110. package/dist/metrics/constants.js.map +1 -1
  111. package/dist/metrics/index.js +48 -29
  112. package/dist/metrics/index.js.map +1 -1
  113. package/dist/multistream/mediaRequestManager.js +265 -36
  114. package/dist/multistream/mediaRequestManager.js.map +1 -1
  115. package/dist/multistream/receiveSlot.js +52 -19
  116. package/dist/multistream/receiveSlot.js.map +1 -1
  117. package/dist/multistream/receiveSlotManager.js +53 -33
  118. package/dist/multistream/receiveSlotManager.js.map +1 -1
  119. package/dist/multistream/remoteMedia.js +44 -18
  120. package/dist/multistream/remoteMedia.js.map +1 -1
  121. package/dist/multistream/remoteMediaGroup.js +60 -3
  122. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  123. package/dist/multistream/remoteMediaManager.js +322 -103
  124. package/dist/multistream/remoteMediaManager.js.map +1 -1
  125. package/dist/networkQualityMonitor/index.js +4 -2
  126. package/dist/networkQualityMonitor/index.js.map +1 -1
  127. package/dist/reachability/index.js +117 -60
  128. package/dist/reachability/index.js.map +1 -1
  129. package/dist/reachability/request.js +12 -5
  130. package/dist/reachability/request.js.map +1 -1
  131. package/dist/reactions/constants.js +13 -0
  132. package/dist/reactions/constants.js.map +1 -0
  133. package/dist/reactions/reactions.js +2 -2
  134. package/dist/reactions/reactions.js.map +1 -1
  135. package/dist/reactions/reactions.type.js +18 -18
  136. package/dist/reactions/reactions.type.js.map +1 -1
  137. package/dist/reconnection-manager/index.js +190 -145
  138. package/dist/reconnection-manager/index.js.map +1 -1
  139. package/dist/recording-controller/enums.js +17 -0
  140. package/dist/recording-controller/enums.js.map +1 -0
  141. package/dist/recording-controller/index.js +343 -0
  142. package/dist/recording-controller/index.js.map +1 -0
  143. package/dist/recording-controller/util.js +63 -0
  144. package/dist/recording-controller/util.js.map +1 -0
  145. package/dist/roap/index.js +21 -29
  146. package/dist/roap/index.js.map +1 -1
  147. package/dist/roap/request.js +127 -92
  148. package/dist/roap/request.js.map +1 -1
  149. package/dist/roap/turnDiscovery.js +135 -53
  150. package/dist/roap/turnDiscovery.js.map +1 -1
  151. package/dist/statsAnalyzer/global.js +1 -93
  152. package/dist/statsAnalyzer/global.js.map +1 -1
  153. package/dist/statsAnalyzer/index.js +329 -314
  154. package/dist/statsAnalyzer/index.js.map +1 -1
  155. package/dist/statsAnalyzer/mqaUtil.js +103 -54
  156. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  157. package/dist/types/annotation/annotation.types.d.ts +43 -0
  158. package/dist/types/annotation/constants.d.ts +31 -0
  159. package/dist/types/annotation/index.d.ts +124 -0
  160. package/dist/types/breakouts/breakout.d.ts +8 -0
  161. package/dist/types/breakouts/collection.d.ts +5 -0
  162. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  163. package/dist/types/breakouts/events.d.ts +2 -0
  164. package/dist/types/breakouts/index.d.ts +5 -0
  165. package/dist/types/breakouts/request.d.ts +22 -0
  166. package/dist/types/breakouts/utils.d.ts +15 -0
  167. package/dist/types/common/browser-detection.d.ts +9 -0
  168. package/dist/types/common/collection.d.ts +48 -0
  169. package/dist/types/common/config.d.ts +2 -0
  170. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  171. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  172. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  173. package/dist/types/common/errors/media.d.ts +15 -0
  174. package/dist/types/common/errors/parameter.d.ts +15 -0
  175. package/dist/types/common/errors/password-error.d.ts +15 -0
  176. package/dist/types/common/errors/permission.d.ts +14 -0
  177. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  178. package/dist/types/common/errors/reconnection.d.ts +15 -0
  179. package/dist/types/common/errors/stats.d.ts +15 -0
  180. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  181. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  182. package/dist/types/common/events/events-scope.d.ts +17 -0
  183. package/dist/types/common/events/events.d.ts +12 -0
  184. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  185. package/dist/types/common/events/util.d.ts +2 -0
  186. package/dist/types/common/logs/logger-config.d.ts +2 -0
  187. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  188. package/dist/types/common/logs/request.d.ts +34 -0
  189. package/dist/types/common/queue.d.ts +32 -0
  190. package/dist/types/config.d.ts +72 -0
  191. package/dist/types/constants.d.ts +987 -0
  192. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  193. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  194. package/dist/types/controls-options-manager/index.d.ts +136 -0
  195. package/dist/types/controls-options-manager/types.d.ts +43 -0
  196. package/dist/types/controls-options-manager/util.d.ts +1 -0
  197. package/dist/types/index.d.ts +7 -0
  198. package/dist/types/interpretation/collection.d.ts +5 -0
  199. package/dist/types/interpretation/index.d.ts +5 -0
  200. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  201. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  202. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  203. package/dist/types/locus-info/fullState.d.ts +2 -0
  204. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  205. package/dist/types/locus-info/index.d.ts +315 -0
  206. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  207. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  208. package/dist/types/locus-info/parser.d.ts +212 -0
  209. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  210. package/dist/types/media/index.d.ts +34 -0
  211. package/dist/types/media/properties.d.ts +86 -0
  212. package/dist/types/media/util.d.ts +2 -0
  213. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  214. package/dist/types/meeting/in-meeting-actions.d.ts +149 -0
  215. package/dist/types/meeting/index.d.ts +1524 -0
  216. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  217. package/dist/types/meeting/muteState.d.ts +184 -0
  218. package/dist/types/meeting/request.d.ts +270 -0
  219. package/dist/types/meeting/request.type.d.ts +11 -0
  220. package/dist/types/meeting/state.d.ts +9 -0
  221. package/dist/types/meeting/util.d.ts +75 -0
  222. package/dist/types/meeting-info/collection.d.ts +20 -0
  223. package/dist/types/meeting-info/index.d.ts +57 -0
  224. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  225. package/dist/types/meeting-info/request.d.ts +22 -0
  226. package/dist/types/meeting-info/util.d.ts +2 -0
  227. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  228. package/dist/types/meetings/collection.d.ts +31 -0
  229. package/dist/types/meetings/index.d.ts +364 -0
  230. package/dist/types/meetings/meetings.types.d.ts +4 -0
  231. package/dist/types/meetings/request.d.ts +27 -0
  232. package/dist/types/meetings/util.d.ts +18 -0
  233. package/dist/types/member/index.d.ts +158 -0
  234. package/dist/types/member/types.d.ts +21 -0
  235. package/dist/types/member/util.d.ts +2 -0
  236. package/dist/types/members/collection.d.ts +29 -0
  237. package/dist/types/members/index.d.ts +353 -0
  238. package/dist/types/members/request.d.ts +114 -0
  239. package/dist/types/members/types.d.ts +24 -0
  240. package/dist/types/members/util.d.ts +210 -0
  241. package/dist/types/metrics/config.d.ts +195 -0
  242. package/dist/types/metrics/constants.d.ts +55 -0
  243. package/dist/types/metrics/index.d.ts +169 -0
  244. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  245. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  246. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  247. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  248. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  249. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  250. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  251. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  252. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  253. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  254. package/dist/types/reachability/index.d.ts +152 -0
  255. package/dist/types/reachability/request.d.ts +37 -0
  256. package/dist/types/reactions/constants.d.ts +3 -0
  257. package/dist/types/reactions/reactions.d.ts +4 -0
  258. package/dist/types/reactions/reactions.type.d.ts +52 -0
  259. package/dist/types/reconnection-manager/index.d.ts +126 -0
  260. package/dist/types/recording-controller/enums.d.ts +7 -0
  261. package/dist/types/recording-controller/index.d.ts +193 -0
  262. package/dist/types/recording-controller/util.d.ts +13 -0
  263. package/dist/types/roap/index.d.ts +77 -0
  264. package/dist/types/roap/request.d.ts +36 -0
  265. package/dist/types/roap/turnDiscovery.d.ts +91 -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 +28 -21
  271. package/src/annotation/annotation.types.ts +52 -0
  272. package/src/annotation/constants.ts +36 -0
  273. package/src/annotation/index.ts +343 -0
  274. package/src/breakouts/README.md +220 -0
  275. package/src/breakouts/breakout.ts +180 -0
  276. package/src/breakouts/collection.ts +19 -0
  277. package/src/breakouts/edit-lock-error.ts +25 -0
  278. package/src/breakouts/events.ts +37 -0
  279. package/src/breakouts/index.ts +921 -0
  280. package/src/breakouts/request.ts +55 -0
  281. package/src/breakouts/utils.ts +57 -0
  282. package/src/common/errors/webex-errors.ts +6 -2
  283. package/src/common/logs/logger-proxy.ts +1 -1
  284. package/src/config.ts +5 -7
  285. package/src/constants.ts +165 -20
  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 +286 -0
  291. package/src/index.ts +34 -0
  292. package/src/interpretation/README.md +51 -0
  293. package/src/interpretation/collection.ts +19 -0
  294. package/src/interpretation/index.ts +182 -0
  295. package/src/interpretation/siLanguage.ts +18 -0
  296. package/src/locus-info/controlsUtils.ts +110 -0
  297. package/src/locus-info/index.ts +339 -21
  298. package/src/locus-info/mediaSharesUtils.ts +48 -0
  299. package/src/locus-info/parser.ts +2 -1
  300. package/src/locus-info/selfUtils.ts +86 -2
  301. package/src/media/index.ts +70 -142
  302. package/src/media/properties.ts +41 -104
  303. package/src/mediaQualityMetrics/config.ts +379 -377
  304. package/src/meeting/in-meeting-actions.ts +156 -0
  305. package/src/meeting/index.ts +1779 -1741
  306. package/src/meeting/locusMediaRequest.ts +309 -0
  307. package/src/meeting/muteState.ts +228 -132
  308. package/src/meeting/request.ts +100 -91
  309. package/src/meeting/request.type.ts +2 -0
  310. package/src/meeting/util.ts +422 -421
  311. package/src/meeting-info/meeting-info-v2.ts +134 -13
  312. package/src/meeting-info/utilv2.ts +13 -3
  313. package/src/meetings/collection.ts +20 -0
  314. package/src/meetings/index.ts +385 -83
  315. package/src/meetings/meetings.types.ts +12 -0
  316. package/src/meetings/request.ts +3 -1
  317. package/src/meetings/util.ts +103 -4
  318. package/src/member/index.ts +42 -0
  319. package/src/member/types.ts +24 -0
  320. package/src/member/util.ts +95 -1
  321. package/src/members/collection.ts +8 -0
  322. package/src/members/index.ts +108 -6
  323. package/src/members/request.ts +98 -17
  324. package/src/members/types.ts +28 -0
  325. package/src/members/util.ts +319 -240
  326. package/src/metrics/config.ts +49 -10
  327. package/src/metrics/constants.ts +2 -4
  328. package/src/metrics/index.ts +43 -27
  329. package/src/multistream/mediaRequestManager.ts +337 -63
  330. package/src/multistream/receiveSlot.ts +68 -26
  331. package/src/multistream/receiveSlotManager.ts +61 -38
  332. package/src/multistream/remoteMedia.ts +29 -3
  333. package/src/multistream/remoteMediaGroup.ts +61 -2
  334. package/src/multistream/remoteMediaManager.ts +260 -66
  335. package/src/networkQualityMonitor/index.ts +6 -6
  336. package/src/reachability/index.ts +75 -25
  337. package/src/reachability/request.ts +10 -5
  338. package/src/reactions/constants.ts +4 -0
  339. package/src/reactions/reactions.ts +4 -4
  340. package/src/reactions/reactions.type.ts +28 -3
  341. package/src/reconnection-manager/index.ts +53 -32
  342. package/src/recording-controller/enums.ts +8 -0
  343. package/src/recording-controller/index.ts +315 -0
  344. package/src/recording-controller/util.ts +58 -0
  345. package/src/roap/index.ts +21 -30
  346. package/src/roap/request.ts +51 -52
  347. package/src/roap/turnDiscovery.ts +51 -27
  348. package/src/statsAnalyzer/global.ts +1 -94
  349. package/src/statsAnalyzer/index.ts +380 -390
  350. package/src/statsAnalyzer/mqaUtil.ts +106 -99
  351. package/test/integration/spec/converged-space-meetings.js +233 -0
  352. package/test/integration/spec/journey.js +331 -254
  353. package/test/integration/spec/space-meeting.js +77 -4
  354. package/test/unit/spec/annotation/index.ts +436 -0
  355. package/test/unit/spec/breakouts/breakout.ts +233 -0
  356. package/test/unit/spec/breakouts/collection.ts +15 -0
  357. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  358. package/test/unit/spec/breakouts/events.ts +77 -0
  359. package/test/unit/spec/breakouts/index.ts +1790 -0
  360. package/test/unit/spec/breakouts/request.ts +104 -0
  361. package/test/unit/spec/breakouts/utils.js +72 -0
  362. package/test/unit/spec/controls-options-manager/index.js +287 -0
  363. package/test/unit/spec/controls-options-manager/util.js +518 -0
  364. package/test/unit/spec/fixture/locus.js +1 -0
  365. package/test/unit/spec/interpretation/collection.ts +15 -0
  366. package/test/unit/spec/interpretation/index.ts +329 -0
  367. package/test/unit/spec/interpretation/siLanguage.ts +26 -0
  368. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  369. package/test/unit/spec/locus-info/index.js +680 -4
  370. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  371. package/test/unit/spec/locus-info/selfConstant.js +48 -0
  372. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  373. package/test/unit/spec/media/index.ts +118 -22
  374. package/test/unit/spec/media/properties.ts +9 -9
  375. package/test/unit/spec/meeting/in-meeting-actions.ts +76 -0
  376. package/test/unit/spec/meeting/index.js +2695 -1513
  377. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  378. package/test/unit/spec/meeting/muteState.js +370 -208
  379. package/test/unit/spec/meeting/request.js +354 -42
  380. package/test/unit/spec/meeting/utils.js +270 -156
  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 -120
  385. package/test/unit/spec/meetings/utils.js +206 -2
  386. package/test/unit/spec/member/index.js +31 -0
  387. package/test/unit/spec/member/util.js +408 -32
  388. package/test/unit/spec/members/index.js +320 -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 +98 -0
  392. package/test/unit/spec/multistream/mediaRequestManager.ts +1012 -109
  393. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  394. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  395. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  396. package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
  397. package/test/unit/spec/multistream/remoteMediaManager.ts +672 -65
  398. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  399. package/test/unit/spec/reachability/index.ts +176 -25
  400. package/test/unit/spec/reachability/request.js +66 -0
  401. package/test/unit/spec/reconnection-manager/index.js +46 -13
  402. package/test/unit/spec/recording-controller/index.js +231 -0
  403. package/test/unit/spec/recording-controller/util.js +102 -0
  404. package/test/unit/spec/roap/index.ts +21 -51
  405. package/test/unit/spec/roap/request.ts +187 -0
  406. package/test/unit/spec/roap/turnDiscovery.ts +73 -34
  407. package/test/unit/spec/stats-analyzer/index.js +94 -43
  408. package/test/utils/constants.js +9 -0
  409. package/test/utils/integrationTestUtils.js +46 -0
  410. package/test/utils/testUtils.js +0 -45
  411. package/test/utils/webex-config.js +4 -0
  412. package/test/utils/webex-test-users.js +7 -3
  413. package/tsconfig.json +6 -0
  414. package/dist/media/internal-media-core-wrapper.js +0 -18
  415. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  416. package/dist/meeting/effectsState.js +0 -262
  417. package/dist/meeting/effectsState.js.map +0 -1
  418. package/dist/multistream/multistreamMedia.js +0 -106
  419. package/dist/multistream/multistreamMedia.js.map +0 -1
  420. package/src/index.js +0 -15
  421. package/src/media/internal-media-core-wrapper.ts +0 -9
  422. package/src/meeting/effectsState.ts +0 -211
  423. package/src/multistream/multistreamMedia.ts +0 -93
  424. package/test/unit/spec/meeting/effectsState.js +0 -281
@@ -1,31 +1,43 @@
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 =
40
+ // @ts-ignore
29
41
  max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;
30
42
  audioReceiver.streams[0].common.meanRtpJitter =
31
43
  mean(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;
@@ -34,51 +46,53 @@ export const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSen
34
46
  // Fec packets do come in as part of the FEC only for audio
35
47
  const fecRecovered =
36
48
  statsResults[mediaType][sendrecvType].fecPacketsReceived -
37
- lastMqaDataSent[mediaType][sendrecvType].fecPacketsReceived -
38
- (statsResults[mediaType][sendrecvType].fecPacketsDiscarded -
39
- lastMqaDataSent[mediaType][sendrecvType].fecPacketsDiscarded);
49
+ lastFecPacketsReceived -
50
+ (statsResults[mediaType][sendrecvType].fecPacketsDiscarded - lastFecPacketsDiscarded);
40
51
 
41
52
  audioReceiver.streams[0].common.rtpEndToEndLost =
42
- statsResults[mediaType][sendrecvType].totalPacketsLost -
43
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost -
44
- fecRecovered || 0;
53
+ statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost - fecRecovered || 0;
45
54
 
46
55
  audioReceiver.streams[0].common.framesDropped =
47
- statsResults[mediaType][sendrecvType].totalSamplesDecoded -
48
- lastMqaDataSent[mediaType][sendrecvType].totalSamplesDecoded || 0;
56
+ statsResults[mediaType][sendrecvType].totalSamplesDecoded - lastPacketsDecoded || 0;
49
57
  audioReceiver.streams[0].common.renderedFrameRate =
50
58
  (audioReceiver.streams[0].common.framesDropped * 100) / 60 || 0;
59
+
51
60
  audioReceiver.streams[0].common.framesReceived =
52
- statsResults[mediaType][sendrecvType].totalSamplesReceived -
53
- lastMqaDataSent[mediaType][sendrecvType].totalSamplesReceived || 0;
61
+ statsResults[mediaType][sendrecvType].totalSamplesReceived - lastSamplesReceived || 0;
54
62
  audioReceiver.streams[0].common.concealedFrames =
55
- statsResults[mediaType][sendrecvType].concealedSamples -
56
- lastMqaDataSent[mediaType][sendrecvType].concealedSamples || 0;
63
+ statsResults[mediaType][sendrecvType].concealedSamples - lastConcealedSamples || 0;
57
64
  audioReceiver.streams[0].common.receivedBitrate =
58
- ((statsResults[mediaType][sendrecvType].totalBytesReceived -
59
- lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived) *
60
- 8) /
61
- 60 || 0;
65
+ ((statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived) * 8) / 60 || 0;
62
66
 
63
67
  audioReceiver.common.rtpBitrate = audioReceiver.streams[0].common.receivedBitrate;
64
68
  };
65
69
 
66
- export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent}) => {
67
- const mediaType = STATS.AUDIO_CORRELATE;
70
+ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent, mediaType}) => {
68
71
  const sendrecvType = STATS.SEND_DIRECTION;
69
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
+
70
85
  audioSender.common.common.direction = statsResults[mediaType].direction;
71
86
  audioSender.common.transportType = statsResults.connectionType.local.transport[0];
72
87
 
73
- // @ts-ignore
74
88
  audioSender.common.maxRemoteJitter =
89
+ // @ts-ignore
75
90
  max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
76
91
  audioSender.common.meanRemoteJitter =
77
92
  mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
78
93
 
79
94
  audioSender.common.rtpPackets =
80
- statsResults[mediaType][sendrecvType].totalPacketsSent -
81
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;
95
+ statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
82
96
  audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;
83
97
  // From candidate-pair
84
98
  audioSender.common.availableBitrate =
@@ -86,25 +100,22 @@ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent})
86
100
  // Calculate based on how much packets lost of received compated to how to the client sent
87
101
 
88
102
  const totalpacketsLostForaMin =
89
- statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver -
90
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver;
103
+ statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;
91
104
 
92
105
  audioSender.common.remoteLossRate =
93
106
  totalpacketsLostForaMin > 0
94
107
  ? (totalpacketsLostForaMin * 100) / audioSender.common.rtpPackets
95
108
  : 0; // This is the packets sent with in last min || 0;
96
109
 
97
- // @ts-ignore
98
110
  audioSender.common.maxRoundTripTime =
111
+ // @ts-ignore
99
112
  max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
100
113
  audioSender.common.meanRoundTripTime =
101
114
  mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
102
115
  audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;
103
116
 
104
117
  // Calculate the outgoing bitrate
105
- const totalBytesSentInaMin =
106
- statsResults[mediaType][sendrecvType].totalBytesSent -
107
- lastMqaDataSent[mediaType][sendrecvType].totalBytesSent;
118
+ const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;
108
119
 
109
120
  audioSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin
110
121
  ? (totalBytesSentInaMin * 8) / 60
@@ -112,33 +123,37 @@ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent})
112
123
  audioSender.common.rtpBitrate = audioSender.streams[0].common.transmittedBitrate;
113
124
 
114
125
  audioSender.streams[0].transmittedKeyFrames =
115
- statsResults[mediaType][sendrecvType].totalKeyFramesEncoded -
116
- lastMqaDataSent[mediaType][sendrecvType].totalKeyFramesEncoded || 0;
126
+ statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastFramesEncoded || 0;
117
127
  audioSender.streams[0].requestedKeyFrames =
118
- statsResults[mediaType][sendrecvType].totalFirCount -
119
- lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0;
128
+ statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;
120
129
  };
121
130
 
122
- export const getVideoReceiverMqa = ({
123
- videoReceiver,
124
- statsResults,
125
- lastMqaDataSent,
126
- isShareStream = false,
127
- }) => {
128
- const mediaType = isShareStream ? STATS.SHARE_CORRELATE : STATS.VIDEO_CORRELATE;
131
+ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSent, mediaType}) => {
129
132
  const sendrecvType = STATS.RECEIVE_DIRECTION;
130
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
+
131
148
  videoReceiver.common.common.direction = statsResults[mediaType].direction;
132
149
  videoReceiver.common.transportType = statsResults.connectionType.remote.transport[0];
133
150
  // collect the packets received for the last min
134
151
  videoReceiver.common.rtpPackets =
135
- statsResults[mediaType][sendrecvType].totalPacketsReceived -
136
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsReceived || 0;
152
+ statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
137
153
  videoReceiver.streams[0].common.rtpPackets = videoReceiver.common.rtpPackets;
138
154
 
139
155
  const totalPacketLoss =
140
- statsResults[mediaType][sendrecvType].totalPacketsLost -
141
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;
156
+ statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;
142
157
 
143
158
  // Hope by hop are numbers and not percentage so we compare on what we sent the last min
144
159
  // this is including packet lost
@@ -150,19 +165,18 @@ export const getVideoReceiverMqa = ({
150
165
 
151
166
  // calculate this values
152
167
 
153
- // @ts-ignore
154
168
  videoReceiver.common.maxRemoteJitter =
169
+ // @ts-ignore
155
170
  max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
156
171
  videoReceiver.common.meanRemoteJitter =
157
172
  mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
158
173
 
159
174
  videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;
160
- // 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;
161
176
 
162
177
  // Calculate the outgoing bitrate
163
178
  const totalBytesReceivedInaMin =
164
- statsResults[mediaType][sendrecvType].totalBytesReceived -
165
- lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived;
179
+ statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived;
166
180
 
167
181
  videoReceiver.streams[0].common.receivedBitrate = totalBytesReceivedInaMin
168
182
  ? (totalBytesReceivedInaMin * 8) / 60
@@ -171,11 +185,9 @@ export const getVideoReceiverMqa = ({
171
185
 
172
186
  // From tracks //TODO: calculate a proper one
173
187
  const totalFrameReceivedInaMin =
174
- statsResults.resolutions[mediaType][sendrecvType].framesReceived -
175
- lastMqaDataSent.resolutions[mediaType][sendrecvType].framesReceived;
188
+ statsResults.resolutions[mediaType][sendrecvType].framesReceived - lastFramesReceived;
176
189
  const totalFrameDecodedInaMin =
177
- statsResults.resolutions[mediaType][sendrecvType].framesDecoded -
178
- lastMqaDataSent.resolutions[mediaType][sendrecvType].framesDecoded;
190
+ statsResults.resolutions[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;
179
191
 
180
192
  videoReceiver.streams[0].common.receivedFrameRate = totalFrameReceivedInaMin
181
193
  ? (totalFrameReceivedInaMin * 100) / 60
@@ -185,73 +197,72 @@ export const getVideoReceiverMqa = ({
185
197
  : 0;
186
198
 
187
199
  videoReceiver.streams[0].common.framesDropped =
188
- statsResults.resolutions[mediaType][sendrecvType].framesDropped -
189
- lastMqaDataSent.resolutions[mediaType][sendrecvType].framesDropped;
200
+ statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastFramesDropped;
190
201
  videoReceiver.streams[0].receivedHeight =
191
- statsResults.resolutions[mediaType][sendrecvType].height;
192
- 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;
193
205
  videoReceiver.streams[0].receivedFrameSize =
194
- (statsResults.resolutions[mediaType][sendrecvType].height *
195
- statsResults.resolutions[mediaType][sendrecvType].height) /
196
- 256;
206
+ (videoReceiver.streams[0].receivedHeight * videoReceiver.streams[0].receivedWidth) / 256;
197
207
 
198
208
  videoReceiver.streams[0].receivedKeyFrames =
199
- statsResults[mediaType][sendrecvType].keyFramesDecoded -
200
- lastMqaDataSent[mediaType][sendrecvType].keyFramesDecoded || 0;
209
+ statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;
201
210
  videoReceiver.streams[0].requestedKeyFrames =
202
- statsResults[mediaType][sendrecvType].totalPliCount -
203
- lastMqaDataSent[mediaType][sendrecvType].totalPliCount || 0;
211
+ statsResults[mediaType][sendrecvType].totalPliCount - lastPliCount || 0;
204
212
  };
205
213
 
206
- export const getVideoSenderMqa = ({
207
- videoSender,
208
- statsResults,
209
- lastMqaDataSent,
210
- isShareStream = false,
211
- }) => {
212
- const mediaType = isShareStream ? STATS.SHARE_CORRELATE : STATS.VIDEO_CORRELATE;
214
+ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, mediaType}) => {
213
215
  const sendrecvType = STATS.SEND_DIRECTION;
214
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
+
215
230
  videoSender.common.common.direction = statsResults[mediaType].direction;
216
231
  videoSender.common.transportType = statsResults.connectionType.local.transport[0];
217
232
 
218
233
  // @ts-ignore
219
234
  videoSender.common.maxRemoteJitter =
235
+ // @ts-ignore
220
236
  max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
221
237
  videoSender.common.meanRemoteJitter =
222
238
  mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
223
239
 
224
240
  videoSender.common.rtpPackets =
225
- statsResults[mediaType][sendrecvType].totalPacketsSent -
226
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;
241
+ statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
227
242
  videoSender.common.availableBitrate =
228
243
  statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;
229
244
  // Calculate based on how much packets lost of received compated to how to the client sent
230
245
 
231
246
  const totalpacketsLostForaMin =
232
- statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver -
233
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver;
247
+ statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;
234
248
 
235
249
  videoSender.common.remoteLossRate =
236
250
  totalpacketsLostForaMin > 0
237
251
  ? (totalpacketsLostForaMin * 100) / (videoSender.common.rtpPackets + totalpacketsLostForaMin)
238
252
  : 0; // This is the packets sent with in last min || 0;
239
253
 
240
- // @ts-ignore
241
254
  videoSender.common.maxRoundTripTime =
255
+ // @ts-ignore
242
256
  max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
243
257
  videoSender.common.meanRoundTripTime =
244
258
  mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
245
259
  videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;
246
260
 
247
261
  videoSender.streams[0].common.rtpPackets =
248
- statsResults[mediaType][sendrecvType].totalPacketsSent -
249
- lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;
262
+ statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
250
263
 
251
264
  // Calculate the outgoing bitrate
252
- const totalBytesSentInaMin =
253
- statsResults[mediaType][sendrecvType].totalBytesSent -
254
- lastMqaDataSent[mediaType][sendrecvType].totalBytesSent;
265
+ const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;
255
266
 
256
267
  videoSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin
257
268
  ? (totalBytesSentInaMin * 8) / 60
@@ -260,25 +271,21 @@ export const getVideoSenderMqa = ({
260
271
  videoSender.common.rtpBitrate = videoSender.streams[0].common.transmittedBitrate;
261
272
 
262
273
  videoSender.streams[0].transmittedKeyFrames =
263
- statsResults[mediaType][sendrecvType].totalKeyFramesEncoded -
264
- lastMqaDataSent[mediaType][sendrecvType].totalKeyFramesEncoded || 0;
274
+ statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastKeyFramesEncoded || 0;
265
275
  videoSender.streams[0].requestedKeyFrames =
266
- statsResults[mediaType][sendrecvType].totalFirCount -
267
- lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0;
276
+ statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;
268
277
 
269
278
  // From tracks //TODO: calculate a proper one
270
279
  const totalFrameSentInaMin =
271
- statsResults.resolutions[mediaType][sendrecvType].framesSent -
272
- (lastMqaDataSent.resolutions[mediaType][sendrecvType].framesSent || 0);
280
+ statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);
273
281
 
274
282
  videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin
275
283
  ? (totalFrameSentInaMin * 100) / 60
276
284
  : 0;
277
285
  videoSender.streams[0].transmittedHeight =
278
- statsResults.resolutions[mediaType][sendrecvType].height;
279
- 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;
280
289
  videoSender.streams[0].transmittedFrameSize =
281
- (statsResults.resolutions[mediaType][sendrecvType].height *
282
- statsResults.resolutions[mediaType][sendrecvType].width) /
283
- 254;
290
+ (videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;
284
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
+ });