@webex/plugin-meetings 3.0.0-beta.34 → 3.0.0-beta.340

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 (392) 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 +94 -15
  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 +709 -35
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/utils.js +45 -1
  17. package/dist/breakouts/utils.js.map +1 -1
  18. package/dist/common/errors/no-meeting-info.js +51 -0
  19. package/dist/common/errors/no-meeting-info.js.map +1 -0
  20. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  21. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +48 -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/logs/request.js +5 -1
  27. package/dist/common/logs/request.js.map +1 -1
  28. package/dist/common/queue.js +24 -9
  29. package/dist/common/queue.js.map +1 -1
  30. package/dist/config.js +5 -10
  31. package/dist/config.js.map +1 -1
  32. package/dist/constants.js +233 -29
  33. package/dist/constants.js.map +1 -1
  34. package/dist/controls-options-manager/enums.js +14 -2
  35. package/dist/controls-options-manager/enums.js.map +1 -1
  36. package/dist/controls-options-manager/index.js +109 -15
  37. package/dist/controls-options-manager/index.js.map +1 -1
  38. package/dist/controls-options-manager/types.js +7 -0
  39. package/dist/controls-options-manager/types.js.map +1 -0
  40. package/dist/controls-options-manager/util.js +309 -18
  41. package/dist/controls-options-manager/util.js.map +1 -1
  42. package/dist/index.js +112 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/interpretation/collection.js +23 -0
  45. package/dist/interpretation/collection.js.map +1 -0
  46. package/dist/interpretation/index.js +366 -0
  47. package/dist/interpretation/index.js.map +1 -0
  48. package/dist/interpretation/siLanguage.js +25 -0
  49. package/dist/interpretation/siLanguage.js.map +1 -0
  50. package/dist/locus-info/controlsUtils.js +91 -2
  51. package/dist/locus-info/controlsUtils.js.map +1 -1
  52. package/dist/locus-info/index.js +383 -62
  53. package/dist/locus-info/index.js.map +1 -1
  54. package/dist/locus-info/infoUtils.js +7 -1
  55. package/dist/locus-info/infoUtils.js.map +1 -1
  56. package/dist/locus-info/mediaSharesUtils.js +57 -1
  57. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  58. package/dist/locus-info/parser.js +249 -72
  59. package/dist/locus-info/parser.js.map +1 -1
  60. package/dist/locus-info/selfUtils.js +89 -14
  61. package/dist/locus-info/selfUtils.js.map +1 -1
  62. package/dist/media/index.js +62 -116
  63. package/dist/media/index.js.map +1 -1
  64. package/dist/media/properties.js +73 -124
  65. package/dist/media/properties.js.map +1 -1
  66. package/dist/mediaQualityMetrics/config.js +1 -204
  67. package/dist/mediaQualityMetrics/config.js.map +1 -1
  68. package/dist/meeting/in-meeting-actions.js +86 -2
  69. package/dist/meeting/in-meeting-actions.js.map +1 -1
  70. package/dist/meeting/index.js +3927 -2960
  71. package/dist/meeting/index.js.map +1 -1
  72. package/dist/meeting/locusMediaRequest.js +292 -0
  73. package/dist/meeting/locusMediaRequest.js.map +1 -0
  74. package/dist/meeting/muteState.js +224 -131
  75. package/dist/meeting/muteState.js.map +1 -1
  76. package/dist/meeting/request.js +260 -196
  77. package/dist/meeting/request.js.map +1 -1
  78. package/dist/meeting/util.js +601 -417
  79. package/dist/meeting/util.js.map +1 -1
  80. package/dist/meeting-info/index.js +73 -7
  81. package/dist/meeting-info/index.js.map +1 -1
  82. package/dist/meeting-info/meeting-info-v2.js +192 -51
  83. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  84. package/dist/meeting-info/util.js +1 -1
  85. package/dist/meeting-info/util.js.map +1 -1
  86. package/dist/meeting-info/utilv2.js +36 -36
  87. package/dist/meeting-info/utilv2.js.map +1 -1
  88. package/dist/meetings/collection.js +39 -0
  89. package/dist/meetings/collection.js.map +1 -1
  90. package/dist/meetings/index.js +424 -116
  91. package/dist/meetings/index.js.map +1 -1
  92. package/dist/meetings/meetings.types.js +7 -0
  93. package/dist/meetings/meetings.types.js.map +1 -0
  94. package/dist/meetings/request.js +2 -0
  95. package/dist/meetings/request.js.map +1 -1
  96. package/dist/meetings/util.js +72 -6
  97. package/dist/meetings/util.js.map +1 -1
  98. package/dist/member/index.js +58 -0
  99. package/dist/member/index.js.map +1 -1
  100. package/dist/member/types.js +25 -0
  101. package/dist/member/types.js.map +1 -0
  102. package/dist/member/util.js +132 -25
  103. package/dist/member/util.js.map +1 -1
  104. package/dist/members/collection.js +10 -0
  105. package/dist/members/collection.js.map +1 -1
  106. package/dist/members/index.js +102 -6
  107. package/dist/members/index.js.map +1 -1
  108. package/dist/members/request.js +106 -38
  109. package/dist/members/request.js.map +1 -1
  110. package/dist/members/types.js +15 -0
  111. package/dist/members/types.js.map +1 -0
  112. package/dist/members/util.js +326 -232
  113. package/dist/members/util.js.map +1 -1
  114. package/dist/metrics/constants.js +16 -5
  115. package/dist/metrics/constants.js.map +1 -1
  116. package/dist/metrics/index.js +1 -446
  117. package/dist/metrics/index.js.map +1 -1
  118. package/dist/multistream/mediaRequestManager.js +228 -58
  119. package/dist/multistream/mediaRequestManager.js.map +1 -1
  120. package/dist/multistream/receiveSlot.js +29 -16
  121. package/dist/multistream/receiveSlot.js.map +1 -1
  122. package/dist/multistream/receiveSlotManager.js +39 -36
  123. package/dist/multistream/receiveSlotManager.js.map +1 -1
  124. package/dist/multistream/remoteMedia.js +44 -18
  125. package/dist/multistream/remoteMedia.js.map +1 -1
  126. package/dist/multistream/remoteMediaGroup.js +60 -3
  127. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  128. package/dist/multistream/remoteMediaManager.js +209 -59
  129. package/dist/multistream/remoteMediaManager.js.map +1 -1
  130. package/dist/multistream/sendSlotManager.js +233 -0
  131. package/dist/multistream/sendSlotManager.js.map +1 -0
  132. package/dist/reachability/clusterReachability.js +356 -0
  133. package/dist/reachability/clusterReachability.js.map +1 -0
  134. package/dist/reachability/index.js +273 -391
  135. package/dist/reachability/index.js.map +1 -1
  136. package/dist/reachability/request.js +17 -8
  137. package/dist/reachability/request.js.map +1 -1
  138. package/dist/reachability/util.js +29 -0
  139. package/dist/reachability/util.js.map +1 -0
  140. package/dist/reconnection-manager/index.js +214 -170
  141. package/dist/reconnection-manager/index.js.map +1 -1
  142. package/dist/recording-controller/index.js +21 -2
  143. package/dist/recording-controller/index.js.map +1 -1
  144. package/dist/recording-controller/util.js +9 -8
  145. package/dist/recording-controller/util.js.map +1 -1
  146. package/dist/roap/index.js +62 -35
  147. package/dist/roap/index.js.map +1 -1
  148. package/dist/roap/request.js +112 -97
  149. package/dist/roap/request.js.map +1 -1
  150. package/dist/roap/turnDiscovery.js +95 -38
  151. package/dist/roap/turnDiscovery.js.map +1 -1
  152. package/dist/rtcMetrics/constants.js +12 -0
  153. package/dist/rtcMetrics/constants.js.map +1 -0
  154. package/dist/rtcMetrics/index.js +142 -0
  155. package/dist/rtcMetrics/index.js.map +1 -0
  156. package/dist/statsAnalyzer/index.js +181 -214
  157. package/dist/statsAnalyzer/index.js.map +1 -1
  158. package/dist/statsAnalyzer/mqaUtil.js +22 -18
  159. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  160. package/dist/types/annotation/annotation.types.d.ts +42 -0
  161. package/dist/types/annotation/constants.d.ts +31 -0
  162. package/dist/types/annotation/index.d.ts +117 -0
  163. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  164. package/dist/types/breakouts/events.d.ts +8 -0
  165. package/dist/types/breakouts/utils.d.ts +14 -0
  166. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  167. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  168. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  169. package/dist/types/common/logs/request.d.ts +2 -0
  170. package/dist/types/common/queue.d.ts +9 -7
  171. package/dist/types/config.d.ts +2 -7
  172. package/dist/types/constants.d.ts +201 -30
  173. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  174. package/dist/types/controls-options-manager/index.d.ts +17 -1
  175. package/dist/types/controls-options-manager/types.d.ts +43 -0
  176. package/dist/types/controls-options-manager/util.d.ts +1 -7
  177. package/dist/types/index.d.ts +6 -4
  178. package/dist/types/interpretation/collection.d.ts +5 -0
  179. package/dist/types/interpretation/index.d.ts +5 -0
  180. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  181. package/dist/types/locus-info/index.d.ts +57 -4
  182. package/dist/types/locus-info/parser.d.ts +66 -6
  183. package/dist/types/media/index.d.ts +2 -0
  184. package/dist/types/media/properties.d.ts +34 -48
  185. package/dist/types/mediaQualityMetrics/config.d.ts +0 -128
  186. package/dist/types/meeting/in-meeting-actions.d.ts +86 -2
  187. package/dist/types/meeting/index.d.ts +506 -512
  188. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  189. package/dist/types/meeting/muteState.d.ts +93 -25
  190. package/dist/types/meeting/request.d.ts +72 -43
  191. package/dist/types/meeting/util.d.ts +101 -1
  192. package/dist/types/meeting-info/index.d.ts +13 -1
  193. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  194. package/dist/types/meetings/collection.d.ts +17 -0
  195. package/dist/types/meetings/index.d.ts +91 -21
  196. package/dist/types/meetings/meetings.types.d.ts +4 -0
  197. package/dist/types/member/index.d.ts +14 -0
  198. package/dist/types/member/types.d.ts +32 -0
  199. package/dist/types/members/collection.d.ts +5 -0
  200. package/dist/types/members/index.d.ts +35 -2
  201. package/dist/types/members/request.d.ts +73 -9
  202. package/dist/types/members/types.d.ts +25 -0
  203. package/dist/types/members/util.d.ts +214 -1
  204. package/dist/types/metrics/constants.d.ts +15 -4
  205. package/dist/types/metrics/index.d.ts +4 -111
  206. package/dist/types/multistream/mediaRequestManager.d.ts +72 -5
  207. package/dist/types/multistream/receiveSlot.d.ts +13 -11
  208. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  209. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  210. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  211. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  212. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  213. package/dist/types/reachability/clusterReachability.d.ts +109 -0
  214. package/dist/types/reachability/index.d.ts +60 -95
  215. package/dist/types/reachability/request.d.ts +7 -3
  216. package/dist/types/reachability/util.d.ts +8 -0
  217. package/dist/types/reconnection-manager/index.d.ts +19 -0
  218. package/dist/types/recording-controller/index.d.ts +15 -1
  219. package/dist/types/recording-controller/util.d.ts +5 -4
  220. package/dist/types/roap/index.d.ts +2 -1
  221. package/dist/types/roap/request.d.ts +15 -11
  222. package/dist/types/roap/turnDiscovery.d.ts +21 -3
  223. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  224. package/dist/types/rtcMetrics/index.d.ts +54 -0
  225. package/dist/types/statsAnalyzer/index.d.ts +29 -11
  226. package/dist/types/webinar/collection.d.ts +16 -0
  227. package/dist/types/webinar/index.d.ts +5 -0
  228. package/dist/webinar/collection.js +44 -0
  229. package/dist/webinar/collection.js.map +1 -0
  230. package/dist/webinar/index.js +69 -0
  231. package/dist/webinar/index.js.map +1 -0
  232. package/package.json +22 -19
  233. package/src/annotation/annotation.types.ts +50 -0
  234. package/src/annotation/constants.ts +36 -0
  235. package/src/annotation/index.ts +328 -0
  236. package/src/breakouts/README.md +42 -12
  237. package/src/breakouts/breakout.ts +67 -9
  238. package/src/breakouts/edit-lock-error.ts +25 -0
  239. package/src/breakouts/events.ts +56 -0
  240. package/src/breakouts/index.ts +592 -20
  241. package/src/breakouts/utils.ts +42 -0
  242. package/src/common/errors/no-meeting-info.ts +24 -0
  243. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  244. package/src/common/errors/webex-errors.ts +44 -2
  245. package/src/common/logs/logger-proxy.ts +1 -1
  246. package/src/common/logs/request.ts +5 -1
  247. package/src/common/queue.ts +22 -8
  248. package/src/config.ts +4 -9
  249. package/src/constants.ts +224 -20
  250. package/src/controls-options-manager/enums.ts +12 -0
  251. package/src/controls-options-manager/index.ts +116 -21
  252. package/src/controls-options-manager/types.ts +59 -0
  253. package/src/controls-options-manager/util.ts +294 -14
  254. package/src/index.ts +40 -0
  255. package/src/interpretation/README.md +60 -0
  256. package/src/interpretation/collection.ts +19 -0
  257. package/src/interpretation/index.ts +332 -0
  258. package/src/interpretation/siLanguage.ts +18 -0
  259. package/src/locus-info/controlsUtils.ts +108 -0
  260. package/src/locus-info/index.ts +413 -59
  261. package/src/locus-info/infoUtils.ts +10 -2
  262. package/src/locus-info/mediaSharesUtils.ts +64 -0
  263. package/src/locus-info/parser.ts +258 -47
  264. package/src/locus-info/selfUtils.ts +81 -5
  265. package/src/media/index.ts +102 -122
  266. package/src/media/properties.ts +87 -110
  267. package/src/mediaQualityMetrics/config.ts +0 -135
  268. package/src/meeting/in-meeting-actions.ts +171 -3
  269. package/src/meeting/index.ts +3276 -2555
  270. package/src/meeting/locusMediaRequest.ts +313 -0
  271. package/src/meeting/muteState.ts +223 -136
  272. package/src/meeting/request.ts +177 -121
  273. package/src/meeting/util.ts +588 -394
  274. package/src/meeting-info/index.ts +81 -8
  275. package/src/meeting-info/meeting-info-v2.ts +170 -14
  276. package/src/meeting-info/util.ts +1 -1
  277. package/src/meeting-info/utilv2.ts +23 -23
  278. package/src/meetings/collection.ts +33 -0
  279. package/src/meetings/index.ts +454 -125
  280. package/src/meetings/meetings.types.ts +12 -0
  281. package/src/meetings/request.ts +2 -0
  282. package/src/meetings/util.ts +80 -11
  283. package/src/member/index.ts +58 -0
  284. package/src/member/types.ts +38 -0
  285. package/src/member/util.ts +141 -25
  286. package/src/members/collection.ts +8 -0
  287. package/src/members/index.ts +134 -8
  288. package/src/members/request.ts +97 -17
  289. package/src/members/types.ts +29 -0
  290. package/src/members/util.ts +333 -240
  291. package/src/metrics/constants.ts +15 -4
  292. package/src/metrics/index.ts +1 -469
  293. package/src/multistream/mediaRequestManager.ts +277 -82
  294. package/src/multistream/receiveSlot.ts +31 -17
  295. package/src/multistream/receiveSlotManager.ts +34 -24
  296. package/src/multistream/remoteMedia.ts +27 -2
  297. package/src/multistream/remoteMediaGroup.ts +59 -0
  298. package/src/multistream/remoteMediaManager.ts +148 -30
  299. package/src/multistream/sendSlotManager.ts +170 -0
  300. package/src/reachability/clusterReachability.ts +320 -0
  301. package/src/reachability/index.ts +236 -342
  302. package/src/reachability/request.ts +17 -8
  303. package/src/reachability/util.ts +24 -0
  304. package/src/reconnection-manager/index.ts +128 -106
  305. package/src/recording-controller/index.ts +20 -3
  306. package/src/recording-controller/util.ts +26 -9
  307. package/src/roap/index.ts +63 -32
  308. package/src/roap/request.ts +100 -104
  309. package/src/roap/turnDiscovery.ts +48 -26
  310. package/src/rtcMetrics/constants.ts +3 -0
  311. package/src/rtcMetrics/index.ts +124 -0
  312. package/src/statsAnalyzer/index.ts +218 -289
  313. package/src/statsAnalyzer/mqaUtil.ts +28 -30
  314. package/src/webinar/collection.ts +31 -0
  315. package/src/webinar/index.ts +62 -0
  316. package/test/integration/spec/converged-space-meetings.js +60 -3
  317. package/test/integration/spec/journey.js +320 -261
  318. package/test/integration/spec/space-meeting.js +76 -3
  319. package/test/unit/spec/annotation/index.ts +418 -0
  320. package/test/unit/spec/breakouts/breakout.ts +118 -28
  321. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  322. package/test/unit/spec/breakouts/events.ts +89 -0
  323. package/test/unit/spec/breakouts/index.ts +1395 -69
  324. package/test/unit/spec/breakouts/utils.js +52 -1
  325. package/test/unit/spec/common/queue.js +31 -2
  326. package/test/unit/spec/controls-options-manager/index.js +163 -0
  327. package/test/unit/spec/controls-options-manager/util.js +576 -60
  328. package/test/unit/spec/fixture/locus.js +1 -0
  329. package/test/unit/spec/interpretation/collection.ts +15 -0
  330. package/test/unit/spec/interpretation/index.ts +589 -0
  331. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  332. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  333. package/test/unit/spec/locus-info/index.js +1304 -33
  334. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  335. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  336. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  337. package/test/unit/spec/locus-info/parser.js +116 -35
  338. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  339. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  340. package/test/unit/spec/media/index.ts +120 -37
  341. package/test/unit/spec/media/properties.ts +2 -2
  342. package/test/unit/spec/meeting/in-meeting-actions.ts +85 -3
  343. package/test/unit/spec/meeting/index.js +5849 -2014
  344. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  345. package/test/unit/spec/meeting/muteState.js +402 -213
  346. package/test/unit/spec/meeting/request.js +483 -49
  347. package/test/unit/spec/meeting/utils.js +679 -64
  348. package/test/unit/spec/meeting-info/index.js +300 -0
  349. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  350. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  351. package/test/unit/spec/meetings/collection.js +26 -0
  352. package/test/unit/spec/meetings/index.js +1231 -212
  353. package/test/unit/spec/meetings/utils.js +202 -2
  354. package/test/unit/spec/member/index.js +61 -6
  355. package/test/unit/spec/member/util.js +510 -34
  356. package/test/unit/spec/members/index.js +432 -1
  357. package/test/unit/spec/members/request.js +206 -27
  358. package/test/unit/spec/members/utils.js +210 -0
  359. package/test/unit/spec/metrics/index.js +1 -50
  360. package/test/unit/spec/multistream/mediaRequestManager.ts +776 -162
  361. package/test/unit/spec/multistream/receiveSlot.ts +28 -20
  362. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  363. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  364. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  365. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  366. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  367. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  368. package/test/unit/spec/reachability/index.ts +486 -13
  369. package/test/unit/spec/reachability/request.js +68 -0
  370. package/test/unit/spec/reachability/util.ts +40 -0
  371. package/test/unit/spec/reconnection-manager/index.js +117 -11
  372. package/test/unit/spec/recording-controller/index.js +294 -218
  373. package/test/unit/spec/recording-controller/util.js +223 -96
  374. package/test/unit/spec/roap/index.ts +174 -63
  375. package/test/unit/spec/roap/request.ts +226 -85
  376. package/test/unit/spec/roap/turnDiscovery.ts +76 -34
  377. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  378. package/test/unit/spec/stats-analyzer/index.js +231 -7
  379. package/test/unit/spec/webinar/collection.ts +13 -0
  380. package/test/unit/spec/webinar/index.ts +60 -0
  381. package/test/utils/integrationTestUtils.js +46 -0
  382. package/test/utils/testUtils.js +0 -52
  383. package/dist/meeting/effectsState.js +0 -262
  384. package/dist/meeting/effectsState.js.map +0 -1
  385. package/dist/metrics/config.js +0 -289
  386. package/dist/metrics/config.js.map +0 -1
  387. package/dist/types/meeting/effectsState.d.ts +0 -42
  388. package/dist/types/metrics/config.d.ts +0 -169
  389. package/src/index.js +0 -16
  390. package/src/meeting/effectsState.ts +0 -211
  391. package/src/metrics/config.ts +0 -485
  392. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -3,21 +3,27 @@ import {assert} from '@webex/test-helper-chai';
