@webex/plugin-meetings 3.0.0-beta.4 → 3.0.0-beta.40

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 (498) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/breakouts/breakout.js +137 -0
  4. package/dist/breakouts/breakout.js.map +1 -0
  5. package/dist/breakouts/collection.js +23 -0
  6. package/dist/breakouts/collection.js.map +1 -0
  7. package/dist/breakouts/edit-lock-error.js +52 -0
  8. package/dist/breakouts/edit-lock-error.js.map +1 -0
  9. package/dist/breakouts/index.js +546 -0
  10. package/dist/breakouts/index.js.map +1 -0
  11. package/dist/breakouts/request.js +78 -0
  12. package/dist/breakouts/request.js.map +1 -0
  13. package/dist/breakouts/utils.js +48 -0
  14. package/dist/breakouts/utils.js.map +1 -0
  15. package/dist/common/browser-detection.js +1 -20
  16. package/dist/common/browser-detection.js.map +1 -1
  17. package/dist/common/collection.js +5 -20
  18. package/dist/common/collection.js.map +1 -1
  19. package/dist/common/config.js +0 -7
  20. package/dist/common/config.js.map +1 -1
  21. package/dist/common/errors/captcha-error.js +10 -24
  22. package/dist/common/errors/captcha-error.js.map +1 -1
  23. package/dist/common/errors/intent-to-join.js +11 -24
  24. package/dist/common/errors/intent-to-join.js.map +1 -1
  25. package/dist/common/errors/join-meeting.js +12 -25
  26. package/dist/common/errors/join-meeting.js.map +1 -1
  27. package/dist/common/errors/media.js +10 -24
  28. package/dist/common/errors/media.js.map +1 -1
  29. package/dist/common/errors/parameter.js +5 -33
  30. package/dist/common/errors/parameter.js.map +1 -1
  31. package/dist/common/errors/password-error.js +10 -24
  32. package/dist/common/errors/password-error.js.map +1 -1
  33. package/dist/common/errors/permission.js +9 -23
  34. package/dist/common/errors/permission.js.map +1 -1
  35. package/dist/common/errors/reconnection-in-progress.js +0 -17
  36. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  37. package/dist/common/errors/reconnection.js +10 -24
  38. package/dist/common/errors/reconnection.js.map +1 -1
  39. package/dist/common/errors/stats.js +10 -24
  40. package/dist/common/errors/stats.js.map +1 -1
  41. package/dist/common/errors/webex-errors.js +6 -41
  42. package/dist/common/errors/webex-errors.js.map +1 -1
  43. package/dist/common/errors/webex-meetings-error.js +5 -25
  44. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  45. package/dist/common/events/events-scope.js +0 -22
  46. package/dist/common/events/events-scope.js.map +1 -1
  47. package/dist/common/events/events.js +0 -23
  48. package/dist/common/events/events.js.map +1 -1
  49. package/dist/common/events/trigger-proxy.js +0 -12
  50. package/dist/common/events/trigger-proxy.js.map +1 -1
  51. package/dist/common/events/util.js +0 -15
  52. package/dist/common/events/util.js.map +1 -1
  53. package/dist/common/logs/logger-config.js +0 -4
  54. package/dist/common/logs/logger-config.js.map +1 -1
  55. package/dist/common/logs/logger-proxy.js +1 -8
  56. package/dist/common/logs/logger-proxy.js.map +1 -1
  57. package/dist/common/logs/request.js +37 -60
  58. package/dist/common/logs/request.js.map +1 -1
  59. package/dist/common/queue.js +4 -14
  60. package/dist/common/queue.js.map +1 -1
  61. package/dist/config.js +6 -6
  62. package/dist/config.js.map +1 -1
  63. package/dist/constants.js +109 -49
  64. package/dist/constants.js.map +1 -1
  65. package/dist/controls-options-manager/constants.js +14 -0
  66. package/dist/controls-options-manager/constants.js.map +1 -0
  67. package/dist/controls-options-manager/enums.js +15 -0
  68. package/dist/controls-options-manager/enums.js.map +1 -0
  69. package/dist/controls-options-manager/index.js +203 -0
  70. package/dist/controls-options-manager/index.js.map +1 -0
  71. package/dist/controls-options-manager/util.js +28 -0
  72. package/dist/controls-options-manager/util.js.map +1 -0
  73. package/dist/index.js +11 -18
  74. package/dist/index.js.map +1 -1
  75. package/dist/locus-info/controlsUtils.js +12 -29
  76. package/dist/locus-info/controlsUtils.js.map +1 -1
  77. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  78. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  79. package/dist/locus-info/fullState.js +0 -15
  80. package/dist/locus-info/fullState.js.map +1 -1
  81. package/dist/locus-info/hostUtils.js +4 -12
  82. package/dist/locus-info/hostUtils.js.map +1 -1
  83. package/dist/locus-info/index.js +186 -192
  84. package/dist/locus-info/index.js.map +1 -1
  85. package/dist/locus-info/infoUtils.js +3 -37
  86. package/dist/locus-info/infoUtils.js.map +1 -1
  87. package/dist/locus-info/mediaSharesUtils.js +12 -38
  88. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  89. package/dist/locus-info/parser.js +92 -118
  90. package/dist/locus-info/parser.js.map +1 -1
  91. package/dist/locus-info/selfUtils.js +34 -91
  92. package/dist/locus-info/selfUtils.js.map +1 -1
  93. package/dist/media/index.js +66 -153
  94. package/dist/media/index.js.map +1 -1
  95. package/dist/media/properties.js +83 -117
  96. package/dist/media/properties.js.map +1 -1
  97. package/dist/media/util.js +2 -9
  98. package/dist/media/util.js.map +1 -1
  99. package/dist/mediaQualityMetrics/config.js +505 -495
  100. package/dist/mediaQualityMetrics/config.js.map +1 -1
  101. package/dist/meeting/in-meeting-actions.js +13 -14
  102. package/dist/meeting/in-meeting-actions.js.map +1 -1
  103. package/dist/meeting/index.js +2141 -2210
  104. package/dist/meeting/index.js.map +1 -1
  105. package/dist/meeting/muteState.js +59 -82
  106. package/dist/meeting/muteState.js.map +1 -1
  107. package/dist/meeting/request.js +308 -264
  108. package/dist/meeting/request.js.map +1 -1
  109. package/dist/meeting/request.type.js +7 -0
  110. package/dist/meeting/request.type.js.map +1 -0
  111. package/dist/meeting/state.js +21 -31
  112. package/dist/meeting/state.js.map +1 -1
  113. package/dist/meeting/util.js +45 -217
  114. package/dist/meeting/util.js.map +1 -1
  115. package/dist/meeting-info/collection.js +6 -25
  116. package/dist/meeting-info/collection.js.map +1 -1
  117. package/dist/meeting-info/index.js +14 -32
  118. package/dist/meeting-info/index.js.map +1 -1
  119. package/dist/meeting-info/meeting-info-v2.js +193 -268
  120. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  121. package/dist/meeting-info/request.js +3 -15
  122. package/dist/meeting-info/request.js.map +1 -1
  123. package/dist/meeting-info/util.js +98 -183
  124. package/dist/meeting-info/util.js.map +1 -1
  125. package/dist/meeting-info/utilv2.js +137 -228
  126. package/dist/meeting-info/utilv2.js.map +1 -1
  127. package/dist/meetings/collection.js +5 -20
  128. package/dist/meetings/collection.js.map +1 -1
  129. package/dist/meetings/index.js +490 -560
  130. package/dist/meetings/index.js.map +1 -1
  131. package/dist/meetings/request.js +24 -41
  132. package/dist/meetings/request.js.map +1 -1
  133. package/dist/meetings/util.js +116 -155
  134. package/dist/meetings/util.js.map +1 -1
  135. package/dist/member/index.js +78 -86
  136. package/dist/member/index.js.map +1 -1
  137. package/dist/member/util.js +31 -68
  138. package/dist/member/util.js.map +1 -1
  139. package/dist/members/collection.js +3 -12
  140. package/dist/members/collection.js.map +1 -1
  141. package/dist/members/index.js +95 -200
  142. package/dist/members/index.js.map +1 -1
  143. package/dist/members/request.js +16 -39
  144. package/dist/members/request.js.map +1 -1
  145. package/dist/members/util.js +9 -38
  146. package/dist/members/util.js.map +1 -1
  147. package/dist/metrics/config.js +1 -13
  148. package/dist/metrics/config.js.map +1 -1
  149. package/dist/metrics/constants.js +1 -6
  150. package/dist/metrics/constants.js.map +1 -1
  151. package/dist/metrics/index.js +54 -156
  152. package/dist/metrics/index.js.map +1 -1
  153. package/dist/multistream/mediaRequestManager.js +74 -52
  154. package/dist/multistream/mediaRequestManager.js.map +1 -1
  155. package/dist/multistream/receiveSlot.js +48 -65
  156. package/dist/multistream/receiveSlot.js.map +1 -1
  157. package/dist/multistream/receiveSlotManager.js +60 -82
  158. package/dist/multistream/receiveSlotManager.js.map +1 -1
  159. package/dist/multistream/remoteMedia.js +60 -76
  160. package/dist/multistream/remoteMedia.js.map +1 -1
  161. package/dist/multistream/remoteMediaGroup.js +6 -40
  162. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  163. package/dist/multistream/remoteMediaManager.js +360 -413
  164. package/dist/multistream/remoteMediaManager.js.map +1 -1
  165. package/dist/networkQualityMonitor/index.js +40 -59
  166. package/dist/networkQualityMonitor/index.js.map +1 -1
  167. package/dist/personal-meeting-room/index.js +21 -45
  168. package/dist/personal-meeting-room/index.js.map +1 -1
  169. package/dist/personal-meeting-room/request.js +1 -31
  170. package/dist/personal-meeting-room/request.js.map +1 -1
  171. package/dist/personal-meeting-room/util.js +0 -13
  172. package/dist/personal-meeting-room/util.js.map +1 -1
  173. package/dist/reachability/index.js +147 -183
  174. package/dist/reachability/index.js.map +1 -1
  175. package/dist/reachability/request.js +15 -23
  176. package/dist/reachability/request.js.map +1 -1
  177. package/dist/reactions/constants.js +13 -0
  178. package/dist/reactions/constants.js.map +1 -0
  179. package/dist/reactions/reactions.js +109 -0
  180. package/dist/reactions/reactions.js.map +1 -0
  181. package/dist/reactions/reactions.type.js +36 -0
  182. package/dist/reactions/reactions.type.js.map +1 -0
  183. package/dist/reconnection-manager/index.js +322 -456
  184. package/dist/reconnection-manager/index.js.map +1 -1
  185. package/dist/recording-controller/enums.js +17 -0
  186. package/dist/recording-controller/enums.js.map +1 -0
  187. package/dist/recording-controller/index.js +343 -0
  188. package/dist/recording-controller/index.js.map +1 -0
  189. package/dist/recording-controller/util.js +63 -0
  190. package/dist/recording-controller/util.js.map +1 -0
  191. package/dist/roap/index.js +48 -70
  192. package/dist/roap/index.js.map +1 -1
  193. package/dist/roap/request.js +143 -131
  194. package/dist/roap/request.js.map +1 -1
  195. package/dist/roap/turnDiscovery.js +91 -98
  196. package/dist/roap/turnDiscovery.js.map +1 -1
  197. package/dist/statsAnalyzer/global.js +1 -95
  198. package/dist/statsAnalyzer/global.js.map +1 -1
  199. package/dist/statsAnalyzer/index.js +361 -449
  200. package/dist/statsAnalyzer/index.js.map +1 -1
  201. package/dist/statsAnalyzer/mqaUtil.js +137 -81
  202. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  203. package/dist/transcription/index.js +22 -47
  204. package/dist/transcription/index.js.map +1 -1
  205. package/dist/types/breakouts/breakout.d.ts +8 -0
  206. package/dist/types/breakouts/collection.d.ts +5 -0
  207. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  208. package/dist/types/breakouts/index.d.ts +5 -0
  209. package/dist/types/breakouts/request.d.ts +22 -0
  210. package/dist/types/breakouts/utils.d.ts +8 -0
  211. package/dist/types/common/browser-detection.d.ts +9 -0
  212. package/dist/types/common/collection.d.ts +48 -0
  213. package/dist/types/common/config.d.ts +2 -0
  214. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  215. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  216. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  217. package/dist/types/common/errors/media.d.ts +15 -0
  218. package/dist/types/common/errors/parameter.d.ts +15 -0
  219. package/dist/types/common/errors/password-error.d.ts +15 -0
  220. package/dist/types/common/errors/permission.d.ts +14 -0
  221. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  222. package/dist/types/common/errors/reconnection.d.ts +15 -0
  223. package/dist/types/common/errors/stats.d.ts +15 -0
  224. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  225. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  226. package/dist/types/common/events/events-scope.d.ts +17 -0
  227. package/dist/types/common/events/events.d.ts +12 -0
  228. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  229. package/dist/types/common/events/util.d.ts +2 -0
  230. package/dist/types/common/logs/logger-config.d.ts +2 -0
  231. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  232. package/dist/types/common/logs/request.d.ts +34 -0
  233. package/dist/types/common/queue.d.ts +32 -0
  234. package/dist/types/config.d.ts +77 -0
  235. package/dist/types/constants.d.ts +916 -0
  236. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  237. package/dist/types/controls-options-manager/enums.d.ts +5 -0
  238. package/dist/types/controls-options-manager/index.d.ts +120 -0
  239. package/dist/types/controls-options-manager/util.d.ts +7 -0
  240. package/dist/types/index.d.ts +6 -0
  241. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  242. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  243. package/dist/types/locus-info/fullState.d.ts +2 -0
  244. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  245. package/dist/types/locus-info/index.d.ts +269 -0
  246. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  247. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  248. package/dist/types/locus-info/parser.d.ts +212 -0
  249. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  250. package/dist/types/media/index.d.ts +32 -0
  251. package/dist/types/media/properties.d.ts +108 -0
  252. package/dist/types/media/util.d.ts +2 -0
  253. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  254. package/dist/types/meeting/in-meeting-actions.d.ts +83 -0
  255. package/dist/types/meeting/index.d.ts +1699 -0
  256. package/dist/types/meeting/muteState.d.ts +116 -0
  257. package/dist/types/meeting/request.d.ts +271 -0
  258. package/dist/types/meeting/request.type.d.ts +11 -0
  259. package/dist/types/meeting/state.d.ts +9 -0
  260. package/dist/types/meeting/util.d.ts +2 -0
  261. package/dist/types/meeting-info/collection.d.ts +20 -0
  262. package/dist/types/meeting-info/index.d.ts +57 -0
  263. package/dist/types/meeting-info/meeting-info-v2.d.ts +93 -0
  264. package/dist/types/meeting-info/request.d.ts +22 -0
  265. package/dist/types/meeting-info/util.d.ts +2 -0
  266. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  267. package/dist/types/meetings/collection.d.ts +23 -0
  268. package/dist/types/meetings/index.d.ts +297 -0
  269. package/dist/types/meetings/request.d.ts +27 -0
  270. package/dist/types/meetings/util.d.ts +18 -0
  271. package/dist/types/member/index.d.ts +146 -0
  272. package/dist/types/member/util.d.ts +2 -0
  273. package/dist/types/members/collection.d.ts +24 -0
  274. package/dist/types/members/index.d.ts +320 -0
  275. package/dist/types/members/request.d.ts +50 -0
  276. package/dist/types/members/util.d.ts +2 -0
  277. package/dist/types/metrics/config.d.ts +169 -0
  278. package/dist/types/metrics/constants.d.ts +53 -0
  279. package/dist/types/metrics/index.d.ts +152 -0
  280. package/dist/types/multistream/mediaRequestManager.d.ts +51 -0
  281. package/dist/types/multistream/receiveSlot.d.ts +64 -0
  282. package/dist/types/multistream/receiveSlotManager.d.ts +46 -0
  283. package/dist/types/multistream/remoteMedia.d.ts +100 -0
  284. package/dist/types/multistream/remoteMediaGroup.d.ts +56 -0
  285. package/dist/types/multistream/remoteMediaManager.d.ts +241 -0
  286. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  287. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  288. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  289. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  290. package/dist/types/reachability/index.d.ts +140 -0
  291. package/dist/types/reachability/request.d.ts +37 -0
  292. package/dist/types/reactions/constants.d.ts +3 -0
  293. package/dist/types/reactions/reactions.d.ts +4 -0
  294. package/dist/types/reactions/reactions.type.d.ts +52 -0
  295. package/dist/types/reconnection-manager/index.d.ts +117 -0
  296. package/dist/types/recording-controller/enums.d.ts +7 -0
  297. package/dist/types/recording-controller/index.d.ts +193 -0
  298. package/dist/types/recording-controller/util.d.ts +13 -0
  299. package/dist/types/roap/index.d.ts +77 -0
  300. package/dist/types/roap/request.d.ts +38 -0
  301. package/dist/types/roap/turnDiscovery.d.ts +74 -0
  302. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  303. package/dist/types/statsAnalyzer/index.d.ts +195 -0
  304. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  305. package/dist/types/transcription/index.d.ts +64 -0
  306. package/internal-README.md +7 -6
  307. package/package.json +27 -21
  308. package/src/breakouts/README.md +199 -0
  309. package/src/breakouts/breakout.ts +130 -0
  310. package/src/breakouts/collection.ts +19 -0
  311. package/src/breakouts/edit-lock-error.ts +25 -0
  312. package/src/breakouts/index.ts +504 -0
  313. package/src/breakouts/request.ts +55 -0
  314. package/src/breakouts/utils.ts +39 -0
  315. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  316. package/src/common/collection.ts +9 -7
  317. package/src/common/{config.js → config.ts} +1 -1
  318. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  319. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  320. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  321. package/src/common/errors/{media.js → media.ts} +11 -7
  322. package/src/common/errors/parameter.ts +11 -7
  323. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  324. package/src/common/errors/{permission.js → permission.ts} +10 -6
  325. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  326. package/src/common/errors/{stats.js → stats.ts} +11 -7
  327. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
  328. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  329. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  330. package/src/common/events/{events.js → events.ts} +5 -1
  331. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  332. package/src/common/events/{util.js → util.ts} +2 -3
  333. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  334. package/src/common/logs/logger-proxy.ts +44 -0
  335. package/src/common/logs/{request.js → request.ts} +22 -9
  336. package/src/common/queue.ts +1 -2
  337. package/src/{config.js → config.ts} +17 -12
  338. package/src/constants.ts +62 -5
  339. package/src/controls-options-manager/constants.ts +5 -0
  340. package/src/controls-options-manager/enums.ts +6 -0
  341. package/src/controls-options-manager/index.ts +183 -0
  342. package/src/controls-options-manager/util.ts +20 -0
  343. package/src/index.js +4 -1
  344. package/src/locus-info/controlsUtils.ts +114 -0
  345. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  346. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  347. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  348. package/src/locus-info/{index.js → index.ts} +150 -66
  349. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  350. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  351. package/src/locus-info/{parser.js → parser.ts} +67 -79
  352. package/src/locus-info/{selfUtils.js → selfUtils.ts} +123 -68
  353. package/src/media/{index.js → index.ts} +182 -173
  354. package/src/media/{properties.js → properties.ts} +60 -37
  355. package/src/media/{util.js → util.ts} +2 -2
  356. package/src/mediaQualityMetrics/config.ts +384 -0
  357. package/src/meeting/in-meeting-actions.ts +31 -3
  358. package/src/meeting/{index.js → index.ts} +2512 -1579
  359. package/src/meeting/{muteState.js → muteState.ts} +95 -49
  360. package/src/meeting/{request.js → request.ts} +326 -142
  361. package/src/meeting/request.type.ts +13 -0
  362. package/src/meeting/{state.js → state.ts} +50 -35
  363. package/src/meeting/{util.js → util.ts} +117 -119
  364. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  365. package/src/meeting-info/{index.js → index.ts} +42 -36
  366. package/src/meeting-info/meeting-info-v2.ts +273 -0
  367. package/src/meeting-info/{request.js → request.ts} +14 -4
  368. package/src/meeting-info/{util.js → util.ts} +60 -51
  369. package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
  370. package/src/meetings/{collection.js → collection.ts} +6 -3
  371. package/src/meetings/index.ts +1159 -0
  372. package/src/meetings/{request.js → request.ts} +32 -25
  373. package/src/meetings/{util.js → util.ts} +58 -32
  374. package/src/member/{index.js → index.ts} +102 -56
  375. package/src/member/{util.js → util.ts} +52 -25
  376. package/src/members/{collection.js → collection.ts} +2 -2
  377. package/src/members/{index.js → index.ts} +221 -142
  378. package/src/members/{request.js → request.ts} +60 -16
  379. package/src/members/{util.js → util.ts} +50 -48
  380. package/src/metrics/{config.js → config.ts} +253 -92
  381. package/src/metrics/{constants.js → constants.ts} +0 -6
  382. package/src/metrics/{index.js → index.ts} +105 -94
  383. package/src/multistream/mediaRequestManager.ts +101 -39
  384. package/src/multistream/receiveSlot.ts +62 -26
  385. package/src/multistream/receiveSlotManager.ts +35 -21
  386. package/src/multistream/remoteMedia.ts +38 -5
  387. package/src/multistream/remoteMediaGroup.ts +4 -3
  388. package/src/multistream/remoteMediaManager.ts +152 -36
  389. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  390. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  391. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  392. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  393. package/src/reachability/{index.js → index.ts} +109 -85
  394. package/src/reachability/request.ts +46 -35
  395. package/src/reactions/constants.ts +4 -0
  396. package/src/reactions/reactions.ts +104 -0
  397. package/src/reactions/reactions.type.ts +62 -0
  398. package/src/reconnection-manager/{index.js → index.ts} +196 -103
  399. package/src/recording-controller/enums.ts +8 -0
  400. package/src/recording-controller/index.ts +315 -0
  401. package/src/recording-controller/util.ts +58 -0
  402. package/src/roap/{index.js → index.ts} +77 -60
  403. package/src/roap/request.ts +172 -0
  404. package/src/roap/turnDiscovery.ts +81 -41
  405. package/src/statsAnalyzer/global.ts +37 -0
  406. package/src/statsAnalyzer/index.ts +1234 -0
  407. package/src/statsAnalyzer/mqaUtil.ts +293 -0
  408. package/src/transcription/{index.js → index.ts} +46 -39
  409. package/test/integration/spec/converged-space-meetings.js +176 -0
  410. package/test/integration/spec/journey.js +665 -464
  411. package/test/integration/spec/space-meeting.js +320 -206
  412. package/test/integration/spec/transcription.js +7 -8
  413. package/test/unit/spec/breakouts/breakout.ts +147 -0
  414. package/test/unit/spec/breakouts/collection.ts +15 -0
  415. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  416. package/test/unit/spec/breakouts/index.ts +707 -0
  417. package/test/unit/spec/breakouts/request.ts +104 -0
  418. package/test/unit/spec/breakouts/utils.js +47 -0
  419. package/test/unit/spec/common/browser-detection.js +9 -28
  420. package/test/unit/spec/controls-options-manager/index.js +124 -0
  421. package/test/unit/spec/controls-options-manager/util.js +66 -0
  422. package/test/unit/spec/fixture/locus.js +92 -90
  423. package/test/unit/spec/locus-info/controlsUtils.js +25 -5
  424. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  425. package/test/unit/spec/locus-info/index.js +104 -2
  426. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  427. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  428. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  429. package/test/unit/spec/locus-info/parser.js +3 -9
  430. package/test/unit/spec/locus-info/selfConstant.js +97 -103
  431. package/test/unit/spec/locus-info/selfUtils.js +105 -12
  432. package/test/unit/spec/media/index.ts +39 -53
  433. package/test/unit/spec/media/properties.ts +9 -9
  434. package/test/unit/spec/meeting/in-meeting-actions.ts +13 -2
  435. package/test/unit/spec/meeting/index.js +2253 -811
  436. package/test/unit/spec/meeting/muteState.js +74 -55
  437. package/test/unit/spec/meeting/request.js +141 -43
  438. package/test/unit/spec/meeting/utils.js +106 -171
  439. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  440. package/test/unit/spec/meeting-info/request.js +7 -9
  441. package/test/unit/spec/meeting-info/util.js +11 -12
  442. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  443. package/test/unit/spec/meetings/collection.js +1 -1
  444. package/test/unit/spec/meetings/index.js +439 -257
  445. package/test/unit/spec/meetings/utils.js +14 -12
  446. package/test/unit/spec/member/index.js +0 -1
  447. package/test/unit/spec/member/util.js +31 -7
  448. package/test/unit/spec/members/index.js +104 -54
  449. package/test/unit/spec/members/request.js +29 -20
  450. package/test/unit/spec/members/utils.js +8 -5
  451. package/test/unit/spec/metrics/index.js +16 -21
  452. package/test/unit/spec/multistream/mediaRequestManager.ts +318 -64
  453. package/test/unit/spec/multistream/receiveSlot.ts +68 -17
  454. package/test/unit/spec/multistream/receiveSlotManager.ts +41 -13
  455. package/test/unit/spec/multistream/remoteMedia.ts +38 -2
  456. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  457. package/test/unit/spec/multistream/remoteMediaManager.ts +412 -65
  458. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  459. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  460. package/test/unit/spec/reachability/index.ts +70 -27
  461. package/test/unit/spec/reachability/request.js +66 -0
  462. package/test/unit/spec/reconnection-manager/index.js +58 -30
  463. package/test/unit/spec/recording-controller/index.js +231 -0
  464. package/test/unit/spec/recording-controller/util.js +102 -0
  465. package/test/unit/spec/roap/index.ts +12 -8
  466. package/test/unit/spec/roap/request.ts +217 -0
  467. package/test/unit/spec/roap/turnDiscovery.ts +72 -49
  468. package/test/unit/spec/stats-analyzer/index.js +86 -57
  469. package/test/utils/cmr.js +44 -42
  470. package/test/utils/constants.js +9 -0
  471. package/test/utils/testUtils.js +98 -77
  472. package/test/utils/webex-config.js +22 -18
  473. package/test/utils/webex-test-users.js +57 -50
  474. package/tsconfig.json +6 -0
  475. package/dist/media/internal-media-core-wrapper.js +0 -22
  476. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  477. package/dist/meeting/effectsState.js +0 -327
  478. package/dist/meeting/effectsState.js.map +0 -1
  479. package/dist/multistream/multistreamMedia.js +0 -116
  480. package/dist/multistream/multistreamMedia.js.map +0 -1
  481. package/dist/peer-connection-manager/util.js +0 -124
  482. package/dist/peer-connection-manager/util.js.map +0 -1
  483. package/src/common/logs/logger-proxy.js +0 -33
  484. package/src/locus-info/controlsUtils.js +0 -102
  485. package/src/media/internal-media-core-wrapper.ts +0 -9
  486. package/src/mediaQualityMetrics/config.js +0 -382
  487. package/src/meeting/effectsState.js +0 -205
  488. package/src/meeting-info/meeting-info-v2.js +0 -255
  489. package/src/meetings/index.js +0 -1015
  490. package/src/multistream/multistreamMedia.ts +0 -92
  491. package/src/peer-connection-manager/util.ts +0 -117
  492. package/src/roap/request.js +0 -127
  493. package/src/statsAnalyzer/global.js +0 -133
  494. package/src/statsAnalyzer/index.js +0 -1006
  495. package/src/statsAnalyzer/mqaUtil.js +0 -173
  496. package/test/unit/spec/meeting/effectsState.js +0 -291
  497. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  498. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -1,7 +1,7 @@
