@webex/plugin-meetings 3.0.0-beta.12 → 3.0.0-beta.121

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 +357 -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 +995 -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 +196 -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 +95 -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 +67 -14
  113. package/dist/meeting/in-meeting-actions.js.map +1 -1
  114. package/dist/meeting/index.js +2506 -2444
  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 +462 -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 +675 -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 +177 -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 +3 -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 +987 -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 +137 -0
  277. package/dist/types/meeting/index.d.ts +1755 -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 +54 -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 +861 -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 +144 -6
  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 +148 -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 +139 -3
  384. package/src/meeting/index.ts +2733 -1589
  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 +444 -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 +749 -437
  399. package/src/meetings/request.ts +29 -25
  400. package/src/meetings/util.ts +122 -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 +1 -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 +436 -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 +1611 -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 +297 -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 +66 -3
  467. package/test/unit/spec/meeting/index.js +2908 -887
  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 +308 -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 +1052 -329
  478. package/test/unit/spec/meetings/utils.js +163 -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,536 @@ 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
+ })
113
+ .then((res) => {
114
+ Metrics.postEvent({
115
+ event: eventType.LOCUS_JOIN_RESPONSE,
116
+ meeting,
117
+ data: {
118
+ trigger: trigger.LOCI_UPDATE,
119
+ locus: res.body.locus,
120
+ mediaConnections: res.body.mediaConnections,
121
+ trackingId: res.headers.trackingid,
122
+ },
123
+ });
80
124
 
81
- Metrics.postEvent({event: eventType.LOCUS_JOIN_REQUEST, meeting});
125
+ return MeetingUtil.parseLocusJoin(res);
126
+ });
127
+ },
128
+
129
+ cleanUp: (meeting) => {
130
+ meeting.breakouts.cleanUp();
131
+
132
+ // make sure we send last metrics before we close the peerconnection
133
+ const stopStatsAnalyzer = meeting.statsAnalyzer
134
+ ? meeting.statsAnalyzer.stopAnalyzer()
135
+ : Promise.resolve();
136
+
137
+ return stopStatsAnalyzer
138
+ .then(() => meeting.closeLocalStream())
139
+ .then(() => meeting.closeLocalShare())
140
+ .then(() => meeting.closeRemoteTracks())
141
+ .then(() => meeting.closePeerConnections())
142
+ .then(() => {
143
+ meeting.unsetLocalVideoTrack();
144
+ meeting.unsetLocalShareTrack();
145
+ meeting.unsetRemoteTracks();
146
+ meeting.unsetPeerConnections();
147
+ meeting.reconnectionManager.cleanUp();
148
+ })
149
+ .then(() => meeting.stopKeepAlive())
150
+ .then(() => meeting.updateLLMConnection());
151
+ },
152
+
153
+ disconnectPhoneAudio: (meeting, phoneUrl) => {
154
+ if (meeting.meetingState === FULL_STATE.INACTIVE) {
155
+ return Promise.reject(new MeetingNotActiveError());
156
+ }
82
157
 
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,
158
+ const options = {
91
159
  locusUrl: meeting.locusUrl,
160
+ selfId: meeting.selfId,
92
161
  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
- });
162
+ phoneUrl,
163
+ };
113
164
 
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) => {
165
+ return meeting.meetingRequest.disconnectPhoneAudio(options).catch((err) => {
158
166
  LoggerProxy.logger.error(
159
- `Meeting:util#disconnectPhoneAudio --> An error occured while disconnecting phone audio in meeting ${
160
- meeting.id
161
- }, error: ${err}`
167
+ `Meeting:util#disconnectPhoneAudio --> An error occured while disconnecting phone audio in meeting ${meeting.id}, error: ${err}`
162
168
  );
163
169
 
164
170
  return Promise.reject(err);
165
171
  });
166
- };
172
+ },
173
+
174
+ // by default will leave on meeting's resourceId
175
+ // if you explicity want it not to leave on resource id, pass
176
+ // {resourceId: null}
177
+ // TODO: chris, you can modify this however you want
178
+ leaveMeeting: (meeting, options: any = {}) => {
179
+ if (meeting.meetingState === FULL_STATE.INACTIVE) {
180
+ // TODO: clean up if the meeting is already inactive
181
+ return Promise.reject(new MeetingNotActiveError());
182
+ }
167
183
 
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
- }
184
+ if (MeetingUtil.isUserInLeftState(meeting.locusInfo)) {
185
+ return Promise.reject(new UserNotJoinedError());
186
+ }
198
187
 
