@webex/plugin-meetings 3.0.0-beta.2 → 3.0.0-beta.20

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 (365) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/breakouts/breakout.js +116 -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/index.js +226 -0
  8. package/dist/breakouts/index.js.map +1 -0
  9. package/dist/common/browser-detection.js +1 -20
  10. package/dist/common/browser-detection.js.map +1 -1
  11. package/dist/common/collection.js +5 -20
  12. package/dist/common/collection.js.map +1 -1
  13. package/dist/common/config.js +0 -7
  14. package/dist/common/config.js.map +1 -1
  15. package/dist/common/errors/captcha-error.js +10 -24
  16. package/dist/common/errors/captcha-error.js.map +1 -1
  17. package/dist/common/errors/intent-to-join.js +11 -24
  18. package/dist/common/errors/intent-to-join.js.map +1 -1
  19. package/dist/common/errors/join-meeting.js +12 -25
  20. package/dist/common/errors/join-meeting.js.map +1 -1
  21. package/dist/common/errors/media.js +10 -24
  22. package/dist/common/errors/media.js.map +1 -1
  23. package/dist/common/errors/parameter.js +5 -33
  24. package/dist/common/errors/parameter.js.map +1 -1
  25. package/dist/common/errors/password-error.js +10 -24
  26. package/dist/common/errors/password-error.js.map +1 -1
  27. package/dist/common/errors/permission.js +9 -23
  28. package/dist/common/errors/permission.js.map +1 -1
  29. package/dist/common/errors/reconnection-in-progress.js +0 -17
  30. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  31. package/dist/common/errors/reconnection.js +10 -24
  32. package/dist/common/errors/reconnection.js.map +1 -1
  33. package/dist/common/errors/stats.js +10 -24
  34. package/dist/common/errors/stats.js.map +1 -1
  35. package/dist/common/errors/webex-errors.js +6 -41
  36. package/dist/common/errors/webex-errors.js.map +1 -1
  37. package/dist/common/errors/webex-meetings-error.js +5 -25
  38. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  39. package/dist/common/events/events-scope.js +0 -22
  40. package/dist/common/events/events-scope.js.map +1 -1
  41. package/dist/common/events/events.js +0 -23
  42. package/dist/common/events/events.js.map +1 -1
  43. package/dist/common/events/trigger-proxy.js +0 -12
  44. package/dist/common/events/trigger-proxy.js.map +1 -1
  45. package/dist/common/events/util.js +0 -15
  46. package/dist/common/events/util.js.map +1 -1
  47. package/dist/common/logs/logger-config.js +0 -4
  48. package/dist/common/logs/logger-config.js.map +1 -1
  49. package/dist/common/logs/logger-proxy.js +1 -8
  50. package/dist/common/logs/logger-proxy.js.map +1 -1
  51. package/dist/common/logs/request.js +37 -60
  52. package/dist/common/logs/request.js.map +1 -1
  53. package/dist/common/queue.js +4 -14
  54. package/dist/common/queue.js.map +1 -1
  55. package/dist/config.js +6 -6
  56. package/dist/config.js.map +1 -1
  57. package/dist/constants.js +88 -46
  58. package/dist/constants.js.map +1 -1
  59. package/dist/index.js +1 -17
  60. package/dist/index.js.map +1 -1
  61. package/dist/locus-info/controlsUtils.js +12 -29
  62. package/dist/locus-info/controlsUtils.js.map +1 -1
  63. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  64. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  65. package/dist/locus-info/fullState.js +0 -15
  66. package/dist/locus-info/fullState.js.map +1 -1
  67. package/dist/locus-info/hostUtils.js +4 -12
  68. package/dist/locus-info/hostUtils.js.map +1 -1
  69. package/dist/locus-info/index.js +184 -190
  70. package/dist/locus-info/index.js.map +1 -1
  71. package/dist/locus-info/infoUtils.js +3 -37
  72. package/dist/locus-info/infoUtils.js.map +1 -1
  73. package/dist/locus-info/mediaSharesUtils.js +12 -38
  74. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  75. package/dist/locus-info/parser.js +92 -118
  76. package/dist/locus-info/parser.js.map +1 -1
  77. package/dist/locus-info/selfUtils.js +34 -91
  78. package/dist/locus-info/selfUtils.js.map +1 -1
  79. package/dist/media/index.js +67 -111
  80. package/dist/media/index.js.map +1 -1
  81. package/dist/media/properties.js +80 -114
  82. package/dist/media/properties.js.map +1 -1
  83. package/dist/media/util.js +2 -9
  84. package/dist/media/util.js.map +1 -1
  85. package/dist/mediaQualityMetrics/config.js +10 -12
  86. package/dist/mediaQualityMetrics/config.js.map +1 -1
  87. package/dist/meeting/effectsState.js +125 -190
  88. package/dist/meeting/effectsState.js.map +1 -1
  89. package/dist/meeting/in-meeting-actions.js +5 -14
  90. package/dist/meeting/in-meeting-actions.js.map +1 -1
  91. package/dist/meeting/index.js +1692 -1925
  92. package/dist/meeting/index.js.map +1 -1
  93. package/dist/meeting/muteState.js +36 -77
  94. package/dist/meeting/muteState.js.map +1 -1
  95. package/dist/meeting/request.js +224 -230
  96. package/dist/meeting/request.js.map +1 -1
  97. package/dist/meeting/request.type.js +7 -0
  98. package/dist/meeting/request.type.js.map +1 -0
  99. package/dist/meeting/state.js +21 -31
  100. package/dist/meeting/state.js.map +1 -1
  101. package/dist/meeting/util.js +43 -215
  102. package/dist/meeting/util.js.map +1 -1
  103. package/dist/meeting-info/collection.js +6 -25
  104. package/dist/meeting-info/collection.js.map +1 -1
  105. package/dist/meeting-info/index.js +14 -32
  106. package/dist/meeting-info/index.js.map +1 -1
  107. package/dist/meeting-info/meeting-info-v2.js +193 -268
  108. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  109. package/dist/meeting-info/request.js +3 -15
  110. package/dist/meeting-info/request.js.map +1 -1
  111. package/dist/meeting-info/util.js +98 -183
  112. package/dist/meeting-info/util.js.map +1 -1
  113. package/dist/meeting-info/utilv2.js +137 -228
  114. package/dist/meeting-info/utilv2.js.map +1 -1
  115. package/dist/meetings/collection.js +5 -20
  116. package/dist/meetings/collection.js.map +1 -1
  117. package/dist/meetings/index.js +490 -560
  118. package/dist/meetings/index.js.map +1 -1
  119. package/dist/meetings/request.js +24 -41
  120. package/dist/meetings/request.js.map +1 -1
  121. package/dist/meetings/util.js +99 -155
  122. package/dist/meetings/util.js.map +1 -1
  123. package/dist/member/index.js +78 -86
  124. package/dist/member/index.js.map +1 -1
  125. package/dist/member/util.js +31 -68
  126. package/dist/member/util.js.map +1 -1
  127. package/dist/members/collection.js +3 -12
  128. package/dist/members/collection.js.map +1 -1
  129. package/dist/members/index.js +93 -200
  130. package/dist/members/index.js.map +1 -1
  131. package/dist/members/request.js +16 -39
  132. package/dist/members/request.js.map +1 -1
  133. package/dist/members/util.js +9 -38
  134. package/dist/members/util.js.map +1 -1
  135. package/dist/metrics/config.js +0 -2
  136. package/dist/metrics/config.js.map +1 -1
  137. package/dist/metrics/constants.js +1 -2
  138. package/dist/metrics/constants.js.map +1 -1
  139. package/dist/metrics/index.js +55 -135
  140. package/dist/metrics/index.js.map +1 -1
  141. package/dist/multistream/mediaRequestManager.js +57 -32
  142. package/dist/multistream/mediaRequestManager.js.map +1 -1
  143. package/dist/multistream/multistreamMedia.js +15 -21
  144. package/dist/multistream/multistreamMedia.js.map +1 -1
  145. package/dist/multistream/receiveSlot.js +10 -50
  146. package/dist/multistream/receiveSlot.js.map +1 -1
  147. package/dist/multistream/receiveSlotManager.js +45 -82
  148. package/dist/multistream/receiveSlotManager.js.map +1 -1
  149. package/dist/multistream/remoteMedia.js +18 -58
  150. package/dist/multistream/remoteMedia.js.map +1 -1
  151. package/dist/multistream/remoteMediaGroup.js +6 -40
  152. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  153. package/dist/multistream/remoteMediaManager.js +362 -416
  154. package/dist/multistream/remoteMediaManager.js.map +1 -1
  155. package/dist/networkQualityMonitor/index.js +36 -57
  156. package/dist/networkQualityMonitor/index.js.map +1 -1
  157. package/dist/personal-meeting-room/index.js +21 -45
  158. package/dist/personal-meeting-room/index.js.map +1 -1
  159. package/dist/personal-meeting-room/request.js +1 -31
  160. package/dist/personal-meeting-room/request.js.map +1 -1
  161. package/dist/personal-meeting-room/util.js +0 -13
  162. package/dist/personal-meeting-room/util.js.map +1 -1
  163. package/dist/reachability/index.js +138 -182
  164. package/dist/reachability/index.js.map +1 -1
  165. package/dist/reachability/request.js +3 -18
  166. package/dist/reachability/request.js.map +1 -1
  167. package/dist/reactions/constants.js +13 -0
  168. package/dist/reactions/constants.js.map +1 -0
  169. package/dist/reactions/reactions.js +109 -0
  170. package/dist/reactions/reactions.js.map +1 -0
  171. package/dist/reactions/reactions.type.js +36 -0
  172. package/dist/reactions/reactions.type.js.map +1 -0
  173. package/dist/reconnection-manager/index.js +322 -455
  174. package/dist/reconnection-manager/index.js.map +1 -1
  175. package/dist/recording-controller/enums.js +17 -0
  176. package/dist/recording-controller/enums.js.map +1 -0
  177. package/dist/recording-controller/index.js +343 -0
  178. package/dist/recording-controller/index.js.map +1 -0
  179. package/dist/recording-controller/util.js +63 -0
  180. package/dist/recording-controller/util.js.map +1 -0
  181. package/dist/roap/index.js +39 -64
  182. package/dist/roap/index.js.map +1 -1
  183. package/dist/roap/request.js +94 -113
  184. package/dist/roap/request.js.map +1 -1
  185. package/dist/roap/turnDiscovery.js +85 -94
  186. package/dist/roap/turnDiscovery.js.map +1 -1
  187. package/dist/statsAnalyzer/global.js +0 -2
  188. package/dist/statsAnalyzer/global.js.map +1 -1
  189. package/dist/statsAnalyzer/index.js +85 -175
  190. package/dist/statsAnalyzer/index.js.map +1 -1
  191. package/dist/statsAnalyzer/mqaUtil.js +72 -53
  192. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  193. package/dist/transcription/index.js +22 -47
  194. package/dist/transcription/index.js.map +1 -1
  195. package/internal-README.md +7 -6
  196. package/package.json +25 -20
  197. package/src/breakouts/README.md +190 -0
  198. package/src/breakouts/breakout.ts +110 -0
  199. package/src/breakouts/collection.ts +19 -0
  200. package/src/breakouts/index.ts +225 -0
  201. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  202. package/src/common/collection.ts +9 -7
  203. package/src/common/{config.js → config.ts} +1 -1
  204. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  205. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  206. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  207. package/src/common/errors/{media.js → media.ts} +11 -7
  208. package/src/common/errors/parameter.ts +11 -7
  209. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  210. package/src/common/errors/{permission.js → permission.ts} +10 -6
  211. package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
  212. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  213. package/src/common/errors/{stats.js → stats.ts} +11 -7
  214. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
  215. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  216. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  217. package/src/common/events/{events.js → events.ts} +5 -1
  218. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  219. package/src/common/events/{util.js → util.ts} +2 -3
  220. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  221. package/src/common/logs/logger-proxy.ts +44 -0
  222. package/src/common/logs/{request.js → request.ts} +22 -9
  223. package/src/common/queue.ts +1 -2
  224. package/src/{config.js → config.ts} +17 -12
  225. package/src/constants.ts +40 -1
  226. package/src/index.js +1 -1
  227. package/src/locus-info/controlsUtils.ts +114 -0
  228. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  229. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  230. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  231. package/src/locus-info/{index.js → index.ts} +148 -64
  232. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  233. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  234. package/src/locus-info/{parser.js → parser.ts} +67 -79
  235. package/src/locus-info/{selfUtils.js → selfUtils.ts} +123 -68
  236. package/src/media/{index.js → index.ts} +181 -131
  237. package/src/media/{properties.js → properties.ts} +47 -28
  238. package/src/media/{util.js → util.ts} +2 -2
  239. package/src/mediaQualityMetrics/{config.js → config.ts} +46 -46
  240. package/src/meeting/{effectsState.js → effectsState.ts} +47 -41
  241. package/src/meeting/in-meeting-actions.ts +15 -3
  242. package/src/meeting/{index.js → index.ts} +2263 -1427
  243. package/src/meeting/{muteState.js → muteState.ts} +78 -42
  244. package/src/meeting/{request.js → request.ts} +292 -142
  245. package/src/meeting/request.type.ts +13 -0
  246. package/src/meeting/{state.js → state.ts} +50 -35
  247. package/src/meeting/{util.js → util.ts} +112 -115
  248. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  249. package/src/meeting-info/{index.js → index.ts} +42 -36
  250. package/src/meeting-info/meeting-info-v2.ts +273 -0
  251. package/src/meeting-info/{request.js → request.ts} +14 -4
  252. package/src/meeting-info/{util.js → util.ts} +60 -51
  253. package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
  254. package/src/meetings/{collection.js → collection.ts} +6 -3
  255. package/src/meetings/index.ts +1159 -0
  256. package/src/meetings/{request.js → request.ts} +32 -25
  257. package/src/meetings/{util.js → util.ts} +34 -32
  258. package/src/member/{index.js → index.ts} +102 -56
  259. package/src/member/{util.js → util.ts} +52 -25
  260. package/src/members/{collection.js → collection.ts} +2 -2
  261. package/src/members/{index.js → index.ts} +219 -142
  262. package/src/members/{request.js → request.ts} +60 -16
  263. package/src/members/{util.js → util.ts} +50 -48
  264. package/src/metrics/{config.js → config.ts} +254 -83
  265. package/src/metrics/{constants.js → constants.ts} +0 -2
  266. package/src/metrics/{index.js → index.ts} +106 -74
  267. package/src/multistream/mediaRequestManager.ts +81 -15
  268. package/src/multistream/multistreamMedia.ts +5 -0
  269. package/src/multistream/receiveSlot.ts +18 -12
  270. package/src/multistream/receiveSlotManager.ts +23 -21
  271. package/src/multistream/remoteMedia.ts +15 -5
  272. package/src/multistream/remoteMediaGroup.ts +4 -3
  273. package/src/multistream/remoteMediaManager.ts +153 -37
  274. package/src/networkQualityMonitor/{index.js → index.ts} +37 -25
  275. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  276. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  277. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  278. package/src/reachability/{index.js → index.ts} +99 -83
  279. package/src/reachability/request.ts +39 -33
  280. package/src/reactions/constants.ts +4 -0
  281. package/src/reactions/reactions.ts +104 -0
  282. package/src/reactions/reactions.type.ts +62 -0
  283. package/src/reconnection-manager/{index.js → index.ts} +195 -102
  284. package/src/recording-controller/enums.ts +8 -0
  285. package/src/recording-controller/index.ts +315 -0
  286. package/src/recording-controller/util.ts +58 -0
  287. package/src/roap/{index.js → index.ts} +73 -56
  288. package/src/roap/request.ts +157 -0
  289. package/src/roap/turnDiscovery.ts +77 -37
  290. package/src/statsAnalyzer/{global.js → global.ts} +30 -33
  291. package/src/statsAnalyzer/{index.js → index.ts} +468 -192
  292. package/src/statsAnalyzer/mqaUtil.ts +290 -0
  293. package/src/transcription/{index.js → index.ts} +46 -39
  294. package/test/integration/spec/journey.js +664 -463
  295. package/test/integration/spec/space-meeting.js +320 -206
  296. package/test/integration/spec/transcription.js +7 -8
  297. package/test/unit/spec/breakouts/breakout.ts +119 -0
  298. package/test/unit/spec/breakouts/collection.ts +15 -0
  299. package/test/unit/spec/breakouts/index.ts +293 -0
  300. package/test/unit/spec/common/browser-detection.js +9 -28
  301. package/test/unit/spec/fixture/locus.js +92 -90
  302. package/test/unit/spec/locus-info/controlsUtils.js +25 -5
  303. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  304. package/test/unit/spec/locus-info/index.js +104 -2
  305. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  306. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  307. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  308. package/test/unit/spec/locus-info/parser.js +3 -9
  309. package/test/unit/spec/locus-info/selfConstant.js +97 -103
  310. package/test/unit/spec/locus-info/selfUtils.js +105 -12
  311. package/test/unit/spec/media/index.ts +31 -47
  312. package/test/unit/spec/media/properties.ts +9 -9
  313. package/test/unit/spec/meeting/effectsState.js +39 -45
  314. package/test/unit/spec/meeting/in-meeting-actions.ts +5 -2
  315. package/test/unit/spec/meeting/index.js +2017 -742
  316. package/test/unit/spec/meeting/muteState.js +42 -33
  317. package/test/unit/spec/meeting/request.js +115 -44
  318. package/test/unit/spec/meeting/utils.js +104 -171
  319. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  320. package/test/unit/spec/meeting-info/request.js +7 -9
  321. package/test/unit/spec/meeting-info/util.js +11 -12
  322. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  323. package/test/unit/spec/meetings/collection.js +1 -1
  324. package/test/unit/spec/meetings/index.js +439 -257
  325. package/test/unit/spec/meetings/utils.js +14 -12
  326. package/test/unit/spec/member/index.js +0 -1
  327. package/test/unit/spec/member/util.js +31 -7
  328. package/test/unit/spec/members/index.js +104 -54
  329. package/test/unit/spec/members/request.js +29 -20
  330. package/test/unit/spec/members/utils.js +8 -5
  331. package/test/unit/spec/metrics/index.js +16 -21
  332. package/test/unit/spec/multistream/mediaRequestManager.ts +316 -50
  333. package/test/unit/spec/multistream/receiveSlot.ts +6 -6
  334. package/test/unit/spec/multistream/receiveSlotManager.ts +13 -13
  335. package/test/unit/spec/multistream/remoteMedia.ts +10 -2
  336. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  337. package/test/unit/spec/multistream/remoteMediaManager.ts +412 -65
  338. package/test/unit/spec/networkQualityMonitor/index.js +21 -15
  339. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  340. package/test/unit/spec/reachability/index.ts +58 -26
  341. package/test/unit/spec/reconnection-manager/index.js +102 -9
  342. package/test/unit/spec/recording-controller/index.js +231 -0
  343. package/test/unit/spec/recording-controller/util.js +102 -0
  344. package/test/unit/spec/roap/index.ts +2 -1
  345. package/test/unit/spec/roap/request.ts +114 -0
  346. package/test/unit/spec/roap/turnDiscovery.ts +64 -45
  347. package/test/unit/spec/stats-analyzer/index.js +27 -22
  348. package/test/utils/cmr.js +44 -42
  349. package/test/utils/testUtils.js +83 -74
  350. package/test/utils/webex-config.js +18 -18
  351. package/test/utils/webex-test-users.js +54 -50
  352. package/tsconfig.json +6 -0
  353. package/dist/media/internal-media-core-wrapper.js +0 -22
  354. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  355. package/dist/peer-connection-manager/util.js +0 -124
  356. package/dist/peer-connection-manager/util.js.map +0 -1
  357. package/src/common/logs/logger-proxy.js +0 -33
  358. package/src/locus-info/controlsUtils.js +0 -102
  359. package/src/media/internal-media-core-wrapper.ts +0 -9
  360. package/src/meeting-info/meeting-info-v2.js +0 -255
  361. package/src/meetings/index.js +0 -1015
  362. package/src/peer-connection-manager/util.ts +0 -117
  363. package/src/roap/request.js +0 -127
  364. package/src/statsAnalyzer/mqaUtil.js +0 -173
  365. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
