@webex/plugin-meetings 3.0.0-beta.13 → 3.0.0-beta.130

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 (519) hide show
  1. package/README.md +45 -1
  2. package/UPGRADING.md +9 -9
  3. package/browsers.js +19 -24
  4. package/dist/annotation/annotation.types.js +7 -0
  5. package/dist/annotation/annotation.types.js.map +1 -0
  6. package/dist/annotation/constants.js +48 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +355 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +193 -0
  11. package/dist/breakouts/breakout.js.map +1 -0
  12. package/dist/breakouts/collection.js +23 -0
  13. package/dist/breakouts/collection.js.map +1 -0
  14. package/dist/breakouts/edit-lock-error.js +52 -0
  15. package/dist/breakouts/edit-lock-error.js.map +1 -0
  16. package/dist/breakouts/events.js +43 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +994 -0
  19. package/dist/breakouts/index.js.map +1 -0
  20. package/dist/breakouts/request.js +78 -0
  21. package/dist/breakouts/request.js.map +1 -0
  22. package/dist/breakouts/utils.js +67 -0
  23. package/dist/breakouts/utils.js.map +1 -0
  24. package/dist/common/browser-detection.js +1 -20
  25. package/dist/common/browser-detection.js.map +1 -1
  26. package/dist/common/collection.js +5 -20
  27. package/dist/common/collection.js.map +1 -1
  28. package/dist/common/config.js +0 -7
  29. package/dist/common/config.js.map +1 -1
  30. package/dist/common/errors/captcha-error.js +5 -26
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +5 -26
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +6 -27
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +5 -26
  37. package/dist/common/errors/media.js.map +1 -1
  38. package/dist/common/errors/parameter.js +5 -33
  39. package/dist/common/errors/parameter.js.map +1 -1
  40. package/dist/common/errors/password-error.js +5 -26
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +4 -25
  43. package/dist/common/errors/permission.js.map +1 -1
  44. package/dist/common/errors/reconnection-in-progress.js +0 -17
  45. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  46. package/dist/common/errors/reconnection.js +5 -26
  47. package/dist/common/errors/reconnection.js.map +1 -1
  48. package/dist/common/errors/stats.js +5 -26
  49. package/dist/common/errors/stats.js.map +1 -1
  50. package/dist/common/errors/webex-errors.js +6 -41
  51. package/dist/common/errors/webex-errors.js.map +1 -1
  52. package/dist/common/errors/webex-meetings-error.js +1 -24
  53. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  54. package/dist/common/events/events-scope.js +0 -22
  55. package/dist/common/events/events-scope.js.map +1 -1
  56. package/dist/common/events/events.js +0 -23
  57. package/dist/common/events/events.js.map +1 -1
  58. package/dist/common/events/trigger-proxy.js +0 -12
  59. package/dist/common/events/trigger-proxy.js.map +1 -1
  60. package/dist/common/events/util.js +0 -15
  61. package/dist/common/events/util.js.map +1 -1
  62. package/dist/common/logs/logger-config.js +0 -4
  63. package/dist/common/logs/logger-config.js.map +1 -1
  64. package/dist/common/logs/logger-proxy.js +1 -8
  65. package/dist/common/logs/logger-proxy.js.map +1 -1
  66. package/dist/common/logs/request.js +35 -61
  67. package/dist/common/logs/request.js.map +1 -1
  68. package/dist/common/queue.js +4 -14
  69. package/dist/common/queue.js.map +1 -1
  70. package/dist/config.js +6 -6
  71. package/dist/config.js.map +1 -1
  72. package/dist/constants.js +201 -53
  73. package/dist/constants.js.map +1 -1
  74. package/dist/controls-options-manager/constants.js +14 -0
  75. package/dist/controls-options-manager/constants.js.map +1 -0
  76. package/dist/controls-options-manager/enums.js +27 -0
  77. package/dist/controls-options-manager/enums.js.map +1 -0
  78. package/dist/controls-options-manager/index.js +297 -0
  79. package/dist/controls-options-manager/index.js.map +1 -0
  80. package/dist/controls-options-manager/types.js +7 -0
  81. package/dist/controls-options-manager/types.js.map +1 -0
  82. package/dist/controls-options-manager/util.js +294 -0
  83. package/dist/controls-options-manager/util.js.map +1 -0
  84. package/dist/index.js +72 -17
  85. package/dist/index.js.map +1 -1
  86. package/dist/locus-info/controlsUtils.js +100 -29
  87. package/dist/locus-info/controlsUtils.js.map +1 -1
  88. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  89. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  90. package/dist/locus-info/fullState.js +0 -15
  91. package/dist/locus-info/fullState.js.map +1 -1
  92. package/dist/locus-info/hostUtils.js +4 -12
  93. package/dist/locus-info/hostUtils.js.map +1 -1
  94. package/dist/locus-info/index.js +392 -212
  95. package/dist/locus-info/index.js.map +1 -1
  96. package/dist/locus-info/infoUtils.js +0 -38
  97. package/dist/locus-info/infoUtils.js.map +1 -1
  98. package/dist/locus-info/mediaSharesUtils.js +54 -38
  99. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  100. package/dist/locus-info/parser.js +88 -123
  101. package/dist/locus-info/parser.js.map +1 -1
  102. package/dist/locus-info/selfUtils.js +99 -91
  103. package/dist/locus-info/selfUtils.js.map +1 -1
  104. package/dist/media/index.js +55 -165
  105. package/dist/media/index.js.map +1 -1
  106. package/dist/media/properties.js +71 -117
  107. package/dist/media/properties.js.map +1 -1
  108. package/dist/media/util.js +2 -9
  109. package/dist/media/util.js.map +1 -1
  110. package/dist/mediaQualityMetrics/config.js +505 -495
  111. package/dist/mediaQualityMetrics/config.js.map +1 -1
  112. package/dist/meeting/in-meeting-actions.js +77 -14
  113. package/dist/meeting/in-meeting-actions.js.map +1 -1
  114. package/dist/meeting/index.js +2597 -2464
  115. package/dist/meeting/index.js.map +1 -1
  116. package/dist/meeting/locusMediaRequest.js +291 -0
  117. package/dist/meeting/locusMediaRequest.js.map +1 -0
  118. package/dist/meeting/muteState.js +292 -138
  119. package/dist/meeting/muteState.js.map +1 -1
  120. package/dist/meeting/request.js +315 -336
  121. package/dist/meeting/request.js.map +1 -1
  122. package/dist/meeting/request.type.js +7 -0
  123. package/dist/meeting/request.type.js.map +1 -0
  124. package/dist/meeting/state.js +21 -31
  125. package/dist/meeting/state.js.map +1 -1
  126. package/dist/meeting/util.js +463 -583
  127. package/dist/meeting/util.js.map +1 -1
  128. package/dist/meeting-info/collection.js +3 -25
  129. package/dist/meeting-info/collection.js.map +1 -1
  130. package/dist/meeting-info/index.js +10 -33
  131. package/dist/meeting-info/index.js.map +1 -1
  132. package/dist/meeting-info/meeting-info-v2.js +305 -286
  133. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  134. package/dist/meeting-info/request.js +1 -16
  135. package/dist/meeting-info/request.js.map +1 -1
  136. package/dist/meeting-info/util.js +98 -183
  137. package/dist/meeting-info/util.js.map +1 -1
  138. package/dist/meeting-info/utilv2.js +156 -232
  139. package/dist/meeting-info/utilv2.js.map +1 -1
  140. package/dist/meetings/collection.js +24 -20
  141. package/dist/meetings/collection.js.map +1 -1
  142. package/dist/meetings/index.js +692 -593
  143. package/dist/meetings/index.js.map +1 -1
  144. package/dist/meetings/request.js +23 -42
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +186 -155
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.js +89 -88
  149. package/dist/member/index.js.map +1 -1
  150. package/dist/member/types.js +15 -0
  151. package/dist/member/types.js.map +1 -0
  152. package/dist/member/util.js +101 -69
  153. package/dist/member/util.js.map +1 -1
  154. package/dist/members/collection.js +12 -12
  155. package/dist/members/collection.js.map +1 -1
  156. package/dist/members/index.js +166 -205
  157. package/dist/members/index.js.map +1 -1
  158. package/dist/members/request.js +120 -85
  159. package/dist/members/request.js.map +1 -1
  160. package/dist/members/types.js +15 -0
  161. package/dist/members/types.js.map +1 -0
  162. package/dist/members/util.js +314 -260
  163. package/dist/members/util.js.map +1 -1
  164. package/dist/metrics/config.js +50 -16
  165. package/dist/metrics/config.js.map +1 -1
  166. package/dist/metrics/constants.js +4 -7
  167. package/dist/metrics/constants.js.map +1 -1
  168. package/dist/metrics/index.js +93 -162
  169. package/dist/metrics/index.js.map +1 -1
  170. package/dist/multistream/mediaRequestManager.js +167 -50
  171. package/dist/multistream/mediaRequestManager.js.map +1 -1
  172. package/dist/multistream/receiveSlot.js +58 -65
  173. package/dist/multistream/receiveSlot.js.map +1 -1
  174. package/dist/multistream/receiveSlotManager.js +74 -93
  175. package/dist/multistream/receiveSlotManager.js.map +1 -1
  176. package/dist/multistream/remoteMedia.js +55 -74
  177. package/dist/multistream/remoteMedia.js.map +1 -1
  178. package/dist/multistream/remoteMediaGroup.js +6 -40
  179. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  180. package/dist/multistream/remoteMediaManager.js +466 -442
  181. package/dist/multistream/remoteMediaManager.js.map +1 -1
  182. package/dist/networkQualityMonitor/index.js +32 -59
  183. package/dist/networkQualityMonitor/index.js.map +1 -1
  184. package/dist/personal-meeting-room/index.js +10 -45
  185. package/dist/personal-meeting-room/index.js.map +1 -1
  186. package/dist/personal-meeting-room/request.js +2 -33
  187. package/dist/personal-meeting-room/request.js.map +1 -1
  188. package/dist/personal-meeting-room/util.js +0 -13
  189. package/dist/personal-meeting-room/util.js.map +1 -1
  190. package/dist/reachability/index.js +190 -199
  191. package/dist/reachability/index.js.map +1 -1
  192. package/dist/reachability/request.js +14 -23
  193. package/dist/reachability/request.js.map +1 -1
  194. package/dist/reactions/constants.js +13 -0
  195. package/dist/reactions/constants.js.map +1 -0
  196. package/dist/reactions/reactions.js +2 -4
  197. package/dist/reactions/reactions.js.map +1 -1
  198. package/dist/reactions/reactions.type.js +19 -23
  199. package/dist/reactions/reactions.type.js.map +1 -1
  200. package/dist/reconnection-manager/index.js +326 -465
  201. package/dist/reconnection-manager/index.js.map +1 -1
  202. package/dist/recording-controller/enums.js +17 -0
  203. package/dist/recording-controller/enums.js.map +1 -0
  204. package/dist/recording-controller/index.js +343 -0
  205. package/dist/recording-controller/index.js.map +1 -0
  206. package/dist/recording-controller/util.js +63 -0
  207. package/dist/recording-controller/util.js.map +1 -0
  208. package/dist/roap/index.js +31 -75
  209. package/dist/roap/index.js.map +1 -1
  210. package/dist/roap/request.js +129 -136
  211. package/dist/roap/request.js.map +1 -1
  212. package/dist/roap/turnDiscovery.js +143 -103
  213. package/dist/roap/turnDiscovery.js.map +1 -1
  214. package/dist/statsAnalyzer/global.js +1 -95
  215. package/dist/statsAnalyzer/global.js.map +1 -1
  216. package/dist/statsAnalyzer/index.js +369 -461
  217. package/dist/statsAnalyzer/index.js.map +1 -1
  218. package/dist/statsAnalyzer/mqaUtil.js +144 -94
  219. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  220. package/dist/transcription/index.js +13 -45
  221. package/dist/transcription/index.js.map +1 -1
  222. package/dist/types/annotation/annotation.types.d.ts +35 -0
  223. package/dist/types/annotation/constants.d.ts +31 -0
  224. package/dist/types/annotation/index.d.ts +124 -0
  225. package/dist/types/breakouts/breakout.d.ts +8 -0
  226. package/dist/types/breakouts/collection.d.ts +5 -0
  227. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  228. package/dist/types/breakouts/events.d.ts +2 -0
  229. package/dist/types/breakouts/index.d.ts +5 -0
  230. package/dist/types/breakouts/request.d.ts +22 -0
  231. package/dist/types/breakouts/utils.d.ts +15 -0
  232. package/dist/types/common/browser-detection.d.ts +9 -0
  233. package/dist/types/common/collection.d.ts +48 -0
  234. package/dist/types/common/config.d.ts +2 -0
  235. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  236. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  237. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  238. package/dist/types/common/errors/media.d.ts +15 -0
  239. package/dist/types/common/errors/parameter.d.ts +15 -0
  240. package/dist/types/common/errors/password-error.d.ts +15 -0
  241. package/dist/types/common/errors/permission.d.ts +14 -0
  242. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  243. package/dist/types/common/errors/reconnection.d.ts +15 -0
  244. package/dist/types/common/errors/stats.d.ts +15 -0
  245. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  246. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  247. package/dist/types/common/events/events-scope.d.ts +17 -0
  248. package/dist/types/common/events/events.d.ts +12 -0
  249. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  250. package/dist/types/common/events/util.d.ts +2 -0
  251. package/dist/types/common/logs/logger-config.d.ts +2 -0
  252. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  253. package/dist/types/common/logs/request.d.ts +34 -0
  254. package/dist/types/common/queue.d.ts +32 -0
  255. package/dist/types/config.d.ts +78 -0
  256. package/dist/types/constants.d.ts +991 -0
  257. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  258. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  259. package/dist/types/controls-options-manager/index.d.ts +136 -0
  260. package/dist/types/controls-options-manager/types.d.ts +43 -0
  261. package/dist/types/controls-options-manager/util.d.ts +1 -0
  262. package/dist/types/index.d.ts +7 -0
  263. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  264. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  265. package/dist/types/locus-info/fullState.d.ts +2 -0
  266. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  267. package/dist/types/locus-info/index.d.ts +315 -0
  268. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  269. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  270. package/dist/types/locus-info/parser.d.ts +212 -0
  271. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  272. package/dist/types/media/index.d.ts +34 -0
  273. package/dist/types/media/properties.d.ts +108 -0
  274. package/dist/types/media/util.d.ts +2 -0
  275. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  276. package/dist/types/meeting/in-meeting-actions.d.ts +147 -0
  277. package/dist/types/meeting/index.d.ts +1762 -0
  278. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  279. package/dist/types/meeting/muteState.d.ts +186 -0
  280. package/dist/types/meeting/request.d.ts +269 -0
  281. package/dist/types/meeting/request.type.d.ts +11 -0
  282. package/dist/types/meeting/state.d.ts +9 -0
  283. package/dist/types/meeting/util.d.ts +76 -0
  284. package/dist/types/meeting-info/collection.d.ts +20 -0
  285. package/dist/types/meeting-info/index.d.ts +57 -0
  286. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  287. package/dist/types/meeting-info/request.d.ts +22 -0
  288. package/dist/types/meeting-info/util.d.ts +2 -0
  289. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  290. package/dist/types/meetings/collection.d.ts +31 -0
  291. package/dist/types/meetings/index.d.ts +345 -0
  292. package/dist/types/meetings/request.d.ts +27 -0
  293. package/dist/types/meetings/util.d.ts +18 -0
  294. package/dist/types/member/index.d.ts +157 -0
  295. package/dist/types/member/types.d.ts +21 -0
  296. package/dist/types/member/util.d.ts +2 -0
  297. package/dist/types/members/collection.d.ts +29 -0
  298. package/dist/types/members/index.d.ts +353 -0
  299. package/dist/types/members/request.d.ts +114 -0
  300. package/dist/types/members/types.d.ts +24 -0
  301. package/dist/types/members/util.d.ts +210 -0
  302. package/dist/types/metrics/config.d.ts +195 -0
  303. package/dist/types/metrics/constants.d.ts +55 -0
  304. package/dist/types/metrics/index.d.ts +169 -0
  305. package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
  306. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  307. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  308. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  309. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  310. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  311. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  312. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  313. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  314. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  315. package/dist/types/reachability/index.d.ts +152 -0
  316. package/dist/types/reachability/request.d.ts +37 -0
  317. package/dist/types/reactions/constants.d.ts +3 -0
  318. package/dist/types/reactions/reactions.d.ts +4 -0
  319. package/dist/types/reactions/reactions.type.d.ts +52 -0
  320. package/dist/types/reconnection-manager/index.d.ts +126 -0
  321. package/dist/types/recording-controller/enums.d.ts +7 -0
  322. package/dist/types/recording-controller/index.d.ts +193 -0
  323. package/dist/types/recording-controller/util.d.ts +13 -0
  324. package/dist/types/roap/index.d.ts +77 -0
  325. package/dist/types/roap/request.d.ts +36 -0
  326. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  327. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  328. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  329. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  330. package/dist/types/transcription/index.d.ts +64 -0
  331. package/internal-README.md +7 -6
  332. package/package.json +28 -21
  333. package/src/annotation/annotation.types.ts +42 -0
  334. package/src/annotation/constants.ts +36 -0
  335. package/src/annotation/index.ts +339 -0
  336. package/src/breakouts/README.md +220 -0
  337. package/src/breakouts/breakout.ts +163 -0
  338. package/src/breakouts/collection.ts +19 -0
  339. package/src/breakouts/edit-lock-error.ts +25 -0
  340. package/src/breakouts/events.ts +37 -0
  341. package/src/breakouts/index.ts +860 -0
  342. package/src/breakouts/request.ts +55 -0
  343. package/src/breakouts/utils.ts +57 -0
  344. package/src/common/browser-detection.ts +9 -6
  345. package/src/common/collection.ts +3 -1
  346. package/src/common/errors/captcha-error.ts +6 -6
  347. package/src/common/errors/intent-to-join.ts +6 -6
  348. package/src/common/errors/join-meeting.ts +12 -8
  349. package/src/common/errors/media.ts +6 -6
  350. package/src/common/errors/parameter.ts +9 -6
  351. package/src/common/errors/password-error.ts +6 -6
  352. package/src/common/errors/permission.ts +5 -5
  353. package/src/common/errors/reconnection.ts +6 -6
  354. package/src/common/errors/stats.ts +6 -6
  355. package/src/common/errors/webex-errors.ts +7 -5
  356. package/src/common/errors/webex-meetings-error.ts +1 -1
  357. package/src/common/events/events-scope.ts +5 -1
  358. package/src/common/events/events.ts +5 -1
  359. package/src/common/events/trigger-proxy.ts +8 -3
  360. package/src/common/events/util.ts +1 -2
  361. package/src/common/logs/logger-proxy.ts +21 -10
  362. package/src/common/logs/request.ts +11 -8
  363. package/src/config.ts +16 -12
  364. package/src/constants.ts +151 -7
  365. package/src/controls-options-manager/constants.ts +5 -0
  366. package/src/controls-options-manager/enums.ts +18 -0
  367. package/src/controls-options-manager/index.ts +278 -0
  368. package/src/controls-options-manager/types.ts +59 -0
  369. package/src/controls-options-manager/util.ts +281 -0
  370. package/src/index.ts +33 -0
  371. package/src/locus-info/controlsUtils.ts +142 -24
  372. package/src/locus-info/fullState.ts +15 -11
  373. package/src/locus-info/hostUtils.ts +4 -3
  374. package/src/locus-info/index.ts +335 -55
  375. package/src/locus-info/infoUtils.ts +12 -4
  376. package/src/locus-info/mediaSharesUtils.ts +52 -4
  377. package/src/locus-info/parser.ts +46 -68
  378. package/src/locus-info/selfUtils.ts +187 -56
  379. package/src/media/index.ts +139 -196
  380. package/src/media/properties.ts +43 -36
  381. package/src/media/util.ts +1 -1
  382. package/src/mediaQualityMetrics/config.ts +380 -378
  383. package/src/meeting/in-meeting-actions.ts +159 -3
  384. package/src/meeting/index.ts +2789 -1584
  385. package/src/meeting/locusMediaRequest.ts +309 -0
  386. package/src/meeting/muteState.ts +290 -72
  387. package/src/meeting/request.ts +247 -178
  388. package/src/meeting/request.type.ts +13 -0
  389. package/src/meeting/state.ts +45 -30
  390. package/src/meeting/util.ts +445 -395
  391. package/src/meeting-info/collection.ts +2 -1
  392. package/src/meeting-info/index.ts +32 -30
  393. package/src/meeting-info/meeting-info-v2.ts +235 -116
  394. package/src/meeting-info/request.ts +9 -3
  395. package/src/meeting-info/util.ts +54 -46
  396. package/src/meeting-info/utilv2.ts +71 -55
  397. package/src/meetings/collection.ts +21 -1
  398. package/src/meetings/index.ts +772 -437
  399. package/src/meetings/request.ts +29 -25
  400. package/src/meetings/util.ts +132 -33
  401. package/src/member/index.ts +95 -49
  402. package/src/member/types.ts +24 -0
  403. package/src/member/util.ts +106 -13
  404. package/src/members/collection.ts +8 -1
  405. package/src/members/index.ts +288 -130
  406. package/src/members/request.ts +144 -31
  407. package/src/members/types.ts +28 -0
  408. package/src/members/util.ts +316 -235
  409. package/src/metrics/config.ts +302 -90
  410. package/src/metrics/constants.ts +2 -6
  411. package/src/metrics/index.ts +124 -95
  412. package/src/multistream/mediaRequestManager.ts +203 -45
  413. package/src/multistream/receiveSlot.ts +69 -26
  414. package/src/multistream/receiveSlotManager.ts +62 -38
  415. package/src/multistream/remoteMedia.ts +30 -4
  416. package/src/multistream/remoteMediaGroup.ts +4 -3
  417. package/src/multistream/remoteMediaManager.ts +230 -66
  418. package/src/networkQualityMonitor/index.ts +24 -27
  419. package/src/personal-meeting-room/index.ts +12 -16
  420. package/src/personal-meeting-room/request.ts +10 -3
  421. package/src/personal-meeting-room/util.ts +3 -3
  422. package/src/reachability/index.ts +131 -79
  423. package/src/reachability/request.ts +43 -34
  424. package/src/reactions/constants.ts +4 -0
  425. package/src/reactions/reactions.ts +8 -8
  426. package/src/reactions/reactions.type.ts +31 -5
  427. package/src/reconnection-manager/index.ts +193 -111
  428. package/src/recording-controller/enums.ts +8 -0
  429. package/src/recording-controller/index.ts +315 -0
  430. package/src/recording-controller/util.ts +58 -0
  431. package/src/roap/index.ts +53 -53
  432. package/src/roap/request.ts +77 -64
  433. package/src/roap/turnDiscovery.ts +101 -48
  434. package/src/statsAnalyzer/global.ts +8 -104
  435. package/src/statsAnalyzer/index.ts +624 -376
  436. package/src/statsAnalyzer/mqaUtil.ts +203 -90
  437. package/src/transcription/index.ts +34 -32
  438. package/test/integration/spec/converged-space-meetings.js +177 -0
  439. package/test/integration/spec/journey.js +670 -466
  440. package/test/integration/spec/space-meeting.js +320 -204
  441. package/test/integration/spec/transcription.js +7 -8
  442. package/test/unit/spec/annotation/index.ts +433 -0
  443. package/test/unit/spec/breakouts/breakout.ts +203 -0
  444. package/test/unit/spec/breakouts/collection.ts +15 -0
  445. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  446. package/test/unit/spec/breakouts/events.ts +77 -0
  447. package/test/unit/spec/breakouts/index.ts +1609 -0
  448. package/test/unit/spec/breakouts/request.ts +104 -0
  449. package/test/unit/spec/breakouts/utils.js +72 -0
  450. package/test/unit/spec/common/browser-detection.js +9 -28
  451. package/test/unit/spec/controls-options-manager/index.js +287 -0
  452. package/test/unit/spec/controls-options-manager/util.js +504 -0
  453. package/test/unit/spec/fixture/locus.js +93 -90
  454. package/test/unit/spec/locus-info/controlsUtils.js +305 -32
  455. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  456. package/test/unit/spec/locus-info/index.js +598 -5
  457. package/test/unit/spec/locus-info/infoUtils.js +26 -33
  458. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  459. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  460. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  461. package/test/unit/spec/locus-info/parser.js +3 -9
  462. package/test/unit/spec/locus-info/selfConstant.js +110 -103
  463. package/test/unit/spec/locus-info/selfUtils.js +236 -12
  464. package/test/unit/spec/media/index.ts +104 -8
  465. package/test/unit/spec/media/properties.ts +9 -9
  466. package/test/unit/spec/meeting/in-meeting-actions.ts +76 -3
  467. package/test/unit/spec/meeting/index.js +3094 -921
  468. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  469. package/test/unit/spec/meeting/muteState.js +421 -94
  470. package/test/unit/spec/meeting/request.js +421 -79
  471. package/test/unit/spec/meeting/utils.js +326 -189
  472. package/test/unit/spec/meeting-info/meetinginfov2.js +481 -76
  473. package/test/unit/spec/meeting-info/request.js +7 -9
  474. package/test/unit/spec/meeting-info/util.js +11 -12
  475. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  476. package/test/unit/spec/meetings/collection.js +15 -1
  477. package/test/unit/spec/meetings/index.js +1126 -328
  478. package/test/unit/spec/meetings/utils.js +220 -14
  479. package/test/unit/spec/member/index.js +24 -1
  480. package/test/unit/spec/member/util.js +383 -32
  481. package/test/unit/spec/members/index.js +424 -55
  482. package/test/unit/spec/members/request.js +228 -40
  483. package/test/unit/spec/members/utils.js +191 -4
  484. package/test/unit/spec/metrics/index.js +113 -20
  485. package/test/unit/spec/multistream/mediaRequestManager.ts +650 -105
  486. package/test/unit/spec/multistream/receiveSlot.ts +76 -17
  487. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  488. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  489. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  490. package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
  491. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  492. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  493. package/test/unit/spec/reachability/index.ts +176 -27
  494. package/test/unit/spec/reachability/request.js +66 -0
  495. package/test/unit/spec/reconnection-manager/index.js +62 -31
  496. package/test/unit/spec/recording-controller/index.js +231 -0
  497. package/test/unit/spec/recording-controller/util.js +102 -0
  498. package/test/unit/spec/roap/index.ts +19 -49
  499. package/test/unit/spec/roap/request.ts +187 -0
  500. package/test/unit/spec/roap/turnDiscovery.ts +92 -50
  501. package/test/unit/spec/stats-analyzer/index.js +116 -60
  502. package/test/utils/cmr.js +44 -42
  503. package/test/utils/constants.js +9 -0
  504. package/test/utils/integrationTestUtils.js +64 -0
  505. package/test/utils/testUtils.js +63 -99
  506. package/test/utils/webex-config.js +22 -18
  507. package/test/utils/webex-test-users.js +57 -50
  508. package/tsconfig.json +6 -0
  509. package/dist/media/internal-media-core-wrapper.js +0 -22
  510. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  511. package/dist/meeting/effectsState.js +0 -334
  512. package/dist/meeting/effectsState.js.map +0 -1
  513. package/dist/multistream/multistreamMedia.js +0 -116
  514. package/dist/multistream/multistreamMedia.js.map +0 -1
  515. package/src/index.js +0 -15
  516. package/src/media/internal-media-core-wrapper.ts +0 -9
  517. package/src/meeting/effectsState.ts +0 -211
  518. package/src/multistream/multistreamMedia.ts +0 -92
  519. package/test/unit/spec/meeting/effectsState.js +0 -291