199
- return Promise.resolve();
200
- })
201
- .then(() => {
202
- if (options.moveMeeting) {
203
- return Promise.resolve();
204
- }
188
+ const defaultOptions = {
189
+ locusUrl: meeting.locusUrl,
190
+ selfId: meeting.selfId,
191
+ correlationId: meeting.correlationId,
192
+ resourceId: meeting.resourceId,
193
+ deviceUrl: meeting.deviceUrl,
194
+ };
205
195
 
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
- );
196
+ const leaveOptions = {...defaultOptions, ...options};
217
197
 
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
- });
198
+ return meeting.meetingRequest
199
+ .leaveMeeting(leaveOptions)
200
+ .then(() => {
201
+ if (options.moveMeeting) {
202
+ return Promise.resolve();
203
+ }
227
204
 
228
- MeetingUtil.isUserInLeftState = (locusInfo) =>
229
- locusInfo.parsedLocus?.self?.state === _LEFT_;
205
+ return MeetingUtil.cleanUp(meeting);
206
+ })
207
+ .catch((err) => {
208
+ // TODO: If the meeting state comes as LEFT or INACTIVE as response then
209
+ // 1) on leave clean up the meeting or simply do a sync on the meeting
210
+ // 2) If the error says meeting is inactive then destroy the meeting object
211
+ LoggerProxy.logger.error(
212
+ `Meeting:util#leaveMeeting --> An error occured while trying to leave meeting with an id of ${meeting.id}, error: ${err}`
213
+ );
214
+
215
+ return Promise.reject(err);
216
+ });
217
+ },
218
+ declineMeeting: (meeting, reason) =>
219
+ meeting.meetingRequest.declineMeeting({
220
+ locusUrl: meeting.locusUrl,
221
+ deviceUrl: meeting.deviceUrl,
222
+ reason,
223
+ }),
230
224
 
231
- MeetingUtil.isUserInIdleState = (locusInfo) =>
232
- locusInfo.parsedLocus?.self?.state === _IDLE_;
225
+ isUserInLeftState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _LEFT_,
233
226
 
234
- MeetingUtil.isUserInJoinedState = (locusInfo) =>
235
- locusInfo.parsedLocus?.self?.state === _JOINED_;
227
+ isUserInIdleState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _IDLE_,
236
228
 
237
- MeetingUtil.isMediaEstablished = (currentMediaStatus) =>
238
- currentMediaStatus && (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share);
229
+ isUserInJoinedState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _JOINED_,
239
230
 
231
+ isMediaEstablished: (currentMediaStatus) =>
232
+ currentMediaStatus &&
233
+ (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share),
240
234
 
241
- MeetingUtil.joinMeetingOptions = (meeting, options: any = {}) => {
242
- meeting.resourceId = meeting.resourceId || options.resourceId;
235
+ joinMeetingOptions: (meeting, options: any = {}) => {
236
+ meeting.resourceId = meeting.resourceId || options.resourceId;
243
237
 
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
- }
238
+ if (meeting.requiredCaptcha) {
239
+ return Promise.reject(new CaptchaError());
240
+ }
241
+ if (meeting.passwordStatus === PASSWORD_STATUS.REQUIRED) {
242
+ return Promise.reject(new PasswordError());
243
+ }
250
244
 
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
- });
245
+ if (options.pin) {
246
+ Metrics.postEvent({
247
+ event: eventType.PIN_COLLECTED,
248
+ meeting,
249
+ });
250
+ }
272
251
 
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);
252
+ // normal join meeting, scenario A, D
253
+ return MeetingUtil.joinMeeting(meeting, options)
254
+ .then((response) => {
255
+ meeting.setLocus(response);
256
+
257
+ return Promise.resolve(response);
258
+ })
259
+ .catch((err) => {
260
+ // joining a claimed PMR that is not my own, scenario B
261
+ if (MeetingUtil.isPinOrGuest(err)) {
262
+ Metrics.postEvent({
263
+ event: eventType.PIN_PROMPT,
264
+ meeting,
265
+ });
266
+
267
+ // request host pin or non host for unclaimed PMR, start of Scenario C
268
+ // see https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-Lobby-and--IVR-Feature
269
+ return Promise.reject(new IntentToJoinError('Error Joining Meeting', err));
270
+ }
271
+ LoggerProxy.logger.error(
272
+ 'Meeting:util#joinMeetingOptions --> Error joining the call, ',
273
+ err
274
+ );
278
275
 
279
- return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));
280
- });
281
- };
276
+ return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));
277
+ });
278
+ },
282
279
 