@@ -20,17 +20,17 @@ describe('plugin-meetings', () => {
20
20
  meeting = {
21
21
  mediaProperties: {
22
22
  audioTrack: 'fake audio track',
23
- videoTrack: 'fake video track'
23
+ videoTrack: 'fake video track',
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});
@@ -128,11 +128,14 @@ describe('plugin-meetings', () => {
128
128
  // first we need to mute and make that request last forever
129
129
  let serverResponseResolve;
130
130
 
131
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve) => {
132
- serverResponseResolve = resolve;
133
- }));
131
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
132
+ new Promise((resolve) => {
133
+ serverResponseResolve = resolve;
134
+ })
135
+ );
134
136
 
135
- audio.handleClientRequest(meeting, true)
137
+ audio
138
+ .handleClientRequest(meeting, true)
136
139
  .then(() => {
137
140
  clientPromiseResolved = true;
138
141
  })
@@ -236,14 +239,15 @@ describe('plugin-meetings', () => {
236
239
 
237
240
  let serverResponseResolve;
238
241
 
239
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve) => {
240
- serverResponseResolve = resolve;
241
- }));
242
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
243
+ new Promise((resolve) => {
244
+ serverResponseResolve = resolve;
245
+ })
246
+ );
242
247
 
243
- audio.handleClientRequest(meeting, true)
244
- .then(() => {
245
- clientPromiseResolved = true;
246
- });
248
+ audio.handleClientRequest(meeting, true).then(() => {
249
+ clientPromiseResolved = true;
250
+ });
247
251
 
