@webex/plugin-meetings 3.0.0-beta.28 → 3.0.0-beta.280

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 (363) 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 +763 -31
  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/no-meeting-info.js +51 -0
  21. package/dist/common/errors/no-meeting-info.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +28 -7
  23. package/dist/common/errors/webex-errors.js.map +1 -1
  24. package/dist/common/logs/logger-proxy.js +1 -1
  25. package/dist/common/logs/logger-proxy.js.map +1 -1
  26. package/dist/common/queue.js +24 -9
  27. package/dist/common/queue.js.map +1 -1
  28. package/dist/config.js +5 -10
  29. package/dist/config.js.map +1 -1
  30. package/dist/constants.js +203 -28
  31. package/dist/constants.js.map +1 -1
  32. package/dist/controls-options-manager/enums.js +14 -2
  33. package/dist/controls-options-manager/enums.js.map +1 -1
  34. package/dist/controls-options-manager/index.js +109 -15
  35. package/dist/controls-options-manager/index.js.map +1 -1
  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 +309 -18
  39. package/dist/controls-options-manager/util.js.map +1 -1
  40. package/dist/index.js +112 -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 +383 -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 +57 -1
  55. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  56. package/dist/locus-info/parser.js +249 -72
  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 +58 -116
  61. package/dist/media/index.js.map +1 -1
  62. package/dist/media/properties.js +72 -123
  63. package/dist/media/properties.js.map +1 -1
  64. package/dist/meeting/in-meeting-actions.js +82 -2
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +3123 -2814
  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 +230 -124
  71. package/dist/meeting/muteState.js.map +1 -1
  72. package/dist/meeting/request.js +256 -196
  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 +73 -7
  77. package/dist/meeting-info/index.js.map +1 -1
  78. package/dist/meeting-info/meeting-info-v2.js +192 -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 +394 -94
  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 +71 -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 -6
  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 +12 -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 +40 -16
  117. package/dist/multistream/receiveSlot.js.map +1 -1
  118. package/dist/multistream/receiveSlotManager.js +39 -36
  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 +209 -59
  125. package/dist/multistream/remoteMediaManager.js.map +1 -1
  126. package/dist/multistream/sendSlotManager.js +233 -0
  127. package/dist/multistream/sendSlotManager.js.map +1 -0
  128. package/dist/reachability/index.js +225 -59
  129. package/dist/reachability/index.js.map +1 -1
  130. package/dist/reachability/request.js +17 -8
  131. package/dist/reachability/request.js.map +1 -1
  132. package/dist/reconnection-manager/index.js +199 -154
  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 +23 -29
  139. package/dist/roap/index.js.map +1 -1
  140. package/dist/roap/request.js +112 -97
  141. package/dist/roap/request.js.map +1 -1
  142. package/dist/roap/turnDiscovery.js +96 -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/index.js +67 -73
  149. package/dist/statsAnalyzer/index.js.map +1 -1
  150. package/dist/statsAnalyzer/mqaUtil.js +11 -10
  151. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  152. package/dist/types/annotation/annotation.types.d.ts +42 -0
  153. package/dist/types/annotation/constants.d.ts +31 -0
  154. package/dist/types/annotation/index.d.ts +117 -0
  155. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  156. package/dist/types/breakouts/events.d.ts +8 -0
  157. package/dist/types/breakouts/request.d.ts +22 -0
  158. package/dist/types/breakouts/utils.d.ts +15 -0
  159. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  160. package/dist/types/common/errors/webex-errors.d.ts +13 -1
  161. package/dist/types/common/queue.d.ts +9 -7
  162. package/dist/types/config.d.ts +1 -6
  163. package/dist/types/constants.d.ts +161 -21
  164. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  165. package/dist/types/controls-options-manager/index.d.ts +17 -1
  166. package/dist/types/controls-options-manager/types.d.ts +43 -0
  167. package/dist/types/controls-options-manager/util.d.ts +1 -7
  168. package/dist/types/index.d.ts +6 -4
  169. package/dist/types/interpretation/collection.d.ts +5 -0
  170. package/dist/types/interpretation/index.d.ts +5 -0
  171. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  172. package/dist/types/locus-info/index.d.ts +57 -4
  173. package/dist/types/locus-info/parser.d.ts +67 -6
  174. package/dist/types/media/index.d.ts +2 -0
  175. package/dist/types/media/properties.d.ts +34 -48
  176. package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
  177. package/dist/types/meeting/index.d.ts +345 -507
  178. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  179. package/dist/types/meeting/muteState.d.ts +99 -23
  180. package/dist/types/meeting/request.d.ts +72 -43
  181. package/dist/types/meeting/util.d.ts +101 -1
  182. package/dist/types/meeting-info/index.d.ts +13 -1
  183. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  184. package/dist/types/meetings/collection.d.ts +8 -0
  185. package/dist/types/meetings/index.d.ts +88 -12
  186. package/dist/types/meetings/meetings.types.d.ts +4 -0
  187. package/dist/types/member/index.d.ts +13 -0
  188. package/dist/types/member/types.d.ts +32 -0
  189. package/dist/types/members/collection.d.ts +5 -0
  190. package/dist/types/members/index.d.ts +35 -2
  191. package/dist/types/members/request.d.ts +73 -9
  192. package/dist/types/members/types.d.ts +24 -0
  193. package/dist/types/members/util.d.ts +209 -1
  194. package/dist/types/metrics/constants.d.ts +11 -4
  195. package/dist/types/metrics/index.d.ts +4 -119
  196. package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
  197. package/dist/types/multistream/receiveSlot.d.ts +13 -11
  198. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  199. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  200. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  201. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  202. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  203. package/dist/types/reachability/index.d.ts +61 -7
  204. package/dist/types/reachability/request.d.ts +7 -3
  205. package/dist/types/reconnection-manager/index.d.ts +9 -0
  206. package/dist/types/recording-controller/index.d.ts +15 -1
  207. package/dist/types/recording-controller/util.d.ts +5 -4
  208. package/dist/types/roap/request.d.ts +15 -11
  209. package/dist/types/roap/turnDiscovery.d.ts +18 -1
  210. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  211. package/dist/types/rtcMetrics/index.d.ts +47 -0
  212. package/dist/types/statsAnalyzer/index.d.ts +6 -1
  213. package/package.json +23 -20
  214. package/src/annotation/annotation.types.ts +50 -0
  215. package/src/annotation/constants.ts +36 -0
  216. package/src/annotation/index.ts +328 -0
  217. package/src/breakouts/README.md +44 -14
  218. package/src/breakouts/breakout.ts +87 -9
  219. package/src/breakouts/edit-lock-error.ts +25 -0
  220. package/src/breakouts/events.ts +56 -0
  221. package/src/breakouts/index.ts +646 -18
  222. package/src/breakouts/request.ts +55 -0
  223. package/src/breakouts/utils.ts +57 -0
  224. package/src/common/errors/no-meeting-info.ts +24 -0
  225. package/src/common/errors/webex-errors.ts +27 -2
  226. package/src/common/logs/logger-proxy.ts +1 -1
  227. package/src/common/queue.ts +22 -8
  228. package/src/config.ts +4 -9
  229. package/src/constants.ts +184 -18
  230. package/src/controls-options-manager/enums.ts +12 -0
  231. package/src/controls-options-manager/index.ts +116 -21
  232. package/src/controls-options-manager/types.ts +59 -0
  233. package/src/controls-options-manager/util.ts +294 -14
  234. package/src/index.ts +40 -0
  235. package/src/interpretation/README.md +60 -0
  236. package/src/interpretation/collection.ts +19 -0
  237. package/src/interpretation/index.ts +332 -0
  238. package/src/interpretation/siLanguage.ts +18 -0
  239. package/src/locus-info/controlsUtils.ts +108 -0
  240. package/src/locus-info/index.ts +413 -59
  241. package/src/locus-info/infoUtils.ts +10 -2
  242. package/src/locus-info/mediaSharesUtils.ts +64 -0
  243. package/src/locus-info/parser.ts +258 -47
  244. package/src/locus-info/selfUtils.ts +81 -5
  245. package/src/media/index.ts +100 -122
  246. package/src/media/properties.ts +85 -108
  247. package/src/meeting/in-meeting-actions.ts +163 -3
  248. package/src/meeting/index.ts +2541 -2309
  249. package/src/meeting/locusMediaRequest.ts +313 -0
  250. package/src/meeting/muteState.ts +229 -131
  251. package/src/meeting/request.ts +172 -121
  252. package/src/meeting/util.ts +588 -394
  253. package/src/meeting-info/index.ts +81 -8
  254. package/src/meeting-info/meeting-info-v2.ts +170 -14
  255. package/src/meeting-info/util.ts +1 -1
  256. package/src/meeting-info/utilv2.ts +23 -23
  257. package/src/meetings/collection.ts +20 -0
  258. package/src/meetings/index.ts +428 -108
  259. package/src/meetings/meetings.types.ts +12 -0
  260. package/src/meetings/request.ts +2 -0
  261. package/src/meetings/util.ts +79 -4
  262. package/src/member/index.ts +49 -0
  263. package/src/member/types.ts +38 -0
  264. package/src/member/util.ts +127 -25
  265. package/src/members/collection.ts +8 -0
  266. package/src/members/index.ts +106 -7
  267. package/src/members/request.ts +97 -17
  268. package/src/members/types.ts +28 -0
  269. package/src/members/util.ts +319 -240
  270. package/src/metrics/constants.ts +11 -4
  271. package/src/metrics/index.ts +1 -490
  272. package/src/multistream/mediaRequestManager.ts +289 -79
  273. package/src/multistream/receiveSlot.ts +47 -17
  274. package/src/multistream/receiveSlotManager.ts +34 -24
  275. package/src/multistream/remoteMedia.ts +27 -2
  276. package/src/multistream/remoteMediaGroup.ts +59 -0
  277. package/src/multistream/remoteMediaManager.ts +148 -30
  278. package/src/multistream/sendSlotManager.ts +170 -0
  279. package/src/reachability/index.ts +228 -37
  280. package/src/reachability/request.ts +17 -8
  281. package/src/reconnection-manager/index.ts +81 -54
  282. package/src/recording-controller/index.ts +20 -3
  283. package/src/recording-controller/util.ts +26 -9
  284. package/src/roap/index.ts +23 -30
  285. package/src/roap/request.ts +100 -104
  286. package/src/roap/turnDiscovery.ts +51 -25
  287. package/src/rtcMetrics/constants.ts +3 -0
  288. package/src/rtcMetrics/index.ts +100 -0
  289. package/src/statsAnalyzer/index.ts +88 -88
  290. package/src/statsAnalyzer/mqaUtil.ts +13 -14
  291. package/test/integration/spec/converged-space-meetings.js +60 -3
  292. package/test/integration/spec/journey.js +320 -261
  293. package/test/integration/spec/space-meeting.js +76 -3
  294. package/test/unit/spec/annotation/index.ts +418 -0
  295. package/test/unit/spec/breakouts/breakout.ts +142 -24
  296. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  297. package/test/unit/spec/breakouts/events.ts +89 -0
  298. package/test/unit/spec/breakouts/index.ts +1488 -67
  299. package/test/unit/spec/breakouts/request.ts +104 -0
  300. package/test/unit/spec/breakouts/utils.js +72 -0
  301. package/test/unit/spec/common/queue.js +31 -2
  302. package/test/unit/spec/controls-options-manager/index.js +163 -0
  303. package/test/unit/spec/controls-options-manager/util.js +576 -60
  304. package/test/unit/spec/fixture/locus.js +1 -0
  305. package/test/unit/spec/interpretation/collection.ts +15 -0
  306. package/test/unit/spec/interpretation/index.ts +589 -0
  307. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  308. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  309. package/test/unit/spec/locus-info/index.js +1304 -33
  310. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  311. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  312. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  313. package/test/unit/spec/locus-info/parser.js +116 -35
  314. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  315. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  316. package/test/unit/spec/media/index.ts +104 -37
  317. package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
  318. package/test/unit/spec/meeting/index.js +4515 -1932
  319. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  320. package/test/unit/spec/meeting/muteState.js +408 -208
  321. package/test/unit/spec/meeting/request.js +440 -45
  322. package/test/unit/spec/meeting/utils.js +679 -64
  323. package/test/unit/spec/meeting-info/index.js +295 -0
  324. package/test/unit/spec/meeting-info/meetinginfov2.js +521 -5
  325. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  326. package/test/unit/spec/meetings/collection.js +14 -0
  327. package/test/unit/spec/meetings/index.js +1007 -177
  328. package/test/unit/spec/meetings/utils.js +206 -2
  329. package/test/unit/spec/member/index.js +58 -4
  330. package/test/unit/spec/member/util.js +479 -35
  331. package/test/unit/spec/members/index.js +319 -1
  332. package/test/unit/spec/members/request.js +206 -27
  333. package/test/unit/spec/members/utils.js +184 -0
  334. package/test/unit/spec/metrics/index.js +1 -50
  335. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  336. package/test/unit/spec/multistream/receiveSlot.ts +43 -20
  337. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  338. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  339. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  340. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  341. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  342. package/test/unit/spec/reachability/index.ts +549 -9
  343. package/test/unit/spec/reachability/request.js +68 -0
  344. package/test/unit/spec/reconnection-manager/index.js +84 -9
  345. package/test/unit/spec/recording-controller/index.js +294 -218
  346. package/test/unit/spec/recording-controller/util.js +223 -96
  347. package/test/unit/spec/roap/index.ts +31 -51
  348. package/test/unit/spec/roap/request.ts +203 -85
  349. package/test/unit/spec/roap/turnDiscovery.ts +48 -13
  350. package/test/unit/spec/rtcMetrics/index.ts +68 -0
  351. package/test/unit/spec/stats-analyzer/index.js +64 -2
  352. package/test/utils/integrationTestUtils.js +46 -0
  353. package/test/utils/testUtils.js +0 -52
  354. package/dist/meeting/effectsState.js +0 -262
  355. package/dist/meeting/effectsState.js.map +0 -1
  356. package/dist/metrics/config.js +0 -299
  357. package/dist/metrics/config.js.map +0 -1
  358. package/dist/types/meeting/effectsState.d.ts +0 -42
  359. package/dist/types/metrics/config.d.ts +0 -178
  360. package/src/index.js +0 -16
  361. package/src/meeting/effectsState.ts +0 -211
  362. package/src/metrics/config.ts +0 -495
  363. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -14,6 +14,9 @@ import ParameterError from '@webex/plugin-meetings/src/common/errors/parameter';