283
- MeetingUtil.validateOptions = (options) => {
284
- const {
285
- sendVideo, sendAudio, sendShare, localStream, localShare
286
- } = options;
280
+ validateOptions: (options) => {
281
+ const {sendVideo, sendAudio, sendShare, localStream, localShare} = options;
287
282
 
288
- if (sendVideo && !MeetingUtil.getTrack(localStream).videoTrack) {
289
- return Promise.reject(new ParameterError('please pass valid video streams'));
290
- }
283
+ if (sendVideo && !MeetingUtil.getTrack(localStream).videoTrack) {
284
+ return Promise.reject(new ParameterError('please pass valid video streams'));
285
+ }
291
286
 
292
- if (sendAudio && !MeetingUtil.getTrack(localStream).audioTrack) {
293
- return Promise.reject(new ParameterError('please pass valid audio streams'));
294
- }
287
+ if (sendAudio && !MeetingUtil.getTrack(localStream).audioTrack) {
288
+ return Promise.reject(new ParameterError('please pass valid audio streams'));
289
+ }
295
290
 
296
- if (sendShare && !MeetingUtil.getTrack(localShare).videoTrack) {
297
- return Promise.reject(new ParameterError('please pass valid share streams'));
298
- }
291
+ if (sendShare && !MeetingUtil.getTrack(localShare).videoTrack) {
292
+ return Promise.reject(new ParameterError('please pass valid share streams'));
293
+ }
299
294
 
300
- return Promise.resolve();
301
- };
295
+ return Promise.resolve();
296
+ },
302
297
 
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
- };
298
+ getTrack: (stream) => {
299
+ let audioTrack = null;
300
+ let videoTrack = null;
301
+ let audioTracks = null;
302
+ let videoTracks = null;
329
303
 
330
- MeetingUtil.getModeratorFromLocusInfo = (locusInfo) =>
331
- locusInfo &&
332
- locusInfo.parsedLocus &&
333
- locusInfo.parsedLocus.info &&
334
- locusInfo.parsedLocus.info &&
335
- locusInfo.parsedLocus.info.moderator;
304
+ if (!stream) {
305
+ return {audioTrack: null, videoTrack: null};
306
+ }
307
+ if (stream.getAudioTracks) {
308
+ audioTracks = stream.getAudioTracks();
309
+ }
310
+ if (stream.getVideoTracks) {
311
+ videoTracks = stream.getVideoTracks();
312
+ }
336
313
 
337
- MeetingUtil.getPolicyFromLocusInfo = (locusInfo) =>
338
- locusInfo &&
339
- locusInfo.parsedLocus &&
340
- locusInfo.parsedLocus.info &&
341
- locusInfo.parsedLocus.info &&
342
- locusInfo.parsedLocus.info.policy;
314
+ if (audioTracks && audioTracks.length > 0) {
315
+ [audioTrack] = audioTracks;
316
+ }
343
317
 
344
- MeetingUtil.getUserDisplayHintsFromLocusInfo = (locusInfo) => locusInfo?.parsedLocus?.info?.userDisplayHints || [];
318
+ if (videoTracks && videoTracks.length > 0) {
319
+ [videoTrack] = videoTracks;
320
+ }
345
321
 
346
- MeetingUtil.canInviteNewParticipants = (displayHints) => displayHints.includes(DISPLAY_HINTS.ADD_GUEST);
322
+ return {audioTrack, videoTrack};
323
+ },
347
324
 