248
252
  // do a small delay to make sure that the client promise doesn't resolve in that time
249
253
  await testUtils.waitUntil(200);
@@ -257,9 +261,11 @@ describe('plugin-meetings', () => {
257
261
  });
258
262
 
259
263
  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
- }));
264
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
265
+ new Promise((resolve, reject) => {
266
+ reject();
267
+ })
268
+ );
263
269
 
264
270
  assert.isRejected(audio.handleClientRequest(meeting, true));
265
271
  });
@@ -282,9 +288,11 @@ describe('plugin-meetings', () => {
282
288
  it('does not send a server request if client state matches the server', async () => {
283
289
  let serverResponseResolve;
284
290
 
285
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve) => {
286
- serverResponseResolve = resolve;
287
- }));
291
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
292
+ new Promise((resolve) => {
293
+ serverResponseResolve = resolve;
294
+ })
295
+ );
288
296
 
289
297
  // simulate many client requests, with the last one matching the initial one
290
298
  audio.handleClientRequest(meeting, true);
@@ -309,22 +317,22 @@ describe('plugin-meetings', () => {
309
317
  it('queues up server requests when multiple client requests are received', async () => {
310
318
  let serverResponseResolve;
311
319
 
312
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve) => {
313
- serverResponseResolve = resolve;
314
- }));
320
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
321
+ new Promise((resolve) => {
322
+ serverResponseResolve = resolve;
323
+ })
324
+ );
315
325
 