3
3
  import MockWebex from '@webex/test-helper-mock-webex';
4
4
  import Meetings from '@webex/plugin-meetings';
5
5
  import MeetingRequest from '@webex/plugin-meetings/src/meeting/request';
6
+ import uuid from 'uuid';
7
+ import { merge } from 'lodash';
8
+ import {IP_VERSION} from '@webex/plugin-meetings/src/constants';
9
+ import {CallDiagnosticUtils} from '@webex/internal-plugin-metrics';
10
+
6
11
 
7
12
  describe('plugin-meetings', () => {
8
13
  let meetingsRequest;
14
+ let locusDeltaRequestSpy;
15
+ let webex;
16
+ const geoHintInfoDefaults = {countryCode: 'US', regionCode: 'WEST-COAST', clientAddress: '127.0.0.1'};
17
+ let anonymizeIpSpy;
9
18
 
10
19
  beforeEach(() => {
11
- const webex = new MockWebex({
20
+ webex = new MockWebex({
12
21
  children: {
13
22
  meetings: Meetings,
14
23
  },
15
24
  });
16
25
 
17
- webex.meetings.clientRegion = {
18
- countryCode: 'US',
19
- regionCode: 'WEST-COAST',
20
- };
26
+ webex.meetings.geoHintInfo = {...geoHintInfoDefaults};
21
27
 
22
28
  webex.internal = {
23
29
  services: {
@@ -26,17 +32,52 @@ describe('plugin-meetings', () => {
26
32
  },
27
33
  };
28
34
 
35
+ webex.boundedStorage.get = sinon
36
+ .mock()
37
+ .returns(Promise.resolve(JSON.stringify({anycastEntryPoint: 'aws-eu-west-1'})));
38
+
39
+ const request = sinon.mock().returns(Promise.resolve({}));
40
+
29
41
  meetingsRequest = new MeetingRequest(
30
- {},
42
+ {
43
+ meeting: {
44
+ request,
45
+ locusInfo: {
46
+ sequence: {},
47
+ },
48
+ },
49
+ },
31
50
  {
32
51
  parent: webex,
33
52
  }
34
53
  );
35
54
 
36
- meetingsRequest.request = sinon.mock().returns(Promise.resolve({}));
55
+ meetingsRequest.request = request;
56
+ locusDeltaRequestSpy = sinon.spy(meetingsRequest, 'locusDeltaRequest');
57
+ anonymizeIpSpy = sinon.spy(CallDiagnosticUtils, 'anonymizeIPAddress');
37
58
  });
38
59
 
60
+ afterEach(() => {
61
+ anonymizeIpSpy.restore();
62
+ });
63
+
64
+ const checkRequest = (expectedParams) => {
65
+ assert.calledOnceWithExactly(locusDeltaRequestSpy, expectedParams);
66
+ assert.calledOnceWithExactly(
67
+ meetingsRequest.request,
68
+ merge(expectedParams, {body: {sequence: {}}})
69
+ );
70
+ };
71
+
39
72
  describe('meeting request library', () => {
73
+ beforeEach(() => {
74
+ sinon.stub(uuid, 'v4').returns('12345');
75
+ });
76
+
77
+ afterEach(() => {
78
+ uuid.v4.restore();
79
+ });
80
+
40
81
  describe('#sendDTMF', () => {
41
82
  it('sends a POST to the sendDtmf locus endpoint', async () => {
42
83
  const locusUrl = 'locusURL';
@@ -48,12 +89,18 @@ describe('plugin-meetings', () => {
48
89
  deviceUrl,
49
90
  tones,
50
91
  });
51
- const requestParams = meetingsRequest.request.getCall(0).args[0];
52
92
 
53
- assert.equal(requestParams.method, 'POST');
54
- assert.equal(requestParams.uri, `${locusUrl}/sendDtmf`);
55
- assert.equal(requestParams.body.dtmf.tones, tones);
56
- assert.equal(requestParams.body.deviceUrl, deviceUrl);
93
+ checkRequest({
94
+ method: 'POST',
95
+ uri: `${locusUrl}/sendDtmf`,
96
+ body: {
97
+ deviceUrl: 'deviceUrl',
98
+ dtmf: {
99
+ correlationId: '12345',
100
+ tones: '1234',
101
+ },
102
+ },
103
+ });
57
104
  });
58
105
  });
59
106
 
@@ -70,14 +117,19 @@ describe('plugin-meetings', () => {
70
117
  main: {width: 640, height: 480},
71
118
  content: {width: 1280, height: 720},
72
119
  });
73
- const requestParams = meetingsRequest.request.getCall(0).args[0];
74
120
 
75
- assert.equal(requestParams.method, 'PUT');
76
- assert.equal(requestParams.uri, `${locusUrl}/controls`);
77
- assert.equal(requestParams.body.layout.type, layoutType);
78
- assert.equal(requestParams.body.layout.deviceUrl, deviceUrl);
79
- assert.deepEqual(requestParams.body.layout.layoutParams, {
80
- renderInfo: {main: {width: 640, height: 480}, content: {width: 1280, height: 720}},
121
+ checkRequest({
122
+ method: 'PUT',
123
+ uri: `${locusUrl}/controls`,
124
+ body: {
125
+ layout: {
126
+ deviceUrl,
127
+ type: layoutType,
128
+ layoutParams: {
129
+ renderInfo: {main: {width: 640, height: 480}, content: {width: 1280, height: 720}},
130
+ },
131
+ },
132
+ },
81
133
  });
82
134
  });
83
135
 
@@ -149,8 +201,41 @@ describe('plugin-meetings', () => {
149
201
  assert.equal(requestParams.body.device.countryCode, 'US');
150
202
  assert.equal(requestParams.body.permissionToken, 'permission-token');
151
203
  assert.equal(requestParams.body.device.regionCode, 'WEST-COAST');
204
+ assert.include(requestParams.body.device.localIp, '127.0.0');
205
+
206
+ assert.calledOnceWithExactly(anonymizeIpSpy, '127.0.0.1');
152
207
  });
153
208
 
209
+ describe('clientAddress geoHintInfo undefined', () => {
210
+ beforeEach(() => {
211
+ webex.meetings.geoHintInfo = {};
212
+ });
213
+
214
+ // reset
215
+ afterEach(() => {
216
+ webex.meetings.geoHintInfo = {...geoHintInfoDefaults};
217
+ });
218
+
219
+ it('doesnt send the clientAddress if not available as localIp', async () => {
220
+ const locusUrl = 'locusURL';
221
+ const deviceUrl = 'deviceUrl';
222
+ const correlationId = 'random-uuid';
223
+ const roapMessage = 'roap-message';
224
+ const permissionToken = 'permission-token';
225
+
226
+ await meetingsRequest.joinMeeting({
227
+ locusUrl,
228
+ deviceUrl,
229
+ correlationId,
230
+ roapMessage,
231
+ permissionToken,
232
+ });
233
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
234
+
235
+ assert.equal(requestParams.body.device.localIp, undefined);
236
+ });
237
+ })
238
+
154
239
  it('sends /call with meetingNumber if inviteeAddress does not exist', async () => {
155
240
  const deviceUrl = 'deviceUrl';
156
241
  const correlationId = 'random-uuid';
@@ -191,22 +276,110 @@ describe('plugin-meetings', () => {
191
276
  assert.equal(requestParams.body.invitee.address, 'sipUrl');
192
277
  });
193
278
 
279
+ it('sends uses the locusClusterUrl if available', async () => {
280
+ const deviceUrl = 'deviceUrl';
281
+ const correlationId = 'random-uuid';
282
+ const roapMessage = 'roap-message';
283
+ const inviteeAddress = 'sipUrl';
284
+ const locusClusterUrl = 'locusClusterUrl';
285
+
286
+ await meetingsRequest.joinMeeting({
287
+ deviceUrl,
288
+ correlationId,
289
+ roapMessage,
290
+ locusClusterUrl,
291
+ inviteeAddress,
292
+ });
293
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
294
+
295
+ assert.equal(requestParams.method, 'POST');
296
+ assert.equal(
297
+ requestParams.uri,
298
+ 'https://locusClusterUrl/locus/api/v1/loci/call?alternateRedirect=true'
299
+ );
300
+ });
301
+
194
302
  it('adds deviceCapabilities to request when breakouts are supported', async () => {
195
303
  await meetingsRequest.joinMeeting({
196
- breakoutsSupported: true
304
+ breakoutsSupported: true,
197
305
  });
198
306
  const requestParams = meetingsRequest.request.getCall(0).args[0];
199
307
 
200
308
  assert.deepEqual(requestParams.body.deviceCapabilities, ['BREAKOUTS_SUPPORTED']);
201
309
  });
202
310
 
203
- it('does not add deviceCapabilities to request when breakouts are not supported', async () => {
311
+ it('adds deviceCapabilities to request when live annotation are supported', async () => {
312
+ await meetingsRequest.joinMeeting({
313
+ liveAnnotationSupported: true,
314
+ });
315
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
316
+ assert.deepEqual(requestParams.body.deviceCapabilities, ['ANNOTATION_ON_SHARE_SUPPORTED']);
317
+ });
318
+ it('adds deviceCapabilities to request when breakouts and live annotation are supported', async () => {
319
+ await meetingsRequest.joinMeeting({
320
+ liveAnnotationSupported: true,
321
+ breakoutsSupported: true,
322
+ });
323
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
324
+ assert.deepEqual(requestParams.body.deviceCapabilities, [
325
+ 'BREAKOUTS_SUPPORTED',
326
+ 'ANNOTATION_ON_SHARE_SUPPORTED',
327
+ ]);
328
+ });
329
+ it('does not add deviceCapabilities to request when breakouts and live annotation are not supported', async () => {
204
330
  await meetingsRequest.joinMeeting({});
205
331
 
206
332
  const requestParams = meetingsRequest.request.getCall(0).args[0];
207
333
 
208
334
  assert.deepEqual(requestParams.body.deviceCapabilities, undefined);
209
335
  });
336
+
337
+ it('adds deviceCapabilities and locale to request when they are provided', async () => {
338
+ await meetingsRequest.joinMeeting({
339
+ locale: 'en_UK',
340
+ deviceCapabilities: ['SERVER_AUDIO_ANNOUNCEMENT_SUPPORTED'],
341
+ });
342
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
343
+
344
+ assert.deepEqual(requestParams.body.deviceCapabilities, [
345
+ 'SERVER_AUDIO_ANNOUNCEMENT_SUPPORTED',
346
+ ]);
347
+ assert.deepEqual(requestParams.body.locale, 'en_UK');
348
+ });
349
+
350
+ it('does not add deviceCapabilities and locale to request when they are not provided', async () => {
351
+ await meetingsRequest.joinMeeting({});
352
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
353
+
354
+ assert.deepEqual(requestParams.body.deviceCapabilities, undefined);
355
+ assert.deepEqual(requestParams.body.locale, undefined);
356
+ });
357
+
358
+ it('includes joinCookie and ipver correctly', async () => {
359
+ const locusUrl = 'locusURL';
360
+ const deviceUrl = 'deviceUrl';
361
+ const correlationId = 'random-uuid';
362
+ const roapMessage = 'roap-message';
363
+ const permissionToken = 'permission-token';
364
+
365
+ await meetingsRequest.joinMeeting({
366
+ locusUrl,
367
+ deviceUrl,
368
+ correlationId,
369
+ roapMessage,
370
+ permissionToken,
371
+ ipVersion: IP_VERSION.ipv4_and_ipv6
372
+ });
373
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
374
+
375
+ assert.equal(requestParams.method, 'POST');
376
+ assert.equal(requestParams.uri, `${locusUrl}/participant?alternateRedirect=true`);
377
+ assert.deepEqual(requestParams.body.clientMediaPreferences, {
378
+ "joinCookie": {anycastEntryPoint: "aws-eu-west-1"},
379
+ "preferTranscoding": true,
380
+ "ipver": 1
381
+ });
382
+ });
210
383
  });
211
384
 
212
385
  describe('#pstn', () => {
@@ -222,14 +395,20 @@ describe('plugin-meetings', () => {
222
395
  correlationId,
223
396
  dialInUrl,
224
397
  });
225
- const requestParams = meetingsRequest.request.getCall(0).args[0];
226
398
 
227
- assert.equal(requestParams.method, 'POST');
228
- assert.equal(requestParams.uri, `${locusUrl}/participant`);
229
- assert.equal(requestParams.body.device.url, dialInUrl);
230
- assert.equal(requestParams.body.device.deviceType, 'PROVISIONAL');
231
- assert.equal(requestParams.body.device.provisionalType, 'DIAL_IN');
232
- assert.equal(requestParams.body.device.clientUrl, 'clientUrl');
399
+ checkRequest({
400
+ method: 'POST',
401
+ uri: `${locusUrl}/participant`,
402
+ body: {
403
+ device: {
404
+ url: dialInUrl,
405
+ deviceType: 'PROVISIONAL',
406
+ provisionalType: 'DIAL_IN',
407
+ clientUrl,
408
+ },
409
+ correlationId,
410
+ },
411
+ });
233
412
  });
234
413
 
235
414
  it('sends dial out pstn request', async () => {
@@ -246,15 +425,21 @@ describe('plugin-meetings', () => {
246
425
  dialOutUrl,
247
426
  phoneNumber,
248
427
  });
249
- const requestParams = meetingsRequest.request.getCall(0).args[0];
250
428
 
251
- assert.equal(requestParams.method, 'POST');
252
- assert.equal(requestParams.uri, `${locusUrl}/participant`);
253
- assert.equal(requestParams.body.device.url, dialOutUrl);
254
- assert.equal(requestParams.body.device.deviceType, 'PROVISIONAL');
255
- assert.equal(requestParams.body.device.provisionalType, 'DIAL_OUT');
256
- assert.equal(requestParams.body.device.clientUrl, 'clientUrl');
257
- assert.equal(requestParams.body.device.dialoutAddress, phoneNumber);
429
+ checkRequest({
430
+ method: 'POST',
431
+ uri: `${locusUrl}/participant`,
432
+ body: {
433
+ device: {
434
+ url: dialOutUrl,
435
+ deviceType: 'PROVISIONAL',
436
+ provisionalType: 'DIAL_OUT',
437
+ clientUrl,
438
+ dialoutAddress: phoneNumber,
439
+ },
440
+ correlationId,
441
+ },
442
+ });
258
443
  });
259
444
 
260
445
  it('sends disconnect phone audio request', async () => {
@@ -269,12 +454,92 @@ describe('plugin-meetings', () => {
269
454
  correlationId,
270
455
  phoneUrl,
271
456
  });
272
- const requestParams = meetingsRequest.request.getCall(0).args[0];
273
457
 
274
- assert.equal(requestParams.method, 'PUT');
275
- assert.equal(requestParams.uri, `${locusUrl}/participant/${selfId}/leave`);
276
- assert.equal(requestParams.body.device.url, phoneUrl);
277
- assert.equal(requestParams.body.device.deviceType, 'PROVISIONAL');
458
+ checkRequest({
459
+ method: 'PUT',
460
+ uri: `${locusUrl}/participant/${selfId}/leave`,
461
+ body: {
462
+ device: {
463
+ url: phoneUrl,
464
+ deviceType: 'PROVISIONAL',
465
+ },
466
+ correlationId,
467
+ },
468
+ });
469
+ });
470
+ });
471
+
472
+ describe('#leaveMeeting', () => {
473
+ it('sends the request to leave the meeting', async () => {
474
+ const locusUrl = 'locusUrl';
475
+ const selfId = 'selfId';
476
+ const correlationId = 'random-uuid';
477
+ const resourceId = 'resourceId';
478
+ const deviceUrl = 'deviceUrl';
479
+
480
+ meetingsRequest.config.meetings.deviceType = 'deviceType';
481
+
482
+ await meetingsRequest.leaveMeeting({
483
+ locusUrl,
484
+ selfId,
485
+ deviceUrl,
486
+ resourceId,
487
+ correlationId,
488
+ });
489
+
490
+ checkRequest({
491
+ method: 'PUT',
492
+ uri: 'locusUrl/participant/selfId/leave',
493
+ body: {
494
+ device: {deviceType: 'deviceType', url: 'deviceUrl'},
495
+ usingResource: 'resourceId',
496
+ correlationId: 'random-uuid',
497
+ },
498
+ });
499
+ });
500
+ });
501
+
502
+ describe('#acknowledgeMeeting', () => {
503
+ it('sends the request to acknowledge the meeting', async () => {
504
+ const locusUrl = 'locusUrl';
505
+ const correlationId = 'random-uuid';
506
+ const deviceUrl = 'deviceUrl';
507
+
508
+ meetingsRequest.config.meetings.deviceType = 'deviceType';
509
+
510
+ await meetingsRequest.acknowledgeMeeting({
511
+ locusUrl,
512
+ deviceUrl,
513
+ correlationId,
514
+ });
515
+
516
+ checkRequest({
517
+ method: 'PUT',
518
+ uri: 'locusUrl/participant/alert',
519
+ body: {
520
+ device: {deviceType: 'deviceType', url: 'deviceUrl'},
521
+ correlationId: 'random-uuid',
522
+ },
523
+ });
524
+ });
525
+ });
526
+
527
+ describe('#lockMeeting', () => {
528
+ it('sends request to lock the meeting', async () => {
529
+ const locusUrl = 'locusURL';
530
+
531
+ await meetingsRequest.lockMeeting({
532
+ locusUrl,
533
+ lock: true,
534
+ });
535
+
536
+ checkRequest({
537
+ method: 'PATCH',
538
+ uri: `${locusUrl}/controls`,
539
+ body: {
540
+ lock: {locked: true},
541
+ },
542
+ });
278
543
  });
279
544
  });
280
545
 
@@ -285,10 +550,11 @@ describe('plugin-meetings', () => {
285
550
  await meetingsRequest.endMeetingForAll({
286
551
  locusUrl,
287
552
  });
288
- const requestParams = meetingsRequest.request.getCall(0).args[0];
289
553
 
290
- assert.equal(requestParams.method, 'POST');
291
- assert.equal(requestParams.uri, `${locusUrl}/end`);
554
+ checkRequest({
555
+ method: 'POST',
556
+ uri: `${locusUrl}/end`,
557
+ });
292
558
  });
293
559
  });
294
560
 
@@ -341,12 +607,180 @@ describe('plugin-meetings', () => {
341
607
  locusUrl,
342
608
  requestingParticipantId,
343
609
  });
344
- const requestParams = meetingsRequest.request.getCall(0).args[0];
345
610
 
346
- assert.equal(requestParams.method, 'PUT');
347
- assert.equal(requestParams.uri, `${locusUrl}/controls`);
348
- assert.equal(requestParams.body.reactions.enabled, true);
349
- assert.equal(requestParams.body.requestingParticipantId, requestingParticipantId);
611
+ checkRequest({
612
+ method: 'PUT',
613
+ uri: `${locusUrl}/controls`,
614
+ body: {
615
+ reactions: {
616
+ enabled: true,
617
+ },
618
+ requestingParticipantId,
619
+ },
620
+ });
621
+ });
622
+ });
623
+
624
+ describe('#prepareLeaveMeetingRequestOptions', () => {
625
+ it('returns expected result', async () => {
626
+ const result = meetingsRequest.prepareLeaveMeetingRequestOptions({
627
+ locusUrl: 'locusUrl',
628
+ selfId: 'selfId',
629
+ correlationId: 'correlationId',
630
+ resourceId: 'resourceId',
631
+ deviceUrl: 'deviceUrl',
632
+ });
633
+
634
+ assert.deepEqual(result, {
635
+ body: {
636
+ correlationId: 'correlationId',
637
+ device: {
638
+ deviceType: undefined,
639
+ url: 'deviceUrl',
640
+ },
641
+ usingResource: 'resourceId',
642
+ },
643
+ method: 'PUT',
644
+ uri: 'locusUrl/participant/selfId/leave',
645
+ });
646
+ });
647
+ });
648
+
649
+ describe('#buildLeaveMeetingRequestOptions', () => {
650
+ it('calls expected functions and returns expected result', async () => {
651
+ // return this.buildLocusDeltaRequestOptions(this.prepareLeaveMeetingRequestOptions(options));
652
+ const prepareLeaveMeetingRequestOptionsSpy = sinon.spy(
653
+ meetingsRequest,
654
+ 'prepareLeaveMeetingRequestOptions'
655
+ );
656
+ const buildLocusDeltaRequestOptionsSpy = sinon.spy(
657
+ meetingsRequest,
658
+ 'buildLocusDeltaRequestOptions'
659
+ );
660
+
661
+ const inputOpts = {
662
+ locusUrl: 'locusUrl',
663
+ selfId: 'selfId',
664
+ correlationId: 'correlationId',
665
+ resourceId: 'resourceId',
666
+ deviceUrl: 'deviceUrl',
667
+ };
668
+
669
+ const result = meetingsRequest.buildLeaveMeetingRequestOptions(inputOpts);
670
+
671
+ assert.calledOnceWithExactly(prepareLeaveMeetingRequestOptionsSpy, inputOpts);
672
+ assert.calledOnceWithExactly(buildLocusDeltaRequestOptionsSpy, {
673
+ method: 'PUT',
674
+ uri: 'locusUrl/participant/selfId/leave',
675
+ body: {
676
+ device: {deviceType: undefined, url: 'deviceUrl'},
677
+ usingResource: 'resourceId',
678
+ correlationId: 'correlationId',
679
+ },
680
+ });
681
+
682
+ assert.deepEqual(result, {
683
+ body: {
684
+ correlationId: 'correlationId',
685
+ device: {
686
+ deviceType: undefined,
687
+ url: 'deviceUrl',
688
+ },
689
+ sequence: {},
690
+ usingResource: 'resourceId',
691
+ },
692
+ method: 'PUT',
693
+ uri: 'locusUrl/participant/selfId/leave',
694
+ });
695
+ });
696
+ });
697
+ });
698
+
699
+ describe('#declineMeeting', () => {
700
+ it('sends a request to decline the meeting', async () => {
701
+ const reason = 'reason';
702
+ const deviceUrl = 'deviceUrl';
703
+ const locusUrl = 'locusUrl';
704
+ meetingsRequest.config.meetings.deviceType = 'deviceType';
705
+
706
+ await meetingsRequest.declineMeeting({
707
+ locusUrl,
708
+ deviceUrl,
709
+ reason,
710
+ });
711
+
712
+ const expectedBody = {
713
+ device: {
714
+ deviceType: 'deviceType',
715
+ url: deviceUrl,
716
+ },
717
+ reason,
718
+ };
719
+
720
+ checkRequest({
721
+ method: 'PUT',
722
+ uri: `${locusUrl}/participant/decline`,
723
+ body: expectedBody,
724
+ });
725
+ });
726
+ });
727
+
728
+ describe('#getLocusStatusByUrl', () => {
729
+ it('check locus status', async () => {
730
+ const locusUrl = 'locusUrl';
731
+
732
+ await meetingsRequest.getLocusStatusByUrl(locusUrl);
733
+ assert.deepEqual(meetingsRequest.request.getCall(0).args[0], {
734
+ method: 'GET',
735
+ uri: locusUrl,
736
+ });
737
+ });
738
+ });
739
+
740
+ describe('#changeMeetingFloor', () => {
741
+ it('change meeting floor', async () => {
742
+ const options = {
743
+ disposition: 'GRANTED',
744
+ personUrl: 'personUrl',
745
+ deviceUrl: 'deviceUrl',
746
+ resourceId: 'resourceId',
747
+ resourceUrl: 'resourceUrl',
748
+ uri: 'optionsUrl',
749
+ annotationInfo: {
750
+ version: '1',
751
+ policy: 'Approval',
752
+ },
753
+ };
754
+
755
+ const expectBody = {
756
+ annotation: {
757
+ policy: 'Approval',
758
+ version: '1',
759
+ },
760
+ floor: {
761
+ beneficiary: {
762
+ devices: [
763
+ {
764
+ deviceType: undefined,
765
+ url: 'deviceUrl',
766
+ },
767
+ ],
768
+ url: 'personUrl',
769
+ },
770
+ disposition: 'GRANTED',
771
+ requester: {
772
+ url: 'personUrl',
773
+ },
774
+ },
775
+ resourceUrl: 'resourceUrl',
776
+ };
777
+
778
+ await meetingsRequest.changeMeetingFloor(options);
779
+
780
+ assert.deepEqual(meetingsRequest.request.getCall(0).args[0], {
781
+ method: 'PUT',
782
+ uri: 'optionsUrl',
783
+ body: expectBody,
350
784
  });
351
785
  });
352
786
  });