1
1
  import sinon from 'sinon';
2
2
  import {assert} from '@webex/test-helper-chai';
3
3
  import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
4
- import createMuteState from '@webex/plugin-meetings/src/meeting/muteState';
4
+ import {createMuteState} from '@webex/plugin-meetings/src/meeting/muteState';
5
5
  import Media from '@webex/plugin-meetings/src/media/index';
6
6
  import PermissionError from '@webex/plugin-meetings/src/common/errors/permission';
7
7
  import {AUDIO, VIDEO} from '@webex/plugin-meetings/src/constants';
@@ -19,18 +19,18 @@ describe('plugin-meetings', () => {
19
19
  beforeEach(() => {
20
20
  meeting = {
21
21
  mediaProperties: {
22
- audioTrack: 'fake audio track',
23
- videoTrack: 'fake video track'
22
+ audioTrack: {id: 'fake audio track', setMuted: sinon.stub()},
23
+ videoTrack: {id: 'fake video track', setMuted: sinon.stub()},
24
24
  },
25
25
  remoteMuted: false,
26
26
  unmuteAllowed: true,
27
27
  locusInfo: {
28
- onFullLocus: sinon.stub()
28
+ onFullLocus: sinon.stub(),
29
29
  },
30
30
  members: {
31
31
  selfId: 'fake self id',
32
- muteMember: sinon.stub().resolves()
33
- }
32
+ muteMember: sinon.stub().resolves(),
33
+ },
34
34
  };
35
35
  audio = createMuteState(AUDIO, meeting, {sendAudio: true});
36
36
  video = createMuteState(VIDEO, meeting, {sendVideo: true});
@@ -38,7 +38,6 @@ describe('plugin-meetings', () => {
38
38
  originalRemoteUpdateAudioVideo = MeetingUtil.remoteUpdateAudioVideo;
39
39
 
40
40
  MeetingUtil.remoteUpdateAudioVideo = sinon.stub().resolves(fakeLocus);
41
- Media.setLocalTrack = sinon.stub();
42
41
  });
43
42
 
44
43
  afterEach(() => {
@@ -110,8 +109,8 @@ describe('plugin-meetings', () => {
110
109
  audio.handleServerLocalUnmuteRequired(meeting);
111
110
  await testUtils.flushPromises();
112
111
 
113
- // check that local track was enabled
114
- assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.audioTrack);
112
+ // check that local track was unmuted
113
+ assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
115
114
 
116
115
  // and local unmute was sent to server
117
116
  assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
@@ -128,11 +127,14 @@ describe('plugin-meetings', () => {
128
127
  // first we need to mute and make that request last forever
129
128
  let serverResponseResolve;
130
129
 
131
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve) => {
132
- serverResponseResolve = resolve;
133
- }));
130
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
131
+ new Promise((resolve) => {
132
+ serverResponseResolve = resolve;
133
+ })
134
+ );
134
135
 
135
- audio.handleClientRequest(meeting, true)
136
+ audio
137
+ .handleClientRequest(meeting, true)
136
138
  .then(() => {
137
139
  clientPromiseResolved = true;
138
140
  })
@@ -158,48 +160,59 @@ describe('plugin-meetings', () => {
158
160
  assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
159
161
  assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, false, undefined, meeting);
160
162
 
161
- // and local track should be enabled
162
- assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.audioTrack);
163
+ // and local track should be unmuted
164
+ assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
163
165
 
164
166
  assert.isFalse(audio.isMuted());
165
167
  assert.isFalse(audio.isSelf());
166
168
  });
167
169
 
170
+ describe('#isLocallyMuted()', () => {
171
+ it('does not consider remote mute status for audio', async () => {
172
+ // simulate being already remote muted
173
+ meeting.remoteMuted = true;
174
+ // create a new MuteState intance
175
+ audio = createMuteState(AUDIO, meeting, {sendAudio: true});
176
+
177
+ assert.isFalse(audio.isLocallyMuted());
178
+ });
179
+ });
180
+
168
181
  describe('#handleClientRequest', () => {
169
182
  it('disables/enables the local audio track when audio is muted/unmuted', async () => {
170
183
  // mute
171
184
  audio.handleClientRequest(meeting, true);
172
- assert.calledWith(Media.setLocalTrack, false, meeting.mediaProperties.audioTrack);
185
+ assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, true);
173
186
 
174
- // even when calling mute when it's already muted should still call setLocalTrack
187
+ // even when calling mute when it's already muted should still call setMuted
175
188
  audio.handleClientRequest(meeting, true);
176
- assert.calledWith(Media.setLocalTrack, false, meeting.mediaProperties.audioTrack);
189
+ assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, true);
177
190
 
178
191
  // unmute
179
192
  audio.handleClientRequest(meeting, false);
180
- assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.audioTrack);
193
+ assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
181
194
 
182
- // even when calling unmute when it's already unmuted should still call setLocalTrack
195
+ // even when calling unmute when it's already unmuted should still call setMuted
183
196
  audio.handleClientRequest(meeting, false);
184
- assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.audioTrack);
197
+ assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
185
198
  });