316
326
  let firstClientPromiseResolved = false;
317
327
  let secondClientPromiseResolved = false;
318
328
 
319
329
  // 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
- });
330
+ audio.handleClientRequest(meeting, true).then(() => {
331
+ firstClientPromiseResolved = true;
332
+ });
333
+ audio.handleClientRequest(meeting, false).then(() => {
334
+ secondClientPromiseResolved = true;
335
+ });
328
336
 
329
337
  await testUtils.flushPromises();
330
338
 
@@ -351,7 +359,8 @@ describe('plugin-meetings', () => {
351
359
  it('rejects client request to unmute if hard mute is used', (done) => {
352
360
  audio.handleServerRemoteMuteUpdate(true, false);
353
361
 
354
- audio.handleClientRequest(meeting, false)
362
+ audio
363
+ .handleClientRequest(meeting, false)
355
364
  .then(() => {
356
365
  done(new Error('expected handleClientRequest to fail, but it did not!'));
357
366
  })
@@ -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,28 @@ 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
- });
33
-
29
+ meetingsRequest = new MeetingRequest(
30
+ {},
31
+ {
32
+ parent: webex,
33
+ }
34
+ );
34
35
 
35
36
  meetingsRequest.request = sinon.mock().returns(Promise.resolve({}));
36
37
  });