348
- MeetingUtil.canAdmitParticipant = (displayHints) => displayHints.includes(DISPLAY_HINTS.ROSTER_WAITING_TO_JOIN);
325
+ getModeratorFromLocusInfo: (locusInfo) =>
326
+ locusInfo &&
327
+ locusInfo.parsedLocus &&
328
+ locusInfo.parsedLocus.info &&
329
+ locusInfo.parsedLocus.info &&
330
+ locusInfo.parsedLocus.info.moderator,
349
331
 
350
- MeetingUtil.canUserLock = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_LOCK) && displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_UNLOCKED);
332
+ getPolicyFromLocusInfo: (locusInfo) =>
333
+ locusInfo &&
334
+ locusInfo.parsedLocus &&
335
+ locusInfo.parsedLocus.info &&
336
+ locusInfo.parsedLocus.info &&
337
+ locusInfo.parsedLocus.info.policy,
351
338
 
352
- MeetingUtil.canUserUnlock = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_UNLOCK) && displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_LOCKED);
339
+ getUserDisplayHintsFromLocusInfo: (locusInfo) =>
340
+ locusInfo?.parsedLocus?.info?.userDisplayHints || [],
353
341
 
354
- MeetingUtil.canUserRecord = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_START);
342
+ canInviteNewParticipants: (displayHints) => displayHints.includes(DISPLAY_HINTS.ADD_GUEST),
355
343
 
356
- MeetingUtil.canUserPause = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_PAUSE);
344
+ canAdmitParticipant: (displayHints) =>
345
+ displayHints.includes(DISPLAY_HINTS.ROSTER_WAITING_TO_JOIN),
357
346
 
358
- MeetingUtil.canUserResume = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_RESUME);
347
+ canUserLock: (displayHints) =>
348
+ displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_LOCK) &&
349
+ displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_UNLOCKED),
359
350
 
360
- MeetingUtil.canUserStop = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_STOP);
351
+ canUserUnlock: (displayHints) =>
352
+ displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_UNLOCK) &&
353
+ displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_LOCKED),
361
354
 
362
- MeetingUtil.startRecording = (request, locusUrl, locusInfo) => {
363
- const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);
355
+ canUserRaiseHand: (displayHints) => displayHints.includes(DISPLAY_HINTS.RAISE_HAND),
364
356
 
365
- if (MeetingUtil.canUserRecord(displayHints)) {
366
- return request.recordMeeting({locusUrl, recording: true, paused: false});
367
- }
357
+ canUserLowerAllHands: (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_ALL_HANDS),
368
358
 
369
- return Promise.reject(new PermissionError('Start recording not allowed, due to moderator property.'));
370
- };
359
+ canUserLowerSomeoneElsesHand: (displayHints) =>
360
+ displayHints.includes(DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND),
371
361
 
372
- MeetingUtil.pauseRecording = (request, locusUrl, locusInfo) => {
373
- const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);
362
+ bothLeaveAndEndMeetingAvailable: (displayHints) =>
363
+ displayHints.includes(DISPLAY_HINTS.LEAVE_TRANSFER_HOST_END_MEETING) ||
364
+ displayHints.includes(DISPLAY_HINTS.LEAVE_END_MEETING),
374
365
 
375
- if (MeetingUtil.canUserPause(displayHints)) {
376
- return request.recordMeeting({locusUrl, recording: true, paused: true});
377
- }
366
+ canManageBreakout: (displayHints) => displayHints.includes(DISPLAY_HINTS.BREAKOUT_MANAGEMENT),
378
367
 
379
- return Promise.reject(new PermissionError('Pause recording not allowed, due to moderator property.'));
380
- };
368
+ isSuppressBreakoutSupport: (displayHints) =>
369
+ displayHints.includes(DISPLAY_HINTS.UCF_SUPPRESS_BREAKOUTS_SUPPORT),
381
370
 
