@webex/plugin-meetings 3.0.0-beta.31 → 3.0.0-beta.310

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 (378) 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 -11
  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 +61 -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/meeting/in-meeting-actions.js +82 -2
  67. package/dist/meeting/in-meeting-actions.js.map +1 -1
  68. package/dist/meeting/index.js +3777 -2929
  69. package/dist/meeting/index.js.map +1 -1
  70. package/dist/meeting/locusMediaRequest.js +292 -0
  71. package/dist/meeting/locusMediaRequest.js.map +1 -0
  72. package/dist/meeting/muteState.js +230 -124
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +260 -196
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +601 -417
  77. package/dist/meeting/util.js.map +1 -1
  78. package/dist/meeting-info/index.js +73 -7
  79. package/dist/meeting-info/index.js.map +1 -1
  80. package/dist/meeting-info/meeting-info-v2.js +192 -51
  81. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  82. package/dist/meeting-info/util.js +1 -1
  83. package/dist/meeting-info/util.js.map +1 -1
  84. package/dist/meeting-info/utilv2.js +36 -36
  85. package/dist/meeting-info/utilv2.js.map +1 -1
  86. package/dist/meetings/collection.js +39 -0
  87. package/dist/meetings/collection.js.map +1 -1
  88. package/dist/meetings/index.js +415 -115
  89. package/dist/meetings/index.js.map +1 -1
  90. package/dist/meetings/meetings.types.js +7 -0
  91. package/dist/meetings/meetings.types.js.map +1 -0
  92. package/dist/meetings/request.js +2 -0
  93. package/dist/meetings/request.js.map +1 -1
  94. package/dist/meetings/util.js +72 -6
  95. package/dist/meetings/util.js.map +1 -1
  96. package/dist/member/index.js +58 -0
  97. package/dist/member/index.js.map +1 -1
  98. package/dist/member/types.js +25 -0
  99. package/dist/member/types.js.map +1 -0
  100. package/dist/member/util.js +132 -25
  101. package/dist/member/util.js.map +1 -1
  102. package/dist/members/collection.js +10 -0
  103. package/dist/members/collection.js.map +1 -1
  104. package/dist/members/index.js +102 -6
  105. package/dist/members/index.js.map +1 -1
  106. package/dist/members/request.js +106 -38
  107. package/dist/members/request.js.map +1 -1
  108. package/dist/members/types.js +15 -0
  109. package/dist/members/types.js.map +1 -0
  110. package/dist/members/util.js +326 -232
  111. package/dist/members/util.js.map +1 -1
  112. package/dist/metrics/constants.js +13 -5
  113. package/dist/metrics/constants.js.map +1 -1
  114. package/dist/metrics/index.js +1 -468
  115. package/dist/metrics/index.js.map +1 -1
  116. package/dist/multistream/mediaRequestManager.js +238 -49
  117. package/dist/multistream/mediaRequestManager.js.map +1 -1
  118. package/dist/multistream/receiveSlot.js +29 -16
  119. package/dist/multistream/receiveSlot.js.map +1 -1
  120. package/dist/multistream/receiveSlotManager.js +39 -36
  121. package/dist/multistream/receiveSlotManager.js.map +1 -1
  122. package/dist/multistream/remoteMedia.js +44 -18
  123. package/dist/multistream/remoteMedia.js.map +1 -1
  124. package/dist/multistream/remoteMediaGroup.js +60 -3
  125. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  126. package/dist/multistream/remoteMediaManager.js +209 -59
  127. package/dist/multistream/remoteMediaManager.js.map +1 -1
  128. package/dist/multistream/sendSlotManager.js +233 -0
  129. package/dist/multistream/sendSlotManager.js.map +1 -0
  130. package/dist/reachability/index.js +225 -59
  131. package/dist/reachability/index.js.map +1 -1
  132. package/dist/reachability/request.js +17 -8
  133. package/dist/reachability/request.js.map +1 -1
  134. package/dist/reconnection-manager/index.js +201 -156
  135. package/dist/reconnection-manager/index.js.map +1 -1
  136. package/dist/recording-controller/index.js +21 -2
  137. package/dist/recording-controller/index.js.map +1 -1
  138. package/dist/recording-controller/util.js +9 -8
  139. package/dist/recording-controller/util.js.map +1 -1
  140. package/dist/roap/index.js +62 -32
  141. package/dist/roap/index.js.map +1 -1
  142. package/dist/roap/request.js +112 -97
  143. package/dist/roap/request.js.map +1 -1
  144. package/dist/roap/turnDiscovery.js +95 -36
  145. package/dist/roap/turnDiscovery.js.map +1 -1
  146. package/dist/rtcMetrics/constants.js +12 -0
  147. package/dist/rtcMetrics/constants.js.map +1 -0
  148. package/dist/rtcMetrics/index.js +117 -0
  149. package/dist/rtcMetrics/index.js.map +1 -0
  150. package/dist/statsAnalyzer/index.js +86 -78
  151. package/dist/statsAnalyzer/index.js.map +1 -1
  152. package/dist/statsAnalyzer/mqaUtil.js +11 -10
  153. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  154. package/dist/types/annotation/annotation.types.d.ts +42 -0
  155. package/dist/types/annotation/constants.d.ts +31 -0
  156. package/dist/types/annotation/index.d.ts +117 -0
  157. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  158. package/dist/types/breakouts/events.d.ts +8 -0
  159. package/dist/types/breakouts/utils.d.ts +14 -0
  160. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  161. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  162. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  163. package/dist/types/common/logs/request.d.ts +2 -0
  164. package/dist/types/common/queue.d.ts +9 -7
  165. package/dist/types/config.d.ts +1 -7
  166. package/dist/types/constants.d.ts +194 -24
  167. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  168. package/dist/types/controls-options-manager/index.d.ts +17 -1
  169. package/dist/types/controls-options-manager/types.d.ts +43 -0
  170. package/dist/types/controls-options-manager/util.d.ts +1 -7
  171. package/dist/types/index.d.ts +6 -4
  172. package/dist/types/interpretation/collection.d.ts +5 -0
  173. package/dist/types/interpretation/index.d.ts +5 -0
  174. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  175. package/dist/types/locus-info/index.d.ts +57 -4
  176. package/dist/types/locus-info/parser.d.ts +67 -6
  177. package/dist/types/media/index.d.ts +2 -0
  178. package/dist/types/media/properties.d.ts +34 -48
  179. package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
  180. package/dist/types/meeting/index.d.ts +463 -510
  181. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  182. package/dist/types/meeting/muteState.d.ts +99 -23
  183. package/dist/types/meeting/request.d.ts +72 -43
  184. package/dist/types/meeting/util.d.ts +101 -1
  185. package/dist/types/meeting-info/index.d.ts +13 -1
  186. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  187. package/dist/types/meetings/collection.d.ts +17 -0
  188. package/dist/types/meetings/index.d.ts +98 -20
  189. package/dist/types/meetings/meetings.types.d.ts +4 -0
  190. package/dist/types/member/index.d.ts +14 -0
  191. package/dist/types/member/types.d.ts +32 -0
  192. package/dist/types/members/collection.d.ts +5 -0
  193. package/dist/types/members/index.d.ts +35 -2
  194. package/dist/types/members/request.d.ts +73 -9
  195. package/dist/types/members/types.d.ts +25 -0
  196. package/dist/types/members/util.d.ts +214 -1
  197. package/dist/types/metrics/constants.d.ts +12 -4
  198. package/dist/types/metrics/index.d.ts +4 -119
  199. package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
  200. package/dist/types/multistream/receiveSlot.d.ts +13 -11
  201. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  202. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  203. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  204. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  205. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  206. package/dist/types/reachability/index.d.ts +61 -7
  207. package/dist/types/reachability/request.d.ts +7 -3
  208. package/dist/types/reconnection-manager/index.d.ts +9 -0
  209. package/dist/types/recording-controller/index.d.ts +15 -1
  210. package/dist/types/recording-controller/util.d.ts +5 -4
  211. package/dist/types/roap/index.d.ts +2 -1
  212. package/dist/types/roap/request.d.ts +15 -11
  213. package/dist/types/roap/turnDiscovery.d.ts +21 -3
  214. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  215. package/dist/types/rtcMetrics/index.d.ts +47 -0
  216. package/dist/types/statsAnalyzer/index.d.ts +7 -1
  217. package/dist/types/webinar/collection.d.ts +16 -0
  218. package/dist/types/webinar/index.d.ts +5 -0
  219. package/dist/webinar/collection.js +44 -0
  220. package/dist/webinar/collection.js.map +1 -0
  221. package/dist/webinar/index.js +69 -0
  222. package/dist/webinar/index.js.map +1 -0
  223. package/package.json +23 -20
  224. package/src/annotation/annotation.types.ts +50 -0
  225. package/src/annotation/constants.ts +36 -0
  226. package/src/annotation/index.ts +328 -0
  227. package/src/breakouts/README.md +42 -12
  228. package/src/breakouts/breakout.ts +67 -9
  229. package/src/breakouts/edit-lock-error.ts +25 -0
  230. package/src/breakouts/events.ts +56 -0
  231. package/src/breakouts/index.ts +592 -20
  232. package/src/breakouts/utils.ts +42 -0
  233. package/src/common/errors/no-meeting-info.ts +24 -0
  234. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  235. package/src/common/errors/webex-errors.ts +44 -2
  236. package/src/common/logs/logger-proxy.ts +1 -1
  237. package/src/common/logs/request.ts +5 -1
  238. package/src/common/queue.ts +22 -8
  239. package/src/config.ts +4 -10
  240. package/src/constants.ts +221 -19
  241. package/src/controls-options-manager/enums.ts +12 -0
  242. package/src/controls-options-manager/index.ts +116 -21
  243. package/src/controls-options-manager/types.ts +59 -0
  244. package/src/controls-options-manager/util.ts +294 -14
  245. package/src/index.ts +40 -0
  246. package/src/interpretation/README.md +60 -0
  247. package/src/interpretation/collection.ts +19 -0
  248. package/src/interpretation/index.ts +332 -0
  249. package/src/interpretation/siLanguage.ts +18 -0
  250. package/src/locus-info/controlsUtils.ts +108 -0
  251. package/src/locus-info/index.ts +413 -59
  252. package/src/locus-info/infoUtils.ts +10 -2
  253. package/src/locus-info/mediaSharesUtils.ts +64 -0
  254. package/src/locus-info/parser.ts +258 -47
  255. package/src/locus-info/selfUtils.ts +81 -5
  256. package/src/media/index.ts +102 -122
  257. package/src/media/properties.ts +87 -110
  258. package/src/meeting/in-meeting-actions.ts +163 -3
  259. package/src/meeting/index.ts +3132 -2541
  260. package/src/meeting/locusMediaRequest.ts +313 -0
  261. package/src/meeting/muteState.ts +229 -131
  262. package/src/meeting/request.ts +177 -121
  263. package/src/meeting/util.ts +588 -394
  264. package/src/meeting-info/index.ts +81 -8
  265. package/src/meeting-info/meeting-info-v2.ts +170 -14
  266. package/src/meeting-info/util.ts +1 -1
  267. package/src/meeting-info/utilv2.ts +23 -23
  268. package/src/meetings/collection.ts +33 -0
  269. package/src/meetings/index.ts +445 -123
  270. package/src/meetings/meetings.types.ts +12 -0
  271. package/src/meetings/request.ts +2 -0
  272. package/src/meetings/util.ts +80 -11
  273. package/src/member/index.ts +58 -0
  274. package/src/member/types.ts +38 -0
  275. package/src/member/util.ts +141 -25
  276. package/src/members/collection.ts +8 -0
  277. package/src/members/index.ts +134 -8
  278. package/src/members/request.ts +97 -17
  279. package/src/members/types.ts +29 -0
  280. package/src/members/util.ts +333 -240
  281. package/src/metrics/constants.ts +12 -4
  282. package/src/metrics/index.ts +1 -490
  283. package/src/multistream/mediaRequestManager.ts +289 -79
  284. package/src/multistream/receiveSlot.ts +31 -17
  285. package/src/multistream/receiveSlotManager.ts +34 -24
  286. package/src/multistream/remoteMedia.ts +27 -2
  287. package/src/multistream/remoteMediaGroup.ts +59 -0
  288. package/src/multistream/remoteMediaManager.ts +148 -30
  289. package/src/multistream/sendSlotManager.ts +170 -0
  290. package/src/reachability/index.ts +228 -37
  291. package/src/reachability/request.ts +17 -8
  292. package/src/reconnection-manager/index.ts +83 -56
  293. package/src/recording-controller/index.ts +20 -3
  294. package/src/recording-controller/util.ts +26 -9
  295. package/src/roap/index.ts +63 -32
  296. package/src/roap/request.ts +100 -104
  297. package/src/roap/turnDiscovery.ts +48 -26
  298. package/src/rtcMetrics/constants.ts +3 -0
  299. package/src/rtcMetrics/index.ts +100 -0
  300. package/src/statsAnalyzer/index.ts +105 -91
  301. package/src/statsAnalyzer/mqaUtil.ts +13 -14
  302. package/src/webinar/collection.ts +31 -0
  303. package/src/webinar/index.ts +62 -0
  304. package/test/integration/spec/converged-space-meetings.js +60 -3
  305. package/test/integration/spec/journey.js +320 -261
  306. package/test/integration/spec/space-meeting.js +76 -3
  307. package/test/unit/spec/annotation/index.ts +418 -0
  308. package/test/unit/spec/breakouts/breakout.ts +118 -28
  309. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  310. package/test/unit/spec/breakouts/events.ts +89 -0
  311. package/test/unit/spec/breakouts/index.ts +1395 -69
  312. package/test/unit/spec/breakouts/utils.js +52 -1
  313. package/test/unit/spec/common/queue.js +31 -2
  314. package/test/unit/spec/controls-options-manager/index.js +163 -0
  315. package/test/unit/spec/controls-options-manager/util.js +576 -60
  316. package/test/unit/spec/fixture/locus.js +1 -0
  317. package/test/unit/spec/interpretation/collection.ts +15 -0
  318. package/test/unit/spec/interpretation/index.ts +589 -0
  319. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  320. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  321. package/test/unit/spec/locus-info/index.js +1304 -33
  322. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  323. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  324. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  325. package/test/unit/spec/locus-info/parser.js +116 -35
  326. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  327. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  328. package/test/unit/spec/media/index.ts +104 -37
  329. package/test/unit/spec/media/properties.ts +2 -2
  330. package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
  331. package/test/unit/spec/meeting/index.js +5216 -1956
  332. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  333. package/test/unit/spec/meeting/muteState.js +408 -208
  334. package/test/unit/spec/meeting/request.js +483 -49
  335. package/test/unit/spec/meeting/utils.js +679 -64
  336. package/test/unit/spec/meeting-info/index.js +300 -0
  337. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  338. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  339. package/test/unit/spec/meetings/collection.js +26 -0
  340. package/test/unit/spec/meetings/index.js +1011 -205
  341. package/test/unit/spec/meetings/utils.js +202 -2
  342. package/test/unit/spec/member/index.js +61 -6
  343. package/test/unit/spec/member/util.js +510 -34
  344. package/test/unit/spec/members/index.js +432 -1
  345. package/test/unit/spec/members/request.js +206 -27
  346. package/test/unit/spec/members/utils.js +210 -0
  347. package/test/unit/spec/metrics/index.js +1 -50
  348. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  349. package/test/unit/spec/multistream/receiveSlot.ts +28 -20
  350. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  351. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  352. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  353. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  354. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  355. package/test/unit/spec/reachability/index.ts +549 -9
  356. package/test/unit/spec/reachability/request.js +68 -0
  357. package/test/unit/spec/reconnection-manager/index.js +85 -9
  358. package/test/unit/spec/recording-controller/index.js +294 -218
  359. package/test/unit/spec/recording-controller/util.js +223 -96
  360. package/test/unit/spec/roap/index.ts +178 -64
  361. package/test/unit/spec/roap/request.ts +203 -85
  362. package/test/unit/spec/roap/turnDiscovery.ts +82 -36
  363. package/test/unit/spec/rtcMetrics/index.ts +73 -0
  364. package/test/unit/spec/stats-analyzer/index.js +136 -2
  365. package/test/unit/spec/webinar/collection.ts +13 -0
  366. package/test/unit/spec/webinar/index.ts +60 -0
  367. package/test/utils/integrationTestUtils.js +46 -0
  368. package/test/utils/testUtils.js +0 -52
  369. package/dist/meeting/effectsState.js +0 -262
  370. package/dist/meeting/effectsState.js.map +0 -1
  371. package/dist/metrics/config.js +0 -299
  372. package/dist/metrics/config.js.map +0 -1
  373. package/dist/types/meeting/effectsState.d.ts +0 -42
  374. package/dist/types/metrics/config.d.ts +0 -178
  375. package/src/index.js +0 -16
  376. package/src/meeting/effectsState.ts +0 -211
  377. package/src/metrics/config.ts +0 -495
  378. 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
  });