@@ -45,7 +46,7 @@ describe('plugin-meetings', () => {
45
46
  await meetingsRequest.sendDTMF({
46
47
  locusUrl,
47
48
  deviceUrl,
48
- tones
49
+ tones,
49
50
  });
50
51
  const requestParams = meetingsRequest.request.getCall(0).args[0];
51
52
 
@@ -67,7 +68,7 @@ describe('plugin-meetings', () => {
67
68
  deviceUrl,
68
69
  layoutType,
69
70
  main: {width: 640, height: 480},
70
- content: {width: 1280, height: 720}
71
+ content: {width: 1280, height: 720},
71
72
  });
72
73
  const requestParams = meetingsRequest.request.getCall(0).args[0];
73
74
 
@@ -75,43 +76,53 @@ describe('plugin-meetings', () => {
75
76
  assert.equal(requestParams.uri, `${locusUrl}/controls`);
76
77
  assert.equal(requestParams.body.layout.type, layoutType);
77
78
  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}}});
79
+ assert.deepEqual(requestParams.body.layout.layoutParams, {
80
+ renderInfo: {main: {width: 640, height: 480}, content: {width: 1280, height: 720}},
81
+ });
79
82
  });
80
83
 
81
84
  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
- }));
85
+ await assert.isRejected(
86
+ meetingsRequest.changeVideoLayout({
87
+ locusUrl,
88
+ deviceUrl,
89
+ layoutType,
90
+ main: {height: 100},
91
+ })
92
+ );
88
93
  });
