@webex/plugin-meetings 2.60.0 → 2.60.1-next.10

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 (539) hide show
  1. package/README.md +58 -8
  2. package/dist/annotation/annotation.types.d.ts +42 -0
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.d.ts +31 -0
  6. package/dist/annotation/constants.js +41 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.d.ts +117 -0
  9. package/dist/annotation/index.js +357 -0
  10. package/dist/annotation/index.js.map +1 -0
  11. package/dist/breakouts/breakout.d.ts +8 -0
  12. package/dist/breakouts/breakout.js +215 -0
  13. package/dist/breakouts/breakout.js.map +1 -0
  14. package/dist/breakouts/collection.d.ts +5 -0
  15. package/dist/breakouts/collection.js +22 -0
  16. package/dist/breakouts/collection.js.map +1 -0
  17. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  18. package/dist/breakouts/edit-lock-error.js +51 -0
  19. package/dist/breakouts/edit-lock-error.js.map +1 -0
  20. package/dist/breakouts/events.d.ts +8 -0
  21. package/dist/breakouts/events.js +44 -0
  22. package/dist/breakouts/events.js.map +1 -0
  23. package/dist/breakouts/index.d.ts +5 -0
  24. package/dist/breakouts/index.js +1047 -0
  25. package/dist/breakouts/index.js.map +1 -0
  26. package/dist/breakouts/request.d.ts +22 -0
  27. package/dist/breakouts/request.js +77 -0
  28. package/dist/breakouts/request.js.map +1 -0
  29. package/dist/breakouts/utils.d.ts +15 -0
  30. package/dist/breakouts/utils.js +64 -0
  31. package/dist/breakouts/utils.js.map +1 -0
  32. package/dist/common/browser-detection.js +2 -3
  33. package/dist/common/browser-detection.js.map +1 -1
  34. package/dist/common/collection.js +3 -4
  35. package/dist/common/collection.js.map +1 -1
  36. package/dist/common/config.js +1 -2
  37. package/dist/common/config.js.map +1 -1
  38. package/dist/common/errors/captcha-error.js +1 -2
  39. package/dist/common/errors/captcha-error.js.map +1 -1
  40. package/dist/common/errors/intent-to-join.js +1 -2
  41. package/dist/common/errors/intent-to-join.js.map +1 -1
  42. package/dist/common/errors/join-meeting.js +1 -2
  43. package/dist/common/errors/join-meeting.js.map +1 -1
  44. package/dist/common/errors/media.js +1 -2
  45. package/dist/common/errors/media.js.map +1 -1
  46. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  47. package/dist/common/errors/no-meeting-info.js +50 -0
  48. package/dist/common/errors/no-meeting-info.js.map +1 -0
  49. package/dist/common/errors/parameter.js +3 -4
  50. package/dist/common/errors/parameter.js.map +1 -1
  51. package/dist/common/errors/password-error.js +1 -2
  52. package/dist/common/errors/password-error.js.map +1 -1
  53. package/dist/common/errors/permission.js +1 -2
  54. package/dist/common/errors/permission.js.map +1 -1
  55. package/dist/common/errors/{reclaim-host-role-error.js → reclaim-host-role-errors.js} +7 -11
  56. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  57. package/dist/common/errors/reconnection-in-progress.js +1 -2
  58. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  59. package/dist/common/errors/reconnection.js +1 -2
  60. package/dist/common/errors/reconnection.js.map +1 -1
  61. package/dist/common/errors/stats.js +1 -2
  62. package/dist/common/errors/stats.js.map +1 -1
  63. package/dist/common/errors/webex-errors.d.ts +20 -8
  64. package/dist/common/errors/webex-errors.js +48 -28
  65. package/dist/common/errors/webex-errors.js.map +1 -1
  66. package/dist/common/errors/webex-meetings-error.js +1 -2
  67. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  68. package/dist/common/events/events-scope.js +1 -2
  69. package/dist/common/events/events-scope.js.map +1 -1
  70. package/dist/common/events/events.js +1 -2
  71. package/dist/common/events/events.js.map +1 -1
  72. package/dist/common/events/trigger-proxy.js +1 -2
  73. package/dist/common/events/trigger-proxy.js.map +1 -1
  74. package/dist/common/events/util.js +1 -2
  75. package/dist/common/events/util.js.map +1 -1
  76. package/dist/common/logs/logger-config.js +1 -2
  77. package/dist/common/logs/logger-config.js.map +1 -1
  78. package/dist/common/logs/logger-proxy.js +2 -3
  79. package/dist/common/logs/logger-proxy.js.map +1 -1
  80. package/dist/common/logs/request.d.ts +3 -1
  81. package/dist/common/logs/request.js +8 -5
  82. package/dist/common/logs/request.js.map +1 -1
  83. package/dist/common/queue.d.ts +9 -7
  84. package/dist/common/queue.js +22 -9
  85. package/dist/common/queue.js.map +1 -1
  86. package/dist/config.d.ts +6 -7
  87. package/dist/config.js +8 -10
  88. package/dist/config.js.map +1 -1
  89. package/dist/constants.d.ts +234 -100
  90. package/dist/constants.js +433 -444
  91. package/dist/constants.js.map +1 -1
  92. package/dist/controls-options-manager/constants.js +3 -6
  93. package/dist/controls-options-manager/constants.js.map +1 -1
  94. package/dist/controls-options-manager/enums.d.ts +11 -1
  95. package/dist/controls-options-manager/enums.js +15 -6
  96. package/dist/controls-options-manager/enums.js.map +1 -1
  97. package/dist/controls-options-manager/index.d.ts +17 -1
  98. package/dist/controls-options-manager/index.js +127 -38
  99. package/dist/controls-options-manager/index.js.map +1 -1
  100. package/dist/controls-options-manager/types.d.ts +43 -0
  101. package/dist/controls-options-manager/types.js +7 -0
  102. package/dist/controls-options-manager/types.js.map +1 -0
  103. package/dist/controls-options-manager/util.d.ts +1 -7
  104. package/dist/controls-options-manager/util.js +309 -19
  105. package/dist/controls-options-manager/util.js.map +1 -1
  106. package/dist/index.d.ts +6 -3
  107. package/dist/index.js +121 -5
  108. package/dist/index.js.map +1 -1
  109. package/dist/interceptors/index.d.ts +2 -0
  110. package/dist/interceptors/index.js +15 -0
  111. package/dist/interceptors/index.js.map +1 -0
  112. package/dist/interceptors/locusRetry.d.ts +27 -0
  113. package/dist/interceptors/locusRetry.js +94 -0
  114. package/dist/interceptors/locusRetry.js.map +1 -0
  115. package/dist/interpretation/collection.d.ts +5 -0
  116. package/dist/interpretation/collection.js +22 -0
  117. package/dist/interpretation/collection.js.map +1 -0
  118. package/dist/interpretation/index.d.ts +5 -0
  119. package/dist/interpretation/index.js +365 -0
  120. package/dist/interpretation/index.js.map +1 -0
  121. package/dist/interpretation/siLanguage.d.ts +5 -0
  122. package/dist/interpretation/siLanguage.js +24 -0
  123. package/dist/interpretation/siLanguage.js.map +1 -0
  124. package/dist/locus-info/controlsUtils.js +100 -11
  125. package/dist/locus-info/controlsUtils.js.map +1 -1
  126. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  127. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  128. package/dist/locus-info/fullState.js +1 -2
  129. package/dist/locus-info/fullState.js.map +1 -1
  130. package/dist/locus-info/hostUtils.js +1 -2
  131. package/dist/locus-info/hostUtils.js.map +1 -1
  132. package/dist/locus-info/index.d.ts +57 -4
  133. package/dist/locus-info/index.js +425 -84
  134. package/dist/locus-info/index.js.map +1 -1
  135. package/dist/locus-info/infoUtils.js +13 -5
  136. package/dist/locus-info/infoUtils.js.map +1 -1
  137. package/dist/locus-info/mediaSharesUtils.js +58 -3
  138. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  139. package/dist/locus-info/parser.d.ts +66 -6
  140. package/dist/locus-info/parser.js +253 -80
  141. package/dist/locus-info/parser.js.map +1 -1
  142. package/dist/locus-info/selfUtils.js +97 -13
  143. package/dist/locus-info/selfUtils.js.map +1 -1
  144. package/dist/media/index.d.ts +2 -0
  145. package/dist/media/index.js +107 -319
  146. package/dist/media/index.js.map +1 -1
  147. package/dist/media/properties.d.ts +38 -53
  148. package/dist/media/properties.js +96 -153
  149. package/dist/media/properties.js.map +1 -1
  150. package/dist/media/util.js +1 -22
  151. package/dist/media/util.js.map +1 -1
  152. package/dist/mediaQualityMetrics/config.d.ts +234 -230
  153. package/dist/mediaQualityMetrics/config.js +302 -498
  154. package/dist/mediaQualityMetrics/config.js.map +1 -1
  155. package/dist/meeting/in-meeting-actions.d.ts +88 -0
  156. package/dist/meeting/in-meeting-actions.js +94 -3
  157. package/dist/meeting/in-meeting-actions.js.map +1 -1
  158. package/dist/meeting/index.d.ts +705 -520
  159. package/dist/meeting/index.js +5047 -3089
  160. package/dist/meeting/index.js.map +1 -1
  161. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  162. package/dist/meeting/locusMediaRequest.js +291 -0
  163. package/dist/meeting/locusMediaRequest.js.map +1 -0
  164. package/dist/meeting/muteState.d.ts +93 -25
  165. package/dist/meeting/muteState.js +224 -133
  166. package/dist/meeting/muteState.js.map +1 -1
  167. package/dist/meeting/request.d.ts +82 -47
  168. package/dist/meeting/request.js +304 -199
  169. package/dist/meeting/request.js.map +1 -1
  170. package/dist/meeting/request.type.d.ts +11 -0
  171. package/dist/meeting/request.type.js +7 -0
  172. package/dist/meeting/request.type.js.map +1 -0
  173. package/dist/meeting/state.js +1 -2
  174. package/dist/meeting/state.js.map +1 -1
  175. package/dist/meeting/util.d.ts +118 -1
  176. package/dist/meeting/util.js +676 -435
  177. package/dist/meeting/util.js.map +1 -1
  178. package/dist/meeting/voicea-meeting.d.ts +20 -0
  179. package/dist/meeting/voicea-meeting.js +201 -0
  180. package/dist/meeting/voicea-meeting.js.map +1 -0
  181. package/dist/meeting-info/collection.js +3 -4
  182. package/dist/meeting-info/collection.js.map +1 -1
  183. package/dist/meeting-info/index.d.ts +13 -1
  184. package/dist/meeting-info/index.js +74 -7
  185. package/dist/meeting-info/index.js.map +1 -1
  186. package/dist/meeting-info/meeting-info-v2.d.ts +31 -1
  187. package/dist/meeting-info/meeting-info-v2.js +200 -63
  188. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  189. package/dist/meeting-info/request.js +1 -2
  190. package/dist/meeting-info/request.js.map +1 -1
  191. package/dist/meeting-info/util.js +2 -3
  192. package/dist/meeting-info/util.js.map +1 -1
  193. package/dist/meeting-info/utilv2.js +39 -41
  194. package/dist/meeting-info/utilv2.js.map +1 -1
  195. package/dist/meetings/collection.d.ts +17 -0
  196. package/dist/meetings/collection.js +42 -4
  197. package/dist/meetings/collection.js.map +1 -1
  198. package/dist/meetings/index.d.ts +114 -20
  199. package/dist/meetings/index.js +540 -126
  200. package/dist/meetings/index.js.map +1 -1
  201. package/dist/meetings/meetings.types.d.ts +4 -0
  202. package/dist/meetings/meetings.types.js +7 -0
  203. package/dist/meetings/meetings.types.js.map +1 -0
  204. package/dist/meetings/request.js +4 -3
  205. package/dist/meetings/request.js.map +1 -1
  206. package/dist/meetings/util.js +107 -6
  207. package/dist/meetings/util.js.map +1 -1
  208. package/dist/member/index.d.ts +13 -1
  209. package/dist/member/index.js +45 -2
  210. package/dist/member/index.js.map +1 -1
  211. package/dist/member/member.types.js +3 -4
  212. package/dist/member/member.types.js.map +1 -1
  213. package/dist/member/types.d.ts +32 -0
  214. package/dist/member/types.js +23 -0
  215. package/dist/member/types.js.map +1 -0
  216. package/dist/member/util.js +120 -29
  217. package/dist/member/util.js.map +1 -1
  218. package/dist/members/collection.d.ts +5 -0
  219. package/dist/members/collection.js +11 -2
  220. package/dist/members/collection.js.map +1 -1
  221. package/dist/members/index.d.ts +56 -11
  222. package/dist/members/index.js +174 -47
  223. package/dist/members/index.js.map +1 -1
  224. package/dist/members/request.d.ts +67 -11
  225. package/dist/members/request.js +102 -54
  226. package/dist/members/request.js.map +1 -1
  227. package/dist/members/types.js +3 -4
  228. package/dist/members/types.js.map +1 -1
  229. package/dist/members/util.d.ts +214 -1
  230. package/dist/members/util.js +327 -284
  231. package/dist/members/util.js.map +1 -1
  232. package/dist/metrics/constants.d.ts +15 -6
  233. package/dist/metrics/constants.js +17 -9
  234. package/dist/metrics/constants.js.map +1 -1
  235. package/dist/metrics/index.d.ts +4 -111
  236. package/dist/metrics/index.js +4 -452
  237. package/dist/metrics/index.js.map +1 -1
  238. package/dist/multistream/mediaRequestManager.d.ts +118 -0
  239. package/dist/multistream/mediaRequestManager.js +344 -0
  240. package/dist/multistream/mediaRequestManager.js.map +1 -0
  241. package/dist/multistream/receiveSlot.d.ts +68 -0
  242. package/dist/multistream/receiveSlot.js +200 -0
  243. package/dist/multistream/receiveSlot.js.map +1 -0
  244. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  245. package/dist/multistream/receiveSlotManager.js +174 -0
  246. package/dist/multistream/receiveSlotManager.js.map +1 -0
  247. package/dist/multistream/remoteMedia.d.ts +72 -0
  248. package/dist/multistream/remoteMedia.js +268 -0
  249. package/dist/multistream/remoteMedia.js.map +1 -0
  250. package/dist/multistream/remoteMediaGroup.d.ts +47 -0
  251. package/dist/multistream/remoteMediaGroup.js +267 -0
  252. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  253. package/dist/multistream/remoteMediaManager.d.ts +285 -0
  254. package/dist/multistream/remoteMediaManager.js +1211 -0
  255. package/dist/multistream/remoteMediaManager.js.map +1 -0
  256. package/dist/multistream/sendSlotManager.d.ts +61 -0
  257. package/dist/multistream/sendSlotManager.js +236 -0
  258. package/dist/multistream/sendSlotManager.js.map +1 -0
  259. package/dist/networkQualityMonitor/index.js +5 -4
  260. package/dist/networkQualityMonitor/index.js.map +1 -1
  261. package/dist/personal-meeting-room/index.js +2 -3
  262. package/dist/personal-meeting-room/index.js.map +1 -1
  263. package/dist/personal-meeting-room/request.js +2 -3
  264. package/dist/personal-meeting-room/request.js.map +1 -1
  265. package/dist/personal-meeting-room/util.js +1 -2
  266. package/dist/personal-meeting-room/util.js.map +1 -1
  267. package/dist/reachability/clusterReachability.d.ts +109 -0
  268. package/dist/reachability/clusterReachability.js +357 -0
  269. package/dist/reachability/clusterReachability.js.map +1 -0
  270. package/dist/reachability/index.d.ts +61 -95
  271. package/dist/reachability/index.js +304 -392
  272. package/dist/reachability/index.js.map +1 -1
  273. package/dist/reachability/request.d.ts +7 -3
  274. package/dist/reachability/request.js +18 -10
  275. package/dist/reachability/request.js.map +1 -1
  276. package/dist/reachability/util.d.ts +8 -0
  277. package/dist/reachability/util.js +29 -0
  278. package/dist/reachability/util.js.map +1 -0
  279. package/dist/reactions/constants.d.ts +3 -0
  280. package/dist/reactions/constants.js +12 -0
  281. package/dist/reactions/constants.js.map +1 -0
  282. package/dist/reactions/reactions.d.ts +2 -2
  283. package/dist/reactions/reactions.js +4 -6
  284. package/dist/reactions/reactions.js.map +1 -1
  285. package/dist/reactions/reactions.type.d.ts +23 -3
  286. package/dist/reactions/reactions.type.js +21 -23
  287. package/dist/reactions/reactions.type.js.map +1 -1
  288. package/dist/reconnection-manager/index.d.ts +32 -8
  289. package/dist/reconnection-manager/index.js +285 -232
  290. package/dist/reconnection-manager/index.js.map +1 -1
  291. package/dist/recording-controller/enums.js +4 -5
  292. package/dist/recording-controller/enums.js.map +1 -1
  293. package/dist/recording-controller/index.d.ts +15 -1
  294. package/dist/recording-controller/index.js +57 -46
  295. package/dist/recording-controller/index.js.map +1 -1
  296. package/dist/recording-controller/util.d.ts +5 -4
  297. package/dist/recording-controller/util.js +10 -10
  298. package/dist/recording-controller/util.js.map +1 -1
  299. package/dist/roap/index.d.ts +9 -47
  300. package/dist/roap/index.js +100 -238
  301. package/dist/roap/index.js.map +1 -1
  302. package/dist/roap/request.d.ts +18 -12
  303. package/dist/roap/request.js +126 -180
  304. package/dist/roap/request.js.map +1 -1
  305. package/dist/roap/turnDiscovery.d.ts +27 -16
  306. package/dist/roap/turnDiscovery.js +115 -105
  307. package/dist/roap/turnDiscovery.js.map +1 -1
  308. package/dist/rtcMetrics/constants.d.ts +4 -0
  309. package/dist/rtcMetrics/constants.js +11 -0
  310. package/dist/rtcMetrics/constants.js.map +1 -0
  311. package/dist/rtcMetrics/index.d.ts +54 -0
  312. package/dist/rtcMetrics/index.js +140 -0
  313. package/dist/rtcMetrics/index.js.map +1 -0
  314. package/dist/statsAnalyzer/global.d.ts +1 -83
  315. package/dist/statsAnalyzer/global.js +2 -85
  316. package/dist/statsAnalyzer/global.js.map +1 -1
  317. package/dist/statsAnalyzer/index.d.ts +50 -30
  318. package/dist/statsAnalyzer/index.js +436 -511
  319. package/dist/statsAnalyzer/index.js.map +1 -1
  320. package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
  321. package/dist/statsAnalyzer/mqaUtil.js +130 -90
  322. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  323. package/dist/transcription/index.js +1 -2
  324. package/dist/transcription/index.js.map +1 -1
  325. package/dist/webinar/collection.d.ts +16 -0
  326. package/dist/webinar/collection.js +43 -0
  327. package/dist/webinar/collection.js.map +1 -0
  328. package/dist/webinar/index.d.ts +5 -0
  329. package/dist/webinar/index.js +68 -0
  330. package/dist/webinar/index.js.map +1 -0
  331. package/package.json +39 -26
  332. package/src/annotation/annotation.types.ts +50 -0
  333. package/src/annotation/constants.ts +36 -0
  334. package/src/annotation/index.ts +328 -0
  335. package/src/breakouts/README.md +220 -0
  336. package/src/breakouts/breakout.ts +188 -0
  337. package/src/breakouts/collection.ts +19 -0
  338. package/src/breakouts/edit-lock-error.ts +25 -0
  339. package/src/breakouts/events.ts +56 -0
  340. package/src/breakouts/index.ts +925 -0
  341. package/src/breakouts/request.ts +55 -0
  342. package/src/breakouts/utils.ts +57 -0
  343. package/src/common/errors/no-meeting-info.ts +24 -0
  344. package/src/common/errors/webex-errors.ts +36 -12
  345. package/src/common/logs/logger-proxy.ts +1 -1
  346. package/src/common/logs/request.ts +5 -1
  347. package/src/common/queue.ts +22 -8
  348. package/src/config.ts +6 -7
  349. package/src/constants.ts +265 -100
  350. package/src/controls-options-manager/enums.ts +12 -0
  351. package/src/controls-options-manager/index.ts +116 -21
  352. package/src/controls-options-manager/types.ts +59 -0
  353. package/src/controls-options-manager/util.ts +294 -14
  354. package/src/index.ts +44 -0
  355. package/src/interceptors/index.ts +3 -0
  356. package/src/interceptors/locusRetry.ts +67 -0
  357. package/src/interpretation/README.md +60 -0
  358. package/src/interpretation/collection.ts +19 -0
  359. package/src/interpretation/index.ts +332 -0
  360. package/src/interpretation/siLanguage.ts +18 -0
  361. package/src/locus-info/controlsUtils.ts +110 -0
  362. package/src/locus-info/index.ts +450 -61
  363. package/src/locus-info/infoUtils.ts +14 -2
  364. package/src/locus-info/mediaSharesUtils.ts +64 -0
  365. package/src/locus-info/parser.ts +258 -47
  366. package/src/locus-info/selfUtils.ts +85 -2
  367. package/src/media/index.ts +153 -370
  368. package/src/media/properties.ts +106 -136
  369. package/src/media/util.ts +0 -21
  370. package/src/mediaQualityMetrics/config.ts +244 -377
  371. package/src/meeting/in-meeting-actions.ts +176 -0
  372. package/src/meeting/index.ts +4306 -2581
  373. package/src/meeting/locusMediaRequest.ts +313 -0
  374. package/src/meeting/muteState.ts +224 -138
  375. package/src/meeting/request.ts +214 -127
  376. package/src/meeting/request.type.ts +13 -0
  377. package/src/meeting/util.ts +687 -423
  378. package/src/meeting/voicea-meeting.ts +161 -0
  379. package/src/meeting-info/index.ts +81 -8
  380. package/src/meeting-info/meeting-info-v2.ts +163 -13
  381. package/src/meeting-info/util.ts +1 -1
  382. package/src/meeting-info/utilv2.ts +28 -28
  383. package/src/meetings/collection.ts +33 -0
  384. package/src/meetings/index.ts +529 -127
  385. package/src/meetings/meetings.types.ts +12 -0
  386. package/src/meetings/request.ts +2 -0
  387. package/src/meetings/util.ts +116 -5
  388. package/src/member/index.ts +43 -1
  389. package/src/member/types.ts +38 -0
  390. package/src/member/util.ts +125 -28
  391. package/src/members/collection.ts +8 -0
  392. package/src/members/index.ts +187 -52
  393. package/src/members/request.ts +87 -27
  394. package/src/members/util.ts +332 -291
  395. package/src/metrics/constants.ts +15 -6
  396. package/src/metrics/index.ts +1 -471
  397. package/src/multistream/mediaRequestManager.ts +440 -0
  398. package/src/multistream/receiveSlot.ts +184 -0
  399. package/src/multistream/receiveSlotManager.ts +166 -0
  400. package/src/multistream/remoteMedia.ts +254 -0
  401. package/src/multistream/remoteMediaGroup.ts +284 -0
  402. package/src/multistream/remoteMediaManager.ts +1145 -0
  403. package/src/multistream/sendSlotManager.ts +170 -0
  404. package/src/networkQualityMonitor/index.ts +6 -6
  405. package/src/reachability/clusterReachability.ts +320 -0
  406. package/src/reachability/index.ts +246 -347
  407. package/src/reachability/request.ts +17 -8
  408. package/src/reachability/util.ts +24 -0
  409. package/src/reactions/constants.ts +4 -0
  410. package/src/reactions/reactions.ts +4 -4
  411. package/src/reactions/reactions.type.ts +30 -4
  412. package/src/reconnection-manager/index.ts +168 -156
  413. package/src/recording-controller/index.ts +20 -3
  414. package/src/recording-controller/util.ts +26 -9
  415. package/src/roap/index.ts +96 -241
  416. package/src/roap/request.ts +74 -148
  417. package/src/roap/turnDiscovery.ts +62 -56
  418. package/src/rtcMetrics/constants.ts +3 -0
  419. package/src/rtcMetrics/index.ts +124 -0
  420. package/src/statsAnalyzer/global.ts +1 -84
  421. package/src/statsAnalyzer/index.ts +479 -645
  422. package/src/statsAnalyzer/mqaUtil.ts +128 -126
  423. package/src/webinar/collection.ts +31 -0
  424. package/src/webinar/index.ts +62 -0
  425. package/test/integration/spec/converged-space-meetings.js +233 -0
  426. package/test/integration/spec/journey.js +320 -264
  427. package/test/integration/spec/space-meeting.js +77 -4
  428. package/test/unit/spec/annotation/index.ts +418 -0
  429. package/test/unit/spec/breakouts/breakout.ts +237 -0
  430. package/test/unit/spec/breakouts/collection.ts +15 -0
  431. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  432. package/test/unit/spec/breakouts/events.ts +89 -0
  433. package/test/unit/spec/breakouts/index.ts +1790 -0
  434. package/test/unit/spec/breakouts/request.ts +104 -0
  435. package/test/unit/spec/breakouts/utils.js +72 -0
  436. package/test/unit/spec/common/queue.js +31 -2
  437. package/test/unit/spec/controls-options-manager/index.js +163 -0
  438. package/test/unit/spec/controls-options-manager/util.js +576 -60
  439. package/test/unit/spec/fixture/locus.js +1 -0
  440. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  441. package/test/unit/spec/interpretation/collection.ts +15 -0
  442. package/test/unit/spec/interpretation/index.ts +589 -0
  443. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  444. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  445. package/test/unit/spec/locus-info/index.js +1438 -16
  446. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  447. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  448. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  449. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  450. package/test/unit/spec/locus-info/parser.js +116 -35
  451. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  452. package/test/unit/spec/media/index.ts +290 -0
  453. package/test/unit/spec/media/properties.ts +75 -84
  454. package/test/unit/spec/meeting/in-meeting-actions.ts +86 -0
  455. package/test/unit/spec/meeting/index.js +8886 -2815
  456. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  457. package/test/unit/spec/meeting/muteState.js +409 -213
  458. package/test/unit/spec/meeting/request.js +523 -43
  459. package/test/unit/spec/meeting/utils.js +834 -24
  460. package/test/unit/spec/meeting-info/index.js +300 -0
  461. package/test/unit/spec/meeting-info/meetinginfov2.js +527 -5
  462. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  463. package/test/unit/spec/meetings/collection.js +26 -0
  464. package/test/unit/spec/meetings/index.js +1446 -217
  465. package/test/unit/spec/meetings/utils.js +202 -2
  466. package/test/unit/spec/member/index.js +32 -9
  467. package/test/unit/spec/member/util.js +499 -61
  468. package/test/unit/spec/members/index.js +394 -5
  469. package/test/unit/spec/members/request.js +206 -27
  470. package/test/unit/spec/members/utils.js +173 -38
  471. package/test/unit/spec/metrics/index.js +1 -50
  472. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  473. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  474. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  475. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  476. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  477. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  478. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  479. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  480. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  481. package/test/unit/spec/reachability/index.ts +532 -24
  482. package/test/unit/spec/reachability/request.js +68 -0
  483. package/test/unit/spec/reachability/util.ts +40 -0
  484. package/test/unit/spec/reconnection-manager/index.js +163 -24
  485. package/test/unit/spec/recording-controller/index.js +293 -218
  486. package/test/unit/spec/recording-controller/util.js +223 -96
  487. package/test/unit/spec/roap/index.ts +187 -77
  488. package/test/unit/spec/roap/request.ts +255 -0
  489. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  490. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  491. package/test/unit/spec/stats-analyzer/index.js +644 -165
  492. package/test/unit/spec/webinar/collection.ts +13 -0
  493. package/test/unit/spec/webinar/index.ts +60 -0
  494. package/test/utils/constants.js +9 -0
  495. package/test/utils/integrationTestUtils.js +46 -0
  496. package/test/utils/testUtils.js +0 -45
  497. package/test/utils/webex-config.js +4 -0
  498. package/test/utils/webex-test-users.js +7 -3
  499. package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
  500. package/dist/meeting/effectsState.d.ts +0 -42
  501. package/dist/meeting/effectsState.js +0 -260
  502. package/dist/meeting/effectsState.js.map +0 -1
  503. package/dist/metrics/config.d.ts +0 -169
  504. package/dist/metrics/config.js +0 -289
  505. package/dist/metrics/config.js.map +0 -1
  506. package/dist/peer-connection-manager/index.d.ts +0 -6
  507. package/dist/peer-connection-manager/index.js +0 -671
  508. package/dist/peer-connection-manager/index.js.map +0 -1
  509. package/dist/peer-connection-manager/util.d.ts +0 -6
  510. package/dist/peer-connection-manager/util.js +0 -110
  511. package/dist/peer-connection-manager/util.js.map +0 -1
  512. package/dist/roap/collection.d.ts +0 -10
  513. package/dist/roap/collection.js +0 -63
  514. package/dist/roap/collection.js.map +0 -1
  515. package/dist/roap/handler.d.ts +0 -47
  516. package/dist/roap/handler.js +0 -279
  517. package/dist/roap/handler.js.map +0 -1
  518. package/dist/roap/state.d.ts +0 -9
  519. package/dist/roap/state.js +0 -127
  520. package/dist/roap/state.js.map +0 -1
  521. package/dist/roap/util.d.ts +0 -2
  522. package/dist/roap/util.js +0 -76
  523. package/dist/roap/util.js.map +0 -1
  524. package/src/index.js +0 -15
  525. package/src/meeting/effectsState.ts +0 -209
  526. package/src/metrics/config.ts +0 -485
  527. package/src/peer-connection-manager/index.ts +0 -847
  528. package/src/peer-connection-manager/util.ts +0 -119
  529. package/src/roap/collection.ts +0 -62
  530. package/src/roap/handler.ts +0 -294
  531. package/src/roap/state.ts +0 -156
  532. package/src/roap/util.ts +0 -100
  533. package/test/unit/spec/meeting/effectsState.js +0 -281
  534. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  535. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  536. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  537. package/test/unit/spec/roap/util.js +0 -30
  538. /package/dist/common/errors/{reclaim-host-role-error.d.ts → reclaim-host-role-errors.d.ts} +0 -0
  539. /package/src/common/errors/{reclaim-host-role-error.ts → reclaim-host-role-errors.ts} +0 -0