382
- MeetingUtil.resumeRecording = (request, locusUrl, locusInfo) => {
383
- const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);
371
+ canAdmitLobbyToBreakout: (displayHints) =>
372
+ !displayHints.includes(DISPLAY_HINTS.DISABLE_LOBBY_TO_BREAKOUT),
384
373
 
385
- if (MeetingUtil.canUserResume(displayHints)) {
386
- return request.recordMeeting({locusUrl, recording: true, paused: false});
387
- }
374
+ isBreakoutPreassignmentsEnabled: (displayHints) =>
375
+ !displayHints.includes(DISPLAY_HINTS.DISABLE_BREAKOUT_PREASSIGNMENTS),
388
376
 
389
- return Promise.reject(new PermissionError('Resume recording not allowed, due to moderator property.'));
390
- };
377
+ canUserAskForHelp: (displayHints) => !displayHints.includes(DISPLAY_HINTS.DISABLE_ASK_FOR_HELP),
391
378
 
392
- MeetingUtil.stopRecording = (request, locusUrl, locusInfo) => {
393
- const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);
379
+ lockMeeting: (actions, request, locusUrl) => {
380
+ if (actions && actions.canLock) {
381
+ return request.lockMeeting({locusUrl, lock: true});
382
+ }
394
383
 
395
- if (MeetingUtil.canUserStop(displayHints)) {
396
- return request.recordMeeting({locusUrl, recording: false, paused: false});
397
- }
384
+ return Promise.reject(new PermissionError('Lock not allowed, due to joined property.'));
385
+ },
398
386
 
399
- return Promise.reject(new PermissionError('Stop recording not allowed, due to moderator property.'));
400
- };
387
+ unlockMeeting: (actions, request, locusUrl) => {
388
+ if (actions && actions.canUnlock) {
389
+ return request.lockMeeting({locusUrl, lock: false});
390
+ }
401
391
 
402
- MeetingUtil.canUserRaiseHand = (displayHints) => displayHints.includes(DISPLAY_HINTS.RAISE_HAND);
392
+ return Promise.reject(new PermissionError('Unlock not allowed, due to joined property.'));
393
+ },
403
394
 
404
- MeetingUtil.canUserLowerAllHands = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_ALL_HANDS);
395
+ handleAudioLogging: (audioTrack: LocalMicrophoneTrack | null) => {
396
+ const LOG_HEADER = 'MeetingUtil#handleAudioLogging -->';
405
397
 
406
- MeetingUtil.canUserLowerSomeoneElsesHand = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND);
398
+ if (audioTrack) {
399
+ const settings = audioTrack.underlyingTrack.getSettings();
400
+ const {deviceId} = settings;
407
401
 
408
- MeetingUtil.bothLeaveAndEndMeetingAvailable = (displayHints) => displayHints.includes(DISPLAY_HINTS.LEAVE_TRANSFER_HOST_END_MEETING) || displayHints.includes(DISPLAY_HINTS.LEAVE_END_MEETING);
402
+ LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);
403
+ LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));
404
+ }
405
+ },
409
406
 
410
- MeetingUtil.lockMeeting = (actions, request, locusUrl) => {
411
- if (actions && actions.canLock) {
412
- return request.lockMeeting({locusUrl, lock: true});
413
- }
407
+ handleVideoLogging: (videoTrack: LocalCameraTrack | null) => {
408
+ const LOG_HEADER = 'MeetingUtil#handleVideoLogging -->';
414
409
 
415
- return Promise.reject(new PermissionError('Lock not allowed, due to joined property.'));
416
- };
410
+ if (videoTrack) {
411
+ const settings = videoTrack.underlyingTrack.getSettings();
412
+ const {deviceId} = settings;
417
413
 
418
- MeetingUtil.unlockMeeting = (actions, request, locusUrl) => {
419
- if (actions && actions.canUnlock) {
420
- return request.lockMeeting({locusUrl, lock: false});
421
- }
414
+ LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);
415
+ LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));
416
+ }
417
+ },
422
418
 