186
199
 
187
200
  it('disables/enables the local video track when video is muted/unmuted', async () => {
188
201
  // mute
189
202
  video.handleClientRequest(meeting, true);
190
- assert.calledWith(Media.setLocalTrack, false, meeting.mediaProperties.videoTrack);
203
+ assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, true);
191
204
 
192
- // even when calling mute when it's already muted should still call setLocalTrack
205
+ // even when calling mute when it's already muted should still call setMuted
193
206
  video.handleClientRequest(meeting, false);
194
- assert.calledWith(Media.setLocalTrack, false, meeting.mediaProperties.videoTrack);
207
+ assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, true);
195
208
 
196
209
  // unmute
197
210
  video.handleClientRequest(meeting, false);
198
- assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.videoTrack);
211
+ assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
199
212
 
200
- // even when calling unmute when it's already unmuted should still call setLocalTrack
213
+ // even when calling unmute when it's already unmuted should still call setMuted
201
214
  video.handleClientRequest(meeting, false);
202
- assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.videoTrack);
215
+ assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
203
216
  });
204
217
 
205
218
  it('returns correct value in isMuted()/isSelf() methods after client mute/unmute requests', async () => {
@@ -236,14 +249,15 @@ describe('plugin-meetings', () => {
236
249
 
237
250
  let serverResponseResolve;
238
251
 
239
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve) => {
240
- serverResponseResolve = resolve;
241
- }));
252
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
253
+ new Promise((resolve) => {
254
+ serverResponseResolve = resolve;
255
+ })
256
+ );
242
257
 
