@webex/plugin-meetings 3.0.0-beta.2 → 3.0.0-beta.21

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 (365) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/breakouts/breakout.js +116 -0
  4. package/dist/breakouts/breakout.js.map +1 -0
  5. package/dist/breakouts/collection.js +23 -0
  6. package/dist/breakouts/collection.js.map +1 -0
  7. package/dist/breakouts/index.js +226 -0
  8. package/dist/breakouts/index.js.map +1 -0
  9. package/dist/common/browser-detection.js +1 -20
  10. package/dist/common/browser-detection.js.map +1 -1
  11. package/dist/common/collection.js +5 -20
  12. package/dist/common/collection.js.map +1 -1
  13. package/dist/common/config.js +0 -7
  14. package/dist/common/config.js.map +1 -1
  15. package/dist/common/errors/captcha-error.js +10 -24
  16. package/dist/common/errors/captcha-error.js.map +1 -1
  17. package/dist/common/errors/intent-to-join.js +11 -24
  18. package/dist/common/errors/intent-to-join.js.map +1 -1
  19. package/dist/common/errors/join-meeting.js +12 -25
  20. package/dist/common/errors/join-meeting.js.map +1 -1
  21. package/dist/common/errors/media.js +10 -24
  22. package/dist/common/errors/media.js.map +1 -1
  23. package/dist/common/errors/parameter.js +5 -33
  24. package/dist/common/errors/parameter.js.map +1 -1
  25. package/dist/common/errors/password-error.js +10 -24
  26. package/dist/common/errors/password-error.js.map +1 -1
  27. package/dist/common/errors/permission.js +9 -23
  28. package/dist/common/errors/permission.js.map +1 -1
  29. package/dist/common/errors/reconnection-in-progress.js +0 -17
  30. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  31. package/dist/common/errors/reconnection.js +10 -24
  32. package/dist/common/errors/reconnection.js.map +1 -1
  33. package/dist/common/errors/stats.js +10 -24
  34. package/dist/common/errors/stats.js.map +1 -1
  35. package/dist/common/errors/webex-errors.js +6 -41
  36. package/dist/common/errors/webex-errors.js.map +1 -1
  37. package/dist/common/errors/webex-meetings-error.js +5 -25
  38. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  39. package/dist/common/events/events-scope.js +0 -22
  40. package/dist/common/events/events-scope.js.map +1 -1
  41. package/dist/common/events/events.js +0 -23
  42. package/dist/common/events/events.js.map +1 -1
  43. package/dist/common/events/trigger-proxy.js +0 -12
  44. package/dist/common/events/trigger-proxy.js.map +1 -1
  45. package/dist/common/events/util.js +0 -15
  46. package/dist/common/events/util.js.map +1 -1
  47. package/dist/common/logs/logger-config.js +0 -4
  48. package/dist/common/logs/logger-config.js.map +1 -1
  49. package/dist/common/logs/logger-proxy.js +1 -8
  50. package/dist/common/logs/logger-proxy.js.map +1 -1
  51. package/dist/common/logs/request.js +37 -60
  52. package/dist/common/logs/request.js.map +1 -1
  53. package/dist/common/queue.js +4 -14
  54. package/dist/common/queue.js.map +1 -1
  55. package/dist/config.js +6 -6
  56. package/dist/config.js.map +1 -1
  57. package/dist/constants.js +88 -46
  58. package/dist/constants.js.map +1 -1
  59. package/dist/index.js +4 -18
  60. package/dist/index.js.map +1 -1
  61. package/dist/locus-info/controlsUtils.js +12 -29
  62. package/dist/locus-info/controlsUtils.js.map +1 -1
  63. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  64. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  65. package/dist/locus-info/fullState.js +0 -15
  66. package/dist/locus-info/fullState.js.map +1 -1
  67. package/dist/locus-info/hostUtils.js +4 -12
  68. package/dist/locus-info/hostUtils.js.map +1 -1
  69. package/dist/locus-info/index.js +184 -190
  70. package/dist/locus-info/index.js.map +1 -1
  71. package/dist/locus-info/infoUtils.js +3 -37
  72. package/dist/locus-info/infoUtils.js.map +1 -1
  73. package/dist/locus-info/mediaSharesUtils.js +12 -38
  74. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  75. package/dist/locus-info/parser.js +92 -118
  76. package/dist/locus-info/parser.js.map +1 -1
  77. package/dist/locus-info/selfUtils.js +34 -91
  78. package/dist/locus-info/selfUtils.js.map +1 -1
  79. package/dist/media/index.js +67 -111
  80. package/dist/media/index.js.map +1 -1
  81. package/dist/media/properties.js +80 -114
  82. package/dist/media/properties.js.map +1 -1
  83. package/dist/media/util.js +2 -9
  84. package/dist/media/util.js.map +1 -1
  85. package/dist/mediaQualityMetrics/config.js +10 -12
  86. package/dist/mediaQualityMetrics/config.js.map +1 -1
  87. package/dist/meeting/effectsState.js +125 -190
  88. package/dist/meeting/effectsState.js.map +1 -1
  89. package/dist/meeting/in-meeting-actions.js +5 -14
  90. package/dist/meeting/in-meeting-actions.js.map +1 -1
  91. package/dist/meeting/index.js +1692 -1925
  92. package/dist/meeting/index.js.map +1 -1
  93. package/dist/meeting/muteState.js +36 -77
  94. package/dist/meeting/muteState.js.map +1 -1
  95. package/dist/meeting/request.js +224 -230
  96. package/dist/meeting/request.js.map +1 -1
  97. package/dist/meeting/request.type.js +7 -0
  98. package/dist/meeting/request.type.js.map +1 -0
  99. package/dist/meeting/state.js +21 -31
  100. package/dist/meeting/state.js.map +1 -1
  101. package/dist/meeting/util.js +43 -215
  102. package/dist/meeting/util.js.map +1 -1
  103. package/dist/meeting-info/collection.js +6 -25
  104. package/dist/meeting-info/collection.js.map +1 -1
  105. package/dist/meeting-info/index.js +14 -32
  106. package/dist/meeting-info/index.js.map +1 -1
  107. package/dist/meeting-info/meeting-info-v2.js +193 -268
  108. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  109. package/dist/meeting-info/request.js +3 -15
  110. package/dist/meeting-info/request.js.map +1 -1
  111. package/dist/meeting-info/util.js +98 -183
  112. package/dist/meeting-info/util.js.map +1 -1
  113. package/dist/meeting-info/utilv2.js +137 -228
  114. package/dist/meeting-info/utilv2.js.map +1 -1
  115. package/dist/meetings/collection.js +5 -20
  116. package/dist/meetings/collection.js.map +1 -1
  117. package/dist/meetings/index.js +490 -560
  118. package/dist/meetings/index.js.map +1 -1
  119. package/dist/meetings/request.js +24 -41
  120. package/dist/meetings/request.js.map +1 -1
  121. package/dist/meetings/util.js +99 -155
  122. package/dist/meetings/util.js.map +1 -1
  123. package/dist/member/index.js +78 -86
  124. package/dist/member/index.js.map +1 -1
  125. package/dist/member/util.js +31 -68
  126. package/dist/member/util.js.map +1 -1
  127. package/dist/members/collection.js +3 -12
  128. package/dist/members/collection.js.map +1 -1
  129. package/dist/members/index.js +93 -200
  130. package/dist/members/index.js.map +1 -1
  131. package/dist/members/request.js +16 -39
  132. package/dist/members/request.js.map +1 -1
  133. package/dist/members/util.js +9 -38
  134. package/dist/members/util.js.map +1 -1
  135. package/dist/metrics/config.js +0 -2
  136. package/dist/metrics/config.js.map +1 -1
  137. package/dist/metrics/constants.js +1 -2
  138. package/dist/metrics/constants.js.map +1 -1
  139. package/dist/metrics/index.js +55 -135
  140. package/dist/metrics/index.js.map +1 -1
  141. package/dist/multistream/mediaRequestManager.js +57 -32
  142. package/dist/multistream/mediaRequestManager.js.map +1 -1
  143. package/dist/multistream/multistreamMedia.js +15 -21
  144. package/dist/multistream/multistreamMedia.js.map +1 -1
  145. package/dist/multistream/receiveSlot.js +10 -50
  146. package/dist/multistream/receiveSlot.js.map +1 -1
  147. package/dist/multistream/receiveSlotManager.js +45 -82
  148. package/dist/multistream/receiveSlotManager.js.map +1 -1
  149. package/dist/multistream/remoteMedia.js +18 -58
  150. package/dist/multistream/remoteMedia.js.map +1 -1
  151. package/dist/multistream/remoteMediaGroup.js +6 -40
  152. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  153. package/dist/multistream/remoteMediaManager.js +362 -416
  154. package/dist/multistream/remoteMediaManager.js.map +1 -1
  155. package/dist/networkQualityMonitor/index.js +36 -57
  156. package/dist/networkQualityMonitor/index.js.map +1 -1
  157. package/dist/personal-meeting-room/index.js +21 -45
  158. package/dist/personal-meeting-room/index.js.map +1 -1
  159. package/dist/personal-meeting-room/request.js +1 -31
  160. package/dist/personal-meeting-room/request.js.map +1 -1
  161. package/dist/personal-meeting-room/util.js +0 -13
  162. package/dist/personal-meeting-room/util.js.map +1 -1
  163. package/dist/reachability/index.js +138 -182
  164. package/dist/reachability/index.js.map +1 -1
  165. package/dist/reachability/request.js +3 -18
  166. package/dist/reachability/request.js.map +1 -1
  167. package/dist/reactions/constants.js +13 -0
  168. package/dist/reactions/constants.js.map +1 -0
  169. package/dist/reactions/reactions.js +109 -0
  170. package/dist/reactions/reactions.js.map +1 -0
  171. package/dist/reactions/reactions.type.js +36 -0
  172. package/dist/reactions/reactions.type.js.map +1 -0
  173. package/dist/reconnection-manager/index.js +322 -455
  174. package/dist/reconnection-manager/index.js.map +1 -1
  175. package/dist/recording-controller/enums.js +17 -0
  176. package/dist/recording-controller/enums.js.map +1 -0
  177. package/dist/recording-controller/index.js +343 -0
  178. package/dist/recording-controller/index.js.map +1 -0
  179. package/dist/recording-controller/util.js +63 -0
  180. package/dist/recording-controller/util.js.map +1 -0
  181. package/dist/roap/index.js +39 -64
  182. package/dist/roap/index.js.map +1 -1
  183. package/dist/roap/request.js +94 -113
  184. package/dist/roap/request.js.map +1 -1
  185. package/dist/roap/turnDiscovery.js +85 -94
  186. package/dist/roap/turnDiscovery.js.map +1 -1
  187. package/dist/statsAnalyzer/global.js +0 -2
  188. package/dist/statsAnalyzer/global.js.map +1 -1
  189. package/dist/statsAnalyzer/index.js +85 -175
  190. package/dist/statsAnalyzer/index.js.map +1 -1
  191. package/dist/statsAnalyzer/mqaUtil.js +72 -53
  192. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  193. package/dist/transcription/index.js +22 -47
  194. package/dist/transcription/index.js.map +1 -1
  195. package/internal-README.md +7 -6
  196. package/package.json +25 -20
  197. package/src/breakouts/README.md +190 -0
  198. package/src/breakouts/breakout.ts +110 -0
  199. package/src/breakouts/collection.ts +19 -0
  200. package/src/breakouts/index.ts +225 -0
  201. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  202. package/src/common/collection.ts +9 -7
  203. package/src/common/{config.js → config.ts} +1 -1
  204. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  205. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  206. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  207. package/src/common/errors/{media.js → media.ts} +11 -7
  208. package/src/common/errors/parameter.ts +11 -7
  209. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  210. package/src/common/errors/{permission.js → permission.ts} +10 -6
  211. package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
  212. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  213. package/src/common/errors/{stats.js → stats.ts} +11 -7
  214. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
  215. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  216. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  217. package/src/common/events/{events.js → events.ts} +5 -1
  218. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  219. package/src/common/events/{util.js → util.ts} +2 -3
  220. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  221. package/src/common/logs/logger-proxy.ts +44 -0
  222. package/src/common/logs/{request.js → request.ts} +22 -9
  223. package/src/common/queue.ts +1 -2
  224. package/src/{config.js → config.ts} +17 -12
  225. package/src/constants.ts +40 -1
  226. package/src/index.js +2 -1
  227. package/src/locus-info/controlsUtils.ts +114 -0
  228. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  229. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  230. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  231. package/src/locus-info/{index.js → index.ts} +148 -64
  232. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  233. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  234. package/src/locus-info/{parser.js → parser.ts} +67 -79
  235. package/src/locus-info/{selfUtils.js → selfUtils.ts} +123 -68
  236. package/src/media/{index.js → index.ts} +181 -131
  237. package/src/media/{properties.js → properties.ts} +47 -28
  238. package/src/media/{util.js → util.ts} +2 -2
  239. package/src/mediaQualityMetrics/{config.js → config.ts} +46 -46
  240. package/src/meeting/{effectsState.js → effectsState.ts} +47 -41
  241. package/src/meeting/in-meeting-actions.ts +15 -3
  242. package/src/meeting/{index.js → index.ts} +2263 -1427
  243. package/src/meeting/{muteState.js → muteState.ts} +78 -42
  244. package/src/meeting/{request.js → request.ts} +292 -142
  245. package/src/meeting/request.type.ts +13 -0
  246. package/src/meeting/{state.js → state.ts} +50 -35
  247. package/src/meeting/{util.js → util.ts} +112 -115
  248. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  249. package/src/meeting-info/{index.js → index.ts} +42 -36
  250. package/src/meeting-info/meeting-info-v2.ts +273 -0
  251. package/src/meeting-info/{request.js → request.ts} +14 -4
  252. package/src/meeting-info/{util.js → util.ts} +60 -51
  253. package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
  254. package/src/meetings/{collection.js → collection.ts} +6 -3
  255. package/src/meetings/index.ts +1159 -0
  256. package/src/meetings/{request.js → request.ts} +32 -25
  257. package/src/meetings/{util.js → util.ts} +34 -32
  258. package/src/member/{index.js → index.ts} +102 -56
  259. package/src/member/{util.js → util.ts} +52 -25
  260. package/src/members/{collection.js → collection.ts} +2 -2
  261. package/src/members/{index.js → index.ts} +219 -142
  262. package/src/members/{request.js → request.ts} +60 -16
  263. package/src/members/{util.js → util.ts} +50 -48
  264. package/src/metrics/{config.js → config.ts} +254 -83
  265. package/src/metrics/{constants.js → constants.ts} +0 -2
  266. package/src/metrics/{index.js → index.ts} +106 -74
  267. package/src/multistream/mediaRequestManager.ts +81 -15
  268. package/src/multistream/multistreamMedia.ts +5 -0
  269. package/src/multistream/receiveSlot.ts +18 -12
  270. package/src/multistream/receiveSlotManager.ts +23 -21
  271. package/src/multistream/remoteMedia.ts +15 -5
  272. package/src/multistream/remoteMediaGroup.ts +4 -3
  273. package/src/multistream/remoteMediaManager.ts +153 -37
  274. package/src/networkQualityMonitor/{index.js → index.ts} +37 -25
  275. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  276. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  277. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  278. package/src/reachability/{index.js → index.ts} +99 -83
  279. package/src/reachability/request.ts +39 -33
  280. package/src/reactions/constants.ts +4 -0
  281. package/src/reactions/reactions.ts +104 -0
  282. package/src/reactions/reactions.type.ts +62 -0
  283. package/src/reconnection-manager/{index.js → index.ts} +195 -102
  284. package/src/recording-controller/enums.ts +8 -0
  285. package/src/recording-controller/index.ts +315 -0
  286. package/src/recording-controller/util.ts +58 -0
  287. package/src/roap/{index.js → index.ts} +73 -56
  288. package/src/roap/request.ts +157 -0
  289. package/src/roap/turnDiscovery.ts +77 -37
  290. package/src/statsAnalyzer/{global.js → global.ts} +30 -33
  291. package/src/statsAnalyzer/{index.js → index.ts} +468 -192
  292. package/src/statsAnalyzer/mqaUtil.ts +290 -0
  293. package/src/transcription/{index.js → index.ts} +46 -39
  294. package/test/integration/spec/journey.js +664 -463
  295. package/test/integration/spec/space-meeting.js +320 -206
  296. package/test/integration/spec/transcription.js +7 -8
  297. package/test/unit/spec/breakouts/breakout.ts +119 -0
  298. package/test/unit/spec/breakouts/collection.ts +15 -0
  299. package/test/unit/spec/breakouts/index.ts +293 -0
  300. package/test/unit/spec/common/browser-detection.js +9 -28
  301. package/test/unit/spec/fixture/locus.js +92 -90
  302. package/test/unit/spec/locus-info/controlsUtils.js +25 -5
  303. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  304. package/test/unit/spec/locus-info/index.js +104 -2
  305. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  306. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  307. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  308. package/test/unit/spec/locus-info/parser.js +3 -9
  309. package/test/unit/spec/locus-info/selfConstant.js +97 -103
  310. package/test/unit/spec/locus-info/selfUtils.js +105 -12
  311. package/test/unit/spec/media/index.ts +31 -47
  312. package/test/unit/spec/media/properties.ts +9 -9
  313. package/test/unit/spec/meeting/effectsState.js +39 -45
  314. package/test/unit/spec/meeting/in-meeting-actions.ts +5 -2
  315. package/test/unit/spec/meeting/index.js +2017 -742
  316. package/test/unit/spec/meeting/muteState.js +42 -33
  317. package/test/unit/spec/meeting/request.js +115 -44
  318. package/test/unit/spec/meeting/utils.js +104 -171
  319. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  320. package/test/unit/spec/meeting-info/request.js +7 -9
  321. package/test/unit/spec/meeting-info/util.js +11 -12
  322. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  323. package/test/unit/spec/meetings/collection.js +1 -1
  324. package/test/unit/spec/meetings/index.js +439 -257
  325. package/test/unit/spec/meetings/utils.js +14 -12
  326. package/test/unit/spec/member/index.js +0 -1
  327. package/test/unit/spec/member/util.js +31 -7
  328. package/test/unit/spec/members/index.js +104 -54
  329. package/test/unit/spec/members/request.js +29 -20
  330. package/test/unit/spec/members/utils.js +8 -5
  331. package/test/unit/spec/metrics/index.js +16 -21
  332. package/test/unit/spec/multistream/mediaRequestManager.ts +316 -50
  333. package/test/unit/spec/multistream/receiveSlot.ts +6 -6
  334. package/test/unit/spec/multistream/receiveSlotManager.ts +13 -13
  335. package/test/unit/spec/multistream/remoteMedia.ts +10 -2
  336. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  337. package/test/unit/spec/multistream/remoteMediaManager.ts +412 -65
  338. package/test/unit/spec/networkQualityMonitor/index.js +21 -15
  339. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  340. package/test/unit/spec/reachability/index.ts +58 -26
  341. package/test/unit/spec/reconnection-manager/index.js +102 -9
  342. package/test/unit/spec/recording-controller/index.js +231 -0
  343. package/test/unit/spec/recording-controller/util.js +102 -0
  344. package/test/unit/spec/roap/index.ts +2 -1
  345. package/test/unit/spec/roap/request.ts +114 -0
  346. package/test/unit/spec/roap/turnDiscovery.ts +64 -45
  347. package/test/unit/spec/stats-analyzer/index.js +27 -22
  348. package/test/utils/cmr.js +44 -42
  349. package/test/utils/testUtils.js +83 -74
  350. package/test/utils/webex-config.js +18 -18
  351. package/test/utils/webex-test-users.js +54 -50
  352. package/tsconfig.json +6 -0
  353. package/dist/media/internal-media-core-wrapper.js +0 -22
  354. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  355. package/dist/peer-connection-manager/util.js +0 -124
  356. package/dist/peer-connection-manager/util.js.map +0 -1
  357. package/src/common/logs/logger-proxy.js +0 -33
  358. package/src/locus-info/controlsUtils.js +0 -102
  359. package/src/media/internal-media-core-wrapper.ts +0 -9
  360. package/src/meeting-info/meeting-info-v2.js +0 -255
  361. package/src/meetings/index.js +0 -1015
  362. package/src/peer-connection-manager/util.ts +0 -117
  363. package/src/roap/request.js +0 -127
  364. package/src/statsAnalyzer/mqaUtil.js +0 -173
  365. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