@@ -1,17 +1,19 @@
1
- import {isEmpty} from 'lodash';
1
+ import {LocalCameraTrack, LocalMicrophoneTrack} from '@webex/media-helpers';
2
2
 
3
+ import {cloneDeep} from 'lodash';
3
4
  import {MeetingNotActiveError, UserNotJoinedError} from '../common/errors/webex-errors';
4
5
  import Metrics from '../metrics';
5
6
  import {eventType, trigger} from '../metrics/config';
6
- import Media from '../media';
7
7
  import LoggerProxy from '../common/logs/logger-proxy';
8
- import {INTENT_TO_JOIN,
8
+ import {
9
+ INTENT_TO_JOIN,
9
10
  _LEFT_,
10
11
  _IDLE_,
11
12
  _JOINED_,
12
13
  PASSWORD_STATUS,
13
14
  DISPLAY_HINTS,
14
- FULL_STATE} from '../constants';
15
+ FULL_STATE,
16
+ } from '../constants';
15
17
  import IntentToJoinError from '../common/errors/intent-to-join';
16
18
  import JoinMeetingError from '../common/errors/join-meeting';
17
19
  import ParameterError from '../common/errors/parameter';
@@ -19,489 +21,537 @@ import PermissionError from '../common/errors/permission';
19
21
  import PasswordError from '../common/errors/password-error';
