@webex/plugin-meetings 3.0.0-beta.24 → 3.0.0-beta.241

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 (360) 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 +28 -7
  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 +5 -10
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +190 -27
  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/meeting/in-meeting-actions.js +90 -2
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +2593 -2558
  67. package/dist/meeting/index.js.map +1 -1
  68. package/dist/meeting/locusMediaRequest.js +292 -0
  69. package/dist/meeting/locusMediaRequest.js.map +1 -0
  70. package/dist/meeting/muteState.js +228 -123
  71. package/dist/meeting/muteState.js.map +1 -1
  72. package/dist/meeting/request.js +255 -195
  73. package/dist/meeting/request.js.map +1 -1
  74. package/dist/meeting/util.js +601 -417
  75. package/dist/meeting/util.js.map +1 -1
  76. package/dist/meeting-info/index.js +48 -7
  77. package/dist/meeting-info/index.js.map +1 -1
  78. package/dist/meeting-info/meeting-info-v2.js +171 -51
  79. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  80. package/dist/meeting-info/util.js +1 -1
  81. package/dist/meeting-info/util.js.map +1 -1
  82. package/dist/meeting-info/utilv2.js +36 -36
  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 +370 -90
  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 +4 -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 +213 -62
  125. package/dist/multistream/remoteMediaManager.js.map +1 -1
  126. package/dist/reachability/index.js +81 -30
  127. package/dist/reachability/index.js.map +1 -1
  128. package/dist/reachability/request.js +16 -7
  129. package/dist/reachability/request.js.map +1 -1
  130. package/dist/reconnection-manager/index.js +199 -154
  131. package/dist/reconnection-manager/index.js.map +1 -1
  132. package/dist/recording-controller/index.js +21 -2
  133. package/dist/recording-controller/index.js.map +1 -1
  134. package/dist/recording-controller/util.js +9 -8
  135. package/dist/recording-controller/util.js.map +1 -1
  136. package/dist/roap/index.js +23 -29
  137. package/dist/roap/index.js.map +1 -1
  138. package/dist/roap/request.js +112 -89
  139. package/dist/roap/request.js.map +1 -1
  140. package/dist/roap/turnDiscovery.js +96 -36
  141. package/dist/roap/turnDiscovery.js.map +1 -1
  142. package/dist/rtcMetrics/constants.js +12 -0
  143. package/dist/rtcMetrics/constants.js.map +1 -0
  144. package/dist/rtcMetrics/index.js +117 -0
  145. package/dist/rtcMetrics/index.js.map +1 -0
  146. package/dist/statsAnalyzer/index.js +51 -34
  147. package/dist/statsAnalyzer/index.js.map +1 -1
  148. package/dist/statsAnalyzer/mqaUtil.js +6 -6
  149. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  150. package/dist/types/annotation/annotation.types.d.ts +42 -0
  151. package/dist/types/annotation/constants.d.ts +31 -0
  152. package/dist/types/annotation/index.d.ts +117 -0
  153. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  154. package/dist/types/breakouts/events.d.ts +8 -0
  155. package/dist/types/breakouts/request.d.ts +22 -0
  156. package/dist/types/breakouts/utils.d.ts +15 -0
  157. package/dist/types/common/errors/webex-errors.d.ts +13 -1
  158. package/dist/types/common/queue.d.ts +9 -7
  159. package/dist/types/config.d.ts +1 -6
  160. package/dist/types/constants.d.ts +154 -21
  161. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  162. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  163. package/dist/types/controls-options-manager/index.d.ts +136 -0
  164. package/dist/types/controls-options-manager/types.d.ts +43 -0
  165. package/dist/types/controls-options-manager/util.d.ts +1 -0
  166. package/dist/types/index.d.ts +6 -4
  167. package/dist/types/interpretation/collection.d.ts +5 -0
  168. package/dist/types/interpretation/index.d.ts +5 -0
  169. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  170. package/dist/types/locus-info/index.d.ts +57 -4
  171. package/dist/types/locus-info/parser.d.ts +65 -6
  172. package/dist/types/media/index.d.ts +2 -0
  173. package/dist/types/media/properties.d.ts +22 -36
  174. package/dist/types/meeting/in-meeting-actions.d.ts +90 -2
  175. package/dist/types/meeting/index.d.ts +297 -491
  176. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  177. package/dist/types/meeting/muteState.d.ts +98 -22
  178. package/dist/types/meeting/request.d.ts +72 -43
  179. package/dist/types/meeting/util.d.ts +101 -1
  180. package/dist/types/meeting-info/index.d.ts +6 -1
  181. package/dist/types/meeting-info/meeting-info-v2.d.ts +30 -1
  182. package/dist/types/meetings/collection.d.ts +8 -0
  183. package/dist/types/meetings/index.d.ts +76 -12
  184. package/dist/types/meetings/meetings.types.d.ts +4 -0
  185. package/dist/types/member/index.d.ts +13 -0
  186. package/dist/types/member/types.d.ts +32 -0
  187. package/dist/types/members/collection.d.ts +5 -0
  188. package/dist/types/members/index.d.ts +35 -2
  189. package/dist/types/members/request.d.ts +73 -9
  190. package/dist/types/members/types.d.ts +24 -0
  191. package/dist/types/members/util.d.ts +209 -1
  192. package/dist/types/metrics/constants.d.ts +3 -4
  193. package/dist/types/metrics/index.d.ts +4 -119
  194. package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
  195. package/dist/types/multistream/receiveSlot.d.ts +16 -12
  196. package/dist/types/multistream/receiveSlotManager.d.ts +19 -4
  197. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  198. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  199. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  200. package/dist/types/reachability/index.d.ts +15 -3
  201. package/dist/types/reachability/request.d.ts +7 -3
  202. package/dist/types/reconnection-manager/index.d.ts +9 -0
  203. package/dist/types/recording-controller/index.d.ts +15 -1
  204. package/dist/types/recording-controller/util.d.ts +5 -4
  205. package/dist/types/roap/request.d.ts +15 -11
  206. package/dist/types/roap/turnDiscovery.d.ts +18 -1
  207. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  208. package/dist/types/rtcMetrics/index.d.ts +47 -0
  209. package/dist/types/statsAnalyzer/index.d.ts +6 -1
  210. package/package.json +23 -20
  211. package/src/annotation/annotation.types.ts +50 -0
  212. package/src/annotation/constants.ts +36 -0
  213. package/src/annotation/index.ts +328 -0
  214. package/src/breakouts/README.md +44 -14
  215. package/src/breakouts/breakout.ts +87 -9
  216. package/src/breakouts/edit-lock-error.ts +25 -0
  217. package/src/breakouts/events.ts +56 -0
  218. package/src/breakouts/index.ts +710 -10
  219. package/src/breakouts/request.ts +55 -0
  220. package/src/breakouts/utils.ts +57 -0
  221. package/src/common/errors/webex-errors.ts +27 -2
  222. package/src/common/logs/logger-proxy.ts +1 -1
  223. package/src/common/queue.ts +22 -8
  224. package/src/config.ts +4 -9
  225. package/src/constants.ts +175 -18
  226. package/src/controls-options-manager/constants.ts +5 -0
  227. package/src/controls-options-manager/enums.ts +18 -0
  228. package/src/controls-options-manager/index.ts +278 -0
  229. package/src/controls-options-manager/types.ts +59 -0
  230. package/src/controls-options-manager/util.ts +300 -0
  231. package/src/index.ts +39 -0
  232. package/src/interpretation/README.md +60 -0
  233. package/src/interpretation/collection.ts +19 -0
  234. package/src/interpretation/index.ts +332 -0
  235. package/src/interpretation/siLanguage.ts +18 -0
  236. package/src/locus-info/controlsUtils.ts +108 -0
  237. package/src/locus-info/index.ts +381 -59
  238. package/src/locus-info/infoUtils.ts +10 -2
  239. package/src/locus-info/mediaSharesUtils.ts +48 -0
  240. package/src/locus-info/parser.ts +224 -39
  241. package/src/locus-info/selfUtils.ts +81 -5
  242. package/src/media/index.ts +89 -109
  243. package/src/media/properties.ts +48 -87
  244. package/src/meeting/in-meeting-actions.ts +179 -3
  245. package/src/meeting/index.ts +2086 -2151
  246. package/src/meeting/locusMediaRequest.ts +313 -0
  247. package/src/meeting/muteState.ts +227 -130
  248. package/src/meeting/request.ts +171 -120
  249. package/src/meeting/util.ts +588 -395
  250. package/src/meeting-info/index.ts +54 -8
  251. package/src/meeting-info/meeting-info-v2.ts +148 -14
  252. package/src/meeting-info/util.ts +1 -1
  253. package/src/meeting-info/utilv2.ts +23 -23
  254. package/src/meetings/collection.ts +20 -0
  255. package/src/meetings/index.ts +407 -108
  256. package/src/meetings/meetings.types.ts +12 -0
  257. package/src/meetings/request.ts +2 -0
  258. package/src/meetings/util.ts +103 -4
  259. package/src/member/index.ts +49 -0
  260. package/src/member/types.ts +38 -0
  261. package/src/member/util.ts +127 -25
  262. package/src/members/collection.ts +8 -0
  263. package/src/members/index.ts +107 -6
  264. package/src/members/request.ts +97 -17
  265. package/src/members/types.ts +28 -0
  266. package/src/members/util.ts +319 -240
  267. package/src/metrics/constants.ts +3 -4
  268. package/src/metrics/index.ts +1 -490
  269. package/src/multistream/mediaRequestManager.ts +289 -79
  270. package/src/multistream/receiveSlot.ts +55 -18
  271. package/src/multistream/receiveSlotManager.ts +46 -24
  272. package/src/multistream/remoteMedia.ts +27 -2
  273. package/src/multistream/remoteMediaGroup.ts +59 -0
  274. package/src/multistream/remoteMediaManager.ts +150 -32
  275. package/src/reachability/index.ts +69 -17
  276. package/src/reachability/request.ts +16 -7
  277. package/src/reconnection-manager/index.ts +81 -54
  278. package/src/recording-controller/index.ts +20 -3
  279. package/src/recording-controller/util.ts +26 -9
  280. package/src/roap/index.ts +23 -30
  281. package/src/roap/request.ts +104 -95
  282. package/src/roap/turnDiscovery.ts +50 -25
  283. package/src/rtcMetrics/constants.ts +3 -0
  284. package/src/rtcMetrics/index.ts +100 -0
  285. package/src/statsAnalyzer/index.ts +73 -35
  286. package/src/statsAnalyzer/mqaUtil.ts +8 -10
  287. package/test/integration/spec/converged-space-meetings.js +233 -0
  288. package/test/integration/spec/journey.js +336 -259
  289. package/test/integration/spec/space-meeting.js +76 -3
  290. package/test/unit/spec/annotation/index.ts +418 -0
  291. package/test/unit/spec/breakouts/breakout.ts +142 -24
  292. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  293. package/test/unit/spec/breakouts/events.ts +89 -0
  294. package/test/unit/spec/breakouts/index.ts +1545 -48
  295. package/test/unit/spec/breakouts/request.ts +104 -0
  296. package/test/unit/spec/breakouts/utils.js +72 -0
  297. package/test/unit/spec/common/queue.js +31 -2
  298. package/test/unit/spec/controls-options-manager/index.js +287 -0
  299. package/test/unit/spec/controls-options-manager/util.js +582 -0
  300. package/test/unit/spec/fixture/locus.js +1 -0
  301. package/test/unit/spec/interpretation/collection.ts +15 -0
  302. package/test/unit/spec/interpretation/index.ts +589 -0
  303. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  304. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  305. package/test/unit/spec/locus-info/index.js +1169 -36
  306. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  307. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  308. package/test/unit/spec/locus-info/parser.js +62 -22
  309. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  310. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  311. package/test/unit/spec/media/index.ts +138 -28
  312. package/test/unit/spec/meeting/in-meeting-actions.ts +89 -3
  313. package/test/unit/spec/meeting/index.js +3514 -1746
  314. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  315. package/test/unit/spec/meeting/muteState.js +370 -208
  316. package/test/unit/spec/meeting/request.js +440 -45
  317. package/test/unit/spec/meeting/utils.js +671 -54
  318. package/test/unit/spec/meeting-info/index.js +181 -0
  319. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  320. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  321. package/test/unit/spec/meetings/collection.js +14 -0
  322. package/test/unit/spec/meetings/index.js +939 -150
  323. package/test/unit/spec/meetings/utils.js +206 -2
  324. package/test/unit/spec/member/index.js +58 -4
  325. package/test/unit/spec/member/util.js +479 -35
  326. package/test/unit/spec/members/index.js +319 -1
  327. package/test/unit/spec/members/request.js +206 -27
  328. package/test/unit/spec/members/utils.js +184 -0
  329. package/test/unit/spec/metrics/index.js +1 -50
  330. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  331. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  332. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  333. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  334. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  335. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  336. package/test/unit/spec/reachability/index.ts +185 -7
  337. package/test/unit/spec/reachability/request.js +68 -0
  338. package/test/unit/spec/reconnection-manager/index.js +80 -6
  339. package/test/unit/spec/recording-controller/index.js +294 -218
  340. package/test/unit/spec/recording-controller/util.js +223 -96
  341. package/test/unit/spec/roap/index.ts +31 -51
  342. package/test/unit/spec/roap/request.ts +202 -85
  343. package/test/unit/spec/roap/turnDiscovery.ts +45 -10
  344. package/test/unit/spec/rtcMetrics/index.ts +68 -0
  345. package/test/unit/spec/stats-analyzer/index.js +29 -2
  346. package/test/utils/constants.js +9 -0
  347. package/test/utils/integrationTestUtils.js +46 -0
  348. package/test/utils/testUtils.js +0 -45
  349. package/test/utils/webex-config.js +4 -0
  350. package/test/utils/webex-test-users.js +6 -3
  351. package/dist/meeting/effectsState.js +0 -262
  352. package/dist/meeting/effectsState.js.map +0 -1
  353. package/dist/metrics/config.js +0 -299
  354. package/dist/metrics/config.js.map +0 -1
  355. package/dist/types/meeting/effectsState.d.ts +0 -42
  356. package/dist/types/metrics/config.d.ts +0 -178
  357. package/src/index.js +0 -16
  358. package/src/meeting/effectsState.ts +0 -211
  359. package/src/metrics/config.ts +0 -495
  360. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -0,0 +1,104 @@