@@ -1,4 +1,4 @@
1
- import Transcription from '@webex/plugin-meetings/src/transcription';
1
+ import Transcription from '@webex/plugin-meetings/dist/transcription';
2
2
  import {assert} from '@webex/test-helper-chai';
3
3
  import sinon from 'sinon';
4
4
 
@@ -14,19 +14,18 @@ describe('transcription index', () => {
14
14
  id: 'member',
15
15
  participant: {
16
16
  status: {
17
- csis: [1, 2, 3]
18
- }
19
- }
20
- }
21
- }
22
- }
17
+ csis: [1, 2, 3],
18
+ },
19
+ },
20
+ },
21
+ },
22
+ },
23
23
  };
24
24
  sessionId = 'sessionId';
25
25
  token = 'token';
26
26
  transcription = new Transcription(webSocketUrl, sessionId, members);
27
27
  });
28
28
 
29
-
30
29
  it('open websocket connection', async () => {
31
30
  await transcription.connect(token);
32
31
  transcription.webSocket.onopen = sinon.stub();
@@ -0,0 +1,119 @@
1
+ import {assert, expect} from '@webex/test-helper-chai';
2
+ import Breakout from '@webex/plugin-meetings/src/breakouts/breakout';
3
+ import Breakouts from '@webex/plugin-meetings/src/breakouts';
4
+ import Members from '@webex/plugin-meetings/src/members';
5
+ import MockWebex from '@webex/test-helper-mock-webex';
6
+ import sinon from "sinon";
7
+
8
+
9
+ describe('plugin-meetings', () => {
10
+ describe('breakout', () => {
11
+
12
+ let webex;
13
+ let breakout;
14
+ let breakouts;
15
+
16
+ beforeEach(() => {
17
+ // @ts-ignore
18
+ webex = new MockWebex({});
19
+ webex.internal.llm.on = sinon.stub();
20
+ webex.internal.mercury.on = sinon.stub();
21
+ breakouts = new Breakouts({}, {parent: webex});
22
+ breakout = new Breakout({}, {parent: breakouts});
23
+ breakout.groupId = 'groupId';
24
+ breakout.sessionId = 'sessionId';
25
+ breakout.url = 'url';
26
+ webex.request = sinon.stub().returns(Promise.resolve('REQUEST_RETURN_VALUE'));
27
+ });
28
+
29
+ describe('initialize', () => {
30
+ it('creates the object correctly', () => {
31
+ assert.instanceOf(breakout.members, Members);
32
+ })
33
+ });
34
+
35
+ describe('#join', () => {
36
+ it('makes the request as expected', async () => {
37
+ const result = await breakout.join()
38
+
39
+ assert.calledOnceWithExactly(webex.request, {
40
+ method: 'POST',
41
+ uri: 'url/move',
42
+ body: {
43
+ groupId: 'groupId',
44
+ sessionId: 'sessionId'
45
+ }
46
+ });
47
+
48
+ assert.equal(result, 'REQUEST_RETURN_VALUE')
49
+ });
50
+ });
51
+
52
+ describe('#leave', () => {
53
+ it('throws error if in main sesson', async () => {
54
+
55
+ breakout.set('sessionType', 'MAIN');
56
+
57
+ const fn = () => {
58
+ breakout.leave();
59
+ }
60
+
61
+ expect(fn).to.throw(/Cannot leave the main session/);
62
+ });
63
+
64
+ it('throws error if there is no main session', async () => {
65
+ const fn = () => {
66
+ breakout.leave();
67
+ }
68
+
69
+ expect(fn).to.throw(/Cannot leave, no main session found/);
70
+ });
71
+
72
+ it('joins the main session if in a breakout', async () => {
73
+ breakout.parent.breakouts.add({
74
+ sessionType: 'MAIN'
75
+ });
76
+
77
+ const mainSession = breakouts.breakouts.models[0];
78
+
79
+ mainSession.join = sinon.stub().returns('JOIN_RETURN_VALUE');
80
+
81
+ const result = await breakout.leave();
82
+
83
+ assert.calledOnceWithExactly(mainSession.join);
84
+ assert.equal(result, 'JOIN_RETURN_VALUE');
85
+ })
86
+ });
87
+
88
+ describe('#askForHelp', () => {
89
+ it('makes the request as expected', async () => {
90
+ const result = await breakout.askForHelp()
91
+
92
+ assert.calledOnceWithExactly(webex.request, {
93
+ method: 'POST',
94
+ uri: 'url/help',
95
+ body: {
96
+ groupId: 'groupId',
97
+ sessionId: 'sessionId'
98
+ }
99
+ });
100
+
101
+ assert.equal(result, 'REQUEST_RETURN_VALUE')
102
+ });
103
+ });
104
+
105
+ describe('#parseRoster', () => {
106
+ it('calls locusParticipantsUpdate', () => {
107
+ breakout.members = {
108
+ locusParticipantsUpdate: sinon.stub()
109
+ };
110
+
111
+ const locusData = {some: 'data'};
112
+ const result = breakout.parseRoster(locusData);
113
+
114
+ assert.calledOnceWithExactly(breakout.members.locusParticipantsUpdate, locusData);
115
+ assert.equal(result, undefined);
116
+ })
117
+ })
118
+ });
119
+ });
@@ -0,0 +1,15 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import Breakout from '@webex/plugin-meetings/src/breakouts/breakout';
3
+ import BreakoutCollection from '@webex/plugin-meetings/src/breakouts/collection';
4
+
5
+ describe('plugin-meetings', () => {
6
+ describe('BreakoutCollection', () => {
7
+ it('the breakout collection is as expected', () => {
8
+ const collection = new BreakoutCollection();
9
+
10
+ assert.equal(collection.model, Breakout);
11
+ assert.equal(collection.namespace, 'Meetings');
12
+ assert.equal(collection.mainIndex, 'sessionId');
13
+ });
14
+ });
15
+ });
@@ -0,0 +1,293 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import Breakout from '@webex/plugin-meetings/src/breakouts/breakout';
3
+ import Breakouts from '@webex/plugin-meetings/src/breakouts';
4
+ import BreakoutCollection from '@webex/plugin-meetings/src/breakouts/collection';
5
+ import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
6
+ import {BREAKOUTS} from '@webex/plugin-meetings/src/constants';
7
+ import sinon from "sinon";
8
+ import MockWebex from '@webex/test-helper-mock-webex';
9
+ import testUtils from '../../../utils/testUtils';
10
+
11
+
12
+ describe('plugin-meetings', () => {
13
+ describe('Breakouts', () => {
14
+ let webex;
15
+ let breakouts;
16
+
17
+ beforeEach(() => {
18
+ // @ts-ignore
19
+ webex = new MockWebex({});
20
+ webex.internal.llm.on = sinon.stub();
21
+ webex.internal.mercury.on = sinon.stub();
22
+ breakouts = new Breakouts({}, {parent: webex});
23
+ webex.request = sinon.stub().returns(Promise.resolve('REQUEST_RETURN_VALUE'));
24
+ });
25
+
26
+ describe('#initialize', () => {
27
+ it('creates Breakouts as expected', () => {
28
+ assert.equal(breakouts.namespace, 'Meetings');
29
+ });
30
+
31
+ it('emits BREAKOUTS_CLOSING event when the status is CLOSING', () => {
32
+ let called = false;
33
+ breakouts.listenTo(breakouts, BREAKOUTS.EVENTS.BREAKOUTS_CLOSING, () => {
34
+ called = true;
35
+ });
36
+
37
+ breakouts.set('status', 'something');
38
+
39
+ assert.isFalse(called);
40
+
41
+ breakouts.set({'status': BREAKOUTS.STATUS.CLOSING});
42
+
43
+ assert.isTrue(called);
44
+ });
45
+
46
+ it('debounces querying rosters on add', () => {
47
+ breakouts.debouncedQueryRosters = sinon.stub();
48
+ breakouts.breakouts.add({sessionType: 'MAIN'});
49
+
50
+ assert.calledOnceWithExactly(breakouts.debouncedQueryRosters);
51
+ });
52
+ });
53
+
54
+ describe('#listenToBroadcastMessages', () => {
55
+ it('triggers message event when a message received', () => {
56
+ const call = webex.internal.llm.on.getCall(0);
57
+ const callback = call.args[1];
58
+
59
+ assert.equal(call.args[0], 'event:breakout.message');
60
+
61
+ let message;
62
+
63
+ breakouts.listenTo(breakouts, BREAKOUTS.EVENTS.MESSAGE, (event) => {
64
+ message = event;
65
+ })
66
+
67
+ breakouts.currentBreakoutSession.sessionId = 'sessionId';
68
+
69
+ callback({
70
+ data: {
71
+ senderUserId: 'senderUserId',
72
+ sentTime: 'sentTime',
73
+ message: 'message',
74
+ }
75
+ });
76
+
77
+ assert.deepEqual(message, {
78
+ senderUserId: "senderUserId",
79
+ sentTime: 'sentTime',
80
+ message: 'message',
81
+ sessionId: 'sessionId'
82
+ });
83
+ });
84
+ });
85
+
86
+ describe('#listenToBreakoutRosters', () => {
87
+ it('triggers member update event when a roster received', () => {
88
+ const call = webex.internal.mercury.on.getCall(0);
89
+ const callback = call.args[1];
90
+
91
+ assert.equal(call.args[0], 'event:breakout.roster');
92
+
93
+ let called = false;
94
+
95
+ breakouts.listenTo(breakouts, BREAKOUTS.EVENTS.MEMBERS_UPDATE, () => {
96
+ called = true;
97
+ })
98
+ breakouts.handleRosterUpdate = sinon.stub();
99
+
100
+ callback({
101
+ data: {
102
+ locus: 'locus'
103
+ }
104
+ });
105
+
106
+ assert.isTrue(called);
107
+ assert.calledOnceWithExactly(breakouts.handleRosterUpdate, 'locus');
108
+ });
109
+ });
110
+
111
+ describe('#updateBreakout', () => {
112
+ it('updates the current breakout session', () => {
113
+ breakouts.updateBreakout({
114
+ sessionId: 'sessionId',
115
+ groupId: 'groupId',
116
+ sessionType: 'sessionType',
117
+ url: 'url',
118
+ name: 'name',
119
+ allowBackToMain: true,
120
+ delayCloseTime: 10,
121
+ enableBreakoutSession: true,
122
+ startTime: 'startTime',
123
+ status: 'active',
124
+ locusUrl: 'locusUrl'
125
+ });
126
+
127
+ assert.equal(breakouts.allowBackToMain, true);
128
+ assert.equal(breakouts.delayCloseTime, 10);
129
+ assert.equal(breakouts.enableBreakoutSession, true);
130
+ assert.equal(breakouts.groupId, 'groupId');
131
+ assert.equal(breakouts.name, 'name');
132
+ assert.equal(breakouts.sessionId, 'sessionId');
133
+ assert.equal(breakouts.startTime, 'startTime');
134
+ assert.equal(breakouts.status, 'active');
135
+ assert.equal(breakouts.url, 'url');
136
+ assert.equal(breakouts.locusUrl, 'locusUrl');
137
+
138
+ assert.equal(breakouts.currentBreakoutSession.sessionId, 'sessionId');
139
+ assert.equal(breakouts.currentBreakoutSession.groupId, 'groupId');
140
+ assert.equal(breakouts.currentBreakoutSession.name, 'name');
141
+ assert.equal(breakouts.currentBreakoutSession.current, true);
142
+ assert.equal(breakouts.currentBreakoutSession.sessionType, 'sessionType');
143
+ assert.equal(breakouts.currentBreakoutSession.url, 'url');
144
+ assert.equal(breakouts.currentBreakoutSession.active, false);
145
+ assert.equal(breakouts.currentBreakoutSession.allowed, false);
146
+ assert.equal(breakouts.currentBreakoutSession.assigned, false);
147
+ assert.equal(breakouts.currentBreakoutSession.assignedCurrent, false);
148
+ assert.equal(breakouts.currentBreakoutSession.requested, false);
149
+ });
150
+ });
151
+
152
+ describe('#updateBreakoutSessions', () => {
153
+
154
+ const checkBreakout = (breakout, sessionId, state) => {
155
+ assert.deepEqual(breakout.attributes, {
156
+ active: false,
157
+ allowed: false,
158
+ assigned: false,
159
+ assignedCurrent: false,
160
+ current: false,
161
+ ready: true,
162
+ requested: false,
163
+ url: 'url',
164
+ sessionId,
165
+ ...{[state]: true}
166
+ });
167
+ }
168
+
169
+ it('works', () => {
170
+
171
+ breakouts.set('url', 'url');
172
+
173
+ const payload = {
174
+ breakoutSessions: {
175
+ active: [{sessionId: 'sessionId1'}],
176
+ assigned: [{sessionId: 'sessionId2'}],
177
+ allowed: [{sessionId: 'sessionId3'}],
178
+ assignedCurrent: [{sessionId: 'sessionId4'}],
179
+ requested: [{sessionId: 'sessionId5'}],
180
+ }
181
+ }
182
+
183
+ breakouts.updateBreakoutSessions(payload);
184
+
185
+ checkBreakout(breakouts.breakouts.get('sessionId1'), 'sessionId1', 'active');
186
+ checkBreakout(breakouts.breakouts.get('sessionId2'), 'sessionId2', 'assigned');
187
+ checkBreakout(breakouts.breakouts.get('sessionId3'), 'sessionId3', 'allowed');
188
+ checkBreakout(breakouts.breakouts.get('sessionId4'), 'sessionId4', 'assignedCurrent');
189
+ checkBreakout(breakouts.breakouts.get('sessionId5'), 'sessionId5', 'requested');
190
+ })
191
+ });
192
+
193
+ describe('#locusUrlUpdate', () => {
194
+ it('sets the locus url', () => {
195
+ breakouts.locusUrlUpdate('newUrl');
196
+
197
+ assert.equal(breakouts.locusUrl, 'newUrl');
198
+ });
199
+ });
200
+
201
+ describe('#cleanUp', () => {
202
+ it('stops listening', () => {
203
+ breakouts.stopListening = sinon.stub();
204
+
205
+ breakouts.cleanUp();
206
+
207
+ assert.calledOnceWithExactly(breakouts.stopListening);
208
+ });
209
+ });
210
+
211
+ describe('#handleRosterUpdate', () => {
212
+ it('does not break if it cannot find the session', () => {
213
+ breakouts.handleRosterUpdate({controls: {breakout: {sessionId: 'sessionId'}}});
214
+ });
215
+
216
+ it('calls parse roster if it can find the session', () => {
217
+ breakouts.breakouts.add({sessionId: 'sessionId'});
218
+
219
+ const breakout = breakouts.breakouts.models[0];
220
+ breakout.parseRoster = sinon.stub();
221
+
222
+ const locus = {controls: {breakout: {sessionId: 'sessionId'}}}
223
+
224
+ breakouts.handleRosterUpdate(locus);
225
+ assert.calledOnceWithExactly(breakout.parseRoster, locus);
226
+ });
227
+ });
228
+
229
+ describe('#queryRosters', () => {
230
+
231
+ it('makes the expected query', async () => {
232
+
233
+ webex.request.returns(Promise.resolve({
234
+ body: {
235
+ rosters: [{
236
+ locus: 'locus1'
237
+ }, {
238
+ locus: 'locus2'
239
+ }]
240
+ }
241
+ }));
242
+
243
+ breakouts.set('url', 'url');
244
+ breakouts.set('locusUrl', 'test');
245
+
246
+ breakouts.handleRosterUpdate = sinon.stub();
247
+
248
+ const result = await breakouts.queryRosters();
249
+
250
+ assert.calledOnceWithExactly(webex.request, {
251
+ uri: 'url/roster',
252
+ qs: { locusUrl: 'dGVzdA==' }
253
+ });
254
+ assert.calledTwice(breakouts.handleRosterUpdate);
255
+
256
+ assert.deepEqual(breakouts.handleRosterUpdate.getCall(0).args, ['locus1']);
257
+ assert.deepEqual(breakouts.handleRosterUpdate.getCall(1).args, ['locus2']);
258
+ });
259
+
260
+ it('logs the error if the query fails', async () => {
261
+ const error = new Error('something went wrong')
262
+ webex.request.rejects(error);
263
+ LoggerProxy.logger.error = sinon.stub();
264
+
265
+ breakouts.set('url', 'url');
266
+ breakouts.set('locusUrl', 'test');
267
+
268
+ breakouts.handleRosterUpdate = sinon.stub();
269
+
270
+ const result = await breakouts.queryRosters();
271
+ await testUtils.flushPromises();
272
+
273
+ assert.calledOnceWithExactly(webex.request, {
274
+ uri: 'url/roster',
275
+ qs: {locusUrl: 'dGVzdA=='},
276
+ });
277
+ assert.calledOnceWithExactly(
278
+ LoggerProxy.logger.error,
279
+ 'Meeting:breakouts#queryRosters failed',
280
+ error
281
+ );
282
+ });
283
+ });
284
+
285
+ describe('isInMainSession', () => {
286
+ it('returns true when sessionType is MAIN', () => {
287
+ assert.equal(breakouts.isInMainSession, false);
288
+ breakouts.set('sessionType', BREAKOUTS.SESSION_TYPES.MAIN)
289
+ assert.equal(breakouts.isInMainSession, true);
290
+ });
291
+ });
292
+ });
293
+ });
@@ -1,7 +1,6 @@
1
1
  import 'jsdom-global/register';
2
2
  import {assert} from '@webex/test-helper-chai';
3
- import BrowserDetection from
4
- '@webex/plugin-meetings/src/common/browser-detection';
3
+ import BrowserDetection from '@webex/plugin-meetings/src/common/browser-detection';
5
4
 
6
5
  const USER_AGENT_CHROME_MAC =
7
6
  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ' +
@@ -17,8 +16,7 @@ const USER_AGENT_SAFARI_MAC =
17
16
  ' AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15';
18
17
 
19
18
  const USER_AGENT_FIREFOX_MAC =
20
- 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:87.0) ' +
21
- 'Gecko/20100101 Firefox/87.0';
19
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:87.0) ' + 'Gecko/20100101 Firefox/87.0';
22
20
 