20
22
  import CaptchaError from '../common/errors/captcha-error';
21
23
 
22
- const MeetingUtil: any = {};
24
+ const MeetingUtil = {
25
+ parseLocusJoin: (response) => {
26
+ const parsed: any = {};
27
+
28
+ // First todo: add check for existance
29
+ parsed.locus = response.body.locus;
30
+ parsed.mediaConnections = response.body.mediaConnections;
31
+ parsed.locusUrl = parsed.locus.url;
32
+ parsed.locusId = parsed.locus.url.split('/').pop();
33
+ parsed.selfId = parsed.locus.self.id;
34
+
35
+ // we need mediaId before making roap calls
36
+ parsed.mediaConnections.forEach((mediaConnection) => {
37
+ if (mediaConnection.mediaId) {
38
+ parsed.mediaId = mediaConnection.mediaId;
39
+ }
40
+ });
23
41
 
24
- MeetingUtil.parseLocusJoin = (response) => {
25
- const parsed: any = {};
42
+ return parsed;
43
+ },
26
44
 
27
- // First todo: add check for existance
28
- parsed.locus = response.body.locus;
29
- parsed.mediaConnections = response.body.mediaConnections;
30
- parsed.locusUrl = parsed.locus.url;
31
- parsed.locusId = parsed.locus.url.split('/').pop();
32
- parsed.selfId = parsed.locus.self.id;
45
+ remoteUpdateAudioVideo: (meeting, audioMuted?: boolean, videoMuted?: boolean) => {
46
+ if (!meeting) {
47
+ return Promise.reject(new ParameterError('You need a meeting object.'));
48
+ }
33
49
 
34
- // we need mediaId before making roap calls
35
- parsed.mediaConnections.forEach((mediaConnection) => {
36
- if (mediaConnection.mediaId) {
37
- parsed.mediaId = mediaConnection.mediaId;
50
+ if (!meeting.locusMediaRequest) {
51
+ return Promise.reject(
52
+ new ParameterError(
53
+ 'You need a meeting with a media connection, call Meeting.addMedia() first.'
54
+ )
55
+ );
38
56
  }
39
- });
40
57
 
41
- return parsed;
42
- };
58
+ Metrics.postEvent({event: eventType.MEDIA_REQUEST, meeting});
59
+
60
+ return meeting.locusMediaRequest
61
+ .send({
62
+ type: 'LocalMute',
63
+ selfUrl: meeting.selfUrl,
64
+ mediaId: meeting.mediaId,
65
+ sequence: meeting.locusInfo.sequence,
66
+ muteOptions: {
67
+ audioMuted,
68
+ videoMuted,
69
+ },
70
+ })
71
+ .then((response) => {
72
+ Metrics.postEvent({event: eventType.MEDIA_RESPONSE, meeting});
73
+
74
+ return response?.body?.locus;
75
+ });
76
+ },
43
77
 
44
- MeetingUtil.remoteUpdateAudioVideo = (audioMuted, videoMuted, meeting) => {
45
- if (!meeting) {
46
- return Promise.reject(new ParameterError('You need a meeting object.'));
47
- }
48
- const localMedias = Media.generateLocalMedias(meeting.mediaId, audioMuted, videoMuted);
49
-
50
- if (isEmpty(localMedias)) {
51
- return Promise.reject(new ParameterError('You need a media id on the meeting to change remote audio.'));
52
- }
53
-
54
- Metrics.postEvent({event: eventType.MEDIA_REQUEST, meeting});
55
-
56
- return meeting.meetingRequest.remoteAudioVideoToggle({
57
- locusUrl: meeting.locusUrl,
58
- selfId: meeting.selfId,
59
- localMedias,
60
- deviceUrl: meeting.deviceUrl,
61
- correlationId: meeting.correlationId,
62
- preferTranscoding: !meeting.isMultistream,
63
- }).then((response) => {
64
- Metrics.postEvent({event: eventType.MEDIA_RESPONSE, meeting});
65
-
66
- return response.body.locus;
67
- });
68
- };
78
+ hasOwner: (info) => info && info.owner,
69
79
 
70
- MeetingUtil.hasOwner = (info) => info && info.owner;
80
+ isOwnerSelf: (owner, selfId) => owner === selfId,
71
81
 
72
- MeetingUtil.isOwnerSelf = (owner, selfId) => owner === selfId;
82
+ isPinOrGuest: (err) => err?.body?.errorCode && INTENT_TO_JOIN.includes(err.body.errorCode),
73
83
 
74
- MeetingUtil.isPinOrGuest = (err) => err?.body?.errorCode && INTENT_TO_JOIN.includes(err.body.errorCode);
84
+ joinMeeting: (meeting, options) => {
85
+ if (!meeting) {
86
+ return Promise.reject(new ParameterError('You need a meeting object.'));
87
+ }
75
88
 
76
- MeetingUtil.joinMeeting = (meeting, options) => {
77
- if (!meeting) {
78
- return Promise.reject(new ParameterError('You need a meeting object.'));
79
- }
89
+ Metrics.postEvent({event: eventType.LOCUS_JOIN_REQUEST, meeting});
90
+
91
+ // eslint-disable-next-line no-warning-comments
92
+ // TODO: check if the meeting is in JOINING state
93
+ // if Joining state termintate the request as user might click multiple times
94
+ return meeting.meetingRequest
95
+ .joinMeeting({
96
+ inviteeAddress: meeting.meetingJoinUrl || meeting.sipUri,
97
+ meetingNumber: meeting.meetingNumber,
98
+ deviceUrl: meeting.deviceUrl,
99
+ locusUrl: meeting.locusUrl,
100
+ correlationId: meeting.correlationId,
101
+ roapMessage: options.roapMessage,
102
+ permissionToken: meeting.permissionToken,
103
+ resourceId: options.resourceId || null,
104
+ moderator: options.moderator,
105
+ pin: options.pin,
106
+ moveToResource: options.moveToResource,
107
+ preferTranscoding: !meeting.isMultistream,
108
+ asResourceOccupant: options.asResourceOccupant,
109
+ breakoutsSupported: options.breakoutsSupported,
110
+ locale: options.locale,
111
+ deviceCapabilities: options.deviceCapabilities,
112
+ liveAnnotationSupported: options.liveAnnotationSupported,
113
+ })
114
+ .then((res) => {
115
+ Metrics.postEvent({
116
+ event: eventType.LOCUS_JOIN_RESPONSE,
117
+ meeting,
118
+ data: {
119
+ trigger: trigger.LOCI_UPDATE,
120
+ locus: res.body.locus,
121
+ mediaConnections: res.body.mediaConnections,
122
+ trackingId: res.headers.trackingid,
123
+ },
124
+ });
80
125
 
81
- Metrics.postEvent({event: eventType.LOCUS_JOIN_REQUEST, meeting});
126
+ return MeetingUtil.parseLocusJoin(res);
127
+ });
128
+ },
129
+
130
+ cleanUp: (meeting) => {
131
+ meeting.breakouts.cleanUp();
132
+
133
+ // make sure we send last metrics before we close the peerconnection
134
+ const stopStatsAnalyzer = meeting.statsAnalyzer
135
+ ? meeting.statsAnalyzer.stopAnalyzer()
136
+ : Promise.resolve();
137
+
138
+ return stopStatsAnalyzer
139
+ .then(() => meeting.closeLocalStream())
140
+ .then(() => meeting.closeLocalShare())
141
+ .then(() => meeting.closeRemoteTracks())
142
+ .then(() => meeting.closePeerConnections())
143
+ .then(() => {
144
+ meeting.unsetLocalVideoTrack();
145
+ meeting.unsetLocalShareTrack();
146
+ meeting.unsetRemoteTracks();
147
+ meeting.unsetPeerConnections();
148
+ meeting.reconnectionManager.cleanUp();
149
+ })
150
+ .then(() => meeting.stopKeepAlive())
151
+ .then(() => meeting.updateLLMConnection());
152
+ },
153
+
154
+ disconnectPhoneAudio: (meeting, phoneUrl) => {
155
+ if (meeting.meetingState === FULL_STATE.INACTIVE) {
156
+ return Promise.reject(new MeetingNotActiveError());
157
+ }
82
158
 
83
- // eslint-disable-next-line no-warning-comments
84
- // TODO: check if the meeting is in JOINING state
85
- // if Joining state termintate the request as user might click multiple times
86
- return meeting.meetingRequest
87
- .joinMeeting({
88
- inviteeAddress: meeting.meetingJoinUrl || meeting.sipUri,
89
- meetingNumber: meeting.meetingNumber,
90
- deviceUrl: meeting.deviceUrl,
159
+ const options = {
91
160
  locusUrl: meeting.locusUrl,
161
+ selfId: meeting.selfId,
92
162
  correlationId: meeting.correlationId,
93
- roapMessage: options.roapMessage,
94
- permissionToken: meeting.permissionToken,
95
- resourceId: options.resourceId || null,
96
- moderator: options.moderator,
97
- pin: options.pin,
98
- moveToResource: options.moveToResource,
99
- preferTranscoding: !meeting.isMultistream,
100
- asResourceOccupant: options.asResourceOccupant
101
- })
102
- .then((res) => {
103
- Metrics.postEvent({
104
- event: eventType.LOCUS_JOIN_RESPONSE,
105
- meeting,
106
- data: {
107
- trigger: trigger.LOCI_UPDATE,
108
- locus: res.body.locus,
109
- mediaConnections: res.body.mediaConnections,
110
- trackingId: res.headers.trackingid
111
- }
112
- });
163
+ phoneUrl,
164
+ };
113
165
 
114
- return MeetingUtil.parseLocusJoin(res);
115
- });
116
- };
117
-
118
- MeetingUtil.cleanUp = (meeting) => {
119
- // make sure we send last metrics before we close the peerconnection
120
- const stopStatsAnalyzer = (meeting.statsAnalyzer) ? meeting.statsAnalyzer.stopAnalyzer() : Promise.resolve();
121
-
122
- return stopStatsAnalyzer
123
- .then(() => meeting.closeLocalStream())
124
- .then(() => meeting.closeLocalShare())
125
- .then(() => meeting.closeRemoteTracks())
126
- .then(() => meeting.closePeerConnections())
127
- .then(() => {
128
- meeting.unsetLocalVideoTrack();
129
- meeting.unsetLocalShareTrack();
130
- meeting.unsetRemoteTracks();
131
- meeting.unsetPeerConnections();
132
- meeting.reconnectionManager.cleanUp();
133
- })
134
- .then(() => meeting.stopKeepAlive())
135
- .then(() => meeting.updateLLMConnection());
136
- };
137
-
138
- MeetingUtil.disconnectPhoneAudio = (meeting, phoneUrl) => {
139
- if (meeting.meetingState === FULL_STATE.INACTIVE) {
140
- return Promise.reject(new MeetingNotActiveError());
141
- }
142
-
143
- const options = {
144
- locusUrl: meeting.locusUrl,
145
- selfId: meeting.selfId,
146
- correlationId: meeting.correlationId,
147
- phoneUrl
148
- };
149
-
150
- return meeting.meetingRequest
151
- .disconnectPhoneAudio(options)
152
- .then((response) => {
153
- if (response?.body?.locus) {
154
- meeting.locusInfo.onFullLocus(response.body.locus);
155
- }
156
- })
157
- .catch((err) => {
166
+ return meeting.meetingRequest.disconnectPhoneAudio(options).catch((err) => {
158
167
  LoggerProxy.logger.error(
159
- `Meeting:util#disconnectPhoneAudio --> An error occured while disconnecting phone audio in meeting ${
160
- meeting.id
161
- }, error: ${err}`
168
+ `Meeting:util#disconnectPhoneAudio --> An error occured while disconnecting phone audio in meeting ${meeting.id}, error: ${err}`
162
169
  );
163
170
 
164
171
  return Promise.reject(err);
165
172
  });
166
- };
173
+ },
174
+
175
+ // by default will leave on meeting's resourceId
176
+ // if you explicity want it not to leave on resource id, pass
177
+ // {resourceId: null}
178
+ // TODO: chris, you can modify this however you want
179
+ leaveMeeting: (meeting, options: any = {}) => {
180
+ if (meeting.meetingState === FULL_STATE.INACTIVE) {
181
+ // TODO: clean up if the meeting is already inactive
182
+ return Promise.reject(new MeetingNotActiveError());
183
+ }
167
184
 
168
- // by default will leave on meeting's resourceId
169
- // if you explicity want it not to leave on resource id, pass
170
- // {resourceId: null}
171
- // TODO: chris, you can modify this however you want
172
- MeetingUtil.leaveMeeting = (meeting, options: any = {}) => {
173
- if (meeting.meetingState === FULL_STATE.INACTIVE) {
174
- // TODO: clean up if the meeting is already inactive
175
- return Promise.reject(new MeetingNotActiveError());
176
- }
177
-
178
- if (MeetingUtil.isUserInLeftState(meeting.locusInfo)) {
179
- return Promise.reject(new UserNotJoinedError());
180
- }
181
-
182
- const defaultOptions = {
183
- locusUrl: meeting.locusUrl,
184
- selfId: meeting.selfId,
185
- correlationId: meeting.correlationId,
186
- resourceId: meeting.resourceId,
187
- deviceUrl: meeting.deviceUrl
188
- };
189
-
190
- const leaveOptions = {...defaultOptions, ...options};
191
-
192
- return meeting.meetingRequest
193
- .leaveMeeting(leaveOptions)
194
- .then((response) => {
195
- if (response && response.body && response.body.locus) { // && !options.moveMeeting) {
196
- meeting.locusInfo.onFullLocus(response.body.locus);
197
- }
185
+ if (MeetingUtil.isUserInLeftState(meeting.locusInfo)) {
186
+ return Promise.reject(new UserNotJoinedError());
187
+ }
198
188
 
199
- return Promise.resolve();
200
- })
201
- .then(() => {
202
- if (options.moveMeeting) {
203
- return Promise.resolve();
204
- }
189
+ const defaultOptions = {
190
+ locusUrl: meeting.locusUrl,
191
+ selfId: meeting.selfId,
192
+ correlationId: meeting.correlationId,
193
+ resourceId: meeting.resourceId,
194
+ deviceUrl: meeting.deviceUrl,
195
+ };
205
196
 
206
- return MeetingUtil.cleanUp(meeting);
207
- })
208
- .catch((err) => {
209
- // TODO: If the meeting state comes as LEFT or INACTIVE as response then
210
- // 1) on leave clean up the meeting or simply do a sync on the meeting
211
- // 2) If the error says meeting is inactive then destroy the meeting object
212
- LoggerProxy.logger.error(
213
- `Meeting:util#leaveMeeting --> An error occured while trying to leave meeting with an id of ${
214
- meeting.id
215
- }, error: ${err}`
216
- );
197
+ const leaveOptions = {...defaultOptions, ...options};
217
198
 
218
- return Promise.reject(err);
219
- });
220
- };
221
- MeetingUtil.declineMeeting = (meeting, reason) =>
222
- meeting.meetingRequest.declineMeeting({
223
- locusUrl: meeting.locusUrl,
224
- deviceUrl: meeting.deviceUrl,
225
- reason
226
- });
199
+ return meeting.meetingRequest
200
+ .leaveMeeting(leaveOptions)
201
+ .then(() => {
202
+ if (options.moveMeeting) {
203
+ return Promise.resolve();
204
+ }
227
205
 
228
- MeetingUtil.isUserInLeftState = (locusInfo) =>
229
- locusInfo.parsedLocus?.self?.state === _LEFT_;
206
+ return MeetingUtil.cleanUp(meeting);
207
+ })
208
+ .catch((err) => {
209
+ // TODO: If the meeting state comes as LEFT or INACTIVE as response then
210
+ // 1) on leave clean up the meeting or simply do a sync on the meeting
211
+ // 2) If the error says meeting is inactive then destroy the meeting object
212
+ LoggerProxy.logger.error(
213
+ `Meeting:util#leaveMeeting --> An error occured while trying to leave meeting with an id of ${meeting.id}, error: ${err}`
214
+ );
215
+
216
+ return Promise.reject(err);
217
+ });
218
+ },
219
+ declineMeeting: (meeting, reason) =>
220
+ meeting.meetingRequest.declineMeeting({
221
+ locusUrl: meeting.locusUrl,
222
+ deviceUrl: meeting.deviceUrl,
223
+ reason,
224
+ }),
230
225
 
231
- MeetingUtil.isUserInIdleState = (locusInfo) =>
232
- locusInfo.parsedLocus?.self?.state === _IDLE_;
226
+ isUserInLeftState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _LEFT_,
233
227
 
234
- MeetingUtil.isUserInJoinedState = (locusInfo) =>
235
- locusInfo.parsedLocus?.self?.state === _JOINED_;
228
+ isUserInIdleState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _IDLE_,
236
229
 
237
- MeetingUtil.isMediaEstablished = (currentMediaStatus) =>
238
- currentMediaStatus && (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share);
230
+ isUserInJoinedState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _JOINED_,
239
231
 
232
+ isMediaEstablished: (currentMediaStatus) =>
233
+ currentMediaStatus &&
234
+ (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share),
240
235
 
241
- MeetingUtil.joinMeetingOptions = (meeting, options: any = {}) => {
242
- meeting.resourceId = meeting.resourceId || options.resourceId;
236
+ joinMeetingOptions: (meeting, options: any = {}) => {
237
+ meeting.resourceId = meeting.resourceId || options.resourceId;
243
238
 
244
- if (meeting.requiredCaptcha) {
245
- return Promise.reject(new CaptchaError());
246
- }
247
- if (meeting.passwordStatus === PASSWORD_STATUS.REQUIRED) {
248
- return Promise.reject(new PasswordError());
249
- }
239
+ if (meeting.requiredCaptcha) {
240
+ return Promise.reject(new CaptchaError());
241
+ }
242
+ if (meeting.passwordStatus === PASSWORD_STATUS.REQUIRED) {
243
+ return Promise.reject(new PasswordError());
244
+ }
250
245
 
251
- if (options.pin) {
252
- Metrics.postEvent({
253
- event: eventType.PIN_COLLECTED,
254
- meeting
255
- });
256
- }
257
-
258
- // normal join meeting, scenario A, D
259
- return MeetingUtil.joinMeeting(meeting, options)
260
- .then((response) => {
261
- meeting.setLocus(response);
262
-
263
- return Promise.resolve(response);
264
- })
265
- .catch((err) => {
266
- // joining a claimed PMR that is not my own, scenario B
267
- if (MeetingUtil.isPinOrGuest(err)) {
268
- Metrics.postEvent({
269
- event: eventType.PIN_PROMPT,
270
- meeting
271
- });
246
+ if (options.pin) {
247
+ Metrics.postEvent({
248
+ event: eventType.PIN_COLLECTED,
249
+ meeting,
250
+ });
251
+ }
272
252
 
273
- // request host pin or non host for unclaimed PMR, start of Scenario C
274
- // see https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-Lobby-and--IVR-Feature
275
- return Promise.reject(new IntentToJoinError('Error Joining Meeting', err));
276
- }
277
- LoggerProxy.logger.error('Meeting:util#joinMeetingOptions --> Error joining the call, ', err);
253
+ // normal join meeting, scenario A, D
254
+ return MeetingUtil.joinMeeting(meeting, options)
255
+ .then((response) => {
256
+ meeting.setLocus(response);
257
+
258
+ return Promise.resolve(response);
259
+ })
260
+ .catch((err) => {
261
+ // joining a claimed PMR that is not my own, scenario B
262
+ if (MeetingUtil.isPinOrGuest(err)) {
263
+ Metrics.postEvent({
264
+ event: eventType.PIN_PROMPT,
265
+ meeting,
266
+ });
267
+
268
+ // request host pin or non host for unclaimed PMR, start of Scenario C
269
+ // see https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-Lobby-and--IVR-Feature
270
+ return Promise.reject(new IntentToJoinError('Error Joining Meeting', err));
271
+ }
272
+ LoggerProxy.logger.error(
273
+ 'Meeting:util#joinMeetingOptions --> Error joining the call, ',
274
+ err
275
+ );
278
276
 
279
- return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));
280
- });
281
- };
277
+ return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));
278
+ });
279
+ },
282
280
 
