@webex/plugin-meetings 3.0.0-beta.22 → 3.0.0-beta.221

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 (419) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +114 -14
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +841 -19
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/request.js +78 -0
  17. package/dist/breakouts/request.js.map +1 -0
  18. package/dist/breakouts/utils.js +67 -0
  19. package/dist/breakouts/utils.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +3 -2
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/queue.js +24 -9
  25. package/dist/common/queue.js.map +1 -1
  26. package/dist/config.js +3 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +188 -30
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/constants.js +14 -0
  31. package/dist/controls-options-manager/constants.js.map +1 -0
  32. package/dist/controls-options-manager/enums.js +27 -0
  33. package/dist/controls-options-manager/enums.js.map +1 -0
  34. package/dist/controls-options-manager/index.js +297 -0
  35. package/dist/controls-options-manager/index.js.map +1 -0
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +319 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +106 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +366 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +91 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +357 -62
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/infoUtils.js +7 -1
  53. package/dist/locus-info/infoUtils.js.map +1 -1
  54. package/dist/locus-info/mediaSharesUtils.js +43 -1
  55. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  56. package/dist/locus-info/parser.js +219 -63
  57. package/dist/locus-info/parser.js.map +1 -1
  58. package/dist/locus-info/selfUtils.js +89 -14
  59. package/dist/locus-info/selfUtils.js.map +1 -1
  60. package/dist/media/index.js +49 -106
  61. package/dist/media/index.js.map +1 -1
  62. package/dist/media/properties.js +29 -90
  63. package/dist/media/properties.js.map +1 -1
  64. package/dist/mediaQualityMetrics/config.js +505 -493
  65. package/dist/mediaQualityMetrics/config.js.map +1 -1
  66. package/dist/meeting/in-meeting-actions.js +90 -2
  67. package/dist/meeting/in-meeting-actions.js.map +1 -1
  68. package/dist/meeting/index.js +2587 -2560
  69. package/dist/meeting/index.js.map +1 -1
  70. package/dist/meeting/locusMediaRequest.js +292 -0
  71. package/dist/meeting/locusMediaRequest.js.map +1 -0
  72. package/dist/meeting/muteState.js +228 -123
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +244 -194
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +568 -414
  77. package/dist/meeting/util.js.map +1 -1
  78. package/dist/meeting-info/index.js +48 -7
  79. package/dist/meeting-info/index.js.map +1 -1
  80. package/dist/meeting-info/meeting-info-v2.js +171 -51
  81. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  82. package/dist/meeting-info/utilv2.js +20 -5
  83. package/dist/meeting-info/utilv2.js.map +1 -1
  84. package/dist/meetings/collection.js +22 -0
  85. package/dist/meetings/collection.js.map +1 -1
  86. package/dist/meetings/index.js +361 -84
  87. package/dist/meetings/index.js.map +1 -1
  88. package/dist/meetings/meetings.types.js +7 -0
  89. package/dist/meetings/meetings.types.js.map +1 -0
  90. package/dist/meetings/request.js +2 -0
  91. package/dist/meetings/request.js.map +1 -1
  92. package/dist/meetings/util.js +88 -1
  93. package/dist/meetings/util.js.map +1 -1
  94. package/dist/member/index.js +49 -0
  95. package/dist/member/index.js.map +1 -1
  96. package/dist/member/types.js +25 -0
  97. package/dist/member/types.js.map +1 -0
  98. package/dist/member/util.js +121 -25
  99. package/dist/member/util.js.map +1 -1
  100. package/dist/members/collection.js +10 -0
  101. package/dist/members/collection.js.map +1 -1
  102. package/dist/members/index.js +86 -5
  103. package/dist/members/index.js.map +1 -1
  104. package/dist/members/request.js +106 -38
  105. package/dist/members/request.js.map +1 -1
  106. package/dist/members/types.js +15 -0
  107. package/dist/members/types.js.map +1 -0
  108. package/dist/members/util.js +316 -233
  109. package/dist/members/util.js.map +1 -1
  110. package/dist/metrics/constants.js +3 -5
  111. package/dist/metrics/constants.js.map +1 -1
  112. package/dist/metrics/index.js +1 -468
  113. package/dist/metrics/index.js.map +1 -1
  114. package/dist/multistream/mediaRequestManager.js +238 -49
  115. package/dist/multistream/mediaRequestManager.js.map +1 -1
  116. package/dist/multistream/receiveSlot.js +49 -16
  117. package/dist/multistream/receiveSlot.js.map +1 -1
  118. package/dist/multistream/receiveSlotManager.js +52 -34
  119. package/dist/multistream/receiveSlotManager.js.map +1 -1
  120. package/dist/multistream/remoteMedia.js +44 -18
  121. package/dist/multistream/remoteMedia.js.map +1 -1
  122. package/dist/multistream/remoteMediaGroup.js +60 -3
  123. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  124. package/dist/multistream/remoteMediaManager.js +173 -59
  125. package/dist/multistream/remoteMediaManager.js.map +1 -1
  126. package/dist/networkQualityMonitor/index.js +4 -2
  127. package/dist/networkQualityMonitor/index.js.map +1 -1
  128. package/dist/reachability/index.js +90 -30
  129. package/dist/reachability/index.js.map +1 -1
  130. package/dist/reachability/request.js +16 -7
  131. package/dist/reachability/request.js.map +1 -1
  132. package/dist/reconnection-manager/index.js +196 -155
  133. package/dist/reconnection-manager/index.js.map +1 -1
  134. package/dist/recording-controller/index.js +21 -2
  135. package/dist/recording-controller/index.js.map +1 -1
  136. package/dist/recording-controller/util.js +9 -8
  137. package/dist/recording-controller/util.js.map +1 -1
  138. package/dist/roap/index.js +25 -29
  139. package/dist/roap/index.js.map +1 -1
  140. package/dist/roap/request.js +111 -89
  141. package/dist/roap/request.js.map +1 -1
  142. package/dist/roap/turnDiscovery.js +97 -36
  143. package/dist/roap/turnDiscovery.js.map +1 -1
  144. package/dist/rtcMetrics/constants.js +12 -0
  145. package/dist/rtcMetrics/constants.js.map +1 -0
  146. package/dist/rtcMetrics/index.js +117 -0
  147. package/dist/rtcMetrics/index.js.map +1 -0
  148. package/dist/statsAnalyzer/global.js +1 -93
  149. package/dist/statsAnalyzer/global.js.map +1 -1
  150. package/dist/statsAnalyzer/index.js +326 -311
  151. package/dist/statsAnalyzer/index.js.map +1 -1
  152. package/dist/statsAnalyzer/mqaUtil.js +90 -53
  153. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  154. package/dist/types/annotation/annotation.types.d.ts +42 -0
  155. package/dist/types/annotation/constants.d.ts +31 -0
  156. package/dist/types/annotation/index.d.ts +117 -0
  157. package/dist/types/breakouts/breakout.d.ts +8 -0
  158. package/dist/types/breakouts/collection.d.ts +5 -0
  159. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  160. package/dist/types/breakouts/events.d.ts +8 -0
  161. package/dist/types/breakouts/index.d.ts +5 -0
  162. package/dist/types/breakouts/request.d.ts +22 -0
  163. package/dist/types/breakouts/utils.d.ts +15 -0
  164. package/dist/types/common/browser-detection.d.ts +9 -0
  165. package/dist/types/common/collection.d.ts +48 -0
  166. package/dist/types/common/config.d.ts +2 -0
  167. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  168. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  169. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  170. package/dist/types/common/errors/media.d.ts +15 -0
  171. package/dist/types/common/errors/parameter.d.ts +15 -0
  172. package/dist/types/common/errors/password-error.d.ts +15 -0
  173. package/dist/types/common/errors/permission.d.ts +14 -0
  174. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  175. package/dist/types/common/errors/reconnection.d.ts +15 -0
  176. package/dist/types/common/errors/stats.d.ts +15 -0
  177. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  178. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  179. package/dist/types/common/events/events-scope.d.ts +17 -0
  180. package/dist/types/common/events/events.d.ts +12 -0
  181. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  182. package/dist/types/common/events/util.d.ts +2 -0
  183. package/dist/types/common/logs/logger-config.d.ts +2 -0
  184. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  185. package/dist/types/common/logs/request.d.ts +34 -0
  186. package/dist/types/common/queue.d.ts +34 -0
  187. package/dist/types/config.d.ts +72 -0
  188. package/dist/types/constants.d.ts +1028 -0
  189. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  190. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  191. package/dist/types/controls-options-manager/index.d.ts +136 -0
  192. package/dist/types/controls-options-manager/types.d.ts +43 -0
  193. package/dist/types/controls-options-manager/util.d.ts +1 -0
  194. package/dist/types/index.d.ts +7 -0
  195. package/dist/types/interpretation/collection.d.ts +5 -0
  196. package/dist/types/interpretation/index.d.ts +5 -0
  197. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  198. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  199. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  200. package/dist/types/locus-info/fullState.d.ts +2 -0
  201. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  202. package/dist/types/locus-info/index.d.ts +322 -0
  203. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  204. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  205. package/dist/types/locus-info/parser.d.ts +271 -0
  206. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  207. package/dist/types/media/index.d.ts +34 -0
  208. package/dist/types/media/properties.d.ts +93 -0
  209. package/dist/types/media/util.d.ts +2 -0
  210. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  211. package/dist/types/meeting/in-meeting-actions.d.ts +163 -0
  212. package/dist/types/meeting/index.d.ts +1512 -0
  213. package/dist/types/meeting/locusMediaRequest.d.ts +75 -0
  214. package/dist/types/meeting/muteState.d.ts +184 -0
  215. package/dist/types/meeting/request.d.ts +289 -0
  216. package/dist/types/meeting/request.type.d.ts +11 -0
  217. package/dist/types/meeting/state.d.ts +9 -0
  218. package/dist/types/meeting/util.d.ts +94 -0
  219. package/dist/types/meeting-info/collection.d.ts +20 -0
  220. package/dist/types/meeting-info/index.d.ts +62 -0
  221. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  222. package/dist/types/meeting-info/request.d.ts +22 -0
  223. package/dist/types/meeting-info/util.d.ts +2 -0
  224. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  225. package/dist/types/meetings/collection.d.ts +31 -0
  226. package/dist/types/meetings/index.d.ts +361 -0
  227. package/dist/types/meetings/meetings.types.d.ts +4 -0
  228. package/dist/types/meetings/request.d.ts +27 -0
  229. package/dist/types/meetings/util.d.ts +18 -0
  230. package/dist/types/member/index.d.ts +159 -0
  231. package/dist/types/member/types.d.ts +32 -0
  232. package/dist/types/member/util.d.ts +2 -0
  233. package/dist/types/members/collection.d.ts +29 -0
  234. package/dist/types/members/index.d.ts +353 -0
  235. package/dist/types/members/request.d.ts +114 -0
  236. package/dist/types/members/types.d.ts +24 -0
  237. package/dist/types/members/util.d.ts +210 -0
  238. package/dist/types/metrics/constants.d.ts +55 -0
  239. package/dist/types/metrics/index.d.ts +45 -0
  240. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  241. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  242. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  243. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  244. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  245. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  246. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  247. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  248. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  249. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  250. package/dist/types/reachability/index.d.ts +158 -0
  251. package/dist/types/reachability/request.d.ts +39 -0
  252. package/dist/types/reactions/constants.d.ts +3 -0
  253. package/dist/types/reactions/reactions.d.ts +4 -0
  254. package/dist/types/reactions/reactions.type.d.ts +52 -0
  255. package/dist/types/reconnection-manager/index.d.ts +126 -0
  256. package/dist/types/recording-controller/enums.d.ts +7 -0
  257. package/dist/types/recording-controller/index.d.ts +207 -0
  258. package/dist/types/recording-controller/util.d.ts +14 -0
  259. package/dist/types/roap/index.d.ts +77 -0
  260. package/dist/types/roap/request.d.ts +38 -0
  261. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  262. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  263. package/dist/types/rtcMetrics/index.d.ts +47 -0
  264. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  265. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  266. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  267. package/dist/types/transcription/index.d.ts +64 -0
  268. package/package.json +23 -20
  269. package/src/annotation/annotation.types.ts +50 -0
  270. package/src/annotation/constants.ts +36 -0
  271. package/src/annotation/index.ts +328 -0
  272. package/src/breakouts/README.md +44 -14
  273. package/src/breakouts/breakout.ts +87 -9
  274. package/src/breakouts/edit-lock-error.ts +25 -0
  275. package/src/breakouts/events.ts +56 -0
  276. package/src/breakouts/index.ts +710 -10
  277. package/src/breakouts/request.ts +55 -0
  278. package/src/breakouts/utils.ts +57 -0
  279. package/src/common/errors/webex-errors.ts +6 -2
  280. package/src/common/logs/logger-proxy.ts +1 -1
  281. package/src/common/queue.ts +22 -8
  282. package/src/config.ts +2 -7
  283. package/src/constants.ts +175 -21
  284. package/src/controls-options-manager/constants.ts +5 -0
  285. package/src/controls-options-manager/enums.ts +18 -0
  286. package/src/controls-options-manager/index.ts +278 -0
  287. package/src/controls-options-manager/types.ts +59 -0
  288. package/src/controls-options-manager/util.ts +300 -0
  289. package/src/index.ts +39 -0
  290. package/src/interpretation/README.md +60 -0
  291. package/src/interpretation/collection.ts +19 -0
  292. package/src/interpretation/index.ts +332 -0
  293. package/src/interpretation/siLanguage.ts +18 -0
  294. package/src/locus-info/controlsUtils.ts +108 -0
  295. package/src/locus-info/index.ts +381 -59
  296. package/src/locus-info/infoUtils.ts +10 -2
  297. package/src/locus-info/mediaSharesUtils.ts +48 -0
  298. package/src/locus-info/parser.ts +224 -39
  299. package/src/locus-info/selfUtils.ts +81 -5
  300. package/src/media/index.ts +89 -109
  301. package/src/media/properties.ts +49 -90
  302. package/src/mediaQualityMetrics/config.ts +379 -377
  303. package/src/meeting/in-meeting-actions.ts +179 -3
  304. package/src/meeting/index.ts +2062 -2137
  305. package/src/meeting/locusMediaRequest.ts +314 -0
  306. package/src/meeting/muteState.ts +227 -130
  307. package/src/meeting/request.ts +157 -116
  308. package/src/meeting/util.ts +555 -396
  309. package/src/meeting-info/index.ts +54 -8
  310. package/src/meeting-info/meeting-info-v2.ts +148 -14
  311. package/src/meeting-info/utilv2.ts +13 -3
  312. package/src/meetings/collection.ts +20 -0
  313. package/src/meetings/index.ts +397 -102
  314. package/src/meetings/meetings.types.ts +12 -0
  315. package/src/meetings/request.ts +2 -0
  316. package/src/meetings/util.ts +103 -4
  317. package/src/member/index.ts +49 -0
  318. package/src/member/types.ts +38 -0
  319. package/src/member/util.ts +127 -25
  320. package/src/members/collection.ts +8 -0
  321. package/src/members/index.ts +107 -6
  322. package/src/members/request.ts +97 -17
  323. package/src/members/types.ts +28 -0
  324. package/src/members/util.ts +319 -240
  325. package/src/metrics/constants.ts +2 -4
  326. package/src/metrics/index.ts +1 -490
  327. package/src/multistream/mediaRequestManager.ts +289 -79
  328. package/src/multistream/receiveSlot.ts +55 -18
  329. package/src/multistream/receiveSlotManager.ts +46 -24
  330. package/src/multistream/remoteMedia.ts +27 -2
  331. package/src/multistream/remoteMediaGroup.ts +59 -0
  332. package/src/multistream/remoteMediaManager.ts +113 -32
  333. package/src/networkQualityMonitor/index.ts +6 -6
  334. package/src/reachability/index.ts +76 -18
  335. package/src/reachability/request.ts +16 -7
  336. package/src/reconnection-manager/index.ts +68 -43
  337. package/src/recording-controller/index.ts +20 -3
  338. package/src/recording-controller/util.ts +26 -9
  339. package/src/roap/index.ts +25 -30
  340. package/src/roap/request.ts +103 -95
  341. package/src/roap/turnDiscovery.ts +51 -25
  342. package/src/rtcMetrics/constants.ts +3 -0
  343. package/src/rtcMetrics/index.ts +100 -0
  344. package/src/statsAnalyzer/global.ts +1 -94
  345. package/src/statsAnalyzer/index.ts +376 -386
  346. package/src/statsAnalyzer/mqaUtil.ts +100 -99
  347. package/test/integration/spec/converged-space-meetings.js +233 -0
  348. package/test/integration/spec/journey.js +336 -259
  349. package/test/integration/spec/space-meeting.js +77 -4
  350. package/test/unit/spec/annotation/index.ts +418 -0
  351. package/test/unit/spec/breakouts/breakout.ts +142 -24
  352. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  353. package/test/unit/spec/breakouts/events.ts +89 -0
  354. package/test/unit/spec/breakouts/index.ts +1545 -48
  355. package/test/unit/spec/breakouts/request.ts +104 -0
  356. package/test/unit/spec/breakouts/utils.js +72 -0
  357. package/test/unit/spec/common/queue.js +31 -2
  358. package/test/unit/spec/controls-options-manager/index.js +287 -0
  359. package/test/unit/spec/controls-options-manager/util.js +582 -0
  360. package/test/unit/spec/fixture/locus.js +1 -0
  361. package/test/unit/spec/interpretation/collection.ts +15 -0
  362. package/test/unit/spec/interpretation/index.ts +589 -0
  363. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  364. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  365. package/test/unit/spec/locus-info/index.js +1169 -36
  366. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  367. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  368. package/test/unit/spec/locus-info/parser.js +62 -22
  369. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  370. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  371. package/test/unit/spec/media/index.ts +138 -28
  372. package/test/unit/spec/meeting/in-meeting-actions.ts +89 -3
  373. package/test/unit/spec/meeting/index.js +3510 -1747
  374. package/test/unit/spec/meeting/locusMediaRequest.ts +443 -0
  375. package/test/unit/spec/meeting/muteState.js +370 -208
  376. package/test/unit/spec/meeting/request.js +417 -45
  377. package/test/unit/spec/meeting/utils.js +601 -53
  378. package/test/unit/spec/meeting-info/index.js +181 -0
  379. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  380. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  381. package/test/unit/spec/meetings/collection.js +14 -0
  382. package/test/unit/spec/meetings/index.js +874 -150
  383. package/test/unit/spec/meetings/utils.js +206 -2
  384. package/test/unit/spec/member/index.js +58 -4
  385. package/test/unit/spec/member/util.js +479 -35
  386. package/test/unit/spec/members/index.js +319 -1
  387. package/test/unit/spec/members/request.js +206 -27
  388. package/test/unit/spec/members/utils.js +184 -0
  389. package/test/unit/spec/metrics/index.js +1 -50
  390. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  391. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  392. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  393. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  394. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  395. package/test/unit/spec/multistream/remoteMediaManager.ts +318 -0
  396. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  397. package/test/unit/spec/reachability/index.ts +185 -7
  398. package/test/unit/spec/reachability/request.js +68 -0
  399. package/test/unit/spec/reconnection-manager/index.js +59 -6
  400. package/test/unit/spec/recording-controller/index.js +294 -218
  401. package/test/unit/spec/recording-controller/util.js +223 -96
  402. package/test/unit/spec/roap/index.ts +27 -51
  403. package/test/unit/spec/roap/request.ts +202 -85
  404. package/test/unit/spec/roap/turnDiscovery.ts +36 -8
  405. package/test/unit/spec/rtcMetrics/index.ts +68 -0
  406. package/test/unit/spec/stats-analyzer/index.js +92 -41
  407. package/test/utils/constants.js +9 -0
  408. package/test/utils/integrationTestUtils.js +46 -0
  409. package/test/utils/testUtils.js +0 -45
  410. package/test/utils/webex-config.js +4 -0
  411. package/test/utils/webex-test-users.js +6 -3
  412. package/dist/meeting/effectsState.js +0 -262
  413. package/dist/meeting/effectsState.js.map +0 -1
  414. package/dist/metrics/config.js +0 -299
  415. package/dist/metrics/config.js.map +0 -1
  416. package/src/index.js +0 -16
  417. package/src/meeting/effectsState.ts +0 -211
  418. package/src/metrics/config.ts +0 -495
  419. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -1,23 +1,32 @@