243
- audio.handleClientRequest(meeting, true)
244
- .then(() => {
245
- clientPromiseResolved = true;
246
- });
258
+ audio.handleClientRequest(meeting, true).then(() => {
259
+ clientPromiseResolved = true;
260
+ });
247
261
 
248
262
  // do a small delay to make sure that the client promise doesn't resolve in that time
249
263
  await testUtils.waitUntil(200);
@@ -257,9 +271,11 @@ describe('plugin-meetings', () => {
257
271
  });
258
272
 
259
273
  it('rejects client request promise if server request for local mute fails', async () => {
260
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve, reject) => {
261
- reject();
262
- }));
274
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
275
+ new Promise((resolve, reject) => {
276
+ reject();
277
+ })
278
+ );
263
279
 
264
280
  assert.isRejected(audio.handleClientRequest(meeting, true));
265
281
  });
@@ -282,9 +298,11 @@ describe('plugin-meetings', () => {
282
298
  it('does not send a server request if client state matches the server', async () => {
283
299
  let serverResponseResolve;
284
300
 
285
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve) => {
286
- serverResponseResolve = resolve;
287
- }));
301
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
302
+ new Promise((resolve) => {
303
+ serverResponseResolve = resolve;
304
+ })
305
+ );
288
306
 
289
307
  // simulate many client requests, with the last one matching the initial one