283
- MeetingUtil.validateOptions = (options) => {
284
- const {
285
- sendVideo, sendAudio, sendShare, localStream, localShare
286
- } = options;
281
+ validateOptions: (options) => {
282
+ const {sendVideo, sendAudio, sendShare, localStream, localShare} = options;
287
283
 
288
- if (sendVideo && !MeetingUtil.getTrack(localStream).videoTrack) {
289
- return Promise.reject(new ParameterError('please pass valid video streams'));
290
- }
284
+ if (sendVideo && !MeetingUtil.getTrack(localStream).videoTrack) {
285
+ return Promise.reject(new ParameterError('please pass valid video streams'));
286
+ }
291
287
 
292
- if (sendAudio && !MeetingUtil.getTrack(localStream).audioTrack) {
293
- return Promise.reject(new ParameterError('please pass valid audio streams'));
294
- }
288
+ if (sendAudio && !MeetingUtil.getTrack(localStream).audioTrack) {
289
+ return Promise.reject(new ParameterError('please pass valid audio streams'));
290
+ }
295
291
 
296
- if (sendShare && !MeetingUtil.getTrack(localShare).videoTrack) {
297
- return Promise.reject(new ParameterError('please pass valid share streams'));
298
- }
292
+ if (sendShare && !MeetingUtil.getTrack(localShare).videoTrack) {
293
+ return Promise.reject(new ParameterError('please pass valid share streams'));
294
+ }
299
295
 
300
- return Promise.resolve();
301
- };
296
+ return Promise.resolve();
297
+ },
302
298
 