@@ -1,22 +1,32 @@
1
1
  import sinon from 'sinon';
2
2
  import {assert} from '@webex/test-helper-chai';
3
+ import Meetings from '@webex/plugin-meetings';
3
4
  import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
5
+ import {LOCAL_SHARE_ERRORS} from '@webex/plugin-meetings/src/constants';
4
6
  import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
5
7
  import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
6
- import Metrics from '@webex/plugin-meetings/src/metrics/index';
8
+ import {SELF_POLICY, IP_VERSION} from '@webex/plugin-meetings/src/constants';
9
+ import MockWebex from '@webex/test-helper-mock-webex';
10
+ import * as BrowserDetectionModule from '@webex/plugin-meetings/src/common/browser-detection';
7
11
 
8
12
  describe('plugin-meetings', () => {
13
+ let webex;
9
14
  describe('Meeting utils function', () => {
10
15
  const sandbox = sinon.createSandbox();
11
16
  const meeting = {};
12
17
 
13
18
  beforeEach(() => {
14
- Metrics.postEvent = sinon.stub();
19
+ webex = new MockWebex({
20
+ children: {
21
+ meetings: Meetings,
22
+ },
23
+ });
15
24
  const logger = {
16
25
  info: sandbox.stub(),
17
26
  log: sandbox.stub(),
18
27
  error: sandbox.stub(),
19
28
  warn: sandbox.stub(),
29
+ debug: sandbox.stub(),
20
30
  };
21
31
 
22
32
  LoggerConfig.set({
@@ -25,40 +35,41 @@ describe('plugin-meetings', () => {
25
35
  });
26
36
  LoggerProxy.set(logger);
27
37
 
28
- meeting.closeLocalStream = sinon.stub().returns(Promise.resolve());
29
- meeting.closeLocalShare = sinon.stub().returns(Promise.resolve());
30
- meeting.closeRemoteTracks = sinon.stub().returns(Promise.resolve());
38
+ meeting.cleanupLocalStreams = sinon.stub().returns(Promise.resolve());
39
+ meeting.closeRemoteStreams = sinon.stub().returns(Promise.resolve());
31
40
  meeting.closePeerConnections = sinon.stub().returns(Promise.resolve());
32
41
 
33
- meeting.unsetLocalVideoTrack = sinon.stub();
34
- meeting.unsetLocalShareTrack = sinon.stub();
35
- meeting.unsetRemoteTracks = sinon.stub();
42
+ meeting.unsetRemoteStreams = sinon.stub();
36
43
  meeting.unsetPeerConnections = sinon.stub();
37
44
  meeting.reconnectionManager = {cleanUp: sinon.stub()};
38
- meeting.roap = {stop: sinon.stub()};
39
45
  meeting.stopKeepAlive = sinon.stub();
46
+ meeting.updateLLMConnection = sinon.stub();
47
+ meeting.breakouts = {cleanUp: sinon.stub()};
48
+ meeting.annotaion = {cleanUp: sinon.stub()};
49
+ meeting.getWebexObject = sinon.stub().returns(webex);
50
+ meeting.simultaneousInterpretation = {cleanUp: sinon.stub()};
51
+ meeting.trigger = sinon.stub();
40
52
  });
41
53
 
42
54
  afterEach(() => {
43
55
  sandbox.restore();
56
+ sinon.restore();
44
57
  });
45
58
 
46
59
  describe('#cleanup', () => {
47
60
  it('do clean up on meeting object', async () => {
48
61
  await MeetingUtil.cleanUp(meeting);
49
- assert.calledOnce(meeting.closeLocalStream);
50
- assert.calledOnce(meeting.closeLocalStream);
51
- assert.calledOnce(meeting.closeLocalShare);
52
- assert.calledOnce(meeting.closeRemoteTracks);
62
+ assert.calledOnce(meeting.cleanupLocalStreams);
63
+ assert.calledOnce(meeting.closeRemoteStreams);
53
64
  assert.calledOnce(meeting.closePeerConnections);
54
65
 
55
- assert.calledOnce(meeting.unsetLocalVideoTrack);
56
- assert.calledOnce(meeting.unsetLocalShareTrack);
57
- assert.calledOnce(meeting.unsetRemoteTracks);
66
+ assert.calledOnce(meeting.unsetRemoteStreams);
58
67
  assert.calledOnce(meeting.unsetPeerConnections);
59
68
  assert.calledOnce(meeting.reconnectionManager.cleanUp);
60
- assert.calledOnce(meeting.roap.stop);
61
69
  assert.calledOnce(meeting.stopKeepAlive);
70
+ assert.calledOnce(meeting.updateLLMConnection);
71
+ assert.calledOnce(meeting.breakouts.cleanUp);
72
+ assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
62
73
  });
63
74
  });
64
75
 
@@ -67,7 +78,7 @@ describe('plugin-meetings', () => {
67
78
  deviceId: 'device-1',
68
79
  });
69
80
 
70
- const mockTrack = {
81
+ const mockStream = {
71
82
  getSettings: fakeDevice,
72
83
  };
73
84
 
@@ -86,27 +97,27 @@ describe('plugin-meetings', () => {
86
97
  });
87
98
 
88
99
  describe('#handleAudioLogging', () => {
89
- it('should not log if called without track', () => {
100
+ it('should not log if called without stream', () => {
90
101
  MeetingUtil.handleAudioLogging();
91
102
  assert(!LoggerProxy.logger.log.called, 'log not called');
92
103
  });
93
104
 
94
- it('should log audioTrack settings', () => {
105
+ it('should log audioStream settings', () => {
95
106
  assert(MeetingUtil.handleAudioLogging, 'method is defined');
96
- MeetingUtil.handleAudioLogging(mockTrack);
107
+ MeetingUtil.handleAudioLogging(mockStream);
97
108
  assert(LoggerProxy.logger.log.called, 'log called');
98
109
  });
99
110
  });
100
111
 
101
112
  describe('#handleVideoLogging', () => {
102
- it('should not log if called without track', () => {
113
+ it('should not log if called without stream', () => {
103
114
  MeetingUtil.handleVideoLogging(null);
104
115
  assert(!LoggerProxy.logger.log.called, 'log not called');
105
116
  });
106
117
 
107
- it('should log videoTrack settings', () => {
118
+ it('should log videoStream settings', () => {
108
119
  assert(MeetingUtil.handleVideoLogging, 'method is defined');
109
- MeetingUtil.handleVideoLogging(mockTrack);
120
+ MeetingUtil.handleVideoLogging(mockStream);
110
121
  assert(LoggerProxy.logger.log.called, 'log called');
111
122
  });
112
123
  });
@@ -127,14 +138,334 @@ describe('plugin-meetings', () => {
127
138
  });
128
139
  });
129
140
 
141
+ describe('addSequence', () => {
142
+ it('should add the sequence object to a request body', () => {
143
+ const body = {};
144
+
145
+ MeetingUtil.addSequence(
146
+ {
147
+ locusInfo: {
148
+ sequence: 'sequence',
149
+ },
150
+ },
151
+ body
152
+ );
153
+
154
+ assert.deepEqual(body, {
155
+ sequence: 'sequence',
156
+ });
157
+ });
158
+
159
+ it('should work with an undefined meeting', () => {
160
+ const body = {};
161
+
162
+ MeetingUtil.addSequence(undefined, body);
163
+
164
+ assert.deepEqual(body, {});
165
+ });
166
+
167
+ it('should work with an undefined locusInfo', () => {
168
+ const body = {};
169
+
170
+ MeetingUtil.addSequence({}, body);
171
+
172
+ assert.deepEqual(body, {});
173
+ });
174
+
175
+ it('should work with an undefined sequence', () => {
176
+ const body = {};
177
+
178
+ MeetingUtil.addSequence({locusInfo: {}}, body);
179
+
180
+ assert.deepEqual(body, {});
181
+ });
182
+ });
183
+
184
+ describe('updateLocusWithDelta', () => {
185
+ it('should call handleLocusDelta with the new delta locus', () => {
186
+ const meeting = {
187
+ locusInfo: {
188
+ handleLocusDelta: sinon.stub(),
189
+ },
190
+ };
191
+
192
+ const originalResponse = {
193
+ body: {
194
+ locus: 'locus',
195
+ },
196
+ };
197
+
198
+ const response = MeetingUtil.updateLocusWithDelta(meeting, originalResponse);
199
+
200
+ assert.deepEqual(response, originalResponse);
201
+ assert.calledOnceWithExactly(meeting.locusInfo.handleLocusDelta, 'locus', meeting);
202
+ });
203
+
204
+ it('should handle locus being missing from the response', () => {
205
+ const meeting = {
206
+ locusInfo: {
207
+ handleLocusDelta: sinon.stub(),
208
+ },
209
+ };
210
+
211
+ const originalResponse = {
212
+ body: {},
213
+ };
214
+
215
+ const response = MeetingUtil.updateLocusWithDelta(meeting, originalResponse);
216
+
217
+ assert.deepEqual(response, originalResponse);
218
+ assert.notCalled(meeting.locusInfo.handleLocusDelta);
219
+ });
220
+
221
+ it('should work with an undefined meeting', () => {
222
+ const originalResponse = {
223
+ body: {
224
+ locus: 'locus',
225
+ },
226
+ };
227
+
228
+ const response = MeetingUtil.updateLocusWithDelta(undefined, originalResponse);
229
+ assert.deepEqual(response, originalResponse);
230
+ });
231
+ });
232
+
233
+ describe('generateLocusDeltaRequest', () => {
234
+ it('generates the correct wrapper function', async () => {
235
+ const updateLocusWithDeltaSpy = sinon.spy(MeetingUtil, 'updateLocusWithDelta');
236
+ const addSequenceSpy = sinon.spy(MeetingUtil, 'addSequence');
237
+
238
+ const meeting = {
239
+ request: sinon.stub().returns(Promise.resolve('result')),
240
+ };
241
+
242
+ const locusDeltaRequest = MeetingUtil.generateLocusDeltaRequest(meeting);
243
+
244
+ const options = {
245
+ some: 'option',
246
+ body: {},
247
+ };
248
+
249
+ let result = await locusDeltaRequest(options);
250
+
251
+ assert.equal(result, 'result');
252
+ assert.calledOnceWithExactly(updateLocusWithDeltaSpy, meeting, 'result');
253
+ assert.calledOnceWithExactly(addSequenceSpy, meeting, options.body);
254
+
255
+ updateLocusWithDeltaSpy.resetHistory();
256
+ addSequenceSpy.resetHistory();
257
+
258
+ // body missing from options
259
+ result = await locusDeltaRequest({});
260
+ assert.equal(result, 'result');
261
+ assert.calledOnceWithExactly(updateLocusWithDeltaSpy, meeting, 'result');
262
+ assert.calledOnceWithExactly(addSequenceSpy, meeting, options.body);
263
+
264
+ // meeting disappears so the WeakRef returns undefined
265
+ sinon.stub(WeakRef.prototype, 'deref').returns(undefined);
266
+
267
+ result = await locusDeltaRequest(options);
268
+ assert.equal(result, undefined);
269
+
270
+ WeakRef.prototype.deref.restore();
271
+ });
272
+
273
+ it('calls generateBuildLocusDeltaRequestOptions as expected', () => {
274
+ const generateBuildLocusDeltaRequestOptionsSpy = sinon.spy(
275
+ MeetingUtil,
276
+ 'generateBuildLocusDeltaRequestOptions'
277
+ );
278
+
279
+ const meeting = {};
280
+
281
+ MeetingUtil.generateLocusDeltaRequest(meeting);
282
+
283
+ assert.calledOnceWithExactly(generateBuildLocusDeltaRequestOptionsSpy, meeting);
284
+ });
285
+ });
286
+
287
+ describe('selfSupportsFeature', () => {
288
+ it('returns true if there are no user policies', () => {
289
+ assert.equal(
290
+ MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_ANNOTATION, undefined),
291
+ true
292
+ );
293
+ });
294
+
295
+ it('returns true if policy is true', () => {
296
+ assert.equal(
297
+ MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_ANNOTATION, {
298
+ [SELF_POLICY.SUPPORT_ANNOTATION]: true,
299
+ }),
300
+ true
301
+ );
302
+ });
303
+
304
+ it('returns false if policy is false', () => {
305
+ assert.equal(
306
+ MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_ANNOTATION, {
307
+ [SELF_POLICY.SUPPORT_ANNOTATION]: false,
308
+ }),
309
+ false
310
+ );
311
+ });
312
+ });
313
+
314
+ describe('remoteUpdateAudioVideo', () => {
315
+ it('#Should call meetingRequest.locusMediaRequest with correct parameters', async () => {
316
+ const meeting = {
317
+ id: 'meeting-id',
318
+ mediaId: '12345',
319
+ selfUrl: 'self url',
320
+ locusInfo: {
321
+ sequence: {},
322
+ },
323
+ locusMediaRequest: {
324
+ send: sinon.stub().resolves({body: {}, headers: {}}),
325
+ },
326
+ getWebexObject: sinon.stub().returns(webex),
327
+ };
328
+
329
+ await MeetingUtil.remoteUpdateAudioVideo(meeting, true, false);
330
+
331
+ assert.calledOnceWithExactly(meeting.locusMediaRequest.send, {
332
+ mediaId: '12345',
333
+ muteOptions: {
334
+ audioMuted: true,
335
+ videoMuted: false,
336
+ },
337
+ selfUrl: 'self url',
338
+ sequence: {},
339
+ type: 'LocalMute',
340
+ });
341
+
342
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
343
+ name: 'client.locus.media.request',
344
+ options: {meetingId: meeting.id},
345
+ });
346
+
347
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
348
+ name: 'client.locus.media.response',
349
+ options: {meetingId: meeting.id},
350
+ });
351
+ });
352
+ });
353
+
130
354
  describe('joinMeeting', () => {
131
355
  it('#Should call `meetingRequest.joinMeeting', async () => {
132
356
  const meeting = {
357
+ meetingJoinUrl: 'meetingJoinUrl',
358
+ locusUrl: 'locusUrl',
359
+ meetingRequest: {
360
+ joinMeeting: sinon.stub().returns(
361
+ Promise.resolve({
362
+ body: {mediaConnections: 'mediaConnections'},
363
+ headers: {
364
+ trackingid: 'trackingId',
365
+ },
366
+ })
367
+ ),
368
+ },
369
+ getWebexObject: sinon.stub().returns(webex),
370
+ };
371
+
372
+ MeetingUtil.parseLocusJoin = sinon.stub();
373
+ await MeetingUtil.joinMeeting(meeting, {});
374
+
375
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
376
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
377
+
378
+ assert.equal(parameter.inviteeAddress, 'meetingJoinUrl');
379
+ assert.equal(parameter.preferTranscoding, true);
380
+
381
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
382
+ name: 'client.locus.join.request',
383
+ options: {meetingId: meeting.id},
384
+ });
385
+
386
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
387
+ name: 'client.locus.join.response',
388
+ payload: {
389
+ trigger: 'loci-update',
390
+ identifiers: {
391
+ trackingId: 'trackingId',
392
+ },
393
+ },
394
+ options: {
395
+ meetingId: meeting.id,
396
+ mediaConnections: 'mediaConnections',
397
+ },
398
+ });
399
+ });
400
+
401
+ it('#Should call meetingRequest.joinMeeting with breakoutsSupported=true when passed in as true', async () => {
402
+ const meeting = {
403
+ meetingRequest: {
404
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
405
+ },
406
+ getWebexObject: sinon.stub().returns(webex),
407
+ };
408
+
409
+ MeetingUtil.parseLocusJoin = sinon.stub();
410
+ await MeetingUtil.joinMeeting(meeting, {
411
+ breakoutsSupported: true,
412
+ });
413
+
414
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
415
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
416
+
417
+ assert.equal(parameter.breakoutsSupported, true);
418
+ });
419
+
420
+ it('#Should call meetingRequest.joinMeeting with liveAnnotationSupported=true when passed in as true', async () => {
421
+ const meeting = {
422
+ meetingRequest: {
423
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
424
+ },
425
+ getWebexObject: sinon.stub().returns(webex),
426
+ };
427
+
428
+ MeetingUtil.parseLocusJoin = sinon.stub();
429
+ await MeetingUtil.joinMeeting(meeting, {
430
+ liveAnnotationSupported: true,
431
+ });
432
+
433
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
434
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
435
+
436
+ assert.equal(parameter.liveAnnotationSupported, true);
437
+ });
438
+
439
+ it('#Should call meetingRequest.joinMeeting with locale=en_UK, deviceCapabilities=["TEST"] when they are passed in as those values', async () => {
440
+ const meeting = {
441
+ meetingRequest: {
442
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
443
+ },
444
+ getWebexObject: sinon.stub().returns(webex),
445
+ };
446
+
447
+ MeetingUtil.parseLocusJoin = sinon.stub();
448
+ await MeetingUtil.joinMeeting(meeting, {
449
+ locale: 'en_UK',
450
+ deviceCapabilities: ['TEST'],
451
+ });
452
+
453
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
454
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
455
+
456
+ assert.equal(parameter.locale, 'en_UK');
457
+ assert.deepEqual(parameter.deviceCapabilities, ['TEST']);
458
+ });
459
+
460
+ it('#Should call meetingRequest.joinMeeting with preferTranscoding=false when multistream is enabled', async () => {
461
+ const meeting = {
462
+ isMultistream: true,
133
463
  meetingJoinUrl: 'meetingJoinUrl',
134
464
  locusUrl: 'locusUrl',
135
465
  meetingRequest: {
136
466
  joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
137
467
  },
468
+ getWebexObject: sinon.stub().returns(webex),
138
469
  };
139
470
 
140
471
  MeetingUtil.parseLocusJoin = sinon.stub();
@@ -144,6 +475,7 @@ describe('plugin-meetings', () => {
144
475
  const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
145
476
 
146
477
  assert.equal(parameter.inviteeAddress, 'meetingJoinUrl');
478
+ assert.equal(parameter.preferTranscoding, false);
147
479
  });
148
480
 
149
481
  it('#Should fallback sipUrl if meetingJoinUrl does not exists', async () => {
@@ -153,6 +485,7 @@ describe('plugin-meetings', () => {
153
485
  meetingRequest: {
154
486
  joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
155
487
  },
488
+ getWebexObject: sinon.stub().returns(webex),
156
489
  };
157
490
 
158
491
  MeetingUtil.parseLocusJoin = sinon.stub();
@@ -171,6 +504,7 @@ describe('plugin-meetings', () => {
171
504
  meetingRequest: {
172
505
  joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
173
506
  },
507
+ getWebexObject: sinon.stub().returns(webex),
174
508
  };
175
509
 
176
510
  MeetingUtil.parseLocusJoin = sinon.stub();
@@ -182,6 +516,63 @@ describe('plugin-meetings', () => {
182
516
  assert.isUndefined(parameter.inviteeAddress);
183
517
  assert.equal(parameter.meetingNumber, 'meetingNumber');
184
518
  });
519
+
520
+ it('should pass in the locusClusterUrl from meetingInfo', async () => {
521
+ const meeting = {
522
+ meetingInfo: {
523
+ locusClusterUrl: 'locusClusterUrl',
524
+ },
525
+ meetingRequest: {
526
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
527
+ },
528
+ getWebexObject: sinon.stub().returns(webex),
529
+ };
530
+
531
+ MeetingUtil.parseLocusJoin = sinon.stub();
532
+ await MeetingUtil.joinMeeting(meeting, {});
533
+
534
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
535
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
536
+
537
+ assert.equal(parameter.locusClusterUrl, 'locusClusterUrl');
538
+ });
539
+ });
540
+
541
+ describe('joinMeetingOptions', () => {
542
+ it('sends client events correctly', async () => {
543
+ MeetingUtil.joinMeeting = sinon.stub().rejects({});
544
+ MeetingUtil.isPinOrGuest = sinon.stub().returns(true);
545
+ const meeting = {
546
+ id: 'meeting-id',
547
+ mediaId: '12345',
548
+ selfUrl: 'self url',
549
+ locusInfo: {
550
+ sequence: {},
551
+ },
552
+ locusMediaRequest: {
553
+ send: sinon.stub().resolves({body: {}, headers: {}}),
554
+ },
555
+ getWebexObject: sinon.stub().returns(webex),
556
+ };
557
+
558
+ try {
559
+ await MeetingUtil.joinMeetingOptions(meeting, {pin: true});
560
+
561
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
562
+ name: 'client.pin.collected',
563
+ options: {
564
+ meetingId: meeting.id,
565
+ },
566
+ });
567
+ } catch (err) {
568
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
569
+ name: 'client.pin.prompt',
570
+ options: {
571
+ meetingId: meeting.id,
572
+ },
573
+ });
574
+ }
575
+ });
185
576
  });
186
577
 
187
578
  describe('getUserDisplayHintsFromLocusInfo', () => {
@@ -255,6 +646,30 @@ describe('plugin-meetings', () => {
255
646
  });
256
647
  });
257
648
 
649
+ describe('canUserRenameSelfAndObserved', () => {
650
+ it('works as expected', () => {
651
+ assert.deepEqual(
652
+ MeetingUtil.canUserRenameSelfAndObserved(['CAN_RENAME_SELF_AND_OBSERVED']),
653
+ true
654
+ );
655
+ assert.deepEqual(MeetingUtil.canUserRenameSelfAndObserved([]), false);
656
+ });
657
+ });
658
+
659
+ describe('canUserRenameOthers', () => {
660
+ it('works as expected', () => {
661
+ assert.deepEqual(MeetingUtil.canUserRenameOthers(['CAN_RENAME_OTHERS']), true);
662
+ assert.deepEqual(MeetingUtil.canUserRenameOthers([]), false);
663
+ });
664
+ });
665
+
666
+ describe('canShareWhiteBoard', () => {
667
+ it('works as expected', () => {
668
+ assert.deepEqual(MeetingUtil.canShareWhiteBoard(['SHARE_WHITEBOARD']), true);
669
+ assert.deepEqual(MeetingUtil.canShareWhiteBoard([]), false);
670
+ });
671
+ });
672
+
258
673
  describe('bothLeaveAndEndMeetingAvailable', () => {
259
674
  it('works as expected', () => {
260
675
  assert.deepEqual(
@@ -298,6 +713,7 @@ describe('plugin-meetings', () => {
298
713
  });
299
714
 
300
715
  [
716
+ {functionName: 'isSaveTranscriptsEnabled', displayHint: 'SAVE_TRANSCRIPTS_ENABLED'},
301
717
  {functionName: 'canEnableClosedCaption', displayHint: 'CAPTION_START'},
302
718
  {functionName: 'canStartTranscribing', displayHint: 'TRANSCRIPTION_CONTROL_START'},
303
719
  {functionName: 'canStopTranscribing', displayHint: 'TRANSCRIPTION_CONTROL_STOP'},
@@ -315,5 +731,399 @@ describe('plugin-meetings', () => {
315
731
  });
316
732
  });
317
733
  });
734
+
735
+ describe('canManageBreakout', () => {
736
+ it('works as expected', () => {
737
+ assert.deepEqual(MeetingUtil.canManageBreakout(['BREAKOUT_MANAGEMENT']), true);
738
+ assert.deepEqual(MeetingUtil.canManageBreakout([]), false);
739
+ });
740
+ });
741
+
742
+ describe('canBroadcastMessageToBreakout', () => {
743
+ it('works as expected', () => {
744
+ assert.deepEqual(
745
+ MeetingUtil.canBroadcastMessageToBreakout(['BROADCAST_MESSAGE_TO_BREAKOUT'], {
746
+ [SELF_POLICY.SUPPORT_BROADCAST_MESSAGE]: true,
747
+ }),
748
+ true
749
+ );
750
+ assert.deepEqual(
751
+ MeetingUtil.canBroadcastMessageToBreakout([], {
752
+ [SELF_POLICY.SUPPORT_BROADCAST_MESSAGE]: true,
753
+ }),
754
+ false
755
+ );
756
+ assert.deepEqual(
757
+ MeetingUtil.canBroadcastMessageToBreakout(['BROADCAST_MESSAGE_TO_BREAKOUT'], {
758
+ [SELF_POLICY.SUPPORT_BROADCAST_MESSAGE]: false,
759
+ }),
760
+ false
761
+ );
762
+ assert.deepEqual(
763
+ MeetingUtil.canBroadcastMessageToBreakout(['BROADCAST_MESSAGE_TO_BREAKOUT'], undefined),
764
+ false
765
+ );
766
+ });
767
+ });
768
+
769
+ describe('isSuppressBreakoutSupport', () => {
770
+ it('works as expected', () => {
771
+ assert.deepEqual(
772
+ MeetingUtil.isSuppressBreakoutSupport(['UCF_SUPPRESS_BREAKOUTS_SUPPORT']),
773
+ true
774
+ );
775
+ assert.deepEqual(MeetingUtil.isSuppressBreakoutSupport([]), false);
776
+ });
777
+ });
778
+
779
+ describe('canAdmitLobbyToBreakout', () => {
780
+ it('works as expected', () => {
781
+ assert.deepEqual(MeetingUtil.canAdmitLobbyToBreakout(['DISABLE_LOBBY_TO_BREAKOUT']), false);
782
+ assert.deepEqual(MeetingUtil.canAdmitLobbyToBreakout([]), true);
783
+ });
784
+ });
785
+
786
+ describe('canUserAskForHelp', () => {
787
+ it('works as expected', () => {
788
+ assert.deepEqual(MeetingUtil.canUserAskForHelp(['DISABLE_ASK_FOR_HELP']), false);
789
+ assert.deepEqual(MeetingUtil.canUserAskForHelp([]), true);
790
+ });
791
+ });
792
+
793
+ describe('isBreakoutPreassignmentsEnabled', () => {
794
+ it('works as expected', () => {
795
+ assert.deepEqual(
796
+ MeetingUtil.isBreakoutPreassignmentsEnabled(['DISABLE_BREAKOUT_PREASSIGNMENTS']),
797
+ false
798
+ );
799
+ assert.deepEqual(MeetingUtil.isBreakoutPreassignmentsEnabled([]), true);
800
+ });
801
+ });
802
+
803
+ describe('parseInterpretationInfo', () => {
804
+ let meetingInfo = {};
805
+ beforeEach(() => {
806
+ meeting.simultaneousInterpretation = {
807
+ updateMeetingSIEnabled: sinon.stub(),
808
+ updateHostSIEnabled: sinon.stub(),
809
+ updateInterpretation: sinon.stub(),
810
+ siLanguages: [],
811
+ };
812
+ });
813
+ it('should update simultaneous interpretation settings with SI and host enabled', () => {
814
+ meetingInfo.turnOnSimultaneousInterpretation = true;
815
+ meetingInfo.meetingSiteSetting = {
816
+ enableHostInterpreterControlSI: true,
817
+ };
818
+ meetingInfo.simultaneousInterpretation = {
819
+ currentSIInterpreter: true,
820
+ siLanguages: [
821
+ {languageCode: 'en', languageGroupId: 1},
822
+ {languageCode: 'es', languageGroupId: 2},
823
+ ],
824
+ };
825
+
826
+ MeetingUtil.parseInterpretationInfo(meeting, meetingInfo);
827
+ assert.calledWith(meeting.simultaneousInterpretation.updateMeetingSIEnabled, true, true);
828
+ assert.calledWith(meeting.simultaneousInterpretation.updateHostSIEnabled, true);
829
+ assert.calledWith(meeting.simultaneousInterpretation.updateInterpretation, {
830
+ siLanguages: [
831
+ {languageName: 'en', languageCode: 1},
832
+ {languageName: 'es', languageCode: 2},
833
+ ],
834
+ });
835
+ });
836
+
837
+ it('should update simultaneous interpretation settings with host SI disabled', () => {
838
+ meetingInfo.meetingSiteSetting.enableHostInterpreterControlSI = false;
839
+ meetingInfo.simultaneousInterpretation.currentSIInterpreter = false;
840
+ MeetingUtil.parseInterpretationInfo(meeting, meetingInfo);
841
+ assert.calledWith(meeting.simultaneousInterpretation.updateMeetingSIEnabled, true, false);
842
+ assert.calledWith(meeting.simultaneousInterpretation.updateHostSIEnabled, false);
843
+ assert.calledWith(meeting.simultaneousInterpretation.updateInterpretation, {
844
+ siLanguages: [
845
+ {languageName: 'en', languageCode: 1},
846
+ {languageName: 'es', languageCode: 2},
847
+ ],
848
+ });
849
+ });
850
+ it('should update simultaneous interpretation settings with SI disabled', () => {
851
+ meetingInfo.turnOnSimultaneousInterpretation = false;
852
+ MeetingUtil.parseInterpretationInfo(meeting, meetingInfo);
853
+ assert.calledWith(meeting.simultaneousInterpretation.updateMeetingSIEnabled, false, false);
854
+ assert.calledWith(meeting.simultaneousInterpretation.updateHostSIEnabled, false);
855
+ });
856
+
857
+ it('should not update simultaneous interpretation settings for invalid input', () => {
858
+ // Call the function with invalid inputs
859
+ MeetingUtil.parseInterpretationInfo(null, null);
860
+
861
+ // Ensure that the update functions are not called
862
+ assert.notCalled(meeting.simultaneousInterpretation.updateMeetingSIEnabled);
863
+ assert.notCalled(meeting.simultaneousInterpretation.updateHostSIEnabled);
864
+ assert.notCalled(meeting.simultaneousInterpretation.updateInterpretation);
865
+ });
866
+ });
867
+
868
+ describe('prepareLeaveMeetingOptions', () => {
869
+ it('works as expected', () => {
870
+ const meeting = {
871
+ locusUrl: 'locusUrl',
872
+ selfId: 'selfId',
873
+ correlationId: 'correlationId',
874
+ resourceId: 'resourceId',
875
+ deviceUrl: 'deviceUrl',
876
+ };
877
+
878
+ const leaveOptions = MeetingUtil.prepareLeaveMeetingOptions(meeting, {
879
+ selfId: 'bob',
880
+ foo: 'bar',
881
+ });
882
+
883
+ assert.deepEqual(leaveOptions, {
884
+ correlationId: 'correlationId',
885
+ deviceUrl: 'deviceUrl',
886
+ foo: 'bar',
887
+ locusUrl: 'locusUrl',
888
+ resourceId: 'resourceId',
889
+ selfId: 'bob',
890
+ });
891
+ });
892
+ });
893
+
894
+ describe('leaveMeeting', () => {
895
+ it('calls prepareLeaveMeetingOptions as expected', () => {
896
+ const meeting = {
897
+ locusUrl: 'locusUrl',
898
+ selfId: 'selfId',
899
+ correlationId: 'correlationId',
900
+ resourceId: 'resourceId',
901
+ deviceUrl: 'deviceUrl',
902
+ locusInfo: {parsedLocus: {}},
903
+ meetingRequest: {
904
+ leaveMeeting: () => Promise.resolve(),
905
+ },
906
+ };
907
+
908
+ const prepareLeaveMeetingOptionsSpy = sinon.spy(MeetingUtil, 'prepareLeaveMeetingOptions');
909
+
910
+ MeetingUtil.leaveMeeting(meeting, {foo: 'bar'});
911
+
912
+ assert.calledOnce(prepareLeaveMeetingOptionsSpy);
913
+ assert.deepEqual(prepareLeaveMeetingOptionsSpy.getCall(0).args[0], meeting);
914
+ assert.deepEqual(prepareLeaveMeetingOptionsSpy.getCall(0).args[1], {foo: 'bar'});
915
+ });
916
+ });
917
+
918
+ describe('buildLeaveFetchRequestOptions', () => {
919
+ it('calls expected functions', () => {
920
+ const buildLeaveMeetingRequestOptionsSpy = sinon.stub();
921
+
922
+ const meeting = {
923
+ locusUrl: 'locusUrl',
924
+ selfId: 'selfId',
925
+ correlationId: 'correlationId',
926
+ resourceId: 'resourceId',
927
+ deviceUrl: 'deviceUrl',
928
+ meetingRequest: {
929
+ leaveMeeting: () => Promise.resolve(),
930
+ buildLeaveMeetingRequestOptions: buildLeaveMeetingRequestOptionsSpy,
931
+ },
932
+ };
933
+
934
+ const prepareLeaveMeetingOptionsSpy = sinon.spy(MeetingUtil, 'prepareLeaveMeetingOptions');
935
+
936
+ const options = MeetingUtil.buildLeaveFetchRequestOptions(meeting, {foo: 'bar'});
937
+
938
+ assert.calledOnce(prepareLeaveMeetingOptionsSpy);
939
+ assert.deepEqual(prepareLeaveMeetingOptionsSpy.getCall(0).args[0], meeting);
940
+ assert.deepEqual(prepareLeaveMeetingOptionsSpy.getCall(0).args[1], {foo: 'bar'});
941
+
942
+ assert.calledOnce(buildLeaveMeetingRequestOptionsSpy);
943
+ assert.deepEqual(buildLeaveMeetingRequestOptionsSpy.getCall(0).args[0], {
944
+ correlationId: 'correlationId',
945
+ deviceUrl: 'deviceUrl',
946
+ foo: 'bar',
947
+ locusUrl: 'locusUrl',
948
+ resourceId: 'resourceId',
949
+ selfId: 'selfId',
950
+ });
951
+ });
952
+ });
953
+
954
+ describe('generateBuildLocusDeltaRequestOptions', () => {
955
+ it('generates the correct wrapper function', async () => {
956
+ const addSequenceSpy = sinon.spy(MeetingUtil, 'addSequence');
957
+
958
+ const meeting = {locusInfo: {sequence: 123}};
959
+
960
+ const buildLocusDeltaRequestOptions =
961
+ MeetingUtil.generateBuildLocusDeltaRequestOptions(meeting);
962
+
963
+ let result = buildLocusDeltaRequestOptions({
964
+ some: 'option',
965
+ body: {},
966
+ });
967
+ assert.deepEqual(result, {some: 'option', body: {sequence: 123}});
968
+ assert.calledOnceWithExactly(addSequenceSpy, meeting, {sequence: 123});
969
+
970
+ addSequenceSpy.resetHistory();
971
+
972
+ // body missing from options
973
+ result = buildLocusDeltaRequestOptions({});
974
+ assert.deepEqual(result, {body: {sequence: 123}});
975
+ assert.calledOnceWithExactly(addSequenceSpy, meeting, {sequence: 123});
976
+
977
+ // meeting disappears so the WeakRef returns undefined
978
+ sinon.stub(WeakRef.prototype, 'deref').returns(undefined);
979
+
980
+ const input = {foo: 'bar'};
981
+ result = buildLocusDeltaRequestOptions(input);
982
+ assert.equal(result, input);
983
+ });
984
+ });
985
+
986
+ describe('getIpVersion', () => {
987
+ let isBrowserStub;
988
+ beforeEach(() => {
989
+ isBrowserStub = sinon.stub().returns(false);
990
+
991
+ sinon.stub(BrowserDetectionModule, 'default').returns({
992
+ isBrowser: isBrowserStub,
993
+ });
994
+ });
995
+
996
+ afterEach(() => {
997
+ sinon.restore();
998
+ });
999
+
1000
+ [
1001
+ {supportsIpV4: undefined, supportsIpV6: undefined, expectedOutput: IP_VERSION.unknown},
1002
+ {supportsIpV4: undefined, supportsIpV6: true, expectedOutput: IP_VERSION.only_ipv6},
1003
+ {supportsIpV4: undefined, supportsIpV6: false, expectedOutput: IP_VERSION.unknown},
1004
+ {supportsIpV4: true, supportsIpV6: undefined, expectedOutput: IP_VERSION.only_ipv4},
1005
+ {supportsIpV4: true, supportsIpV6: true, expectedOutput: IP_VERSION.ipv4_and_ipv6},
1006
+ {supportsIpV4: true, supportsIpV6: false, expectedOutput: IP_VERSION.only_ipv4},
1007
+ {supportsIpV4: false, supportsIpV6: undefined, expectedOutput: IP_VERSION.unknown},
1008
+ {supportsIpV4: false, supportsIpV6: true, expectedOutput: IP_VERSION.only_ipv6},
1009
+ {supportsIpV4: false, supportsIpV6: false, expectedOutput: IP_VERSION.unknown},
1010
+ ].forEach(({supportsIpV4, supportsIpV6, expectedOutput}) => {
1011
+ it(`returns ${expectedOutput} when supportsIpV4=${supportsIpV4} and supportsIpV6=${supportsIpV6}`, () => {
1012
+ sinon
1013
+ .stub(webex.internal.device.ipNetworkDetector, 'supportsIpV4')
1014
+ .get(() => supportsIpV4);
1015
+ sinon
1016
+ .stub(webex.internal.device.ipNetworkDetector, 'supportsIpV6')
1017
+ .get(() => supportsIpV6);
1018
+
1019
+ assert.equal(MeetingUtil.getIpVersion(webex), expectedOutput);
1020
+ });
1021
+
1022
+ it(`returns undefined when supportsIpV4=${supportsIpV4} and supportsIpV6=${supportsIpV6} and browser is firefox`, () => {
1023
+ sinon
1024
+ .stub(webex.internal.device.ipNetworkDetector, 'supportsIpV4')
1025
+ .get(() => supportsIpV4);
1026
+ sinon
1027
+ .stub(webex.internal.device.ipNetworkDetector, 'supportsIpV6')
1028
+ .get(() => supportsIpV6);
1029
+
1030
+ isBrowserStub.callsFake((name) => name === 'firefox');
1031
+
1032
+ assert.equal(MeetingUtil.getIpVersion(webex), undefined);
1033
+ });
1034
+ });
1035
+ });
1036
+
1037
+ describe('getChangeMeetingFloorErrorPayload', () => {
1038
+ [
1039
+ {
1040
+ reason: LOCAL_SHARE_ERRORS.UNDEFINED,
1041
+ expected: {
1042
+ category: 'signaling',
1043
+ errorCode: 1100,
1044
+ },
1045
+ },
1046
+ {
1047
+ reason: LOCAL_SHARE_ERRORS.DEVICE_NOT_JOINED,
1048
+ expected: {
1049
+ category: 'signaling',
1050
+ errorCode: 4050,
1051
+ },
1052
+ },
1053
+ {
1054
+ reason: LOCAL_SHARE_ERRORS.NO_MEDIA_FOR_DEVICE,
1055
+ expected: {
1056
+ category: 'media',
1057
+ errorCode: 2048,
1058
+ },
1059
+ },
1060
+ {
1061
+ reason: LOCAL_SHARE_ERRORS.NO_CONFLUENCE_ID,
1062
+ expected: {
1063
+ category: 'signaling',
1064
+ errorCode: 4064,
1065
+ },
1066
+ },
1067
+ {
1068
+ reason: LOCAL_SHARE_ERRORS.CONTENT_SHARING_DISABLED,
1069
+ expected: {
1070
+ category: 'expected',
1071
+ errorCode: 4065,
1072
+ },
1073
+ },
1074
+ {
1075
+ reason: LOCAL_SHARE_ERRORS.LOCUS_PARTICIPANT_DNE,
1076
+ expected: {
1077
+ category: 'signaling',
1078
+ errorCode: 4066,
1079
+ },
1080
+ },
1081
+ {
1082
+ reason: LOCAL_SHARE_ERRORS.CONTENT_REQUEST_WHILE_PENDING_WHITEBOARD,
1083
+ expected: {
1084
+ category: 'expected',
1085
+ errorCode: 4067,
1086
+ },
1087
+ },
1088
+ {
1089
+ reason: 'some unknown reason',
1090
+ expected: {
1091
+ category: 'signaling',
1092
+ errorCode: 1100,
1093
+ },
1094
+ },
1095
+ ].forEach(({reason, expected}) => {
1096
+ const expectedFull = {
1097
+ errorDescription: reason,
1098
+ name: 'locus.response',
1099
+ shownToUser: false,
1100
+ fatal: true,
1101
+ ...expected,
1102
+ };
1103
+ it(`returns expected when reason="${reason}"`, () => {
1104
+ const result = MeetingUtil.getChangeMeetingFloorErrorPayload(reason);
1105
+ assert.equal(result.length, 1);
1106
+
1107
+ const error = result[0];
1108
+ assert.deepEqual(error, expectedFull);
1109
+ });
1110
+ });
1111
+
1112
+ it('properly handles "includes"', () => {
1113
+ const reason = '>>> ' + LOCAL_SHARE_ERRORS.DEVICE_NOT_JOINED + ' <<<';
1114
+ const result = MeetingUtil.getChangeMeetingFloorErrorPayload(reason);
1115
+ assert.equal(result.length, 1);
1116
+
1117
+ const error = result[0];
1118
+ assert.deepEqual(error, {
1119
+ category: 'signaling',
1120
+ errorCode: 4050,
1121
+ errorDescription: reason,
1122
+ name: 'locus.response',
1123
+ shownToUser: false,
1124
+ fatal: true,
1125
+ });
1126
+ });
1127
+ });
318
1128
  });
319
1129
  });