290
308
  audio.handleClientRequest(meeting, true);
@@ -309,22 +327,22 @@ describe('plugin-meetings', () => {
309
327
  it('queues up server requests when multiple client requests are received', async () => {
310
328
  let serverResponseResolve;
311
329
 
312
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve) => {
313
- serverResponseResolve = resolve;
314
- }));
330
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
331
+ new Promise((resolve) => {
332
+ serverResponseResolve = resolve;
333
+ })
334
+ );
315
335
 
316
336
  let firstClientPromiseResolved = false;
317
337
  let secondClientPromiseResolved = false;
318
338
 
319
339
  // 2 client requests, one after another without waiting for first one to resolve
320
- audio.handleClientRequest(meeting, true)
321
- .then(() => {
322
- firstClientPromiseResolved = true;
323
- });
324
- audio.handleClientRequest(meeting, false)
325
- .then(() => {
326
- secondClientPromiseResolved = true;
327
- });
340
+ audio.handleClientRequest(meeting, true).then(() => {
341
+ firstClientPromiseResolved = true;
342
+ });
343
+ audio.handleClientRequest(meeting, false).then(() => {
344
+ secondClientPromiseResolved = true;
345
+ });
328
346
 
329
347
  await testUtils.flushPromises();
330
348
 
@@ -351,7 +369,8 @@ describe('plugin-meetings', () => {
351
369
  it('rejects client request to unmute if hard mute is used', (done) => {
352
370
  audio.handleServerRemoteMuteUpdate(true, false);
353
371
 
354
- audio.handleClientRequest(meeting, false)
372
+ audio
373
+ .handleClientRequest(meeting, false)
355
374
  .then(() => {
356
375
  done(new Error('expected handleClientRequest to fail, but it did not!'));
357
376
  })
@@ -369,11 +388,11 @@ describe('plugin-meetings', () => {
369
388
  assert.isTrue(video.isSelf());
370
389
 
371
390
  // check local mute is done, but not remote one
372
- assert.calledWith(Media.setLocalTrack, false, meeting.mediaProperties.videoTrack);
391
+ assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, true);
373
392
  assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, undefined, true, meeting);
374
393
  assert.notCalled(meeting.members.muteMember);
375
394
 
376
- Media.setLocalTrack.resetHistory();
395
+ meeting.mediaProperties.videoTrack.setMuted.resetHistory();
377
396
  MeetingUtil.remoteUpdateAudioVideo.resetHistory();
378
397
  meeting.members.muteMember.resetHistory();
379
398
 
@@ -383,7 +402,7 @@ describe('plugin-meetings', () => {
383
402
  assert.isFalse(video.isMuted());
384
403
  assert.isFalse(video.isSelf());
385
404
 
386
- assert.calledWith(Media.setLocalTrack, true, meeting.mediaProperties.videoTrack);
405
+ assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
387
406
  assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, undefined, false, meeting);
388
407
  assert.notCalled(meeting.members.muteMember);
389
408
  });
@@ -1,7 +1,6 @@
1
1
  import sinon from 'sinon';
2
2
  import {assert} from '@webex/test-helper-chai';
3
3
  import MockWebex from '@webex/test-helper-mock-webex';
4
-
5
4
  import Meetings from '@webex/plugin-meetings';
6
5
  import MeetingRequest from '@webex/plugin-meetings/src/meeting/request';
7
6
 
@@ -11,26 +10,30 @@ describe('plugin-meetings', () => {
11
10
  beforeEach(() => {
12
11
  const webex = new MockWebex({
13
12
  children: {
14
- meetings: Meetings
15
- }
13
+ meetings: Meetings,
14
+ },
16
15
  });
17
16
 
18
17
  webex.meetings.clientRegion = {
19
18
  countryCode: 'US',
20
- regionCode: 'WEST-COAST'
19
+ regionCode: 'WEST-COAST',
21
20
  };
22
21
 
23
22
  webex.internal = {
24
23
  services: {
25
24
  get: sinon.mock().returns('locusUrl'),
26
- waitForCatalog: sinon.mock().returns(Promise.resolve({}))
27
- }
25
+ waitForCatalog: sinon.mock().returns(Promise.resolve({})),
26
+ },
28
27
  };
29
28
 
30
- meetingsRequest = new MeetingRequest({}, {
31
- parent: webex
32
- });
29
+ webex.boundedStorage.get = sinon.mock().returns(Promise.resolve(JSON.stringify({anycastEntryPoint: "aws-eu-west-1"})))
33
30
 
31
+ meetingsRequest = new MeetingRequest(
32
+ {},
33
+ {
34
+ parent: webex,
35
+ }
36
+ );
34
37
 
35
38
  meetingsRequest.request = sinon.mock().returns(Promise.resolve({}));
36
39
  });
@@ -45,7 +48,7 @@ describe('plugin-meetings', () => {
45
48
  await meetingsRequest.sendDTMF({
46
49
  locusUrl,
47
50
  deviceUrl,
48
- tones
51
+ tones,
49
52
  });
50
53
  const requestParams = meetingsRequest.request.getCall(0).args[0];
51
54
 
@@ -67,7 +70,7 @@ describe('plugin-meetings', () => {
67
70
  deviceUrl,
68
71
  layoutType,
69
72
  main: {width: 640, height: 480},
70
- content: {width: 1280, height: 720}
73
+ content: {width: 1280, height: 720},
71
74
  });
72
75
  const requestParams = meetingsRequest.request.getCall(0).args[0];
73
76
 
@@ -75,43 +78,53 @@ describe('plugin-meetings', () => {
75
78
  assert.equal(requestParams.uri, `${locusUrl}/controls`);
76
79
  assert.equal(requestParams.body.layout.type, layoutType);
77
80
  assert.equal(requestParams.body.layout.deviceUrl, deviceUrl);
78
- assert.deepEqual(requestParams.body.layout.layoutParams, {renderInfo: {main: {width: 640, height: 480}, content: {width: 1280, height: 720}}});
81
+ assert.deepEqual(requestParams.body.layout.layoutParams, {
82
+ renderInfo: {main: {width: 640, height: 480}, content: {width: 1280, height: 720}},
83
+ });
79
84
  });
80
85
 
81
86
  it('throws if width is missing for main', async () => {
82
- await assert.isRejected(meetingsRequest.changeVideoLayout({
83
- locusUrl,
84
- deviceUrl,
85
- layoutType,
86
- main: {height: 100}
87
- }));
87
+ await assert.isRejected(
88
+ meetingsRequest.changeVideoLayout({
89
+ locusUrl,
90
+ deviceUrl,
91
+ layoutType,
92
+ main: {height: 100},
93
+ })
94
+ );
88
95
  });
89
96
 
90
97
  it('throws if height is missing for main', async () => {
91
- await assert.isRejected(meetingsRequest.changeVideoLayout({
92
- locusUrl,
93
- deviceUrl,
94
- layoutType,
95
- main: {width: 100}
96
- }));
98
+ await assert.isRejected(
99
+ meetingsRequest.changeVideoLayout({
100
+ locusUrl,
101
+ deviceUrl,
102
+ layoutType,
103
+ main: {width: 100},
104
+ })
105
+ );
97
106
  });
98
107
 
99
108
  it('throws if width is missing for content', async () => {
100
- await assert.isRejected(meetingsRequest.changeVideoLayout({
101
- locusUrl,
102
- deviceUrl,
103
- layoutType,
104
- content: {height: 100}
105
- }));
109
+ await assert.isRejected(
110
+ meetingsRequest.changeVideoLayout({
111
+ locusUrl,
112
+ deviceUrl,
113
+ layoutType,
114
+ content: {height: 100},
115
+ })
116
+ );
106
117
  });
107
118
 
108
119
  it('throws if height is missing for content', async () => {
109
- await assert.isRejected(meetingsRequest.changeVideoLayout({
110
- locusUrl,
111
- deviceUrl,
112
- layoutType,
113
- content: {width: 100}
114
- }));
120
+ await assert.isRejected(
121
+ meetingsRequest.changeVideoLayout({
122
+ locusUrl,
123
+ deviceUrl,
124
+ layoutType,
125
+ content: {width: 100},
126
+ })
127
+ );
115
128
  });
116
129
  });
117
130
 
@@ -128,8 +141,7 @@ describe('plugin-meetings', () => {
128
141
  deviceUrl,
129
142
  correlationId,
130
143
  roapMessage,
131
- permissionToken
132
-
144
+ permissionToken,
133
145
  });
134
146
  const requestParams = meetingsRequest.request.getCall(0).args[0];
135
147
 
@@ -151,7 +163,7 @@ describe('plugin-meetings', () => {
151
163
  deviceUrl,
152
164
  correlationId,
153
165
  roapMessage,
154
- meetingNumber
166
+ meetingNumber,
155
167
  });
156
168
  const requestParams = meetingsRequest.request.getCall(0).args[0];
157
169
 
@@ -172,7 +184,7 @@ describe('plugin-meetings', () => {
172
184
  correlationId,
173
185
  roapMessage,
174
186
  meetingNumber,
175
- inviteeAddress
187
+ inviteeAddress,
176
188
  });
177
189
  const requestParams = meetingsRequest.request.getCall(0).args[0];
178
190
 
@@ -180,6 +192,48 @@ describe('plugin-meetings', () => {
180
192
  assert.equal(requestParams.uri, 'locusUrl/loci/call?alternateRedirect=true');
181
193
  assert.equal(requestParams.body.invitee.address, 'sipUrl');
182
194
  });
195
+
196
+ it('adds deviceCapabilities to request when breakouts are supported', async () => {
197
+ await meetingsRequest.joinMeeting({
198
+ breakoutsSupported: true
199
+ });
200
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
201
+
202
+ assert.deepEqual(requestParams.body.deviceCapabilities, ['BREAKOUTS_SUPPORTED']);
203
+ });
204
+
205
+ it('does not add deviceCapabilities to request when breakouts are not supported', async () => {
206
+ await meetingsRequest.joinMeeting({});
207
+
208
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
209
+
210
+ assert.deepEqual(requestParams.body.deviceCapabilities, undefined);
211
+
212
+ });
213
+
214
+ it('includes joinCookie correctly', async () => {
215
+ const locusUrl = 'locusURL';
216
+ const deviceUrl = 'deviceUrl';
217
+ const correlationId = 'random-uuid';
218
+ const roapMessage = 'roap-message';
219
+ const permissionToken = 'permission-token';
220
+
221
+ await meetingsRequest.joinMeeting({
222
+ locusUrl,
223
+ deviceUrl,
224
+ correlationId,
225
+ roapMessage,
226
+ permissionToken,
227
+ });
228
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
229
+
230
+ assert.equal(requestParams.method, 'POST');
231
+ assert.equal(requestParams.uri, `${locusUrl}/participant?alternateRedirect=true`);
232
+ assert.deepEqual(requestParams.body.clientMediaPreferences, {
233
+ "joinCookie": {anycastEntryPoint: "aws-eu-west-1"},
234
+ "preferTranscoding": true
235
+ });
236
+ });
183
237
  });
184
238
 
185
239
  describe('#pstn', () => {
@@ -193,7 +247,7 @@ describe('plugin-meetings', () => {
193
247
  locusUrl,
194
248
  clientUrl,
195
249
  correlationId,
196
- dialInUrl
250
+ dialInUrl,
197
251
  });
198
252
  const requestParams = meetingsRequest.request.getCall(0).args[0];
199
253
 
@@ -217,7 +271,7 @@ describe('plugin-meetings', () => {
217
271
  clientUrl,
218
272
  correlationId,
219
273
  dialOutUrl,
220
- phoneNumber
274
+ phoneNumber,
221
275
  });
222
276
  const requestParams = meetingsRequest.request.getCall(0).args[0];
223
277
 
@@ -240,7 +294,7 @@ describe('plugin-meetings', () => {
240
294
  locusUrl,
241
295
  selfId,
242
296
  correlationId,
243
- phoneUrl
297
+ phoneUrl,
244
298
  });
245
299
  const requestParams = meetingsRequest.request.getCall(0).args[0];
246
300
 
@@ -278,5 +332,49 @@ describe('plugin-meetings', () => {
278
332
  assert.equal(requestParams.uri, keepAliveUrl);
279
333
  });
280
334
  });
335
+
336
+ describe('#sendReaction', () => {
337
+ it('sends request to sendReaction', async () => {
338
+ const reactionChannelUrl = 'reactionChannelUrl';
339
+ const participantId = 'participantId';
340
+ const reaction = {
341
+ type: 'thumb_down',
342
+ codepoints: '1F44E',
343
+ shortcodes: ':thumbsdown:',
344
+ tone: {type: 'normal_skin_tone', codepoints: '', shortcodes: ''},
345
+ };
346
+
347
+ await meetingsRequest.sendReaction({
348
+ reactionChannelUrl,
349
+ reaction,
350
+ participantId,
351
+ });
352
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
353
+
354
+ assert.equal(requestParams.method, 'POST');
355
+ assert.equal(requestParams.uri, reactionChannelUrl);
356
+ assert.equal(requestParams.body.sender.participantId, participantId);
357
+ assert.equal(requestParams.body.reaction, reaction);
358
+ });
359
+ });
360
+
361
+ describe('#toggleReactions', () => {
362
+ it('sends request to toggleReactions', async () => {
363
+ const locusUrl = 'locusUrl';
364
+ const requestingParticipantId = 'requestingParticipantId';
365
+
366
+ await meetingsRequest.toggleReactions({
367
+ enable: true,
368
+ locusUrl,
369
+ requestingParticipantId,
370
+ });
371
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
372
+
373
+ assert.equal(requestParams.method, 'PUT');
374
+ assert.equal(requestParams.uri, `${locusUrl}/controls`);
375
+ assert.equal(requestParams.body.reactions.enabled, true);
376
+ assert.equal(requestParams.body.requestingParticipantId, requestingParticipantId);
377
+ });
378
+ });
281
379
  });
282
380
  });