23
21
  const mockDetectionObject = {
24
22
  /* eslint-disable global-require */
@@ -27,7 +25,7 @@ const mockDetectionObject = {
27
25
  /* eslint-enable global-require */
28
26
  getBrowserName: () => '',
29
27
  getBrowserVersion: () => '',
30
- isBrowser: () => false
28
+ isBrowser: () => false,
31
29
  };
32
30
 
33
31
  describe('common/browser-detection', () => {
@@ -108,31 +106,14 @@ describe('common/browser-detection', () => {
108
106
  it('returns the mock object when there is no userAgent', () => {
109
107
  Object.defineProperty(global.window.navigator, 'userAgent', {
110
108
  get: () => undefined,
111
- configurable: true
109
+ configurable: true,
112
110
  });
113
111
 
114
- const {
115
- getBrowserName,
116
- getBrowserVersion,
117
- getOSName,
118
- getOSVersion
119
- } = BrowserDetection(null);
112
+ const {getBrowserName, getBrowserVersion, getOSName, getOSVersion} = BrowserDetection(null);
120
113
 
121
- assert.equal(
122
- getBrowserName(),
123
- mockDetectionObject.getBrowserName()
124
- );
125
- assert.equal(
126
- getBrowserVersion(),
127
- mockDetectionObject.getBrowserVersion()
128
- );
129
- assert.equal(
130
- getOSName(),
131
- mockDetectionObject.getOSName()
132
- );
133
- assert.equal(
134
- getOSVersion(),
135
- mockDetectionObject.getOSVersion()
136
- );
114
+ assert.equal(getBrowserName(), mockDetectionObject.getBrowserName());
115
+ assert.equal(getBrowserVersion(), mockDetectionObject.getBrowserVersion());
116
+ assert.equal(getOSName(), mockDetectionObject.getOSName());
117
+ assert.equal(getOSVersion(), mockDetectionObject.getOSVersion());
137
118
  });
138
119
  });