303
- MeetingUtil.getTrack = (stream) => {
304
- let audioTrack = null;
305
- let videoTrack = null;
306
- let audioTracks = null;
307
- let videoTracks = null;
308
-
309
- if (!stream) {
310
- return {audioTrack: null, videoTrack: null};
311
- }
312
- if (stream.getAudioTracks) {
313
- audioTracks = stream.getAudioTracks();
314
- }
315
- if (stream.getVideoTracks) {
316
- videoTracks = stream.getVideoTracks();
317
- }
318
-
319
- if (audioTracks && audioTracks.length > 0) {
320
- [audioTrack] = audioTracks;
321
- }
322
-
323
- if (videoTracks && videoTracks.length > 0) {
324
- [videoTrack] = videoTracks;
325
- }
326
-
327
- return {audioTrack, videoTrack};
328
- };
299
+ getTrack: (stream) => {
300
+ let audioTrack = null;
301
+ let videoTrack = null;
302
+ let audioTracks = null;
303
+ let videoTracks = null;
329
304
 
330
- MeetingUtil.getModeratorFromLocusInfo = (locusInfo) =>
331
- locusInfo &&
332
- locusInfo.parsedLocus &&
333
- locusInfo.parsedLocus.info &&
334
- locusInfo.parsedLocus.info &&
335
- locusInfo.parsedLocus.info.moderator;
305
+ if (!stream) {
306
+ return {audioTrack: null, videoTrack: null};
307
+ }
308
+ if (stream.getAudioTracks) {
309
+ audioTracks = stream.getAudioTracks();
310
+ }
311
+ if (stream.getVideoTracks) {
312
+ videoTracks = stream.getVideoTracks();
313
+ }
336
314
 
337
- MeetingUtil.getPolicyFromLocusInfo = (locusInfo) =>
338
- locusInfo &&
339
- locusInfo.parsedLocus &&
340
- locusInfo.parsedLocus.info &&
341
- locusInfo.parsedLocus.info &&
342
- locusInfo.parsedLocus.info.policy;
315
+ if (audioTracks && audioTracks.length > 0) {
316
+ [audioTrack] = audioTracks;
317
+ }
343
318
 
344
- MeetingUtil.getUserDisplayHintsFromLocusInfo = (locusInfo) => locusInfo?.parsedLocus?.info?.userDisplayHints || [];
319
+ if (videoTracks && videoTracks.length > 0) {
320
+ [videoTrack] = videoTracks;
321
+ }
345
322
 
346
- MeetingUtil.canInviteNewParticipants = (displayHints) => displayHints.includes(DISPLAY_HINTS.ADD_GUEST);
323
+ return {audioTrack, videoTrack};
324
+ },
347
325
 