1
+ import sinon from 'sinon';
2
+ import {assert, expect} from '@webex/test-helper-chai';
3
+ import MockWebex from '@webex/test-helper-mock-webex';
4
+ import BreakoutRequest from "@webex/plugin-meetings/src/breakouts/request";
5
+ import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
6
+
7
+ describe('plugin-meetings', () => {
8
+ describe('BreakoutRequest', () => {
9
+ let webex;
10
+ let breakoutRequest;
11
+ beforeEach(() => {
12
+ // @ts-ignore
13
+ webex = new MockWebex({});
14
+ // @ts-ignore
15
+ breakoutRequest = new BreakoutRequest({webex});
16
+ webex.request = sinon.stub().returns(Promise.resolve('REQUEST_RETURN_VALUE'));
17
+ });
18
+
19
+ describe('#broadcast', () => {
20
+ it('makes request as expected', async () => {
21
+ let result = await breakoutRequest.broadcast({url: 'url', message: 'hello', groupId: 'groupId'});
22
+ assert.calledWithExactly(webex.request, {
23
+ method: 'POST',
24
+ uri: 'url/message',
25
+ body: {
26
+ message: 'hello',
27
+ groups: [{
28
+ id: 'groupId',
29
+ recipientRoles: undefined,
30
+ sessions: undefined
31
+ }],
32
+ }
33
+ });
34
+ assert.equal(result, 'REQUEST_RETURN_VALUE');
35
+
36
+ result = await breakoutRequest.broadcast({
37
+ url: 'url',
38
+ message: 'hello',
39
+ groupId: 'groupId',
40
+ options: {
41
+ presenters: true,
42
+ cohosts: true
43
+ }
44
+ });
45
+ assert.calledWithExactly(webex.request, {
46
+ method: 'POST',
47
+ uri: 'url/message',
48
+ body: {
49
+ message: 'hello',
50
+ groups: [{
51
+ id: 'groupId',
52
+ recipientRoles: ['COHOST', 'PRESENTER'],
53
+ sessions: undefined
54
+ }]
55
+ }
56
+ });
57
+ assert.equal(result, 'REQUEST_RETURN_VALUE');
58
+
59
+ result = await breakoutRequest.broadcast({
60
+ url: 'url',
61
+ message: 'hello',
62
+ groupId: 'groupId',
63
+ options: {
64
+ presenters: true,
65
+ cohosts: true
66
+ },
67
+ sessionId: 'sessionId'
68
+ });
69
+
70
+ assert.calledWithExactly(webex.request, {
71
+ method: 'POST',
72
+ uri: 'url/message',
73
+ body: {
74
+ message: 'hello',
75
+ groups: [{
76
+ id: 'groupId',
77
+ recipientRoles: ['COHOST', 'PRESENTER'],
78
+ sessions: [{id: 'sessionId'}]
79
+ }]
80
+ }
81
+ });
82
+ assert.equal(result, 'REQUEST_RETURN_VALUE');
83
+ });
84
+
85
+ it('catch 409 error and log', async () => {
86
+ const error = {statusCode: 409, body: {errorCode: 201409036}};
87
+ webex.request.rejects(error);
88
+ LoggerProxy.logger.info = sinon.stub();
89
+ await breakoutRequest.broadcast({url: 'url', message: 'hello', groupId: 'groupId'});
90
+ assert.calledOnceWithExactly(
91
+ LoggerProxy.logger.info,
92
+ 'Breakouts#broadcast --> no joined participants'
93
+ );
94
+
95
+ const otherError = new Error('something wrong');
96
+ webex.request.rejects(otherError);
97
+ LoggerProxy.logger.error = sinon.stub();
98
+ await breakoutRequest.broadcast({url: 'url', message: 'hello', groupId: 'groupId'}).catch((error) => {
99
+ assert.equal(error.toString(), 'Error: something wrong');
100
+ });
101
+ });
102
+ });
103
+ });
104
+ });
@@ -0,0 +1,72 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import sinon from 'sinon';
3
+ import {getBroadcastRoles, boServiceErrorHandler, isSessionTypeChangedFromSessionToMain} from '@webex/plugin-meetings/src/breakouts/utils';
4
+ import BreakoutEditLockedError from '../../../../src/breakouts/edit-lock-error';
5
+ import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
6
+ import {BREAKOUTS} from '../../../../src/constants';
7
+
8
+ describe('plugin-meetings', () => {
9
+ describe('Breakouts utils', () => {
10
+ describe('#getBroadcastRoles', () => {
11
+ it('return expect roles', () => {
12
+ let roles = getBroadcastRoles();
13
+ assert.deepEqual(roles, []);
14
+
15
+ roles = getBroadcastRoles({cohosts: true});
16
+ assert.deepEqual(roles, ['COHOST']);
17
+
18
+ roles = getBroadcastRoles({presenters: true});
19
+ assert.deepEqual(roles, ['PRESENTER']);
20
+
21
+ roles = getBroadcastRoles({presenters: true, cohosts: true});
22
+ assert.deepEqual(roles, ['COHOST', 'PRESENTER']);
23
+ });
24
+ });
25
+ describe('#boServiceErrorHandler', () => {
26
+ it('return handled breakout service errors', () => {
27
+ // normal error
28
+ const errorMessage = 'Something was wrong.';
29
+ let handledError = boServiceErrorHandler(new Error(errorMessage));
30
+ assert.deepEqual(handledError, handledError);
31
+ assert.equal(handledError.message, errorMessage);
32
+
33
+ // undefined
34
+ handledError = boServiceErrorHandler();
35
+ assert.equal(handledError, undefined);
36
+
37
+ LoggerProxy.logger.info = sinon.stub();
38
+ //Edit lock token mismatch error
39
+ const tokenMismatchError = {
40
+ body: {errorCode: BREAKOUTS.ERROR_CODE.EDIT_LOCK_TOKEN_MISMATCH},
41
+ };
42
+ handledError = boServiceErrorHandler(tokenMismatchError, 'position');
43
+ assert.deepEqual(
44
+ handledError,
45
+ new BreakoutEditLockedError('Edit lock token mismatch', tokenMismatchError)
46
+ );
47
+ assert.calledOnceWithExactly(
48
+ LoggerProxy.logger.info,
49
+ 'position --> Edit lock token mismatch',
50
+ );
51
+ });
52
+ });
53
+
54
+ describe('#isSessionTypeChangedFromSessionToMain', () => {
55
+ it('returns false previous is not BREAKOUT', () => {
56
+ const breakout = {previous: sinon.stub().returns(BREAKOUTS.SESSION_TYPES.MAIN)};
57
+ assert.equal(isSessionTypeChangedFromSessionToMain(breakout, BREAKOUTS.SESSION_TYPES.MAIN), false);
58
+ assert.equal(isSessionTypeChangedFromSessionToMain(breakout, BREAKOUTS.SESSION_TYPES.BREAKOUT), false);
59
+ });
60
+
61
+ it('returns false newSessionType is not MAIN', () => {
62
+ const breakout = {previous: sinon.stub().returns(BREAKOUTS.SESSION_TYPES.BREAKOUT)};
63
+ assert.equal(isSessionTypeChangedFromSessionToMain(breakout, BREAKOUTS.SESSION_TYPES.BREAKOUT), false);
64
+ });
65
+
66
+ it('returns true previous is BREAKOUT and newSessionType is MAIN', () => {
67
+ const breakout = {previous: sinon.stub().returns(BREAKOUTS.SESSION_TYPES.BREAKOUT)};
68
+ assert.equal(isSessionTypeChangedFromSessionToMain(breakout, BREAKOUTS.SESSION_TYPES.MAIN), true);
69
+ });
70
+ })
71
+ });
72
+ });
@@ -1,5 +1,5 @@
1
1
  import {assert} from '@webex/test-helper-chai';