14
14
  import Meetings from '@webex/plugin-meetings';
15
15
  import Members from '@webex/plugin-meetings/src/members';
16
16
  import MembersUtil from '@webex/plugin-meetings/src/members/util';
17
+ import * as MembersRequestImport from '@webex/plugin-meetings/src/members/request';
18
+ import Trigger from '@webex/plugin-meetings/src/common/events/trigger-proxy';
19
+ import {EVENT_TRIGGERS} from '@webex/plugin-meetings/src/constants';
17
20
 
18
21
  const {assert} = chai;
19
22
 
@@ -79,6 +82,8 @@ describe('plugin-meetings', () => {
79
82
  describe('members', () => {
80
83
  const sandbox = sinon.createSandbox();
81
84
  let createMembers;
85
+ let meeting;
86
+ let membersRequestSpy;
82
87
 
83
88
  beforeEach(() => {
84
89
  webex = new MockWebex({
@@ -104,13 +109,31 @@ describe('plugin-meetings', () => {
104
109
 
105
110
  url1 = `https://example.com/${uuid.v4()}`;
106
111
 
107
- createMembers = (options) => new Members({locusUrl: options.url}, {parent: webex});
112
+ membersRequestSpy = sinon.spy(MembersRequestImport, 'default');
113
+
114
+ meeting = {
115
+ request: sinon.mock().returns(Promise.resolve()),
116
+ locusInfo: {
117
+ sequence: {}
118
+ }
119
+ }
120
+
121
+ createMembers = (options) => new Members({locusUrl: options.url, meeting}, {parent: webex});
108
122
  });
109
123
 
110
124
  afterEach(() => {
125
+ membersRequestSpy.restore();
111
126
  sandbox.restore();
112
127
  });
113
128
 
129
+ describe('constructor', () => {
130
+ it('passes the meeting to the MembersRequest', () => {
131
+ createMembers({});
132
+
133
+ assert.calledOnceWithExactly(membersRequestSpy, {meeting}, {parent: webex});
134
+ });
135
+ });
136
+
114
137
  describe('#addMembers', () => {
115
138
  it('should invoke isInvalidInvitee and generateAddMemberOptions from MembersUtil when addMember is called with valid params', async () => {
116
139
  sandbox.spy(MembersUtil, 'isInvalidInvitee');
@@ -130,6 +153,128 @@ describe('plugin-meetings', () => {
130
153
  });
131
154
  });
132
155
 
156
+ describe('#admitMembers', () => {
157
+ let members;
158
+ beforeEach(() => {
159
+ members = createMembers({url: url1});
160
+ members.membersRequest.admitMember = sinon.stub().returns(Promise.resolve(true));
161
+ });
162
+ it('should return error if param memberIds is not provided', async () => {
163
+ let error;
164
+ await members.admitMembers().catch((e) => {
165
+ error = e;
166
+ });
167
+ assert.deepEqual(error, new ParameterError('No member ids provided to admit.'));
168
+ });
169
+
170
+ it('should call membersRequest.admitMember as expected', async () => {
171
+ await members.admitMembers(['uuid']);
172
+ const arg1 = members.membersRequest.admitMember.getCall(0).args[0];
173
+ assert.equal(arg1.sessionLocusUrls, undefined);
174
+ assert.equal(arg1.locusUrl.includes('https://example.com/'), true);
175
+ assert.deepEqual(arg1.memberIds, ['uuid']);
176
+
177
+ const sessionLocusUrls = {
178
+ authorizingLocusUrl: 'authorizingLocusUrl',
179
+ mainLocusUrl: 'mainLocusUrl',
180
+ };
181
+ await members.admitMembers(['uuid'], sessionLocusUrls);
182
+ const arg2 = members.membersRequest.admitMember.getCall(1).args[0];
183
+ assert.equal(arg2.sessionLocusUrls, sessionLocusUrls);
184
+ assert.equal(arg1.locusUrl.includes('https://example.com/'), true);
185
+ assert.deepEqual(arg1.memberIds, ['uuid']);
186
+ });
187
+ });
188
+
189
+ describe('#muteMember', () => {
190
+ const testMuteMember = async (mute, isAudio) => {
191
+ sandbox.spy(MembersUtil, 'generateMuteMemberOptions');
192
+
193
+ const locusUrl = 'locus-url';
194
+ const members = createMembers({url: locusUrl});
195
+ const {membersRequest} = members;
196
+ sandbox.spy(membersRequest, 'muteMember');
197
+
198
+ const memberId = 'bob';
199
+
200
+ await members.muteMember(memberId, mute, isAudio);
201
+ assert.calledOnce(MembersUtil.generateMuteMemberOptions);
202
+ assert.calledWith(
203
+ MembersUtil.generateMuteMemberOptions,
204
+ memberId,
205
+ mute,
206
+ members.locusUrl,
207
+ isAudio
208
+ );
209
+
210
+ assert.calledOnce(membersRequest.muteMember);
211
+ assert.calledWith(membersRequest.muteMember, {memberId, muted: mute, locusUrl, isAudio});
212
+ };
213
+
214
+ it('invokes expected functions when muteMember is called for mute=true, isAudio=true', async () => {
215
+ testMuteMember(true, true);
216
+ });
217
+
218
+ it('invokes expected functions when muteMember is called for mute=true, isAudio=false', async () => {
219
+ testMuteMember(true, false);
220
+ });
221
+
222
+ it('invokes expected functions when muteMember is called for mute=false, isAudio=true', async () => {
223
+ testMuteMember(false, true);
224
+ });
225
+
226
+ it('invokes expected functions when muteMember is called for mute=false, isAudio=false', async () => {
227
+ testMuteMember(false, false);
228
+ });
229
+ });
230
+
231
+ describe('#clearMembers', () => {
232
+ it('should send clear event if clear members', () => {
233
+ const members = createMembers({url: url1});
234
+ members.membersCollection.setAll(fakeMembersCollection);
235
+ sinon.stub(Trigger, 'trigger');
236
+ members.clearMembers();
237
+ assert.deepEqual(members.membersCollection.members, {});
238
+ assert.calledWith(
239
+ Trigger.trigger,
240
+ members,
241
+ {
242
+ file: 'members',
243
+ function: 'clearMembers',
244
+ },
245
+ EVENT_TRIGGERS.MEMBERS_CLEAR,
246
+ {}
247
+ );
248
+ });
249
+ });
250
+ describe('#locusParticipantsUpdate', () => {
251
+ it('should send member update event with session info', () => {
252
+ const members = createMembers({url: url1});
253
+ const fakePayload = {
254
+ participants: {
255
+ forEach: sinon.stub(),
256
+ },
257
+ isReplace: true,
258
+ };
259
+
260
+ members.locusParticipantsUpdate(fakePayload);
261
+
262
+ assert.calledWith(
263
+ Trigger.trigger,
264
+ members,
265
+ {
266
+ file: 'members',
267
+ function: 'locusParticipantsUpdate',
268
+ },
269
+ EVENT_TRIGGERS.MEMBERS_UPDATE,
270
+ {
271
+ delta: {added: [], updated: []},
272
+ full: {},
273
+ isReplace: true,
274
+ }
275
+ );
276
+ });
277
+ });
133
278
  describe('#sendDialPadKey', () => {
134
279
  it('should throw a rejection when calling sendDialPadKey with no tones', async () => {
135
280
  const members = createMembers({url: url1});
@@ -191,6 +336,97 @@ describe('plugin-meetings', () => {
191
336
  });
192
337
  });
193
338
 
339
+ describe('#assignRoles', () => {
340
+ const setup = (locusUrl) => {
341
+ const members = createMembers({url: locusUrl});
342
+
343
+ const spies = {
344
+ generateRoleAssignmentMemberOptions: sandbox.spy(
345
+ MembersUtil,
346
+ 'generateRoleAssignmentMemberOptions'
347
+ ),
348
+ assignRolesMember: sandbox.spy(members.membersRequest, 'assignRolesMember'),
349
+ };
350
+
351
+ return {members, spies};
352
+ };
353
+
354
+ const checkInvalid = async (resultPromise, expectedMessage, spies) => {
355
+ await assert.isRejected(resultPromise, ParameterError, expectedMessage);
356
+ assert.notCalled(spies.generateRoleAssignmentMemberOptions);
357
+ assert.notCalled(spies.assignRolesMember);
358
+ };
359
+
360
+ const checkValid = async (
361
+ resultPromise,
362
+ spies,
363
+ expectedMemberId,
364
+ expectedRoles,
365
+ expectedLocusUrl
366
+ ) => {
367
+ await assert.isFulfilled(resultPromise);
368
+ assert.calledOnceWithExactly(
369
+ spies.generateRoleAssignmentMemberOptions,
370
+ expectedMemberId,
371
+ expectedRoles,
372
+ expectedLocusUrl
373
+ );
374
+ assert.calledOnceWithExactly(spies.assignRolesMember, {
375
+ memberId: expectedMemberId,
376
+ roles: expectedRoles,
377
+ locusUrl: expectedLocusUrl,
378
+ });
379
+ assert.strictEqual(resultPromise, spies.assignRolesMember.getCall(0).returnValue);
380
+ };
381
+
382
+ it('should not make a request if there is no member id', async () => {
383
+ const {members, spies} = setup(url1);
384
+
385
+ const resultPromise = members.assignRoles();
386
+
387
+ await checkInvalid(
388
+ resultPromise,
389
+ 'The member id must be defined to assign the roles to a member.',
390
+ spies
391
+ );
392
+ });
393
+
394
+ it('should not make a request if there is no locus url', async () => {
395
+ const {members, spies} = setup();
396
+
397
+ const resultPromise = members.assignRoles(uuid.v4());
398
+
399
+ await checkInvalid(
400
+ resultPromise,
401
+ 'The associated locus url for this meetings members object must be defined.',
402
+ spies
403
+ );
404
+ });
405
+
406
+ it('should make the correct request when called with roles', async () => {
407
+ const memberId = uuid.v4();
408
+ const {members, spies} = setup(url1);
409
+
410
+ const resultPromise = members.assignRoles(memberId, [
411
+ {type: 'PRESENTER', hasRole: true},
412
+ {type: 'MODERATOR', hasRole: false},
413
+ {type: 'COHOST', hasRole: true},
414
+ ]);
415
+
416
+ await checkValid(
417
+ resultPromise,
418
+ spies,
419
+ memberId,
420
+ [
421
+ {type: 'PRESENTER', hasRole: true},
422
+ {type: 'MODERATOR', hasRole: false},
423
+ {type: 'COHOST', hasRole: true},
424
+ ],
425
+ url1
426
+ );
427
+ });
428
+ });
429
+
194
430
  describe('#raiseOrLowerHand', () => {
195
431
  const setup = (locusUrl) => {
196
432
  const members = createMembers({url: locusUrl});
@@ -360,6 +596,88 @@ describe('plugin-meetings', () => {
360
596
  });
361
597
  });
362
598
 
599
+ describe('#editDisplayName', () => {
600
+ const setup = (locusUrl) => {
601
+ const members = createMembers({url: locusUrl});
602
+
603
+ const spies = {
604
+ generateEditDisplayNameMemberOptions: sandbox.spy(
605
+ MembersUtil,
606
+ 'generateEditDisplayNameMemberOptions'
607
+ ),
608
+ editDisplayNameMember: sandbox.spy(members.membersRequest, 'editDisplayNameMember'),
609
+ };
610
+
611
+ return {members, spies};
612
+ };
613
+
614
+ const checkInvalid = async (resultPromise, expectedMessage, spies) => {
615
+ await assert.isRejected(resultPromise, ParameterError, expectedMessage);
616
+ assert.notCalled(spies.generateEditDisplayNameMemberOptions);
617
+ assert.notCalled(spies.editDisplayNameMember);
618
+ };
619
+
620
+ const checkValid = async (
621
+ resultPromise,
622
+ spies,
623
+ expectedMemberId,
624
+ expectedRequestingParticipantId,
625
+ expectedAlias,
626
+ expectedLocusUrl
627
+ ) => {
628
+ await assert.isFulfilled(resultPromise);
629
+ assert.calledOnceWithExactly(
630
+ spies.generateEditDisplayNameMemberOptions,
631
+ expectedMemberId,
632
+ expectedRequestingParticipantId,
633
+ expectedAlias,
634
+ expectedLocusUrl
635
+ );
636
+ assert.calledOnceWithExactly(spies.editDisplayNameMember, {
637
+ memberId: expectedMemberId,
638
+ requestingParticipantId: expectedRequestingParticipantId,
639
+ alias: expectedAlias,
640
+ locusUrl: expectedLocusUrl,
641
+ });
642
+ assert.strictEqual(resultPromise, spies.editDisplayNameMember.getCall(0).returnValue);
643
+ };
644
+
645
+ it('should not make a request if there is no memberId', async () => {
646
+ const {members, spies} = setup(url1);
647
+
648
+ const resultPromise = members.editDisplayName();
649
+
650
+ await checkInvalid(
651
+ resultPromise,
652
+ 'The member id must be defined to edit display name of the member.',
653
+ spies
654
+ );
655
+ });
656
+
657
+ it('should not make a request if there is no locus url', async () => {
658
+ const {members, spies} = setup();
659
+
660
+ const resultPromise = members.editDisplayName(uuid.v4());
661
+
662
+ await checkInvalid(
663
+ resultPromise,
664
+ 'The associated locus url for this meetings members object must be defined.',
665
+ spies
666
+ );
667
+ });
668
+
669
+ it('should make the correct request when called with respective parameters', async () => {
670
+ const requestingParticipantId = uuid.v4();
671
+ const memberId = uuid.v4();
672
+ const alias = 'aliasName';
673
+ const {members, spies} = setup(url1);
674
+
675
+ const resultPromise = members.editDisplayName(memberId, requestingParticipantId, alias);
676
+
677
+ await checkValid(resultPromise, spies, memberId, requestingParticipantId, alias, url1);
678
+ });
679
+ });
680
+
363
681
  describe('findMemberByCsi()', () => {
364
682
  let members;
365
683
 
@@ -8,6 +8,7 @@ import Meetings from '@webex/plugin-meetings';
8
8
  import MembersRequest from '@webex/plugin-meetings/src/members/request';
9
9
  import membersUtil from '@webex/plugin-meetings/src/members/util';
10
10
  import ParameterError from '@webex/plugin-meetings/src/common/errors/parameter';
11
+ import { merge } from 'lodash';
11
12
 
12
13
  const {assert} = chai;
13
14
 
@@ -18,6 +19,10 @@ describe('plugin-meetings', () => {
18
19
  let membersRequest;
19
20
  let url1;
20
21
  let sandbox;
22
+ const sequence = {some: 'sequenceData'};
23
+ const requestResponse = {some: 'data'};
24
+ let locusDeltaRequestSpy;
25
+ const correlationId = '12345';
21
26
 
22
27
  beforeEach(() => {
23
28
  const webex = new MockWebex({
@@ -28,21 +33,43 @@ describe('plugin-meetings', () => {
28
33
 
29
34
  sandbox = sinon.createSandbox();
30
35
 
36
+ sinon.stub(uuid, 'v4').returns(correlationId);
37
+
31
38
  url1 = `https://example.com/${uuid.v4()}`;
32
39
 
40
+ const request = sinon.mock().returns(Promise.resolve(requestResponse));
41
+
33
42
  membersRequest = new MembersRequest(
34
- {},
43
+ {
44
+ meeting: {
45
+ request,
46
+ locusInfo: {
47
+ sequence,
48
+ },
49
+ },
50
+ },
35
51
  {
36
52
  parent: webex,
37
53
  }
38
54
  );
39
- membersRequest.request = sinon.mock().returns(Promise.resolve({}));
55
+ locusDeltaRequestSpy = sinon.spy(membersRequest, 'locusDeltaRequest');
56
+
57
+ membersRequest.request = request;
40
58
  });
41
59
 
42
60
  afterEach(() => {
43
61
  sandbox.restore();
62
+ uuid.v4.restore();
44
63
  });
45
64
 
65
+ const checkRequest = (expectedParams) => {
66
+ assert.calledOnceWithExactly(locusDeltaRequestSpy, expectedParams);
67
+ assert.calledOnceWithExactly(
68
+ membersRequest.request,
69
+ merge(expectedParams, {body: {sequence}})
70
+ );
71
+ };
72
+
46
73
  describe('members request library', () => {
47
74
  describe('#sendDialPadKey', () => {
48
75
  it('sends a POST to the sendDtmf locus endpoint', async () => {
@@ -57,12 +84,22 @@ describe('plugin-meetings', () => {
57
84
  memberId,
58
85
  locusUrl,
59
86
  });
60
- const requestParams = membersRequest.request.getCall(0).args[0];
61
87
 
62
- assert.equal(requestParams.method, 'POST');
63
- assert.equal(requestParams.uri, `${locusUrl}/participant/${memberId}/sendDtmf`);
64
- assert.equal(requestParams.body.dtmf.tones, tones);
65
- assert.equal(requestParams.body.device.url, url);
88
+ checkRequest({
89
+ method: 'POST',
90
+ uri: `${locusUrl}/participant/${memberId}/sendDtmf`,
91
+ body: {
92
+ memberId,
93
+ dtmf: {
94
+ direction: 'transmit',
95
+ correlationId,
96
+ tones,
97
+ },
98
+ device: {
99
+ url,
100
+ }
101
+ }
102
+ });
66
103
  });
67
104
  });
68
105
 
@@ -76,11 +113,91 @@ describe('plugin-meetings', () => {
76
113
  };
77
114
 
78
115
  await membersRequest.addMembers(options);
79
- const requestParams = membersRequest.request.getCall(0).args[0];
80
116
 
81
- assert.equal(requestParams.method, 'PUT');
82
- assert.equal(requestParams.uri, url1);
83
- assert.equal(requestParams.body.invitees[0].address, '+18578675309');
117
+ checkRequest({
118
+ method: 'PUT',
119
+ uri: url1,
120
+ body: {
121
+ alertIfActive: undefined,
122
+ invitees: [{address: '+18578675309'}]
123
+ }
124
+ })
125
+ });
126
+ });
127
+
128
+ describe('#admitMember', () => {
129
+ it('sends a request to admit members', async () => {
130
+ const options = {
131
+ locusUrl: url1,
132
+ memberIds: ['1', '2'],
133
+ };
134
+
135
+ await membersRequest.admitMember(options)
136
+
137
+ checkRequest({
138
+ method: 'PUT',
139
+ uri: 'https://example.com/12345/controls',
140
+ body: {
141
+ admit: {
142
+ participantIds: options.memberIds
143
+ }
144
+ }
145
+ });
146
+ });
147
+ });
148
+
149
+ describe('#removeMember', () => {
150
+ it('sends a request to remove a member', async () => {
151
+ const options = {
152
+ locusUrl: url1,
153
+ memberId: 'member1',
154
+ };
155
+
156
+ await membersRequest.removeMember(options);
157
+
158
+ checkRequest({
159
+ method: 'PUT',
160
+ uri: 'https://example.com/12345/participant/member1/leave',
161
+ body: {
162
+ reason: undefined
163
+ },
164
+ });
165
+ });
166
+ });
167
+
168
+ describe('#muteMember', () => {
169
+ it('sends a request to mute a member', async () => {
170
+ const options = {
171
+ locusUrl: url1,
172
+ memberId: 'member1',
173
+ muted: true,
174
+ };
175
+
176
+ await membersRequest.muteMember(options);
177
+
178
+ checkRequest({
179
+ method: 'PATCH',
180
+ uri: 'https://example.com/12345/participant/member1/controls',
181
+ body: {audio: {muted: true}},
182
+ });
183
+ });
184
+ });
185
+
186
+ describe('#transferHostToMember', () => {
187
+ it('sends a request to transfer host to a member', async () => {
188
+ const options = {
189
+ locusUrl: url1,
190
+ memberId: 'member1',
191
+ moderator: true,
192
+ };
193
+
194
+ await membersRequest.transferHostToMember(options);
195
+
196
+ checkRequest({
197
+ method: 'PATCH',
198
+ uri: 'https://example.com/12345/participant/member1/controls',
199
+ body: {role: {moderator: true}},
200
+ });
84
201
  });
85
202
  });
86
203
 
@@ -94,12 +211,45 @@ describe('plugin-meetings', () => {
94
211
  };
95
212
 
96
213
  await membersRequest.cancelPhoneInvite(options);
97
- const requestParams = membersRequest.request.getCall(0).args[0];
98
214
 
99
- assert.equal(requestParams.method, 'PUT');
100
- assert.equal(requestParams.uri, url1);
101
- assert.equal(requestParams.body.invitees[0].address, '+18578675309');
102
- assert.equal(requestParams.body.actionType, 'REMOVE');
215
+ checkRequest({
216
+ method: 'PUT',
217
+ uri: url1,
218
+ body: {
219
+ invitees: [{address: '+18578675309'}],
220
+ actionType: 'REMOVE',
221
+ },
222
+ });
223
+ });
224
+ });
225
+
226
+ describe('#assignRolesMember', () => {
227
+ it('sends a PATCH to the locus endpoint', async () => {
228
+ const locusUrl = url1;
229
+ const memberId = 'test1';
230
+ const roles = [
231
+ {type: 'PRESENTER', hasRole: true},
232
+ {type: 'MODERATOR', hasRole: false},
233
+ {type: 'COHOST', hasRole: true},
234
+ ];
235
+
236
+ const options = {
237
+ memberId,
238
+ locusUrl,
239
+ roles,
240
+ };
241
+
242
+ await membersRequest.assignRolesMember(options);
243
+
244
+ checkRequest({
245
+ method: 'PATCH',
246
+ uri: `${locusUrl}/participant/${memberId}/controls`,
247
+ body: {
248
+ role: {
249
+ roles
250
+ }
251
+ }
252
+ });
103
253
  });
104
254
  });
105
255
 
@@ -115,11 +265,16 @@ describe('plugin-meetings', () => {
115
265
  };
116
266
 
117
267
  await membersRequest.raiseOrLowerHandMember(options);
118
- const requestParams = membersRequest.request.getCall(0).args[0];
119
268
 
120
- assert.equal(requestParams.method, 'PATCH');
121
- assert.equal(requestParams.uri, `${locusUrl}/participant/${memberId}/controls`);
122
- assert.equal(requestParams.body.hand.raised, true);
269
+ checkRequest({
270
+ method: 'PATCH',
271
+ uri: `${locusUrl}/participant/${memberId}/controls`,
272
+ body: {
273
+ hand: {
274
+ raised: true
275
+ }
276
+ }
277
+ });
123
278
  });
124
279
  });
125
280
 
@@ -158,10 +313,9 @@ describe('plugin-meetings', () => {
158
313
  locusUrl,
159
314
  };
160
315
 
161
- assert.strictEqual(
162
- membersRequest.lowerAllHandsMember(options),
163
- membersRequest.request.getCall(0).returnValue
164
- );
316
+ const result = await membersRequest.lowerAllHandsMember(options);
317
+
318
+ assert.strictEqual(result, requestResponse);
165
319
  });
166
320
 
167
321
  it('sends a PATCH to the locus endpoint', async () => {
@@ -182,9 +336,7 @@ describe('plugin-meetings', () => {
182
336
  locusUrl: url1,
183
337
  });
184
338
 
185
- const requestParams = membersRequest.request.getCall(0).args[0];
186
-
187
- assert.deepEqual(requestParams, {
339
+ checkRequest({
188
340
  method: 'PATCH',
189
341
  uri: `${locusUrl}/controls`,
190
342
  body: {
@@ -196,5 +348,32 @@ describe('plugin-meetings', () => {
196
348
  });
197
349
  });
198
350
  });
351
+
352
+ describe('#editDisplayName', () => {
353
+ it('sends a POST request to the locus endpoint', async () => {
354
+ const locusUrl = url1;
355
+ const memberId = 'test1';
356
+ const requestingParticipantId = 'test2';
357
+ const aliasValue = 'alias';
358
+
359
+ const options = {
360
+ memberId,
361
+ requestingParticipantId,
362
+ alias: aliasValue,
363
+ locusUrl,
364
+ };
365
+
366
+ await membersRequest.editDisplayNameMember(options);
367
+
368
+ checkRequest({
369
+ method: 'POST',
370
+ uri: `${locusUrl}/participant/${memberId}/alias`,
371
+ body: {
372
+ aliasValue,
373
+ requestingParticipantId,
374
+ }
375
+ });
376
+ });
377
+ });
199
378
  });
200
379
  });