348
- MeetingUtil.canAdmitParticipant = (displayHints) => displayHints.includes(DISPLAY_HINTS.ROSTER_WAITING_TO_JOIN);
326
+ getModeratorFromLocusInfo: (locusInfo) =>
327
+ locusInfo &&
328
+ locusInfo.parsedLocus &&
329
+ locusInfo.parsedLocus.info &&
330
+ locusInfo.parsedLocus.info &&
331
+ locusInfo.parsedLocus.info.moderator,
349
332
 
350
- MeetingUtil.canUserLock = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_LOCK) && displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_UNLOCKED);
333
+ getPolicyFromLocusInfo: (locusInfo) =>
334
+ locusInfo &&
335
+ locusInfo.parsedLocus &&
336
+ locusInfo.parsedLocus.info &&
337
+ locusInfo.parsedLocus.info &&
338
+ locusInfo.parsedLocus.info.policy,
351
339
 
352
- MeetingUtil.canUserUnlock = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_UNLOCK) && displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_LOCKED);
340
+ getUserDisplayHintsFromLocusInfo: (locusInfo) =>
341
+ locusInfo?.parsedLocus?.info?.userDisplayHints || [],
353
342
 
354
- MeetingUtil.canUserRecord = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_START);
343
+ canInviteNewParticipants: (displayHints) => displayHints.includes(DISPLAY_HINTS.ADD_GUEST),
355
344
 