423
- return Promise.reject(new PermissionError('Unlock not allowed, due to joined property.'));
424
- };
419
+ handleDeviceLogging: (devices = []) => {
420
+ const LOG_HEADER = 'MeetingUtil#handleDeviceLogging -->';
425
421
 
426
- MeetingUtil.handleAudioLogging = (audioTrack) => {
427
- const LOG_HEADER = 'MeetingUtil#handleAudioLogging -->';
422
+ devices.forEach((device) => {
423
+ LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${device.deviceId}`);
424
+ LoggerProxy.logger.log(LOG_HEADER, 'settings', JSON.stringify(device));
425
+ });
426
+ },
428
427
 
429
- if (audioTrack) {
430
- const settings = audioTrack.getSettings();
431
- const {deviceId} = settings;
428
+ endMeetingForAll: (meeting) => {
429
+ if (meeting.meetingState === FULL_STATE.INACTIVE) {
430
+ return Promise.reject(new MeetingNotActiveError());
431
+ }
432
432
 
433
- LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);
434
- LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));
435
- }
436
- };
433
+ const endOptions = {
434
+ locusUrl: meeting.locusUrl,
435
+ };
437
436
 
438
- MeetingUtil.handleVideoLogging = (videoTrack) => {
439
- const LOG_HEADER = 'MeetingUtil#handleVideoLogging -->';
437
+ return meeting.meetingRequest
438
+ .endMeetingForAll(endOptions)
439
+ .then(() => MeetingUtil.cleanUp(meeting))
440
+ .catch((err) => {
441
+ LoggerProxy.logger.error(
442
+ `Meeting:util#endMeetingForAll An error occured while trying to end meeting for all with an id of ${meeting.id}, error: ${err}`
443
+ );
440
444
 
441
- if (videoTrack) {
442
- const settings = videoTrack.getSettings();
443
- const {deviceId} = settings;
445
+ return Promise.reject(err);
446
+ });
447
+ },
444
448
 
445
- LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);
446
- LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));
447
- }
448
- };
449
+ canEnableClosedCaption: (displayHints) => displayHints.includes(DISPLAY_HINTS.CAPTION_START),
449
450
 
450
- MeetingUtil.handleDeviceLogging = (devices = []) => {
451
- const LOG_HEADER = 'MeetingUtil#handleDeviceLogging -->';
451
+ isSaveTranscriptsEnabled: (displayHints) =>
452
+ displayHints.includes(DISPLAY_HINTS.SAVE_TRANSCRIPTS_ENABLED),
452
453
 
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
- };
454
+ canStartTranscribing: (displayHints) =>
455
+ displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_START),
458
456
 
459
- MeetingUtil.endMeetingForAll = (meeting) => {
460
- if (meeting.meetingState === FULL_STATE.INACTIVE) {
461
- return Promise.reject(new MeetingNotActiveError());
462
- }
457
+ canStopTranscribing: (displayHints) =>
458
+ displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_STOP),
463
459
 
464
- const endOptions = {
465
- locusUrl: meeting.locusUrl,
466
- };
460
+ isClosedCaptionActive: (displayHints) =>
461
+ displayHints.includes(DISPLAY_HINTS.CAPTION_STATUS_ACTIVE),
467
462
 
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
- }
463
+ isWebexAssistantActive: (displayHints) =>
464
+ displayHints.includes(DISPLAY_HINTS.WEBEX_ASSISTANT_STATUS_ACTIVE),
474
465
 
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
- );
466
+ canViewCaptionPanel: (displayHints) => displayHints.includes(DISPLAY_HINTS.ENABLE_CAPTION_PANEL),
484
467
 
485
- return Promise.reject(err);
486
- });
487
- };
468
+ isRealTimeTranslationEnabled: (displayHints) =>
469
+ displayHints.includes(DISPLAY_HINTS.DISPLAY_REAL_TIME_TRANSLATION),
470
+
471
+ canSelectSpokenLanguages: (displayHints) =>
472
+ displayHints.includes(DISPLAY_HINTS.DISPLAY_NON_ENGLISH_ASR),
473
+
474
+ waitingForOthersToJoin: (displayHints) => displayHints.includes(DISPLAY_HINTS.WAITING_FOR_OTHERS),
475
+
476
+ canSendReactions: (originalValue, displayHints) => {
477
+ if (displayHints.includes(DISPLAY_HINTS.REACTIONS_ACTIVE)) {
478
+ return true;
479
+ }
480
+ if (displayHints.includes(DISPLAY_HINTS.REACTIONS_INACTIVE)) {
481
+ return false;
482
+ }
483
+
484
+ return originalValue;
485
+ },
486
+ canUserRenameSelfAndObserved: (displayHints) =>
487
+ displayHints.includes(DISPLAY_HINTS.CAN_RENAME_SELF_AND_OBSERVED),
488
488
 
