@webex/plugin-meetings 3.0.0-beta.17 → 3.0.0-beta.170

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 (427) 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 +216 -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 +45 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1048 -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 +194 -28
  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 +95 -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 +350 -41
  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 +76 -2
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +2640 -2436
  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 +477 -466
  76. package/dist/meeting/util.js.map +1 -1
  77. package/dist/meeting-info/index.js +48 -7
  78. package/dist/meeting-info/index.js.map +1 -1
  79. package/dist/meeting-info/meeting-info-v2.js +172 -50
  80. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  81. package/dist/meeting-info/utilv2.js +20 -5
  82. package/dist/meeting-info/utilv2.js.map +1 -1
  83. package/dist/meetings/collection.js +22 -0
  84. package/dist/meetings/collection.js.map +1 -1
  85. package/dist/meetings/index.js +377 -82
  86. package/dist/meetings/index.js.map +1 -1
  87. package/dist/meetings/meetings.types.js +7 -0
  88. package/dist/meetings/meetings.types.js.map +1 -0
  89. package/dist/meetings/request.js +16 -12
  90. package/dist/meetings/request.js.map +1 -1
  91. package/dist/meetings/util.js +88 -1
  92. package/dist/meetings/util.js.map +1 -1
  93. package/dist/member/index.js +43 -0
  94. package/dist/member/index.js.map +1 -1
  95. package/dist/member/types.js +15 -0
  96. package/dist/member/types.js.map +1 -0
  97. package/dist/member/util.js +97 -3
  98. package/dist/member/util.js.map +1 -1
  99. package/dist/members/collection.js +10 -0
  100. package/dist/members/collection.js.map +1 -1
  101. package/dist/members/index.js +94 -11
  102. package/dist/members/index.js.map +1 -1
  103. package/dist/members/request.js +109 -39
  104. package/dist/members/request.js.map +1 -1
  105. package/dist/members/types.js +15 -0
  106. package/dist/members/types.js.map +1 -0
  107. package/dist/members/util.js +316 -233
  108. package/dist/members/util.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 +1 -468
  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 +217 -162
  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 +363 -0
  142. package/dist/recording-controller/index.js.map +1 -0
  143. package/dist/recording-controller/util.js +64 -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 +135 -94
  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 +8 -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 +1007 -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 +1430 -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 +77 -0
  222. package/dist/types/meeting-info/collection.d.ts +20 -0
  223. package/dist/types/meeting-info/index.d.ts +62 -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 +365 -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/constants.d.ts +55 -0
  242. package/dist/types/metrics/index.d.ts +45 -0
  243. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  244. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  245. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  246. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  247. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  248. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  249. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  250. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  251. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  252. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  253. package/dist/types/reachability/index.d.ts +152 -0
  254. package/dist/types/reachability/request.d.ts +37 -0
  255. package/dist/types/reactions/constants.d.ts +3 -0
  256. package/dist/types/reactions/reactions.d.ts +4 -0
  257. package/dist/types/reactions/reactions.type.d.ts +52 -0
  258. package/dist/types/reconnection-manager/index.d.ts +126 -0
  259. package/dist/types/recording-controller/enums.d.ts +7 -0
  260. package/dist/types/recording-controller/index.d.ts +208 -0
  261. package/dist/types/recording-controller/util.d.ts +14 -0
  262. package/dist/types/roap/index.d.ts +77 -0
  263. package/dist/types/roap/request.d.ts +36 -0
  264. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  265. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  266. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  267. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  268. package/dist/types/transcription/index.d.ts +64 -0
  269. package/package.json +29 -21
  270. package/src/annotation/annotation.types.ts +52 -0
  271. package/src/annotation/constants.ts +36 -0
  272. package/src/annotation/index.ts +343 -0
  273. package/src/breakouts/README.md +220 -0
  274. package/src/breakouts/breakout.ts +188 -0
  275. package/src/breakouts/collection.ts +19 -0
  276. package/src/breakouts/edit-lock-error.ts +25 -0
  277. package/src/breakouts/events.ts +56 -0
  278. package/src/breakouts/index.ts +925 -0
  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/config.ts +5 -7
  284. package/src/constants.ts +183 -22
  285. package/src/controls-options-manager/constants.ts +5 -0
  286. package/src/controls-options-manager/enums.ts +18 -0
  287. package/src/controls-options-manager/index.ts +278 -0
  288. package/src/controls-options-manager/types.ts +59 -0
  289. package/src/controls-options-manager/util.ts +286 -0
  290. package/src/index.ts +37 -0
  291. package/src/interpretation/README.md +51 -0
  292. package/src/interpretation/collection.ts +19 -0
  293. package/src/interpretation/index.ts +182 -0
  294. package/src/interpretation/siLanguage.ts +18 -0
  295. package/src/locus-info/controlsUtils.ts +110 -0
  296. package/src/locus-info/index.ts +374 -38
  297. package/src/locus-info/mediaSharesUtils.ts +48 -0
  298. package/src/locus-info/parser.ts +2 -1
  299. package/src/locus-info/selfUtils.ts +86 -2
  300. package/src/media/index.ts +70 -142
  301. package/src/media/properties.ts +41 -104
  302. package/src/mediaQualityMetrics/config.ts +379 -377
  303. package/src/meeting/in-meeting-actions.ts +151 -3
  304. package/src/meeting/index.ts +2029 -2033
  305. package/src/meeting/locusMediaRequest.ts +309 -0
  306. package/src/meeting/muteState.ts +228 -132
  307. package/src/meeting/request.ts +100 -91
  308. package/src/meeting/request.type.ts +2 -0
  309. package/src/meeting/util.ts +450 -439
  310. package/src/meeting-info/index.ts +54 -8
  311. package/src/meeting-info/meeting-info-v2.ts +150 -14
  312. package/src/meeting-info/utilv2.ts +13 -3
  313. package/src/meetings/collection.ts +20 -0
  314. package/src/meetings/index.ts +396 -89
  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/constants.ts +2 -4
  327. package/src/metrics/index.ts +1 -490
  328. package/src/multistream/mediaRequestManager.ts +337 -63
  329. package/src/multistream/receiveSlot.ts +68 -26
  330. package/src/multistream/receiveSlotManager.ts +61 -38
  331. package/src/multistream/remoteMedia.ts +29 -3
  332. package/src/multistream/remoteMediaGroup.ts +61 -2
  333. package/src/multistream/remoteMediaManager.ts +260 -66
  334. package/src/networkQualityMonitor/index.ts +6 -6
  335. package/src/reachability/index.ts +75 -25
  336. package/src/reachability/request.ts +10 -5
  337. package/src/reactions/constants.ts +4 -0
  338. package/src/reactions/reactions.ts +4 -4
  339. package/src/reactions/reactions.type.ts +28 -3
  340. package/src/reconnection-manager/index.ts +80 -49
  341. package/src/recording-controller/enums.ts +8 -0
  342. package/src/recording-controller/index.ts +333 -0
  343. package/src/recording-controller/util.ts +75 -0
  344. package/src/roap/index.ts +21 -30
  345. package/src/roap/request.ts +72 -61
  346. package/src/roap/turnDiscovery.ts +51 -27
  347. package/src/statsAnalyzer/global.ts +1 -94
  348. package/src/statsAnalyzer/index.ts +380 -390
  349. package/src/statsAnalyzer/mqaUtil.ts +106 -99
  350. package/test/integration/spec/converged-space-meetings.js +233 -0
  351. package/test/integration/spec/journey.js +331 -254
  352. package/test/integration/spec/space-meeting.js +77 -4
  353. package/test/unit/spec/annotation/index.ts +436 -0
  354. package/test/unit/spec/breakouts/breakout.ts +237 -0
  355. package/test/unit/spec/breakouts/collection.ts +15 -0
  356. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  357. package/test/unit/spec/breakouts/events.ts +89 -0
  358. package/test/unit/spec/breakouts/index.ts +1790 -0
  359. package/test/unit/spec/breakouts/request.ts +104 -0
  360. package/test/unit/spec/breakouts/utils.js +72 -0
  361. package/test/unit/spec/controls-options-manager/index.js +287 -0
  362. package/test/unit/spec/controls-options-manager/util.js +518 -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 +329 -0
  366. package/test/unit/spec/interpretation/siLanguage.ts +26 -0
  367. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  368. package/test/unit/spec/locus-info/index.js +792 -4
  369. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  370. package/test/unit/spec/locus-info/selfConstant.js +48 -0
  371. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  372. package/test/unit/spec/media/index.ts +118 -22
  373. package/test/unit/spec/media/properties.ts +9 -9
  374. package/test/unit/spec/meeting/in-meeting-actions.ts +75 -3
  375. package/test/unit/spec/meeting/index.js +2742 -1441
  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 +354 -42
  379. package/test/unit/spec/meeting/utils.js +384 -170
  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 +847 -121
  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 +1 -50
  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 +95 -13
  402. package/test/unit/spec/recording-controller/index.js +307 -0
  403. package/test/unit/spec/recording-controller/util.js +229 -0
  404. package/test/unit/spec/roap/index.ts +28 -52
  405. package/test/unit/spec/roap/request.ts +225 -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/metrics/config.js +0 -299
  419. package/dist/metrics/config.js.map +0 -1
  420. package/dist/multistream/multistreamMedia.js +0 -106
  421. package/dist/multistream/multistreamMedia.js.map +0 -1
  422. package/src/index.js +0 -15
  423. package/src/media/internal-media-core-wrapper.ts +0 -9
  424. package/src/meeting/effectsState.ts +0 -211
  425. package/src/metrics/config.ts +0 -495
  426. package/src/multistream/multistreamMedia.ts +0 -93
  427. package/test/unit/spec/meeting/effectsState.js +0 -281