356
- MeetingUtil.canUserPause = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_PAUSE);
345
+ canAdmitParticipant: (displayHints) =>
346
+ displayHints.includes(DISPLAY_HINTS.ROSTER_WAITING_TO_JOIN),
357
347
 
358
- MeetingUtil.canUserResume = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_RESUME);
348
+ canUserLock: (displayHints) =>
349
+ displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_LOCK) &&
350
+ displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_UNLOCKED),
359
351
 
360
- MeetingUtil.canUserStop = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_STOP);
352
+ canUserUnlock: (displayHints) =>
353
+ displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_UNLOCK) &&
354
+ displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_LOCKED),
361
355
 
362
- MeetingUtil.startRecording = (request, locusUrl, locusInfo) => {
363
- const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);
356
+ canUserRaiseHand: (displayHints) => displayHints.includes(DISPLAY_HINTS.RAISE_HAND),
364
357
 
365
- if (MeetingUtil.canUserRecord(displayHints)) {
366
- return request.recordMeeting({locusUrl, recording: true, paused: false});
367
- }
358
+ canUserLowerAllHands: (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_ALL_HANDS),
368
359
 
369
- return Promise.reject(new PermissionError('Start recording not allowed, due to moderator property.'));
370
- };
360
+ canUserLowerSomeoneElsesHand: (displayHints) =>
361
+ displayHints.includes(DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND),
371
362
 
372
- MeetingUtil.pauseRecording = (request, locusUrl, locusInfo) => {
373
- const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);
363
+ bothLeaveAndEndMeetingAvailable: (displayHints) =>
364
+ displayHints.includes(DISPLAY_HINTS.LEAVE_TRANSFER_HOST_END_MEETING) ||
365
+ displayHints.includes(DISPLAY_HINTS.LEAVE_END_MEETING),
374
366
 
375
- if (MeetingUtil.canUserPause(displayHints)) {
376
- return request.recordMeeting({locusUrl, recording: true, paused: true});
377
- }
367
+ canManageBreakout: (displayHints) => displayHints.includes(DISPLAY_HINTS.BREAKOUT_MANAGEMENT),
378
368
 
379
- return Promise.reject(new PermissionError('Pause recording not allowed, due to moderator property.'));
380
- };
369
+ isSuppressBreakoutSupport: (displayHints) =>
370
+ displayHints.includes(DISPLAY_HINTS.UCF_SUPPRESS_BREAKOUTS_SUPPORT),
381
371
 
382
- MeetingUtil.resumeRecording = (request, locusUrl, locusInfo) => {
383
- const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);
372
+ canAdmitLobbyToBreakout: (displayHints) =>
373
+ !displayHints.includes(DISPLAY_HINTS.DISABLE_LOBBY_TO_BREAKOUT),
384
374
 
385
- if (MeetingUtil.canUserResume(displayHints)) {
386
- return request.recordMeeting({locusUrl, recording: true, paused: false});
387
- }
375
+ isBreakoutPreassignmentsEnabled: (displayHints) =>
376
+ !displayHints.includes(DISPLAY_HINTS.DISABLE_BREAKOUT_PREASSIGNMENTS),
388
377
 
389
- return Promise.reject(new PermissionError('Resume recording not allowed, due to moderator property.'));
390
- };
378
+ canUserAskForHelp: (displayHints) => !displayHints.includes(DISPLAY_HINTS.DISABLE_ASK_FOR_HELP),
391
379
 
392
- MeetingUtil.stopRecording = (request, locusUrl, locusInfo) => {
393
- const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);
380
+ lockMeeting: (actions, request, locusUrl) => {
381
+ if (actions && actions.canLock) {
382
+ return request.lockMeeting({locusUrl, lock: true});
383
+ }
394
384
 
395
- if (MeetingUtil.canUserStop(displayHints)) {
396
- return request.recordMeeting({locusUrl, recording: false, paused: false});
397
- }
385
+ return Promise.reject(new PermissionError('Lock not allowed, due to joined property.'));
386
+ },
398
387
 
399
- return Promise.reject(new PermissionError('Stop recording not allowed, due to moderator property.'));
400
- };
388
+ unlockMeeting: (actions, request, locusUrl) => {
389
+ if (actions && actions.canUnlock) {
390
+ return request.lockMeeting({locusUrl, lock: false});
391
+ }
401
392
 
402
- MeetingUtil.canUserRaiseHand = (displayHints) => displayHints.includes(DISPLAY_HINTS.RAISE_HAND);
393
+ return Promise.reject(new PermissionError('Unlock not allowed, due to joined property.'));
394
+ },
403
395
 
404
- MeetingUtil.canUserLowerAllHands = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_ALL_HANDS);
396
+ handleAudioLogging: (audioTrack: LocalMicrophoneTrack | null) => {
397
+ const LOG_HEADER = 'MeetingUtil#handleAudioLogging -->';
405
398
 
406
- MeetingUtil.canUserLowerSomeoneElsesHand = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND);
399
+ if (audioTrack) {
400
+ const settings = audioTrack.underlyingTrack.getSettings();
401
+ const {deviceId} = settings;
407
402
 
408
- MeetingUtil.bothLeaveAndEndMeetingAvailable = (displayHints) => displayHints.includes(DISPLAY_HINTS.LEAVE_TRANSFER_HOST_END_MEETING) || displayHints.includes(DISPLAY_HINTS.LEAVE_END_MEETING);
403
+ LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);
404
+ LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));
405
+ }
406
+ },
409
407
 
410
- MeetingUtil.lockMeeting = (actions, request, locusUrl) => {
411
- if (actions && actions.canLock) {
412
- return request.lockMeeting({locusUrl, lock: true});
413
- }
408
+ handleVideoLogging: (videoTrack: LocalCameraTrack | null) => {
409
+ const LOG_HEADER = 'MeetingUtil#handleVideoLogging -->';
414
410
 
415
- return Promise.reject(new PermissionError('Lock not allowed, due to joined property.'));
416
- };
411
+ if (videoTrack) {
412
+ const settings = videoTrack.underlyingTrack.getSettings();
413
+ const {deviceId} = settings;
417
414
 
418
- MeetingUtil.unlockMeeting = (actions, request, locusUrl) => {
419
- if (actions && actions.canUnlock) {
420
- return request.lockMeeting({locusUrl, lock: false});
421
- }
415
+ LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);
416
+ LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));
417
+ }
418
+ },
422
419
 