489
- MeetingUtil.canEnableClosedCaption = (displayHints) => displayHints.includes(DISPLAY_HINTS.CAPTION_START);
489
+ canUserRenameOthers: (displayHints) => displayHints.includes(DISPLAY_HINTS.CAN_RENAME_OTHERS),
490
490
 
491
- MeetingUtil.canStartTranscribing = (displayHints) => displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_START);
491
+ /**
492
+ * Adds the current locus sequence information to a request body
493
+ * @param {Object} meeting The meeting object
494
+ * @param {Object} requestBody The body of a request to locus
495
+ * @returns {void}
496
+ */
497
+ addSequence: (meeting, requestBody) => {
498
+ const sequence = meeting?.locusInfo?.sequence;
492
499
 
493
- MeetingUtil.canStopTranscribing = (displayHints) => displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_STOP);
500
+ if (!sequence) {
501
+ return;
502
+ }
503
+
504
+ requestBody.sequence = sequence;
505
+ },
506
+
507
+ /**
508
+ * Updates the locus info for the meeting with the delta locus
509
+ * returned from requests that include the sequence information
510
+ * Returns the original response object
511
+ * @param {Object} meeting The meeting object
512
+ * @param {Object} response The response of the http request
513
+ * @returns {Object}
514
+ */
515
+ updateLocusWithDelta: (meeting, response) => {
516
+ if (!meeting) {
517
+ return response;
518
+ }
494
519
 
495
- MeetingUtil.isClosedCaptionActive = (displayHints) => displayHints.includes(DISPLAY_HINTS.CAPTION_STATUS_ACTIVE);
520
+ const locus = response?.body?.locus;
496
521
 
497
- MeetingUtil.isWebexAssistantActive = (displayHints) => displayHints.includes(DISPLAY_HINTS.WEBEX_ASSISTANT_STATUS_ACTIVE);
522
+ if (locus) {
523
+ meeting.locusInfo.onDeltaLocus(locus);
524
+ }
498
525
 
499
- MeetingUtil.canViewCaptionPanel = (displayHints) => displayHints.includes(DISPLAY_HINTS.ENABLE_CAPTION_PANEL);
526
+ return response;
527
+ },
500
528
 
501
- MeetingUtil.isRealTimeTranslationEnabled = (displayHints) => displayHints.includes(DISPLAY_HINTS.DISPLAY_REAL_TIME_TRANSLATION);
529
+ generateLocusDeltaRequest: (originalMeeting) => {
530
+ const meetingRef = new WeakRef(originalMeeting);
502
531
 
503
- MeetingUtil.canSelectSpokenLanguages = (displayHints) => displayHints.includes(DISPLAY_HINTS.DISPLAY_NON_ENGLISH_ASR);
532
+ const locusDeltaRequest = (originalOptions) => {
533
+ const meeting = meetingRef.deref();
534
+
535
+ if (!meeting) {
536
+ return Promise.resolve();
537
+ }
504
538
 
505
- MeetingUtil.waitingForOthersToJoin = (displayHints) => displayHints.includes(DISPLAY_HINTS.WAITING_FOR_OTHERS);
539
+ const options = cloneDeep(originalOptions);
540
+
541
+ if (!options.body) {
542
+ options.body = {};
543
+ }
544
+
545
+ MeetingUtil.addSequence(meeting, options.body);
546
+
547
+ return meeting
548
+ .request(options)
549
+ .then((response) => MeetingUtil.updateLocusWithDelta(meeting, response));
550
+ };
551
+
552
+ return locusDeltaRequest;
553
+ },
554
+ };
506
555
 
507
556
  export default MeetingUtil;