@@ -4,15 +4,18 @@ import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
4
4
  import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
5
5
  import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
6
6
  import Metrics from '@webex/plugin-meetings/src/metrics/index';
7
- import {DISPLAY_HINTS} from '@webex/plugin-meetings/dist/constants';
7
+ import {SELF_POLICY} from '@webex/plugin-meetings/src/constants';
8
+ import {DISPLAY_HINTS} from '@webex/plugin-meetings/src/constants';
9
+ import MockWebex from '@webex/test-helper-mock-webex';
8
10
 
9
11
  describe('plugin-meetings', () => {
12
+ let webex;
10
13
  describe('Meeting utils function', () => {
11
14
  const sandbox = sinon.createSandbox();
12
15
  const meeting = {};
13
16
 
14
17
  beforeEach(() => {
15
- Metrics.postEvent = sinon.stub();
18
+ webex = new MockWebex({});
16
19
  const logger = {
17
20
  info: sandbox.stub(),
18
21
  log: sandbox.stub(),
@@ -26,40 +29,40 @@ describe('plugin-meetings', () => {
26
29
  });
27
30
  LoggerProxy.set(logger);
28
31
 
29
- meeting.closeLocalStream = sinon.stub().returns(Promise.resolve());
30
- meeting.closeLocalShare = sinon.stub().returns(Promise.resolve());
32
+ meeting.cleanupLocalTracks = sinon.stub().returns(Promise.resolve());
31
33
  meeting.closeRemoteTracks = sinon.stub().returns(Promise.resolve());
32
34
  meeting.closePeerConnections = sinon.stub().returns(Promise.resolve());
33
35
 
34
- meeting.unsetLocalVideoTrack = sinon.stub();
35
- meeting.unsetLocalShareTrack = sinon.stub();
36
36
  meeting.unsetRemoteTracks = sinon.stub();
37
37
  meeting.unsetPeerConnections = sinon.stub();
38
38
  meeting.reconnectionManager = {cleanUp: sinon.stub()};
39
39
  meeting.stopKeepAlive = sinon.stub();
40
40
  meeting.updateLLMConnection = sinon.stub();
41
+ meeting.breakouts = {cleanUp: sinon.stub()};
42
+ meeting.annotaion = {cleanUp: sinon.stub()};
43
+ meeting.getWebexObject = sinon.stub().returns(webex);
44
+ meeting.simultaneousInterpretation = {cleanUp: sinon.stub()};
41
45
  });
42
46
 
43
47
  afterEach(() => {
44
48
  sandbox.restore();
49
+ sinon.restore();
45
50
  });
46
51
 
47
52
  describe('#cleanup', () => {
48
53
  it('do clean up on meeting object', async () => {
49
54
  await MeetingUtil.cleanUp(meeting);
50
- assert.calledOnce(meeting.closeLocalStream);
51
- assert.calledOnce(meeting.closeLocalStream);
52
- assert.calledOnce(meeting.closeLocalShare);
55
+ assert.calledOnce(meeting.cleanupLocalTracks);
53
56
  assert.calledOnce(meeting.closeRemoteTracks);
54
57
  assert.calledOnce(meeting.closePeerConnections);
55
58
 
56
- assert.calledOnce(meeting.unsetLocalVideoTrack);
57
- assert.calledOnce(meeting.unsetLocalShareTrack);
58
59
  assert.calledOnce(meeting.unsetRemoteTracks);
59
60
  assert.calledOnce(meeting.unsetPeerConnections);
60
61
  assert.calledOnce(meeting.reconnectionManager.cleanUp);
61
62
  assert.calledOnce(meeting.stopKeepAlive);
62
63
  assert.calledOnce(meeting.updateLLMConnection);
64
+ assert.calledOnce(meeting.breakouts.cleanUp);
65
+ assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
63
66
  });
64
67
  });
65
68
 
@@ -69,7 +72,9 @@ describe('plugin-meetings', () => {
69
72
  });
70
73
 
71
74
  const mockTrack = {
72
- getSettings: fakeDevice,
75
+ underlyingTrack: {
76
+ getSettings: fakeDevice,
77
+ },
73
78
  };
74
79
 
75
80
  it('#log - should log [info, warn, error, log] to console', () => {
@@ -128,51 +133,208 @@ describe('plugin-meetings', () => {
128
133
  });
129
134
  });
130
135
 
131
- describe('remoteUpdateAudioVideo', () => {
132
- it('#Should call meetingRequest.remoteAudioVideoToggle with correct parameters (multistream)', async () => {
136
+ describe('addSequence', () => {
137
+ it('should add the sequence object to a request body', () => {
138
+ const body = {};
139
+
140
+ MeetingUtil.addSequence({
141
+ locusInfo: {
142
+ sequence: 'sequence'
143
+ }
144
+ }, body);
145
+
146
+ assert.deepEqual(body, {
147
+ sequence: 'sequence'
148
+ });
149
+ });
150
+
151
+ it('should work with an undefined meeting', () => {
152
+ const body = {};
153
+
154
+ MeetingUtil.addSequence(
155
+ undefined,
156
+ body
157
+ );
158
+
159
+ assert.deepEqual(body, {});
160
+ });
161
+
162
+ it('should work with an undefined locusInfo', () => {
163
+ const body = {};
164
+
165
+ MeetingUtil.addSequence({}, body);
166
+
167
+ assert.deepEqual(body, {});
168
+ });
169
+
170
+ it('should work with an undefined sequence', () => {
171
+ const body = {};
172
+
173
+ MeetingUtil.addSequence({locusInfo: {}}, body);
174
+
175
+ assert.deepEqual(body, {});
176
+ });
177
+ });
178
+
179
+ describe('updateLocusWithDelta', () => {
180
+ it('should call onDeltaLocus with the new delta locus', () => {
133
181
  const meeting = {
134
- correlationId: 'correlation id',
135
- isMultistream: true,
136
- mediaId: '12345',
137
- meetingJoinUrl: 'meetingJoinUrl',
138
- locusUrl: 'locusUrl',
139
- deviceUrl: 'some device url',
140
- selfId: 'self id',
141
- meetingRequest: {
142
- remoteAudioVideoToggle: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
182
+ locusInfo: {
183
+ onDeltaLocus: sinon.stub()
143
184
  },
144
185
  };
145
186
 
146
- await MeetingUtil.remoteUpdateAudioVideo(true, false, meeting);
187
+ const originalResponse = {
188
+ body: {
189
+ locus: 'locus'
190
+ },
191
+ };
147
192
 
148
- assert.calledOnce(meeting.meetingRequest.remoteAudioVideoToggle);
149
- const parameter = meeting.meetingRequest.remoteAudioVideoToggle.getCall(0).args[0];
193
+ const response = MeetingUtil.updateLocusWithDelta(meeting, originalResponse);
150
194
 
151
- assert.equal(parameter.locusUrl, 'locusUrl');
152
- assert.equal(parameter.selfId, 'self id');
153
- assert.equal(parameter.correlationId, 'correlation id');
154
- assert.equal(parameter.deviceUrl, 'some device url');
155
- assert.deepEqual(parameter.localMedias, [
156
- {localSdp: '{"audioMuted":true,"videoMuted":false}', mediaId: '12345'},
157
- ]);
158
- assert.equal(parameter.preferTranscoding, false);
195
+ assert.deepEqual(response, originalResponse);
196
+ assert.calledOnceWithExactly(meeting.locusInfo.onDeltaLocus, 'locus');
197
+ });
198
+
199
+ it('should handle locus being missing from the response', () => {
200
+ const meeting = {
201
+ locusInfo: {
202
+ onDeltaLocus: sinon.stub(),
203
+ },
204
+ };
205
+
206
+ const originalResponse = {
207
+ body: {},
208
+ };
209
+
210
+ const response = MeetingUtil.updateLocusWithDelta(meeting, originalResponse);
211
+
212
+ assert.deepEqual(response, originalResponse);
213
+ assert.notCalled(meeting.locusInfo.onDeltaLocus);
214
+ });
215
+
216
+ it('should work with an undefined meeting', () => {
217
+ const originalResponse = {
218
+ body: {
219
+ locus: 'locus',
220
+ },
221
+ };
222
+
223
+ const response = MeetingUtil.updateLocusWithDelta(undefined, originalResponse);
224
+ assert.deepEqual(response, originalResponse);
225
+ });
226
+ });
227
+
228
+ describe('generateLocusDeltaRequest', () => {
229
+
230
+ afterEach(() => {
231
+ WeakRef.prototype.deref.restore();
232
+ });
233
+
234
+ it('generates the correct wrapper function', async () => {
235
+ const updateLocusWithDeltaSpy = sinon.spy(MeetingUtil, 'updateLocusWithDelta');
236
+ const addSequenceSpy = sinon.spy(MeetingUtil, 'addSequence');
237
+
238
+ const meeting = {
239
+ request: sinon.stub().returns(Promise.resolve('result')),
240
+ }
241
+
242
+ const locusDeltaRequest = MeetingUtil.generateLocusDeltaRequest(meeting);
243
+
244
+ const options = {
245
+ some: 'option',
246
+ body: {}
247
+ };
248
+
249
+ let result = await locusDeltaRequest(options);
250
+
251
+ assert.equal(result, 'result');
252
+ assert.calledOnceWithExactly(updateLocusWithDeltaSpy, meeting, 'result');
253
+ assert.calledOnceWithExactly(addSequenceSpy, meeting, options.body);
254
+
255
+ updateLocusWithDeltaSpy.resetHistory();
256
+ addSequenceSpy.resetHistory();
257
+
258
+ // body missing from options
259
+ result = await locusDeltaRequest({});
260
+ assert.equal(result, 'result');
261
+ assert.calledOnceWithExactly(updateLocusWithDeltaSpy, meeting, 'result');
262
+ assert.calledOnceWithExactly(addSequenceSpy, meeting, options.body);
263
+
264
+ // meeting disappears so the WeakRef returns undefined
265
+ sinon.stub(WeakRef.prototype, 'deref').returns(undefined);
266
+
267
+ result = await locusDeltaRequest(options);
268
+ assert.equal(result, undefined);
269
+
270
+ });
271
+
272
+ });
273
+
274
+ describe('selfSupportsFeature', () => {
275
+ it('returns true if there are no user policies', () => {
276
+ assert.equal(
277
+ MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_ANNOTATION, undefined),
278
+ true
279
+ );
159
280
  });
160
281
 
161
- it('#Should call meetingRequest.remoteAudioVideoToggle with preferTranscoding:true for non multistream connections', async () => {
282
+ it('returns true if policy is true', () => {
283
+ assert.equal(
284
+ MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_ANNOTATION, {
285
+ [SELF_POLICY.SUPPORT_ANNOTATION]: true
286
+ }),
287
+ true
288
+ );
289
+ });
290
+
291
+ it('returns false if policy is false', () => {
292
+ assert.equal(
293
+ MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_ANNOTATION, {
294
+ [SELF_POLICY.SUPPORT_ANNOTATION]: false,
295
+ }),
296
+ false
297
+ );
298
+ });
299
+ });
300
+
301
+ describe('remoteUpdateAudioVideo', () => {
302
+ it('#Should call meetingRequest.locusMediaRequest with correct parameters', async () => {
162
303
  const meeting = {
163
- isMultistream: false,
304
+ id: 'meeting-id',
164
305
  mediaId: '12345',
165
- meetingRequest: {
166
- remoteAudioVideoToggle: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
306
+ selfUrl: 'self url',
307
+ locusInfo: {
308
+ sequence: {},
309
+ },
310
+ locusMediaRequest: {
311
+ send: sinon.stub().resolves({body: {}, headers: {}}),
167
312
  },
313
+ getWebexObject: sinon.stub().returns(webex)
168
314
  };
169
315
 
170
- await MeetingUtil.remoteUpdateAudioVideo(true, false, meeting);
316
+ await MeetingUtil.remoteUpdateAudioVideo(meeting, true, false);
317
+
318
+ assert.calledOnceWithExactly(meeting.locusMediaRequest.send, {
319
+ mediaId: '12345',
320
+ muteOptions: {
321
+ audioMuted: true,
322
+ videoMuted: false,
323
+ },
324
+ selfUrl: 'self url',
325
+ sequence: {},
326
+ type: 'LocalMute',
327
+ });
171
328
 
172
- assert.calledOnce(meeting.meetingRequest.remoteAudioVideoToggle);
173
- const parameter = meeting.meetingRequest.remoteAudioVideoToggle.getCall(0).args[0];
329
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
330
+ name: 'client.locus.media.request',
331
+ options: {meetingId: meeting.id},
332
+ });
174
333
 
175
- assert.equal(parameter.preferTranscoding, true);
334
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
335
+ name: 'client.locus.media.response',
336
+ options: {meetingId: meeting.id},
337
+ });
176
338
  });
177
339
  });
178
340
 
@@ -182,8 +344,16 @@ describe('plugin-meetings', () => {
182
344
  meetingJoinUrl: 'meetingJoinUrl',
183
345
  locusUrl: 'locusUrl',
184
346
  meetingRequest: {
185
- joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
347
+ joinMeeting: sinon.stub().returns(
348
+ Promise.resolve({
349
+ body: {mediaConnections: 'mediaConnections'},
350
+ headers: {
351
+ trackingid: 'trackingId',
352
+ },
353
+ })
354
+ ),
186
355
  },
356
+ getWebexObject: sinon.stub().returns(webex)
187
357
  };
188
358
 
189
359
  MeetingUtil.parseLocusJoin = sinon.stub();
@@ -194,6 +364,84 @@ describe('plugin-meetings', () => {
194
364
 
195
365
  assert.equal(parameter.inviteeAddress, 'meetingJoinUrl');
196
366
  assert.equal(parameter.preferTranscoding, true);
367
+
368
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
369
+ name: 'client.locus.join.request',
370
+ options: {meetingId: meeting.id},
371
+ });
372
+
373
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
374
+ name: 'client.locus.join.response',
375
+ payload: {
376
+ trigger: 'loci-update',
377
+ identifiers: {
378
+ trackingId: 'trackingId',
379
+ },
380
+ },
381
+ options: {
382
+ meetingId: meeting.id,
383
+ mediaConnections: 'mediaConnections',
384
+ },
385
+ });
386
+ });
387
+
388
+ it('#Should call meetingRequest.joinMeeting with breakoutsSupported=true when passed in as true', async () => {
389
+ const meeting = {
390
+ meetingRequest: {
391
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
392
+ },
393
+ getWebexObject: sinon.stub().returns(webex)
394
+ };
395
+
396
+ MeetingUtil.parseLocusJoin = sinon.stub();
397
+ await MeetingUtil.joinMeeting(meeting, {
398
+ breakoutsSupported: true,
399
+ });
400
+
401
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
402
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
403
+
404
+ assert.equal(parameter.breakoutsSupported, true);
405
+ });
406
+
407
+ it('#Should call meetingRequest.joinMeeting with liveAnnotationSupported=true when passed in as true', async () => {
408
+ const meeting = {
409
+ meetingRequest: {
410
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
411
+ },
412
+ getWebexObject: sinon.stub().returns(webex)
413
+ };
414
+
415
+ MeetingUtil.parseLocusJoin = sinon.stub();
416
+ await MeetingUtil.joinMeeting(meeting, {
417
+ liveAnnotationSupported: true,
418
+ });
419
+
420
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
421
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
422
+
423
+ assert.equal(parameter.liveAnnotationSupported, true);
424
+ });
425
+
426
+ it('#Should call meetingRequest.joinMeeting with locale=en_UK, deviceCapabilities=["TEST"] when they are passed in as those values', async () => {
427
+ const meeting = {
428
+ meetingRequest: {
429
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
430
+ },
431
+ getWebexObject: sinon.stub().returns(webex)
432
+ };
433
+
434
+ MeetingUtil.parseLocusJoin = sinon.stub();
435
+ await MeetingUtil.joinMeeting(meeting, {
436
+ locale: 'en_UK',
437
+ deviceCapabilities: ['TEST'],
438
+ });
439
+
440
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
441
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
442
+
443
+ assert.equal(parameter.locale, 'en_UK');
444
+ assert.deepEqual(parameter.deviceCapabilities, ['TEST']);
197
445
  });
198
446
 
199
447
  it('#Should call meetingRequest.joinMeeting with preferTranscoding=false when multistream is enabled', async () => {
@@ -204,6 +452,7 @@ describe('plugin-meetings', () => {
204
452
  meetingRequest: {
205
453
  joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
206
454
  },
455
+ getWebexObject: sinon.stub().returns(webex)
207
456
  };
208
457
 
209
458
  MeetingUtil.parseLocusJoin = sinon.stub();
@@ -223,6 +472,7 @@ describe('plugin-meetings', () => {
223
472
  meetingRequest: {
224
473
  joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
225
474
  },
475
+ getWebexObject: sinon.stub().returns(webex)
226
476
  };
227
477
 
228
478
  MeetingUtil.parseLocusJoin = sinon.stub();
@@ -241,6 +491,7 @@ describe('plugin-meetings', () => {
241
491
  meetingRequest: {
242
492
  joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
243
493
  },
494
+ getWebexObject: sinon.stub().returns(webex)
244
495
  };
245
496
 
246
497
  MeetingUtil.parseLocusJoin = sinon.stub();
@@ -254,6 +505,44 @@ describe('plugin-meetings', () => {
254
505
  });
255
506
  });
256
507
 
508
+ describe('joinMeetingOptions', () => {
509
+ it('sends client events correctly', async () => {
510
+ MeetingUtil.joinMeeting = sinon.stub().rejects({});
511
+ MeetingUtil.isPinOrGuest = sinon.stub().returns(true);
512
+ const meeting = {
513
+ id: 'meeting-id',
514
+ mediaId: '12345',
515
+ selfUrl: 'self url',
516
+ locusInfo: {
517
+ sequence: {},
518
+ },
519
+ locusMediaRequest: {
520
+ send: sinon.stub().resolves({body: {}, headers: {}}),
521
+ },
522
+ getWebexObject: sinon.stub().returns(webex)
523
+ };
524
+
525
+ try {
526
+ await MeetingUtil.joinMeetingOptions(meeting, {pin: true});
527
+
528
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
529
+ name: 'client.pin.collected',
530
+ options: {
531
+ meetingId: meeting.id,
532
+ },
533
+ });
534
+ } catch (err) {
535
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
536
+ name: 'client.pin.prompt',
537
+ options: {
538
+ meetingId: meeting.id,
539
+ },
540
+ });
541
+ }
542
+ });
543
+
544
+ })
545
+
257
546
  describe('getUserDisplayHintsFromLocusInfo', () => {
258
547
  it('returns display hints', () => {
259
548
  assert.deepEqual(MeetingUtil.getUserDisplayHintsFromLocusInfo(), []);
@@ -325,6 +614,23 @@ describe('plugin-meetings', () => {
325
614
  });
326
615
  });
327
616
 
617
+ describe('canUserRenameSelfAndObserved', () => {
618
+ it('works as expected', () => {
619
+ assert.deepEqual(
620
+ MeetingUtil.canUserRenameSelfAndObserved(['CAN_RENAME_SELF_AND_OBSERVED']),
621
+ true
622
+ );
623
+ assert.deepEqual(MeetingUtil.canUserRenameSelfAndObserved([]), false);
624
+ });
625
+ });
626
+
627
+ describe('canUserRenameOthers', () => {
628
+ it('works as expected', () => {
629
+ assert.deepEqual(MeetingUtil.canUserRenameOthers(['CAN_RENAME_OTHERS']), true);
630
+ assert.deepEqual(MeetingUtil.canUserRenameOthers([]), false);
631
+ });
632
+ });
633
+
328
634
  describe('bothLeaveAndEndMeetingAvailable', () => {
329
635
  it('works as expected', () => {
330
636
  assert.deepEqual(
@@ -367,35 +673,8 @@ describe('plugin-meetings', () => {
367
673
  });
368
674
  });
369
675
 
370
- describe('canUserRecord', () => {
371
- it('works as expected', () => {
372
- assert.deepEqual(MeetingUtil.canUserRecord(['RECORDING_CONTROL_START']), true);
373
- assert.deepEqual(MeetingUtil.canUserRecord([]), false);
374
- });
375
- });
376
-
377
- describe('canUserPause', () => {
378
- it('works as expected', () => {
379
- assert.deepEqual(MeetingUtil.canUserPause(['RECORDING_CONTROL_PAUSE']), true);
380
- assert.deepEqual(MeetingUtil.canUserPause([]), false);
381
- });
382
- });
383
-
384
- describe('canUserResume', () => {
385
- it('works as expected', () => {
386
- assert.deepEqual(MeetingUtil.canUserResume(['RECORDING_CONTROL_RESUME']), true);
387
- assert.deepEqual(MeetingUtil.canUserResume([]), false);
388
- });
389
- });
390
-
391
- describe('canUserStop', () => {
392
- it('works as expected', () => {
393
- assert.deepEqual(MeetingUtil.canUserStop(['RECORDING_CONTROL_STOP']), true);
394
- assert.deepEqual(MeetingUtil.canUserStop([]), false);
395
- });
396
- });
397
-
398
676
  [
677
+ {functionName: 'isSaveTranscriptsEnabled', displayHint: 'SAVE_TRANSCRIPTS_ENABLED'},
399
678
  {functionName: 'canEnableClosedCaption', displayHint: 'CAPTION_START'},
400
679
  {functionName: 'canStartTranscribing', displayHint: 'TRANSCRIPTION_CONTROL_START'},
401
680
  {functionName: 'canStopTranscribing', displayHint: 'TRANSCRIPTION_CONTROL_STOP'},
@@ -414,116 +693,51 @@ describe('plugin-meetings', () => {
414
693
  });
415
694
  });
416
695
 
417
-
418
- describe('reactions', () => {
419
- describe('canEnableReactions', () => {
420
- [[null, DISPLAY_HINTS.ENABLE_REACTIONS, true], [null, DISPLAY_HINTS.DISABLE_REACTIONS, false], [null, undefined, null]].forEach(() => ([originalValue, displayHint, expected]) => {
421
- assert.deepEqual(MeetingUtil.canEnableReactions(originalValue, [displayHint]), expected);
422
- });
423
- });
424
- describe('canEnableReactions', () => {
425
- [[null, DISPLAY_HINTS.REACTIONS_ACTIVE, true], [null, DISPLAY_HINTS.REACTIONS_INACTIVE, false], [null, undefined, null]].forEach(([originalValue, displayHint, expected]) => {
426
- assert.deepEqual(MeetingUtil.canSendReactions(originalValue, [displayHint]), expected);
427
- });
696
+ describe('canManageBreakout', () => {
697
+ it('works as expected', () => {
698
+ assert.deepEqual(MeetingUtil.canManageBreakout(['BREAKOUT_MANAGEMENT']), true);
699
+ assert.deepEqual(MeetingUtil.canManageBreakout([]), false);
428
700
  });
429
701
  });
430
702
 
431
- describe('recording tests', () => {
432
- let request;
433
- let locusInfo;
434
- const locusUrl = 'locusUrl';
435
-
436
- beforeEach(() => {
437
- locusInfo = {
438
- parsedLocus: {
439
- info: {
440
- userDisplayHints: ['RECORDING_CONTROL_START'],
441
- },
442
- },
443
- };
444
- request = {
445
- recordMeeting: sinon.stub().returns(Promise.resolve()),
446
- };
703
+ describe('canBroadcastMessageToBreakout', () => {
704
+ it('works as expected', () => {
705
+ assert.deepEqual(MeetingUtil.canBroadcastMessageToBreakout(['BROADCAST_MESSAGE_TO_BREAKOUT']), true);
706
+ assert.deepEqual(MeetingUtil.canBroadcastMessageToBreakout([]), false);
447
707
  });
708
+ });
448
709
 
449
- describe('startRecording', () => {
450
- it('can start recording when the correct display hint is present', () => {
451
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_START');
452
-
453
- const result = MeetingUtil.startRecording(request, locusUrl, locusInfo);
454
-
455
- assert.calledWith(request.recordMeeting, {locusUrl, recording: true, paused: false});
456
-
457
- assert.deepEqual(result, request.recordMeeting.firstCall.returnValue);
458
- });
459
-
460
- it('rejects when correct display hint is not present', () => {
461
- const result = MeetingUtil.startRecording(request, locusUrl, {});
462
-
463
- assert.notCalled(request.recordMeeting);
464
-
465
- assert.isRejected(result);
466
- });
710
+ describe('isSuppressBreakoutSupport', () => {
711
+ it('works as expected', () => {
712
+ assert.deepEqual(
713
+ MeetingUtil.isSuppressBreakoutSupport(['UCF_SUPPRESS_BREAKOUTS_SUPPORT']),
714
+ true
715
+ );
716
+ assert.deepEqual(MeetingUtil.isSuppressBreakoutSupport([]), false);
467
717
  });
718
+ });
468
719
 
469
- describe('pauseRecording', () => {
470
- it('can pause recording when the correct display hint is present', () => {
471
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_PAUSE');
472
-
473
- const result = MeetingUtil.pauseRecording(request, locusUrl, locusInfo);
474
-
475
- assert.calledWith(request.recordMeeting, {locusUrl, recording: true, paused: true});
476
-
477
- assert.deepEqual(result, request.recordMeeting.firstCall.returnValue);
478
- });
479
-
480
- it('rejects when correct display hint is not present', () => {
481
- const result = MeetingUtil.pauseRecording(request, locusUrl, {});
482
-
483
- assert.notCalled(request.recordMeeting);
484
-
485
- assert.isRejected(result);
486
- });
720
+ describe('canAdmitLobbyToBreakout', () => {
721
+ it('works as expected', () => {
722
+ assert.deepEqual(MeetingUtil.canAdmitLobbyToBreakout(['DISABLE_LOBBY_TO_BREAKOUT']), false);
723
+ assert.deepEqual(MeetingUtil.canAdmitLobbyToBreakout([]), true);
487
724
  });
725
+ });
488
726
 
489
- describe('resumeRecording', () => {
490
- it('can resume recording when the correct display hint is present', () => {
491
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_RESUME');
492
-
493
- const result = MeetingUtil.resumeRecording(request, locusUrl, locusInfo);
494
-
495
- assert.calledWith(request.recordMeeting, {locusUrl, recording: true, paused: false});
496
-
497
- assert.deepEqual(result, request.recordMeeting.firstCall.returnValue);
498
- });
499
-
500
- it('rejects when correct display hint is not present', () => {
501
- const result = MeetingUtil.resumeRecording(request, locusUrl, {});
502
-
503
- assert.notCalled(request.recordMeeting);
504
-
505
- assert.isRejected(result);
506
- });
727
+ describe('canUserAskForHelp', () => {
728
+ it('works as expected', () => {
729
+ assert.deepEqual(MeetingUtil.canUserAskForHelp(['DISABLE_ASK_FOR_HELP']), false);
730
+ assert.deepEqual(MeetingUtil.canUserAskForHelp([]), true);
507
731
  });
732
+ });
508
733
 
509
- describe('stopRecording', () => {
510
- it('can stop recording when the correct display hint is present', () => {
511
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_STOP');
512
-
513
- const result = MeetingUtil.stopRecording(request, locusUrl, locusInfo);
514
-
515
- assert.calledWith(request.recordMeeting, {locusUrl, recording: false, paused: false});
516
-
517
- assert.deepEqual(result, request.recordMeeting.firstCall.returnValue);
518
- });
519
-
520
- it('rejects when correct display hint is not present', () => {
521
- const result = MeetingUtil.stopRecording(request, locusUrl, {});
522
-
523
- assert.notCalled(request.recordMeeting);
524
-
525
- assert.isRejected(result);
526
- });
734
+ describe('isBreakoutPreassignmentsEnabled', () => {
735
+ it('works as expected', () => {
736
+ assert.deepEqual(
737
+ MeetingUtil.isBreakoutPreassignmentsEnabled(['DISABLE_BREAKOUT_PREASSIGNMENTS']),
738
+ false
739
+ );
740
+ assert.deepEqual(MeetingUtil.isBreakoutPreassignmentsEnabled([]), true);
527
741
  });
528
742
  });
529
743
  });