@webex/plugin-meetings 3.0.0-beta.7 → 3.0.0-beta.71

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