89
94
 
90
95
  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
- }));
96
+ await assert.isRejected(
97
+ meetingsRequest.changeVideoLayout({
98
+ locusUrl,
99
+ deviceUrl,
100
+ layoutType,
101
+ main: {width: 100},
102
+ })
103
+ );
97
104
  });
98
105
 
99
106
  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
- }));
107
+ await assert.isRejected(
108
+ meetingsRequest.changeVideoLayout({
109
+ locusUrl,
110
+ deviceUrl,
111
+ layoutType,
112
+ content: {height: 100},
113
+ })
114
+ );
106
115
  });
107
116
 
108
117
  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
- }));
118
+ await assert.isRejected(
119
+ meetingsRequest.changeVideoLayout({
120
+ locusUrl,
121
+ deviceUrl,
122
+ layoutType,
123
+ content: {width: 100},
124
+ })
125
+ );
115
126
  });
116
127
  });
117
128
 
@@ -128,8 +139,7 @@ describe('plugin-meetings', () => {
128
139
  deviceUrl,
129
140
  correlationId,
130
141
  roapMessage,
131
- permissionToken
132
-
142
+ permissionToken,
133
143
  });
134
144
  const requestParams = meetingsRequest.request.getCall(0).args[0];
135
145
 
@@ -151,7 +161,7 @@ describe('plugin-meetings', () => {
151
161
  deviceUrl,
152
162
  correlationId,
153
163
  roapMessage,
154
- meetingNumber
164
+ meetingNumber,
155
165
  });