1
1
  import sinon from 'sinon';
2
2
  import {assert} from '@webex/test-helper-chai';
3
+ import Meetings from '@webex/plugin-meetings';
3
4
  import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
4
5
  import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
5
6
  import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
6
7
  import Metrics from '@webex/plugin-meetings/src/metrics/index';
7
- import {DISPLAY_HINTS} from '@webex/plugin-meetings/dist/constants';
8
+ import {SELF_POLICY} from '@webex/plugin-meetings/src/constants';
9
+ import {DISPLAY_HINTS} from '@webex/plugin-meetings/src/constants';
10
+ import MockWebex from '@webex/test-helper-mock-webex';
8
11
 
9
12
  describe('plugin-meetings', () => {
13
+ let webex;
10
14
  describe('Meeting utils function', () => {
11
15
  const sandbox = sinon.createSandbox();
12
16
  const meeting = {};
13
17
 
14
18
  beforeEach(() => {
15
- Metrics.postEvent = sinon.stub();
19
+ webex = new MockWebex({
20
+ children: {
21
+ meetings: Meetings,
22
+ },
23
+ });
16
24
  const logger = {
17
25
  info: sandbox.stub(),
18
26
  log: sandbox.stub(),
19
27
  error: sandbox.stub(),
20
28
  warn: sandbox.stub(),
29
+ debug: sandbox.stub(),
21
30
  };
22
31
 
23
32
  LoggerConfig.set({
@@ -26,42 +35,41 @@ describe('plugin-meetings', () => {
26
35
  });
27
36
  LoggerProxy.set(logger);
28
37
 
29
- meeting.closeLocalStream = sinon.stub().returns(Promise.resolve());
30
- meeting.closeLocalShare = sinon.stub().returns(Promise.resolve());
38
+ meeting.cleanupLocalTracks = sinon.stub().returns(Promise.resolve());
31
39
  meeting.closeRemoteTracks = sinon.stub().returns(Promise.resolve());
32
40
  meeting.closePeerConnections = sinon.stub().returns(Promise.resolve());
33
41
 
34
- meeting.unsetLocalVideoTrack = sinon.stub();
35
- meeting.unsetLocalShareTrack = sinon.stub();
36
42
  meeting.unsetRemoteTracks = sinon.stub();
37
43
  meeting.unsetPeerConnections = sinon.stub();
38
44
  meeting.reconnectionManager = {cleanUp: sinon.stub()};
39
45
  meeting.stopKeepAlive = sinon.stub();
40
46
  meeting.updateLLMConnection = sinon.stub();
41
47
  meeting.breakouts = {cleanUp: sinon.stub()};
48
+ meeting.annotaion = {cleanUp: sinon.stub()};
49
+ meeting.getWebexObject = sinon.stub().returns(webex);
50
+ meeting.simultaneousInterpretation = {cleanUp: sinon.stub()};
51
+ meeting.trigger = sinon.stub();
42
52
  });
43
53
 
44
54
  afterEach(() => {
45
55
  sandbox.restore();
56
+ sinon.restore();
46
57
  });
47
58
 
48
59
  describe('#cleanup', () => {
49
60
  it('do clean up on meeting object', async () => {
50
61
  await MeetingUtil.cleanUp(meeting);
51
- assert.calledOnce(meeting.closeLocalStream);
52
- assert.calledOnce(meeting.closeLocalStream);
53
- assert.calledOnce(meeting.closeLocalShare);
62
+ assert.calledOnce(meeting.cleanupLocalTracks);
54
63
  assert.calledOnce(meeting.closeRemoteTracks);
55
64
  assert.calledOnce(meeting.closePeerConnections);
56
65
 
57
- assert.calledOnce(meeting.unsetLocalVideoTrack);
58
- assert.calledOnce(meeting.unsetLocalShareTrack);
59
66
  assert.calledOnce(meeting.unsetRemoteTracks);
60
67
  assert.calledOnce(meeting.unsetPeerConnections);
61
68
  assert.calledOnce(meeting.reconnectionManager.cleanUp);
62
69
  assert.calledOnce(meeting.stopKeepAlive);
63
70
  assert.calledOnce(meeting.updateLLMConnection);
64
71
  assert.calledOnce(meeting.breakouts.cleanUp);
72
+ assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
65
73
  });
66
74
  });
67
75
 
@@ -71,7 +79,9 @@ describe('plugin-meetings', () => {
71
79
  });
72
80
 
73
81
  const mockTrack = {
74
- getSettings: fakeDevice,
82
+ underlyingTrack: {
83
+ getSettings: fakeDevice,
84
+ },
75
85
  };
76
86
 
77
87
  it('#log - should log [info, warn, error, log] to console', () => {
@@ -130,51 +140,217 @@ describe('plugin-meetings', () => {
130
140
  });
131
141
  });
132
142
 
133
- describe('remoteUpdateAudioVideo', () => {
134
- it('#Should call meetingRequest.remoteAudioVideoToggle with correct parameters (multistream)', async () => {
143
+ describe('addSequence', () => {
144
+ it('should add the sequence object to a request body', () => {
145
+ const body = {};
146
+
147
+ MeetingUtil.addSequence(
148
+ {
149
+ locusInfo: {
150
+ sequence: 'sequence',
151
+ },
152
+ },
153
+ body
154
+ );
155
+
156
+ assert.deepEqual(body, {
157
+ sequence: 'sequence',
158
+ });
159
+ });
160
+
161
+ it('should work with an undefined meeting', () => {
162
+ const body = {};
163
+
164
+ MeetingUtil.addSequence(undefined, body);
165
+
166
+ assert.deepEqual(body, {});
167
+ });
168
+
169
+ it('should work with an undefined locusInfo', () => {
170
+ const body = {};
171
+
172
+ MeetingUtil.addSequence({}, body);
173
+
174
+ assert.deepEqual(body, {});
175
+ });
176
+
177
+ it('should work with an undefined sequence', () => {
178
+ const body = {};
179
+
180
+ MeetingUtil.addSequence({locusInfo: {}}, body);
181
+
182
+ assert.deepEqual(body, {});
183
+ });
184
+ });
185
+
186
+ describe('updateLocusWithDelta', () => {
187
+ it('should call handleLocusDelta with the new delta locus', () => {
135
188
  const meeting = {
136
- correlationId: 'correlation id',
137
- isMultistream: true,
138
- mediaId: '12345',
139
- meetingJoinUrl: 'meetingJoinUrl',
140
- locusUrl: 'locusUrl',
141
- deviceUrl: 'some device url',
142
- selfId: 'self id',
143
- meetingRequest: {
144
- remoteAudioVideoToggle: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
189
+ locusInfo: {
190
+ handleLocusDelta: sinon.stub(),
191
+ },
192
+ };
193
+
194
+ const originalResponse = {
195
+ body: {
196
+ locus: 'locus',
145
197
  },
146
198
  };
147
199
 
148
- await MeetingUtil.remoteUpdateAudioVideo(true, false, meeting);
200
+ const response = MeetingUtil.updateLocusWithDelta(meeting, originalResponse);
149
201
 
150
- assert.calledOnce(meeting.meetingRequest.remoteAudioVideoToggle);
151
- const parameter = meeting.meetingRequest.remoteAudioVideoToggle.getCall(0).args[0];
202
+ assert.deepEqual(response, originalResponse);
203
+ assert.calledOnceWithExactly(meeting.locusInfo.handleLocusDelta, 'locus', meeting);
204
+ });
152
205
 
153
- assert.equal(parameter.locusUrl, 'locusUrl');
154
- assert.equal(parameter.selfId, 'self id');
155
- assert.equal(parameter.correlationId, 'correlation id');
156
- assert.equal(parameter.deviceUrl, 'some device url');
157
- assert.deepEqual(parameter.localMedias, [
158
- {localSdp: '{"audioMuted":true,"videoMuted":false}', mediaId: '12345'},
159
- ]);
160
- assert.equal(parameter.preferTranscoding, false);
206
+ it('should handle locus being missing from the response', () => {
207
+ const meeting = {
208
+ locusInfo: {
209
+ handleLocusDelta: sinon.stub(),
210
+ },
211
+ };
212
+
213
+ const originalResponse = {
214
+ body: {},
215
+ };
216
+
217
+ const response = MeetingUtil.updateLocusWithDelta(meeting, originalResponse);
218
+
219
+ assert.deepEqual(response, originalResponse);
220
+ assert.notCalled(meeting.locusInfo.handleLocusDelta);
221
+ });
222
+
223
+ it('should work with an undefined meeting', () => {
224
+ const originalResponse = {
225
+ body: {
226
+ locus: 'locus',
227
+ },
228
+ };
229
+
230
+ const response = MeetingUtil.updateLocusWithDelta(undefined, originalResponse);
231
+ assert.deepEqual(response, originalResponse);
232
+ });
233
+ });
234
+
235
+ describe('generateLocusDeltaRequest', () => {
236
+ it('generates the correct wrapper function', async () => {
237
+ const updateLocusWithDeltaSpy = sinon.spy(MeetingUtil, 'updateLocusWithDelta');
238
+ const addSequenceSpy = sinon.spy(MeetingUtil, 'addSequence');
239
+
240
+ const meeting = {
241
+ request: sinon.stub().returns(Promise.resolve('result')),
242
+ };
243
+
244
+ const locusDeltaRequest = MeetingUtil.generateLocusDeltaRequest(meeting);
245
+
246
+ const options = {
247
+ some: 'option',
248
+ body: {},
249
+ };
250
+
251
+ let result = await locusDeltaRequest(options);
252
+
253
+ assert.equal(result, 'result');
254
+ assert.calledOnceWithExactly(updateLocusWithDeltaSpy, meeting, 'result');
255
+ assert.calledOnceWithExactly(addSequenceSpy, meeting, options.body);
256
+
257
+ updateLocusWithDeltaSpy.resetHistory();
258
+ addSequenceSpy.resetHistory();
259
+
260
+ // body missing from options
261
+ result = await locusDeltaRequest({});
262
+ assert.equal(result, 'result');
263
+ assert.calledOnceWithExactly(updateLocusWithDeltaSpy, meeting, 'result');
264
+ assert.calledOnceWithExactly(addSequenceSpy, meeting, options.body);
265
+
266
+ // meeting disappears so the WeakRef returns undefined
267
+ sinon.stub(WeakRef.prototype, 'deref').returns(undefined);
268
+
269
+ result = await locusDeltaRequest(options);
270
+ assert.equal(result, undefined);
271
+
272
+ WeakRef.prototype.deref.restore();
273
+ });
274
+
275
+ it('calls generateBuildLocusDeltaRequestOptions as expected', () => {
276
+ const generateBuildLocusDeltaRequestOptionsSpy = sinon.spy(
277
+ MeetingUtil,
278
+ 'generateBuildLocusDeltaRequestOptions'
279
+ );
280
+
281
+ const meeting = {};
282
+
283
+ MeetingUtil.generateLocusDeltaRequest(meeting);
284
+
285
+ assert.calledOnceWithExactly(generateBuildLocusDeltaRequestOptionsSpy, meeting);
161
286
  });
287
+ });
288
+
289
+ describe('selfSupportsFeature', () => {
290
+ it('returns true if there are no user policies', () => {
291
+ assert.equal(
292
+ MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_ANNOTATION, undefined),
293
+ true
294
+ );
295
+ });
296
+
297
+ it('returns true if policy is true', () => {
298
+ assert.equal(
299
+ MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_ANNOTATION, {
300
+ [SELF_POLICY.SUPPORT_ANNOTATION]: true,
301
+ }),
302
+ true
303
+ );
304
+ });
305
+
306
+ it('returns false if policy is false', () => {
307
+ assert.equal(
308
+ MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_ANNOTATION, {
309
+ [SELF_POLICY.SUPPORT_ANNOTATION]: false,
310
+ }),
311
+ false
312
+ );
313
+ });
314
+ });
162
315
 
163
- it('#Should call meetingRequest.remoteAudioVideoToggle with preferTranscoding:true for non multistream connections', async () => {
316
+ describe('remoteUpdateAudioVideo', () => {
317
+ it('#Should call meetingRequest.locusMediaRequest with correct parameters', async () => {
164
318
  const meeting = {
165
- isMultistream: false,
319
+ id: 'meeting-id',
166
320
  mediaId: '12345',
167
- meetingRequest: {
168
- remoteAudioVideoToggle: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
321
+ selfUrl: 'self url',
322
+ locusInfo: {
323
+ sequence: {},
169
324
  },
325
+ locusMediaRequest: {
326
+ send: sinon.stub().resolves({body: {}, headers: {}}),
327
+ },
328
+ getWebexObject: sinon.stub().returns(webex),
170
329
  };
171
330
 
172
- await MeetingUtil.remoteUpdateAudioVideo(true, false, meeting);
331
+ await MeetingUtil.remoteUpdateAudioVideo(meeting, true, false);
173
332
 
174
- assert.calledOnce(meeting.meetingRequest.remoteAudioVideoToggle);
175
- const parameter = meeting.meetingRequest.remoteAudioVideoToggle.getCall(0).args[0];
333
+ assert.calledOnceWithExactly(meeting.locusMediaRequest.send, {
334
+ mediaId: '12345',
335
+ muteOptions: {
336
+ audioMuted: true,
337
+ videoMuted: false,
338
+ },
339
+ selfUrl: 'self url',
340
+ sequence: {},
341
+ type: 'LocalMute',
342
+ ipVersion: 0,
343
+ });
176
344
 
177
- assert.equal(parameter.preferTranscoding, true);
345
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
346
+ name: 'client.locus.media.request',
347
+ options: {meetingId: meeting.id},
348
+ });
349
+
350
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
351
+ name: 'client.locus.media.response',
352
+ options: {meetingId: meeting.id},
353
+ });
178
354
  });
179
355
  });
180
356
 
@@ -184,8 +360,16 @@ describe('plugin-meetings', () => {
184
360
  meetingJoinUrl: 'meetingJoinUrl',
185
361
  locusUrl: 'locusUrl',
186
362
  meetingRequest: {
187
- joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
363
+ joinMeeting: sinon.stub().returns(
364
+ Promise.resolve({
365
+ body: {mediaConnections: 'mediaConnections'},
366
+ headers: {
367
+ trackingid: 'trackingId',
368
+ },
369
+ })
370
+ ),
188
371
  },
372
+ getWebexObject: sinon.stub().returns(webex),
189
373
  };
190
374
 
191
375
  MeetingUtil.parseLocusJoin = sinon.stub();
@@ -196,16 +380,38 @@ describe('plugin-meetings', () => {
196
380
 
197
381
  assert.equal(parameter.inviteeAddress, 'meetingJoinUrl');
198
382
  assert.equal(parameter.preferTranscoding, true);
383
+
384
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
385
+ name: 'client.locus.join.request',
386
+ options: {meetingId: meeting.id},
387
+ });
388
+
389
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
390
+ name: 'client.locus.join.response',
391
+ payload: {
392
+ trigger: 'loci-update',
393
+ identifiers: {
394
+ trackingId: 'trackingId',
395
+ },
396
+ },
397
+ options: {
398
+ meetingId: meeting.id,
399
+ mediaConnections: 'mediaConnections',
400
+ },
401
+ });
199
402
  });
200
403
 
201
404
  it('#Should call meetingRequest.joinMeeting with breakoutsSupported=true when passed in as true', async () => {
202
405
  const meeting = {
203
- meetingRequest: {joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}
406
+ meetingRequest: {
407
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
408
+ },
409
+ getWebexObject: sinon.stub().returns(webex),
204
410
  };
205
411
 
206
412
  MeetingUtil.parseLocusJoin = sinon.stub();
207
413
  await MeetingUtil.joinMeeting(meeting, {
208
- breakoutsSupported: true
414
+ breakoutsSupported: true,
209
415
  });
210
416
 
211
417
  assert.calledOnce(meeting.meetingRequest.joinMeeting);
@@ -214,6 +420,45 @@ describe('plugin-meetings', () => {
214
420
  assert.equal(parameter.breakoutsSupported, true);
215
421
  });
216
422
 
423
+ it('#Should call meetingRequest.joinMeeting with liveAnnotationSupported=true when passed in as true', async () => {
424
+ const meeting = {
425
+ meetingRequest: {
426
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
427
+ },
428
+ getWebexObject: sinon.stub().returns(webex),
429
+ };
430
+
431
+ MeetingUtil.parseLocusJoin = sinon.stub();
432
+ await MeetingUtil.joinMeeting(meeting, {
433
+ liveAnnotationSupported: true,
434
+ });
435
+
436
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
437
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
438
+
439
+ assert.equal(parameter.liveAnnotationSupported, true);
440
+ });
441
+
442
+ it('#Should call meetingRequest.joinMeeting with locale=en_UK, deviceCapabilities=["TEST"] when they are passed in as those values', async () => {
443
+ const meeting = {
444
+ meetingRequest: {
445
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
446
+ },
447
+ getWebexObject: sinon.stub().returns(webex),
448
+ };
449
+
450
+ MeetingUtil.parseLocusJoin = sinon.stub();
451
+ await MeetingUtil.joinMeeting(meeting, {
452
+ locale: 'en_UK',
453
+ deviceCapabilities: ['TEST'],
454
+ });
455
+
456
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
457
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
458
+
459
+ assert.equal(parameter.locale, 'en_UK');
460
+ assert.deepEqual(parameter.deviceCapabilities, ['TEST']);
461
+ });
217
462
 
218
463
  it('#Should call meetingRequest.joinMeeting with preferTranscoding=false when multistream is enabled', async () => {
219
464
  const meeting = {
@@ -223,6 +468,7 @@ describe('plugin-meetings', () => {
223
468
  meetingRequest: {
224
469
  joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
225
470
  },
471
+ getWebexObject: sinon.stub().returns(webex),
226
472
  };
227
473
 
228
474
  MeetingUtil.parseLocusJoin = sinon.stub();
@@ -242,6 +488,7 @@ describe('plugin-meetings', () => {
242
488
  meetingRequest: {
243
489
  joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
244
490
  },
491
+ getWebexObject: sinon.stub().returns(webex),
245
492
  };
246
493
 
247
494
  MeetingUtil.parseLocusJoin = sinon.stub();
@@ -260,6 +507,7 @@ describe('plugin-meetings', () => {
260
507
  meetingRequest: {
261
508
  joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
262
509
  },
510
+ getWebexObject: sinon.stub().returns(webex),
263
511
  };
264
512
 
265
513
  MeetingUtil.parseLocusJoin = sinon.stub();
@@ -273,6 +521,43 @@ describe('plugin-meetings', () => {
273
521
  });
274
522
  });
275
523
 
524
+ describe('joinMeetingOptions', () => {
525
+ it('sends client events correctly', async () => {
526
+ MeetingUtil.joinMeeting = sinon.stub().rejects({});
527
+ MeetingUtil.isPinOrGuest = sinon.stub().returns(true);
528
+ const meeting = {
529
+ id: 'meeting-id',
530
+ mediaId: '12345',
531
+ selfUrl: 'self url',
532
+ locusInfo: {
533
+ sequence: {},
534
+ },
535
+ locusMediaRequest: {
536
+ send: sinon.stub().resolves({body: {}, headers: {}}),
537
+ },
538
+ getWebexObject: sinon.stub().returns(webex),
539
+ };
540
+
541
+ try {
542
+ await MeetingUtil.joinMeetingOptions(meeting, {pin: true});
543
+
544
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
545
+ name: 'client.pin.collected',
546
+ options: {
547
+ meetingId: meeting.id,
548
+ },
549
+ });
550
+ } catch (err) {
551
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
552
+ name: 'client.pin.prompt',
553
+ options: {
554
+ meetingId: meeting.id,
555
+ },
556
+ });
557
+ }
558
+ });
559
+ });
560
+
276
561
  describe('getUserDisplayHintsFromLocusInfo', () => {
277
562
  it('returns display hints', () => {
278
563
  assert.deepEqual(MeetingUtil.getUserDisplayHintsFromLocusInfo(), []);
@@ -344,6 +629,30 @@ describe('plugin-meetings', () => {
344
629
  });
345
630
  });
346
631
 
632
+ describe('canUserRenameSelfAndObserved', () => {
633
+ it('works as expected', () => {
634
+ assert.deepEqual(
635
+ MeetingUtil.canUserRenameSelfAndObserved(['CAN_RENAME_SELF_AND_OBSERVED']),
636
+ true
637
+ );
638
+ assert.deepEqual(MeetingUtil.canUserRenameSelfAndObserved([]), false);
639
+ });
640
+ });
641
+
642
+ describe('canUserRenameOthers', () => {
643
+ it('works as expected', () => {
644
+ assert.deepEqual(MeetingUtil.canUserRenameOthers(['CAN_RENAME_OTHERS']), true);
645
+ assert.deepEqual(MeetingUtil.canUserRenameOthers([]), false);
646
+ });
647
+ });
648
+
649
+ describe('canShareWhiteBoard', () => {
650
+ it('works as expected', () => {
651
+ assert.deepEqual(MeetingUtil.canShareWhiteBoard(['SHARE_WHITEBOARD']), true);
652
+ assert.deepEqual(MeetingUtil.canShareWhiteBoard([]), false);
653
+ });
654
+ });
655
+
347
656
  describe('bothLeaveAndEndMeetingAvailable', () => {
348
657
  it('works as expected', () => {
349
658
  assert.deepEqual(
@@ -387,6 +696,7 @@ describe('plugin-meetings', () => {
387
696
  });
388
697
 
389
698
  [
699
+ {functionName: 'isSaveTranscriptsEnabled', displayHint: 'SAVE_TRANSCRIPTS_ENABLED'},
390
700
  {functionName: 'canEnableClosedCaption', displayHint: 'CAPTION_START'},
391
701
  {functionName: 'canStartTranscribing', displayHint: 'TRANSCRIPTION_CONTROL_START'},
392
702
  {functionName: 'canStopTranscribing', displayHint: 'TRANSCRIPTION_CONTROL_STOP'},
@@ -405,17 +715,255 @@ describe('plugin-meetings', () => {
405
715
  });
406
716
  });
407
717
 
408
- describe('reactions', () => {
409
- describe('canEnableReactions', () => {
410
- [[null, DISPLAY_HINTS.ENABLE_REACTIONS, true], [null, DISPLAY_HINTS.DISABLE_REACTIONS, false], [null, undefined, null]].forEach(() => ([originalValue, displayHint, expected]) => {
411
- assert.deepEqual(MeetingUtil.canEnableReactions(originalValue, [displayHint]), expected);
718
+ describe('canManageBreakout', () => {
719
+ it('works as expected', () => {
720
+ assert.deepEqual(MeetingUtil.canManageBreakout(['BREAKOUT_MANAGEMENT']), true);
721
+ assert.deepEqual(MeetingUtil.canManageBreakout([]), false);
722
+ });
723
+ });
724
+
725
+ describe('canBroadcastMessageToBreakout', () => {
726
+ it('works as expected', () => {
727
+ assert.deepEqual(
728
+ MeetingUtil.canBroadcastMessageToBreakout(['BROADCAST_MESSAGE_TO_BREAKOUT'], {
729
+ [SELF_POLICY.SUPPORT_BROADCAST_MESSAGE]: true,
730
+ }),
731
+ true
732
+ );
733
+ assert.deepEqual(
734
+ MeetingUtil.canBroadcastMessageToBreakout([], {
735
+ [SELF_POLICY.SUPPORT_BROADCAST_MESSAGE]: true,
736
+ }),
737
+ false
738
+ );
739
+ assert.deepEqual(
740
+ MeetingUtil.canBroadcastMessageToBreakout(['BROADCAST_MESSAGE_TO_BREAKOUT'], {
741
+ [SELF_POLICY.SUPPORT_BROADCAST_MESSAGE]: false,
742
+ }),
743
+ false
744
+ );
745
+ assert.deepEqual(
746
+ MeetingUtil.canBroadcastMessageToBreakout(['BROADCAST_MESSAGE_TO_BREAKOUT'], undefined),
747
+ false
748
+ );
749
+ });
750
+ });
751
+
752
+ describe('isSuppressBreakoutSupport', () => {
753
+ it('works as expected', () => {
754
+ assert.deepEqual(
755
+ MeetingUtil.isSuppressBreakoutSupport(['UCF_SUPPRESS_BREAKOUTS_SUPPORT']),
756
+ true
757
+ );
758
+ assert.deepEqual(MeetingUtil.isSuppressBreakoutSupport([]), false);
759
+ });
760
+ });
761
+
762
+ describe('canAdmitLobbyToBreakout', () => {
763
+ it('works as expected', () => {
764
+ assert.deepEqual(MeetingUtil.canAdmitLobbyToBreakout(['DISABLE_LOBBY_TO_BREAKOUT']), false);
765
+ assert.deepEqual(MeetingUtil.canAdmitLobbyToBreakout([]), true);
766
+ });
767
+ });
768
+
769
+ describe('canUserAskForHelp', () => {
770
+ it('works as expected', () => {
771
+ assert.deepEqual(MeetingUtil.canUserAskForHelp(['DISABLE_ASK_FOR_HELP']), false);
772
+ assert.deepEqual(MeetingUtil.canUserAskForHelp([]), true);
773
+ });
774
+ });
775
+
776
+ describe('isBreakoutPreassignmentsEnabled', () => {
777
+ it('works as expected', () => {
778
+ assert.deepEqual(
779
+ MeetingUtil.isBreakoutPreassignmentsEnabled(['DISABLE_BREAKOUT_PREASSIGNMENTS']),
780
+ false
781
+ );
782
+ assert.deepEqual(MeetingUtil.isBreakoutPreassignmentsEnabled([]), true);
783
+ });
784
+ });
785
+
786
+ describe('parseInterpretationInfo', () => {
787
+ let meetingInfo = {};
788
+ beforeEach(() => {
789
+ meeting.simultaneousInterpretation = {
790
+ updateMeetingSIEnabled: sinon.stub(),
791
+ updateHostSIEnabled: sinon.stub(),
792
+ updateInterpretation: sinon.stub(),
793
+ siLanguages: [],
794
+ };
795
+ });
796
+ it('should update simultaneous interpretation settings with SI and host enabled', () => {
797
+ meetingInfo.turnOnSimultaneousInterpretation = true;
798
+ meetingInfo.meetingSiteSetting = {
799
+ enableHostInterpreterControlSI: true,
800
+ };
801
+ meetingInfo.simultaneousInterpretation = {
802
+ currentSIInterpreter: true,
803
+ siLanguages: [
804
+ {languageCode: 'en', languageGroupId: 1},
805
+ {languageCode: 'es', languageGroupId: 2},
806
+ ],
807
+ };
808
+
809
+ MeetingUtil.parseInterpretationInfo(meeting, meetingInfo);
810
+ assert.calledWith(meeting.simultaneousInterpretation.updateMeetingSIEnabled, true, true);
811
+ assert.calledWith(meeting.simultaneousInterpretation.updateHostSIEnabled, true);
812
+ assert.calledWith(meeting.simultaneousInterpretation.updateInterpretation, {
813
+ siLanguages: [
814
+ {languageName: 'en', languageCode: 1},
815
+ {languageName: 'es', languageCode: 2},
816
+ ],
817
+ });
818
+ });
819
+
820
+ it('should update simultaneous interpretation settings with host SI disabled', () => {
821
+ meetingInfo.meetingSiteSetting.enableHostInterpreterControlSI = false;
822
+ meetingInfo.simultaneousInterpretation.currentSIInterpreter = false;
823
+ MeetingUtil.parseInterpretationInfo(meeting, meetingInfo);
824
+ assert.calledWith(meeting.simultaneousInterpretation.updateMeetingSIEnabled, true, false);
825
+ assert.calledWith(meeting.simultaneousInterpretation.updateHostSIEnabled, false);
826
+ assert.calledWith(meeting.simultaneousInterpretation.updateInterpretation, {
827
+ siLanguages: [
828
+ {languageName: 'en', languageCode: 1},
829
+ {languageName: 'es', languageCode: 2},
830
+ ],
831
+ });
832
+ });
833
+ it('should update simultaneous interpretation settings with SI disabled', () => {
834
+ meetingInfo.turnOnSimultaneousInterpretation = false;
835
+ MeetingUtil.parseInterpretationInfo(meeting, meetingInfo);
836
+ assert.calledWith(meeting.simultaneousInterpretation.updateMeetingSIEnabled, false, false);
837
+ assert.calledWith(meeting.simultaneousInterpretation.updateHostSIEnabled, false);
838
+ });
839
+
840
+ it('should not update simultaneous interpretation settings for invalid input', () => {
841
+ // Call the function with invalid inputs
842
+ MeetingUtil.parseInterpretationInfo(null, null);
843
+
844
+ // Ensure that the update functions are not called
845
+ assert.notCalled(meeting.simultaneousInterpretation.updateMeetingSIEnabled);
846
+ assert.notCalled(meeting.simultaneousInterpretation.updateHostSIEnabled);
847
+ assert.notCalled(meeting.simultaneousInterpretation.updateInterpretation);
848
+ });
849
+ });
850
+
851
+ describe('prepareLeaveMeetingOptions', () => {
852
+ it('works as expected', () => {
853
+ const meeting = {
854
+ locusUrl: 'locusUrl',
855
+ selfId: 'selfId',
856
+ correlationId: 'correlationId',
857
+ resourceId: 'resourceId',
858
+ deviceUrl: 'deviceUrl',
859
+ };
860
+
861
+ const leaveOptions = MeetingUtil.prepareLeaveMeetingOptions(meeting, {
862
+ selfId: 'bob',
863
+ foo: 'bar',
864
+ });
865
+
866
+ assert.deepEqual(leaveOptions, {
867
+ correlationId: 'correlationId',
868
+ deviceUrl: 'deviceUrl',
869
+ foo: 'bar',
870
+ locusUrl: 'locusUrl',
871
+ resourceId: 'resourceId',
872
+ selfId: 'bob',
873
+ });
874
+ });
875
+ });
876
+
877
+ describe('leaveMeeting', () => {
878
+ it('calls prepareLeaveMeetingOptions as expected', () => {
879
+ const meeting = {
880
+ locusUrl: 'locusUrl',
881
+ selfId: 'selfId',
882
+ correlationId: 'correlationId',
883
+ resourceId: 'resourceId',
884
+ deviceUrl: 'deviceUrl',
885
+ locusInfo: {parsedLocus: {}},
886
+ meetingRequest: {
887
+ leaveMeeting: () => Promise.resolve(),
888
+ },
889
+ };
890
+
891
+ const prepareLeaveMeetingOptionsSpy = sinon.spy(MeetingUtil, 'prepareLeaveMeetingOptions');
892
+
893
+ MeetingUtil.leaveMeeting(meeting, {foo: 'bar'});
894
+
895
+ assert.calledOnce(prepareLeaveMeetingOptionsSpy);
896
+ assert.deepEqual(prepareLeaveMeetingOptionsSpy.getCall(0).args[0], meeting);
897
+ assert.deepEqual(prepareLeaveMeetingOptionsSpy.getCall(0).args[1], {foo: 'bar'});
898
+ });
899
+ });
900
+
901
+ describe('buildLeaveFetchRequestOptions', () => {
902
+ it('calls expected functions', () => {
903
+ const buildLeaveMeetingRequestOptionsSpy = sinon.stub();
904
+
905
+ const meeting = {
906
+ locusUrl: 'locusUrl',
907
+ selfId: 'selfId',
908
+ correlationId: 'correlationId',
909
+ resourceId: 'resourceId',
910
+ deviceUrl: 'deviceUrl',
911
+ meetingRequest: {
912
+ leaveMeeting: () => Promise.resolve(),
913
+ buildLeaveMeetingRequestOptions: buildLeaveMeetingRequestOptionsSpy,
914
+ },
915
+ };
916
+
917
+ const prepareLeaveMeetingOptionsSpy = sinon.spy(MeetingUtil, 'prepareLeaveMeetingOptions');
918
+
919
+ const options = MeetingUtil.buildLeaveFetchRequestOptions(meeting, {foo: 'bar'});
920
+
921
+ assert.calledOnce(prepareLeaveMeetingOptionsSpy);
922
+ assert.deepEqual(prepareLeaveMeetingOptionsSpy.getCall(0).args[0], meeting);
923
+ assert.deepEqual(prepareLeaveMeetingOptionsSpy.getCall(0).args[1], {foo: 'bar'});
924
+
925
+ assert.calledOnce(buildLeaveMeetingRequestOptionsSpy);
926
+ assert.deepEqual(buildLeaveMeetingRequestOptionsSpy.getCall(0).args[0], {
927
+ correlationId: 'correlationId',
928
+ deviceUrl: 'deviceUrl',
929
+ foo: 'bar',
930
+ locusUrl: 'locusUrl',
931
+ resourceId: 'resourceId',
932
+ selfId: 'selfId',
412
933
  });
413
934
  });
414
- describe('canEnableReactions', () => {
415
- [[null, DISPLAY_HINTS.REACTIONS_ACTIVE, true], [null, DISPLAY_HINTS.REACTIONS_INACTIVE, false], [null, undefined, null]].forEach(([originalValue, displayHint, expected]) => {
416
- assert.deepEqual(MeetingUtil.canSendReactions(originalValue, [displayHint]), expected);
935
+ });
936
+
937
+ describe('generateBuildLocusDeltaRequestOptions', () => {
938
+ it('generates the correct wrapper function', async () => {
939
+ const addSequenceSpy = sinon.spy(MeetingUtil, 'addSequence');
940
+
941
+ const meeting = {locusInfo: {sequence: 123}};
942
+
943
+ const buildLocusDeltaRequestOptions =
944
+ MeetingUtil.generateBuildLocusDeltaRequestOptions(meeting);
945
+
946
+ let result = buildLocusDeltaRequestOptions({
947
+ some: 'option',
948
+ body: {},
417
949
  });
950
+ assert.deepEqual(result, {some: 'option', body: {sequence: 123}});
951
+ assert.calledOnceWithExactly(addSequenceSpy, meeting, {sequence: 123});
952
+
953
+ addSequenceSpy.resetHistory();
954
+
955
+ // body missing from options
956
+ result = buildLocusDeltaRequestOptions({});
957
+ assert.deepEqual(result, {body: {sequence: 123}});
958
+ assert.calledOnceWithExactly(addSequenceSpy, meeting, {sequence: 123});
959
+
960
+ // meeting disappears so the WeakRef returns undefined
961
+ sinon.stub(WeakRef.prototype, 'deref').returns(undefined);
962
+
963
+ const input = {foo: 'bar'};
964
+ result = buildLocusDeltaRequestOptions(input);
965
+ assert.equal(result, input);
418
966
  });
419
967
  });
420
- })
968
+ });
421
969
  });