2
- import SimpleQueue from '@webex/plugin-meetings/src/common/queue';
2
+ import SortedQueue from '@webex/plugin-meetings/src/common/queue';
3
3
 
4
4
  describe('common/queue', () => {
5
5
  let fifo = null;
@@ -11,7 +11,15 @@ describe('common/queue', () => {
11
11
  };
12
12
 
13
13
  beforeEach(() => {
14
- fifo = new SimpleQueue();
14
+ fifo = new SortedQueue((left, right) => {
15
+ if (left.text > right.text) {
16
+ return 1;
17
+ }
18
+ if (left.text < right.text) {
19
+ return -1;
20
+ }
21
+ return 0;
22
+ });
15
23
  });
16
24
 
17
25
  afterEach(() => {
@@ -66,4 +74,25 @@ describe('common/queue', () => {
66
74
  it('Returns null if the queue is empty.', () => {
67
75
  assert.equal(fifo.dequeue(), null);
68
76
  });
77
+
78
+ it('Implement lifo', () => {
79
+ const lifo = new SortedQueue((left, right) => {
80
+ if (left.text < right.text) {
81
+ return 1;
82
+ }
83
+ if (left.text > right.text) {
84
+ return -1;
85
+ }
86
+ return 0;
87
+ });
88
+
89
+ const item1 = {text: 'fake item1'};
90
+ const item2 = {text: 'fake item2'};
91
+
92
+ lifo.enqueue(item1);
93
+ lifo.enqueue(item2);
94
+
95
+ assert.equal(lifo.dequeue(), item2);
96
+ assert.equal(lifo.dequeue(), item1);
97
+ });
69
98
  });
@@ -0,0 +1,287 @@
1
+ import ControlsOptionsManager from '@webex/plugin-meetings/src/controls-options-manager';
2
+ import Util from '@webex/plugin-meetings/src/controls-options-manager/util';
3
+ import sinon from 'sinon';
4
+ import {assert} from '@webex/test-helper-chai';
5
+ import { HTTP_VERBS } from '@webex/plugin-meetings/src/constants';
6
+
7
+ describe('plugin-meetings', () => {
8
+ describe('controls-options-manager tests', () => {
9
+ describe('index', () => {
10
+ let request;
11
+
12
+ describe('class tests', () => {
13
+ it('can set and extract new values later on', () => {
14
+ const manager = new ControlsOptionsManager({});
15
+ assert.isUndefined(manager.getLocusUrl());
16
+ manager.set({
17
+ locusUrl: 'test/id',
18
+ })
19
+ assert(manager.getLocusUrl(), 'test/id');
20
+ });
21
+ });
22
+
23
+ describe('Mute On Entry', () => {
24
+ let manager;
25
+
26
+ beforeEach(() => {
27
+ request = {
28
+ request: sinon.stub().returns(Promise.resolve()),
29
+ };
30
+
31
+ manager = new ControlsOptionsManager(request);
32
+
33
+ manager.set({
34
+ locusUrl: 'test/id',
35
+ displayHints: [],
36
+ })
37
+ });
38
+
39
+ describe('setMuteOnEntry', () => {
40
+ it('rejects when correct display hint is not present enabled=false', () => {
41
+ const result = manager.setMuteOnEntry(false);
42
+
43
+ assert.notCalled(request.request);
44
+
45
+ assert.isRejected(result);
46
+ });
47
+
48
+ it('rejects when correct display hint is not present enabled=true', () => {
49
+ const result = manager.setMuteOnEntry(true);
50
+
51
+ assert.notCalled(request.request);
52
+
53
+ assert.isRejected(result);
54
+ });
55
+
56
+ it('can set mute on entry when the display hint is available enabled=true', () => {
57
+ manager.setDisplayHints(['ENABLE_MUTE_ON_ENTRY']);
58
+
59
+ const result = manager.setMuteOnEntry(true);
60
+
61
+ assert.calledWith(request.request, { uri: 'test/id/controls',
62
+ body: { muteOnEntry: { enabled: true } },
63
+ method: HTTP_VERBS.PATCH});
64
+
65
+ assert.deepEqual(result, request.request.firstCall.returnValue);
66
+ });
67
+
68
+ it('can set mute on entry when the display hint is available enabled=false', () => {
69
+ manager.setDisplayHints(['DISABLE_MUTE_ON_ENTRY']);
70
+
71
+ const result = manager.setMuteOnEntry(false);
72
+
73
+ assert.calledWith(request.request, { uri: 'test/id/controls',
74
+ body: { muteOnEntry: { enabled: false } },
75
+ method: HTTP_VERBS.PATCH});
76
+
77
+ assert.deepEqual(result, request.request.firstCall.returnValue);
78
+ });
79
+ });
80
+
81
+ describe('setDisallowUnmute', () => {
82
+ it('rejects when correct display hint is not present enabled=false', () => {
83
+ const result = manager.setDisallowUnmute(false);
84
+
85
+ assert.notCalled(request.request);
86
+
87
+ assert.isRejected(result);
88
+ });
89
+
90
+ it('rejects when correct display hint is not present enabled=true', () => {
91
+ const result = manager.setDisallowUnmute(true);
92
+
93
+ assert.notCalled(request.request);
94
+
95
+ assert.isRejected(result);
96
+ });
97
+
98
+ it('can set mute on entry when the display hint is available enabled=true', () => {
99
+ manager.setDisplayHints(['ENABLE_HARD_MUTE']);
100
+
101
+ const result = manager.setDisallowUnmute(true);
102
+
103
+ assert.calledWith(request.request, { uri: 'test/id/controls',
104
+ body: { disallowUnmute: { enabled: true } },
105
+ method: HTTP_VERBS.PATCH});
106
+
107
+ assert.deepEqual(result, request.request.firstCall.returnValue);
108
+ });
109
+
110
+ it('can set mute on entry when the display hint is available enabled=false', () => {
111
+ manager.setDisplayHints(['DISABLE_HARD_MUTE']);
112
+
113
+ const result = manager.setDisallowUnmute(false);
114
+
115
+ assert.calledWith(request.request, { uri: 'test/id/controls',
116
+ body: { disallowUnmute: { enabled: false } },
117
+ method: HTTP_VERBS.PATCH});
118
+
119
+ assert.deepEqual(result, request.request.firstCall.returnValue);
120
+ });
121
+ });
122
+ });
123
+
124
+ describe('update()', () => {
125
+ let manager;
126
+
127
+ beforeEach(() => {
128
+ request = {
129
+ request: sinon.stub().resolves(),
130
+ };
131
+
132
+ manager = new ControlsOptionsManager(request);
133
+
134
+ manager.set({
135
+ locusUrl: 'test/id',
136
+ displayHints: [],
137
+ });
138
+ });
139
+
140
+ it('should throw an error if the scope is not supported', () => {
141
+ const scope = 'invalid';
142
+
143
+ assert.throws(() => manager.update({scope}));
144
+ });
145
+
146
+ it('should throw an error if canUpdate returns false', () => {
147
+ const restorable = Util.canUpdate;
148
+ Util.canUpdate = sinon.stub().returns(false);
149
+
150
+ const scope = 'audio';
151
+
152
+ assert.throws(() => manager.update({scope}));
153
+ Util.canUpdate = restorable;
154
+ });
155
+
156
+ it('should call request multiple times with a bodies that include formatted locus details', () => {
157
+ const restorable = Util.canUpdate;
158
+ Util.canUpdate = sinon.stub().returns(true);
159
+
160
+ const audio = {scope: 'audio', properties: {a: 1, b: 2}};
161
+ const reactions = {scope: 'reactions', properties: {c: 3, d: 4}};
162
+
163
+ return manager.update(audio, reactions)
164
+ .then(() => {
165
+ assert.calledWith(request.request, {
166
+ uri: 'test/id/controls',
167
+ body: {
168
+ audio: audio.properties,
169
+ },
170
+ method: HTTP_VERBS.PATCH,
171
+ });
172
+
173
+ assert.calledWith(request.request, {
174
+ uri: 'test/id/controls',
175
+ body: {
176
+ reactions: reactions.properties,
177
+ },
178
+ method: HTTP_VERBS.PATCH,
179
+ });
180
+
181
+ Util.canUpdate = restorable;
182
+ });
183
+ });
184
+
185
+ it('should check if the user can update for each provided control config', () => {
186
+ const restorable = Util.canUpdate;
187
+ Util.canUpdate = sinon.stub().returns(true);
188
+
189
+ const audio = {scope: 'audio', properties: {a: 1, b: 2}};
190
+ const reactions = {scope: 'reactions', properties: {c: 3, d: 4}};
191
+ const controls = [audio, reactions];
192
+
193
+ return manager.update(...controls)
194
+ .then(() => {
195
+ assert.callCount(Util.canUpdate, controls.length);
196
+
197
+ controls.forEach((control) => {
198
+ assert.calledWith(Util.canUpdate, control, manager.displayHints);
199
+ });
200
+
201
+ Util.canUpdate = restorable;
202
+ });
203
+ });
204
+ });
205
+
206
+ describe('Mute/Unmute All', () => {
207
+ let manager;
208
+ beforeEach(() => {
209
+ request = {
210
+ request: sinon.stub().returns(Promise.resolve()),
211
+ };
212
+
213
+ manager = new ControlsOptionsManager(request);
214
+
215
+ manager.set({
216
+ locusUrl: 'test/id',
217
+ displayHints: [],
218
+ })
219
+ });
220
+
221
+ it('rejects when correct display hint is not present mutedEnabled=false', () => {
222
+ const result = manager.setMuteAll(false, false, false);
223
+
224
+ assert.notCalled(request.request);
225
+
226
+ assert.isRejected(result);
227
+ });
228
+
229
+ it('rejects when correct display hint is not present mutedEnabled=true', () => {
230
+ const result = manager.setMuteAll(true, false, false);
231
+
232
+ assert.notCalled(request.request);
233
+
234
+ assert.isRejected(result);
235
+ });
236
+
237
+ it('can set mute all when the display hint is available mutedEnabled=true', () => {
238
+ manager.setDisplayHints(['MUTE_ALL', 'ENABLE_HARD_MUTE', 'ENABLE_MUTE_ON_ENTRY']);
239
+
240
+ const result = manager.setMuteAll(true, true, true);
241
+
242
+ assert.calledWith(request.request, { uri: 'test/id/controls',
243
+ body: { audio: { muted: true, disallowUnmute: true, muteOnEntry: true } },
244
+ method: HTTP_VERBS.PATCH});
245
+
246
+ assert.deepEqual(result, request.request.firstCall.returnValue);
247
+ });
248
+
249
+ it('can set mute all when the display hint is available mutedEnabled=true', () => {
250
+ manager.setDisplayHints(['MUTE_ALL', 'DISABLE_HARD_MUTE', 'ENABLE_MUTE_ON_ENTRY']);
251
+
252
+ const result = manager.setMuteAll(true, true, true);
253
+
254
+ assert.calledWith(request.request, { uri: 'test/id/controls',
255
+ body: { audio: { muted: true, disallowUnmute: true, muteOnEntry: true } },
256
+ method: HTTP_VERBS.PATCH});
257
+
258
+ assert.deepEqual(result, request.request.firstCall.returnValue);
259
+ });
260
+
261
+ it('can set mute all when the display hint is available mutedEnabled=true', () => {
262
+ manager.setDisplayHints(['MUTE_ALL', 'DISABLE_HARD_MUTE', 'DISABLE_MUTE_ON_ENTRY']);
263
+
264
+ const result = manager.setMuteAll(true, true, true);
265
+
266
+ assert.calledWith(request.request, { uri: 'test/id/controls',
267
+ body: { audio: { muted: true, disallowUnmute: true, muteOnEntry: true } },
268
+ method: HTTP_VERBS.PATCH});
269
+
270
+ assert.deepEqual(result, request.request.firstCall.returnValue);
271
+ });
272
+
273
+ it('can set mute all when the display hint is available mutedEnabled=false', () => {
274
+ manager.setDisplayHints(['UNMUTE_ALL', 'DISABLE_HARD_MUTE', 'DISABLE_MUTE_ON_ENTRY']);
275
+
276
+ const result = manager.setMuteAll(false, false, false);
277
+
278
+ assert.calledWith(request.request, { uri: 'test/id/controls',
279
+ body: { audio: { muted: false, disallowUnmute: false, muteOnEntry: false } },
280
+ method: HTTP_VERBS.PATCH});
281
+
282
+ assert.deepEqual(result, request.request.firstCall.returnValue);
283
+ });
284
+ });
285
+ });
286
+ });
287
+ });