156
166
  const requestParams = meetingsRequest.request.getCall(0).args[0];
157
167
 
@@ -172,7 +182,7 @@ describe('plugin-meetings', () => {
172
182
  correlationId,
173
183
  roapMessage,
174
184
  meetingNumber,
175
- inviteeAddress
185
+ inviteeAddress,
176
186
  });
177
187
  const requestParams = meetingsRequest.request.getCall(0).args[0];
178
188
 
@@ -180,6 +190,23 @@ describe('plugin-meetings', () => {
180
190
  assert.equal(requestParams.uri, 'locusUrl/loci/call?alternateRedirect=true');
181
191
  assert.equal(requestParams.body.invitee.address, 'sipUrl');
182
192
  });
193
+
194
+ it('adds deviceCapabilities to request when breakouts are supported', async () => {
195
+ await meetingsRequest.joinMeeting({
196
+ breakoutsSupported: true
197
+ });
198
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
199
+
200
+ assert.deepEqual(requestParams.body.deviceCapabilities, ['BREAKOUTS_SUPPORTED']);
201
+ });
202
+
203
+ it('does not add deviceCapabilities to request when breakouts are not supported', async () => {
204
+ await meetingsRequest.joinMeeting({});
205
+
206
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
207
+
208
+ assert.deepEqual(requestParams.body.deviceCapabilities, undefined);
209
+ });
183
210
  });