423
- return Promise.reject(new PermissionError('Unlock not allowed, due to joined property.'));
424
- };
420
+ handleDeviceLogging: (devices = []) => {
421
+ const LOG_HEADER = 'MeetingUtil#handleDeviceLogging -->';
425
422
 
426
- MeetingUtil.handleAudioLogging = (audioTrack) => {
427
- const LOG_HEADER = 'MeetingUtil#handleAudioLogging -->';
423
+ devices.forEach((device) => {
424
+ LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${device.deviceId}`);
425
+ LoggerProxy.logger.log(LOG_HEADER, 'settings', JSON.stringify(device));
426
+ });
427
+ },
428
428
 
429
- if (audioTrack) {
430
- const settings = audioTrack.getSettings();
431
- const {deviceId} = settings;
429
+ endMeetingForAll: (meeting) => {
430
+ if (meeting.meetingState === FULL_STATE.INACTIVE) {
431
+ return Promise.reject(new MeetingNotActiveError());
432
+ }
432
433
 
433
- LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);
434
- LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));
435
- }
436
- };
434
+ const endOptions = {
435
+ locusUrl: meeting.locusUrl,
436
+ };
437
437
 
438
- MeetingUtil.handleVideoLogging = (videoTrack) => {
439
- const LOG_HEADER = 'MeetingUtil#handleVideoLogging -->';
438
+ return meeting.meetingRequest
439
+ .endMeetingForAll(endOptions)
440
+ .then(() => MeetingUtil.cleanUp(meeting))
441
+ .catch((err) => {
442
+ LoggerProxy.logger.error(
443
+ `Meeting:util#endMeetingForAll An error occured while trying to end meeting for all with an id of ${meeting.id}, error: ${err}`
444
+ );
440
445
 
441
- if (videoTrack) {
442
- const settings = videoTrack.getSettings();
443
- const {deviceId} = settings;
446
+ return Promise.reject(err);
447
+ });
448
+ },
444
449
 
445
- LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);
446
- LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));
447
- }
448
- };
450
+ canEnableClosedCaption: (displayHints) => displayHints.includes(DISPLAY_HINTS.CAPTION_START),
449
451
 
450
- MeetingUtil.handleDeviceLogging = (devices = []) => {
451
- const LOG_HEADER = 'MeetingUtil#handleDeviceLogging -->';
452
+ isSaveTranscriptsEnabled: (displayHints) =>
453
+ displayHints.includes(DISPLAY_HINTS.SAVE_TRANSCRIPTS_ENABLED),
452
454
 
453
- devices.forEach((device) => {
454
- LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${device.deviceId}`);
455
- LoggerProxy.logger.log(LOG_HEADER, 'settings', JSON.stringify(device));
456
- });
457
- };
455
+ canStartTranscribing: (displayHints) =>
456
+ displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_START),
458
457
 
459
- MeetingUtil.endMeetingForAll = (meeting) => {
460
- if (meeting.meetingState === FULL_STATE.INACTIVE) {
461
- return Promise.reject(new MeetingNotActiveError());
462
- }
458
+ canStopTranscribing: (displayHints) =>
459
+ displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_STOP),
463
460
 
464
- const endOptions = {
465
- locusUrl: meeting.locusUrl,
466
- };
461
+ isClosedCaptionActive: (displayHints) =>
462
+ displayHints.includes(DISPLAY_HINTS.CAPTION_STATUS_ACTIVE),
467
463
 
468
- return meeting.meetingRequest
469
- .endMeetingForAll(endOptions)
470
- .then((response) => {
471
- if (response && response.body && response.body.locus) {
472
- meeting.locusInfo.onFullLocus(response.body.locus);
473
- }
464
+ isWebexAssistantActive: (displayHints) =>
465
+ displayHints.includes(DISPLAY_HINTS.WEBEX_ASSISTANT_STATUS_ACTIVE),
474
466
 
475
- return Promise.resolve();
476
- })
477
- .then(() => MeetingUtil.cleanUp(meeting))
478
- .catch((err) => {
479
- LoggerProxy.logger.error(
480
- `Meeting:util#endMeetingForAll An error occured while trying to end meeting for all with an id of ${
481
- meeting.id
482
- }, error: ${err}`
483
- );
467
+ canViewCaptionPanel: (displayHints) => displayHints.includes(DISPLAY_HINTS.ENABLE_CAPTION_PANEL),
484
468
 
485
- return Promise.reject(err);
486
- });
487
- };
469
+ isRealTimeTranslationEnabled: (displayHints) =>
470
+ displayHints.includes(DISPLAY_HINTS.DISPLAY_REAL_TIME_TRANSLATION),
471
+
472
+ canSelectSpokenLanguages: (displayHints) =>
473
+ displayHints.includes(DISPLAY_HINTS.DISPLAY_NON_ENGLISH_ASR),
474
+
475
+ waitingForOthersToJoin: (displayHints) => displayHints.includes(DISPLAY_HINTS.WAITING_FOR_OTHERS),
476
+
477
+ canSendReactions: (originalValue, displayHints) => {
478
+ if (displayHints.includes(DISPLAY_HINTS.REACTIONS_ACTIVE)) {
479
+ return true;
480
+ }
481
+ if (displayHints.includes(DISPLAY_HINTS.REACTIONS_INACTIVE)) {
482
+ return false;
483
+ }
484
+
485
+ return originalValue;
486
+ },
487
+ canUserRenameSelfAndObserved: (displayHints) =>
488
+ displayHints.includes(DISPLAY_HINTS.CAN_RENAME_SELF_AND_OBSERVED),
488
489
 
489
- MeetingUtil.canEnableClosedCaption = (displayHints) => displayHints.includes(DISPLAY_HINTS.CAPTION_START);
490
+ canUserRenameOthers: (displayHints) => displayHints.includes(DISPLAY_HINTS.CAN_RENAME_OTHERS),
490
491
 
491
- MeetingUtil.canStartTranscribing = (displayHints) => displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_START);
492
+ /**
493
+ * Adds the current locus sequence information to a request body
494
+ * @param {Object} meeting The meeting object
495
+ * @param {Object} requestBody The body of a request to locus
496
+ * @returns {void}
497
+ */
498
+ addSequence: (meeting, requestBody) => {
499
+ const sequence = meeting?.locusInfo?.sequence;
492
500
 
493
- MeetingUtil.canStopTranscribing = (displayHints) => displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_STOP);
501
+ if (!sequence) {
502
+ return;
503
+ }
504
+
505
+ requestBody.sequence = sequence;
506
+ },
507
+
508
+ /**
509
+ * Updates the locus info for the meeting with the delta locus
510
+ * returned from requests that include the sequence information
511
+ * Returns the original response object
512
+ * @param {Object} meeting The meeting object
513
+ * @param {Object} response The response of the http request
514
+ * @returns {Object}
515
+ */
516
+ updateLocusWithDelta: (meeting, response) => {
517
+ if (!meeting) {
518
+ return response;
519
+ }
494
520
 
495
- MeetingUtil.isClosedCaptionActive = (displayHints) => displayHints.includes(DISPLAY_HINTS.CAPTION_STATUS_ACTIVE);
521
+ const locus = response?.body?.locus;
496
522
 
497
- MeetingUtil.isWebexAssistantActive = (displayHints) => displayHints.includes(DISPLAY_HINTS.WEBEX_ASSISTANT_STATUS_ACTIVE);
523
+ if (locus) {
524
+ meeting.locusInfo.onDeltaLocus(locus);
525
+ }
498
526
 
499
- MeetingUtil.canViewCaptionPanel = (displayHints) => displayHints.includes(DISPLAY_HINTS.ENABLE_CAPTION_PANEL);
527
+ return response;
528
+ },
500
529
 
501
- MeetingUtil.isRealTimeTranslationEnabled = (displayHints) => displayHints.includes(DISPLAY_HINTS.DISPLAY_REAL_TIME_TRANSLATION);
530
+ generateLocusDeltaRequest: (originalMeeting) => {
531
+ const meetingRef = new WeakRef(originalMeeting);
502
532
 
503
- MeetingUtil.canSelectSpokenLanguages = (displayHints) => displayHints.includes(DISPLAY_HINTS.DISPLAY_NON_ENGLISH_ASR);
533
+ const locusDeltaRequest = (originalOptions) => {
534
+ const meeting = meetingRef.deref();
535
+
536
+ if (!meeting) {
537
+ return Promise.resolve();
538
+ }
504
539
 
505
- MeetingUtil.waitingForOthersToJoin = (displayHints) => displayHints.includes(DISPLAY_HINTS.WAITING_FOR_OTHERS);
540
+ const options = cloneDeep(originalOptions);
541
+
542
+ if (!options.body) {
543
+ options.body = {};
544
+ }
545
+
546
+ MeetingUtil.addSequence(meeting, options.body);
547
+
548
+ return meeting
549
+ .request(options)
550
+ .then((response) => MeetingUtil.updateLocusWithDelta(meeting, response));
551
+ };
552
+
553
+ return locusDeltaRequest;
554
+ },
555
+ };
506
556
 
507
557
  export default MeetingUtil;