184
211
 
185
212
  describe('#pstn', () => {
@@ -193,7 +220,7 @@ describe('plugin-meetings', () => {
193
220
  locusUrl,
194
221
  clientUrl,
195
222
  correlationId,
196
- dialInUrl
223
+ dialInUrl,
197
224
  });
198
225
  const requestParams = meetingsRequest.request.getCall(0).args[0];
199
226
 
@@ -217,7 +244,7 @@ describe('plugin-meetings', () => {
217
244
  clientUrl,
218
245
  correlationId,
219
246
  dialOutUrl,
220
- phoneNumber
247
+ phoneNumber,
221
248
  });
222
249
  const requestParams = meetingsRequest.request.getCall(0).args[0];
223
250
 
@@ -240,7 +267,7 @@ describe('plugin-meetings', () => {
240
267
  locusUrl,
241
268
  selfId,
242
269
  correlationId,
243
- phoneUrl
270
+ phoneUrl,
244
271
  });
245
272
  const requestParams = meetingsRequest.request.getCall(0).args[0];
246
273
 
@@ -278,5 +305,49 @@ describe('plugin-meetings', () => {
278
305
  assert.equal(requestParams.uri, keepAliveUrl);
279
306
  });
280
307
  });
308
+
309
+ describe('#sendReaction', () => {
310
+ it('sends request to sendReaction', async () => {
311
+ const reactionChannelUrl = 'reactionChannelUrl';
312
+ const participantId = 'participantId';
313
+ const reaction = {
314
+ type: 'thumb_down',
315
+ codepoints: '1F44E',
316
+ shortcodes: ':thumbsdown:',
317
+ tone: {type: 'normal_skin_tone', codepoints: '', shortcodes: ''},
318
+ };
319
+
320
+ await meetingsRequest.sendReaction({
321
+ reactionChannelUrl,
322
+ reaction,
323
+ participantId,
324
+ });
325
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
326
+
327
+ assert.equal(requestParams.method, 'POST');
328
+ assert.equal(requestParams.uri, reactionChannelUrl);
329
+ assert.equal(requestParams.body.sender.participantId, participantId);
330
+ assert.equal(requestParams.body.reaction, reaction);
331
+ });
332
+ });
333
+
334
+ describe('#toggleReactions', () => {
335
+ it('sends request to toggleReactions', async () => {
336
+ const locusUrl = 'locusUrl';
337
+ const requestingParticipantId = 'requestingParticipantId';
338
+
339
+ await meetingsRequest.toggleReactions({
340
+ enable: true,
341
+ locusUrl,
342
+ requestingParticipantId,
343
+ });
344
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
345
+
346
+ assert.equal(requestParams.method, 'PUT');
347
+ assert.equal(requestParams.uri, `${locusUrl}/controls`);
348
+ assert.equal(requestParams.body.reactions.enabled, true);
349
+ assert.equal(requestParams.body.requestingParticipantId, requestingParticipantId);
350
+ });
351
+ });
281
352
  });
282
353
  });