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

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 (516) hide show
  1. package/README.md +8 -46
  2. package/dist/common/browser-detection.js +3 -2
  3. package/dist/common/browser-detection.js.map +1 -1
  4. package/dist/common/collection.js +4 -3
  5. package/dist/common/collection.js.map +1 -1
  6. package/dist/common/config.js +2 -1
  7. package/dist/common/config.js.map +1 -1
  8. package/dist/common/errors/captcha-error.js +2 -1
  9. package/dist/common/errors/captcha-error.js.map +1 -1
  10. package/dist/common/errors/intent-to-join.js +2 -1
  11. package/dist/common/errors/intent-to-join.js.map +1 -1
  12. package/dist/common/errors/join-meeting.js +2 -1
  13. package/dist/common/errors/join-meeting.js.map +1 -1
  14. package/dist/common/errors/media.js +2 -1
  15. package/dist/common/errors/media.js.map +1 -1
  16. package/dist/common/errors/parameter.js +4 -3
  17. package/dist/common/errors/parameter.js.map +1 -1
  18. package/dist/common/errors/password-error.js +2 -1
  19. package/dist/common/errors/password-error.js.map +1 -1
  20. package/dist/common/errors/permission.js +2 -1
  21. package/dist/common/errors/permission.js.map +1 -1
  22. package/dist/common/errors/{reclaim-host-role-errors.js → reclaim-host-role-error.js} +11 -7
  23. package/dist/common/errors/reclaim-host-role-error.js.map +1 -0
  24. package/dist/common/errors/reconnection-in-progress.js +2 -1
  25. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  26. package/dist/common/errors/reconnection.js +2 -1
  27. package/dist/common/errors/reconnection.js.map +1 -1
  28. package/dist/common/errors/stats.js +2 -1
  29. package/dist/common/errors/stats.js.map +1 -1
  30. package/dist/common/errors/webex-errors.d.ts +8 -20
  31. package/dist/common/errors/webex-errors.js +28 -48
  32. package/dist/common/errors/webex-errors.js.map +1 -1
  33. package/dist/common/errors/webex-meetings-error.js +2 -1
  34. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  35. package/dist/common/events/events-scope.js +2 -1
  36. package/dist/common/events/events-scope.js.map +1 -1
  37. package/dist/common/events/events.js +2 -1
  38. package/dist/common/events/events.js.map +1 -1
  39. package/dist/common/events/trigger-proxy.js +2 -1
  40. package/dist/common/events/trigger-proxy.js.map +1 -1
  41. package/dist/common/events/util.js +2 -1
  42. package/dist/common/events/util.js.map +1 -1
  43. package/dist/common/logs/logger-config.js +2 -1
  44. package/dist/common/logs/logger-config.js.map +1 -1
  45. package/dist/common/logs/logger-proxy.js +3 -2
  46. package/dist/common/logs/logger-proxy.js.map +1 -1
  47. package/dist/common/logs/request.d.ts +1 -3
  48. package/dist/common/logs/request.js +5 -8
  49. package/dist/common/logs/request.js.map +1 -1
  50. package/dist/common/queue.d.ts +7 -9
  51. package/dist/common/queue.js +9 -22
  52. package/dist/common/queue.js.map +1 -1
  53. package/dist/config.d.ts +7 -5
  54. package/dist/config.js +11 -8
  55. package/dist/config.js.map +1 -1
  56. package/dist/constants.d.ts +97 -217
  57. package/dist/constants.js +441 -416
  58. package/dist/constants.js.map +1 -1
  59. package/dist/controls-options-manager/constants.js +6 -3
  60. package/dist/controls-options-manager/constants.js.map +1 -1
  61. package/dist/controls-options-manager/enums.d.ts +1 -11
  62. package/dist/controls-options-manager/enums.js +6 -15
  63. package/dist/controls-options-manager/enums.js.map +1 -1
  64. package/dist/controls-options-manager/index.d.ts +1 -17
  65. package/dist/controls-options-manager/index.js +38 -127
  66. package/dist/controls-options-manager/index.js.map +1 -1
  67. package/dist/controls-options-manager/util.d.ts +7 -1
  68. package/dist/controls-options-manager/util.js +19 -309
  69. package/dist/controls-options-manager/util.js.map +1 -1
  70. package/dist/index.d.ts +3 -6
  71. package/dist/index.js +4 -116
  72. package/dist/index.js.map +1 -1
  73. package/dist/locus-info/controlsUtils.js +11 -100
  74. package/dist/locus-info/controlsUtils.js.map +1 -1
  75. package/dist/locus-info/embeddedAppsUtils.js +4 -3
  76. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  77. package/dist/locus-info/fullState.js +2 -1
  78. package/dist/locus-info/fullState.js.map +1 -1
  79. package/dist/locus-info/hostUtils.js +2 -1
  80. package/dist/locus-info/hostUtils.js.map +1 -1
  81. package/dist/locus-info/index.d.ts +4 -57
  82. package/dist/locus-info/index.js +84 -425
  83. package/dist/locus-info/index.js.map +1 -1
  84. package/dist/locus-info/infoUtils.js +5 -13
  85. package/dist/locus-info/infoUtils.js.map +1 -1
  86. package/dist/locus-info/mediaSharesUtils.js +3 -58
  87. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  88. package/dist/locus-info/parser.d.ts +6 -66
  89. package/dist/locus-info/parser.js +80 -253
  90. package/dist/locus-info/parser.js.map +1 -1
  91. package/dist/locus-info/selfUtils.js +13 -97
  92. package/dist/locus-info/selfUtils.js.map +1 -1
  93. package/dist/media/index.d.ts +0 -2
  94. package/dist/media/index.js +319 -107
  95. package/dist/media/index.js.map +1 -1
  96. package/dist/media/properties.d.ts +53 -38
  97. package/dist/media/properties.js +153 -96
  98. package/dist/media/properties.js.map +1 -1
  99. package/dist/media/util.js +22 -1
  100. package/dist/media/util.js.map +1 -1
  101. package/dist/mediaQualityMetrics/config.d.ts +230 -234
  102. package/dist/mediaQualityMetrics/config.js +498 -302
  103. package/dist/mediaQualityMetrics/config.js.map +1 -1
  104. package/dist/meeting/effectsState.d.ts +42 -0
  105. package/dist/meeting/effectsState.js +260 -0
  106. package/dist/meeting/effectsState.js.map +1 -0
  107. package/dist/meeting/in-meeting-actions.d.ts +0 -88
  108. package/dist/meeting/in-meeting-actions.js +3 -94
  109. package/dist/meeting/in-meeting-actions.js.map +1 -1
  110. package/dist/meeting/index.d.ts +494 -591
  111. package/dist/meeting/index.js +2969 -4707
  112. package/dist/meeting/index.js.map +1 -1
  113. package/dist/meeting/muteState.d.ts +25 -93
  114. package/dist/meeting/muteState.js +133 -224
  115. package/dist/meeting/muteState.js.map +1 -1
  116. package/dist/meeting/request.d.ts +47 -82
  117. package/dist/meeting/request.js +199 -297
  118. package/dist/meeting/request.js.map +1 -1
  119. package/dist/meeting/state.js +2 -1
  120. package/dist/meeting/state.js.map +1 -1
  121. package/dist/meeting/util.d.ts +1 -102
  122. package/dist/meeting/util.js +435 -605
  123. package/dist/meeting/util.js.map +1 -1
  124. package/dist/meeting-info/collection.js +4 -3
  125. package/dist/meeting-info/collection.js.map +1 -1
  126. package/dist/meeting-info/index.d.ts +1 -13
  127. package/dist/meeting-info/index.js +7 -74
  128. package/dist/meeting-info/index.js.map +1 -1
  129. package/dist/meeting-info/meeting-info-v2.d.ts +1 -31
  130. package/dist/meeting-info/meeting-info-v2.js +63 -200
  131. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  132. package/dist/meeting-info/request.js +2 -1
  133. package/dist/meeting-info/request.js.map +1 -1
  134. package/dist/meeting-info/util.js +3 -2
  135. package/dist/meeting-info/util.js.map +1 -1
  136. package/dist/meeting-info/utilv2.js +41 -39
  137. package/dist/meeting-info/utilv2.js.map +1 -1
  138. package/dist/meetings/collection.d.ts +0 -17
  139. package/dist/meetings/collection.js +4 -42
  140. package/dist/meetings/collection.js.map +1 -1
  141. package/dist/meetings/index.d.ts +21 -103
  142. package/dist/meetings/index.js +124 -486
  143. package/dist/meetings/index.js.map +1 -1
  144. package/dist/meetings/request.js +3 -4
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +6 -107
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.d.ts +1 -13
  149. package/dist/member/index.js +2 -45
  150. package/dist/member/index.js.map +1 -1
  151. package/dist/member/member.types.js +4 -3
  152. package/dist/member/member.types.js.map +1 -1
  153. package/dist/member/util.js +29 -120
  154. package/dist/member/util.js.map +1 -1
  155. package/dist/members/collection.d.ts +0 -5
  156. package/dist/members/collection.js +2 -11
  157. package/dist/members/collection.js.map +1 -1
  158. package/dist/members/index.d.ts +11 -56
  159. package/dist/members/index.js +47 -174
  160. package/dist/members/index.js.map +1 -1
  161. package/dist/members/request.d.ts +11 -67
  162. package/dist/members/request.js +54 -102
  163. package/dist/members/request.js.map +1 -1
  164. package/dist/members/types.js +4 -3
  165. package/dist/members/types.js.map +1 -1
  166. package/dist/members/util.d.ts +1 -214
  167. package/dist/members/util.js +284 -327
  168. package/dist/members/util.js.map +1 -1
  169. package/dist/metrics/config.d.ts +169 -0
  170. package/dist/metrics/config.js +289 -0
  171. package/dist/metrics/config.js.map +1 -0
  172. package/dist/metrics/constants.d.ts +6 -15
  173. package/dist/metrics/constants.js +9 -17
  174. package/dist/metrics/constants.js.map +1 -1
  175. package/dist/metrics/index.d.ts +111 -4
  176. package/dist/metrics/index.js +452 -4
  177. package/dist/metrics/index.js.map +1 -1
  178. package/dist/networkQualityMonitor/index.js +4 -5
  179. package/dist/networkQualityMonitor/index.js.map +1 -1
  180. package/dist/peer-connection-manager/index.d.ts +6 -0
  181. package/dist/peer-connection-manager/index.js +671 -0
  182. package/dist/peer-connection-manager/index.js.map +1 -0
  183. package/dist/peer-connection-manager/util.d.ts +6 -0
  184. package/dist/peer-connection-manager/util.js +110 -0
  185. package/dist/peer-connection-manager/util.js.map +1 -0
  186. package/dist/personal-meeting-room/index.js +3 -2
  187. package/dist/personal-meeting-room/index.js.map +1 -1
  188. package/dist/personal-meeting-room/request.js +3 -2
  189. package/dist/personal-meeting-room/request.js.map +1 -1
  190. package/dist/personal-meeting-room/util.js +2 -1
  191. package/dist/personal-meeting-room/util.js.map +1 -1
  192. package/dist/reachability/index.d.ts +7 -62
  193. package/dist/reachability/index.js +72 -265
  194. package/dist/reachability/index.js.map +1 -1
  195. package/dist/reachability/request.d.ts +3 -7
  196. package/dist/reachability/request.js +10 -18
  197. package/dist/reachability/request.js.map +1 -1
  198. package/dist/reactions/reactions.d.ts +2 -2
  199. package/dist/reactions/reactions.js +6 -4
  200. package/dist/reactions/reactions.js.map +1 -1
  201. package/dist/reactions/reactions.type.d.ts +3 -23
  202. package/dist/reactions/reactions.type.js +23 -21
  203. package/dist/reactions/reactions.type.js.map +1 -1
  204. package/dist/reconnection-manager/index.d.ts +8 -32
  205. package/dist/reconnection-manager/index.js +231 -282
  206. package/dist/reconnection-manager/index.js.map +1 -1
  207. package/dist/recording-controller/enums.js +5 -4
  208. package/dist/recording-controller/enums.js.map +1 -1
  209. package/dist/recording-controller/index.d.ts +1 -15
  210. package/dist/recording-controller/index.js +46 -57
  211. package/dist/recording-controller/index.js.map +1 -1
  212. package/dist/recording-controller/util.d.ts +4 -5
  213. package/dist/recording-controller/util.js +10 -10
  214. package/dist/recording-controller/util.js.map +1 -1
  215. package/dist/roap/collection.d.ts +10 -0
  216. package/dist/roap/collection.js +63 -0
  217. package/dist/roap/collection.js.map +1 -0
  218. package/dist/roap/handler.d.ts +47 -0
  219. package/dist/roap/handler.js +279 -0
  220. package/dist/roap/handler.js.map +1 -0
  221. package/dist/roap/index.d.ts +47 -9
  222. package/dist/roap/index.js +235 -101
  223. package/dist/roap/index.js.map +1 -1
  224. package/dist/roap/request.d.ts +12 -18
  225. package/dist/roap/request.js +180 -126
  226. package/dist/roap/request.js.map +1 -1
  227. package/dist/roap/state.d.ts +9 -0
  228. package/dist/roap/state.js +127 -0
  229. package/dist/roap/state.js.map +1 -0
  230. package/dist/roap/turnDiscovery.d.ts +16 -27
  231. package/dist/roap/turnDiscovery.js +105 -115
  232. package/dist/roap/turnDiscovery.js.map +1 -1
  233. package/dist/roap/util.d.ts +2 -0
  234. package/dist/roap/util.js +76 -0
  235. package/dist/roap/util.js.map +1 -0
  236. package/dist/statsAnalyzer/global.d.ts +83 -1
  237. package/dist/statsAnalyzer/global.js +85 -2
  238. package/dist/statsAnalyzer/global.js.map +1 -1
  239. package/dist/statsAnalyzer/index.d.ts +30 -28
  240. package/dist/statsAnalyzer/index.js +509 -374
  241. package/dist/statsAnalyzer/index.js.map +1 -1
  242. package/dist/statsAnalyzer/mqaUtil.d.ts +6 -8
  243. package/dist/statsAnalyzer/mqaUtil.js +83 -116
  244. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  245. package/dist/transcription/index.js +2 -1
  246. package/dist/transcription/index.js.map +1 -1
  247. package/package.json +26 -35
  248. package/src/common/errors/webex-errors.ts +12 -36
  249. package/src/common/logs/logger-proxy.ts +1 -1
  250. package/src/common/logs/request.ts +1 -5
  251. package/src/common/queue.ts +8 -22
  252. package/src/config.ts +7 -5
  253. package/src/constants.ts +97 -244
  254. package/src/controls-options-manager/enums.ts +0 -12
  255. package/src/controls-options-manager/index.ts +21 -116
  256. package/src/controls-options-manager/util.ts +14 -294
  257. package/src/index.js +15 -0
  258. package/src/locus-info/controlsUtils.ts +0 -110
  259. package/src/locus-info/index.ts +61 -449
  260. package/src/locus-info/infoUtils.ts +2 -14
  261. package/src/locus-info/mediaSharesUtils.ts +0 -64
  262. package/src/locus-info/parser.ts +47 -258
  263. package/src/locus-info/selfUtils.ts +2 -85
  264. package/src/media/index.ts +370 -153
  265. package/src/media/properties.ts +136 -106
  266. package/src/media/util.ts +21 -0
  267. package/src/mediaQualityMetrics/config.ts +377 -244
  268. package/src/meeting/effectsState.ts +209 -0
  269. package/src/meeting/in-meeting-actions.ts +0 -176
  270. package/src/meeting/index.ts +2482 -3929
  271. package/src/meeting/muteState.ts +138 -224
  272. package/src/meeting/request.ts +127 -207
  273. package/src/meeting/util.ts +423 -590
  274. package/src/meeting-info/index.ts +8 -81
  275. package/src/meeting-info/meeting-info-v2.ts +13 -163
  276. package/src/meeting-info/util.ts +1 -1
  277. package/src/meeting-info/utilv2.ts +28 -28
  278. package/src/meetings/collection.ts +0 -33
  279. package/src/meetings/index.ts +126 -486
  280. package/src/meetings/request.ts +0 -2
  281. package/src/meetings/util.ts +5 -116
  282. package/src/member/index.ts +1 -43
  283. package/src/member/util.ts +28 -125
  284. package/src/members/collection.ts +0 -8
  285. package/src/members/index.ts +52 -187
  286. package/src/members/request.ts +27 -87
  287. package/src/members/util.ts +291 -332
  288. package/src/metrics/config.ts +485 -0
  289. package/src/metrics/constants.ts +6 -15
  290. package/src/metrics/index.ts +471 -1
  291. package/src/networkQualityMonitor/index.ts +6 -6
  292. package/src/peer-connection-manager/index.ts +847 -0
  293. package/src/peer-connection-manager/util.ts +119 -0
  294. package/src/reachability/index.ts +45 -238
  295. package/src/reachability/request.ts +8 -17
  296. package/src/reactions/reactions.ts +4 -4
  297. package/src/reactions/reactions.type.ts +4 -30
  298. package/src/reconnection-manager/index.ts +156 -168
  299. package/src/recording-controller/index.ts +3 -20
  300. package/src/recording-controller/util.ts +9 -26
  301. package/src/roap/collection.ts +62 -0
  302. package/src/roap/handler.ts +294 -0
  303. package/src/roap/index.ts +241 -98
  304. package/src/roap/request.ts +148 -74
  305. package/src/roap/state.ts +156 -0
  306. package/src/roap/turnDiscovery.ts +56 -62
  307. package/src/roap/util.ts +100 -0
  308. package/src/statsAnalyzer/global.ts +84 -1
  309. package/src/statsAnalyzer/index.ts +642 -413
  310. package/src/statsAnalyzer/mqaUtil.ts +114 -111
  311. package/test/integration/spec/journey.js +264 -320
  312. package/test/integration/spec/space-meeting.js +4 -77
  313. package/test/unit/spec/common/queue.js +2 -31
  314. package/test/unit/spec/controls-options-manager/index.js +0 -163
  315. package/test/unit/spec/controls-options-manager/util.js +60 -576
  316. package/test/unit/spec/fixture/locus.js +0 -1
  317. package/test/unit/spec/locus-info/controlsUtils.js +30 -323
  318. package/test/unit/spec/locus-info/index.js +15 -1389
  319. package/test/unit/spec/locus-info/infoUtils.js +16 -54
  320. package/test/unit/spec/locus-info/lib/SeqCmp.json +0 -16
  321. package/test/unit/spec/locus-info/lib/selfConstant.js +0 -48
  322. package/test/unit/spec/locus-info/parser.js +35 -116
  323. package/test/unit/spec/locus-info/selfUtils.js +0 -275
  324. package/test/unit/spec/media/properties.ts +84 -75
  325. package/test/unit/spec/meeting/effectsState.js +281 -0
  326. package/test/unit/spec/meeting/in-meeting-actions.ts +0 -86
  327. package/test/unit/spec/meeting/index.js +3136 -8547
  328. package/test/unit/spec/meeting/muteState.js +213 -409
  329. package/test/unit/spec/meeting/request.js +42 -512
  330. package/test/unit/spec/meeting/utils.js +24 -741
  331. package/test/unit/spec/meeting-info/meetinginfov2.js +5 -527
  332. package/test/unit/spec/meeting-info/utilv2.js +0 -21
  333. package/test/unit/spec/meetings/collection.js +0 -26
  334. package/test/unit/spec/meetings/index.js +211 -1278
  335. package/test/unit/spec/meetings/utils.js +2 -202
  336. package/test/unit/spec/member/index.js +9 -32
  337. package/test/unit/spec/member/util.js +61 -499
  338. package/test/unit/spec/members/index.js +5 -394
  339. package/test/unit/spec/members/request.js +27 -206
  340. package/test/unit/spec/members/utils.js +38 -173
  341. package/test/unit/spec/metrics/index.js +50 -1
  342. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  343. package/test/unit/spec/peerconnection-manager/index.js +218 -0
  344. package/test/unit/spec/peerconnection-manager/utils.js +49 -0
  345. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +388 -0
  346. package/test/unit/spec/reachability/index.ts +24 -598
  347. package/test/unit/spec/reconnection-manager/index.js +24 -162
  348. package/test/unit/spec/recording-controller/index.js +218 -293
  349. package/test/unit/spec/recording-controller/util.js +96 -223
  350. package/test/unit/spec/roap/index.ts +76 -200
  351. package/test/unit/spec/roap/turnDiscovery.ts +48 -86
  352. package/test/unit/spec/roap/util.js +30 -0
  353. package/test/unit/spec/stats-analyzer/index.js +174 -188
  354. package/test/utils/testUtils.js +45 -0
  355. package/test/utils/webex-config.js +0 -4
  356. package/test/utils/webex-test-users.js +3 -7
  357. package/dist/annotation/annotation.types.d.ts +0 -42
  358. package/dist/annotation/annotation.types.js +0 -7
  359. package/dist/annotation/annotation.types.js.map +0 -1
  360. package/dist/annotation/constants.d.ts +0 -31
  361. package/dist/annotation/constants.js +0 -41
  362. package/dist/annotation/constants.js.map +0 -1
  363. package/dist/annotation/index.d.ts +0 -117
  364. package/dist/annotation/index.js +0 -357
  365. package/dist/annotation/index.js.map +0 -1
  366. package/dist/breakouts/breakout.d.ts +0 -8
  367. package/dist/breakouts/breakout.js +0 -215
  368. package/dist/breakouts/breakout.js.map +0 -1
  369. package/dist/breakouts/collection.d.ts +0 -5
  370. package/dist/breakouts/collection.js +0 -22
  371. package/dist/breakouts/collection.js.map +0 -1
  372. package/dist/breakouts/edit-lock-error.d.ts +0 -15
  373. package/dist/breakouts/edit-lock-error.js +0 -51
  374. package/dist/breakouts/edit-lock-error.js.map +0 -1
  375. package/dist/breakouts/events.d.ts +0 -8
  376. package/dist/breakouts/events.js +0 -44
  377. package/dist/breakouts/events.js.map +0 -1
  378. package/dist/breakouts/index.d.ts +0 -5
  379. package/dist/breakouts/index.js +0 -1047
  380. package/dist/breakouts/index.js.map +0 -1
  381. package/dist/breakouts/request.d.ts +0 -22
  382. package/dist/breakouts/request.js +0 -77
  383. package/dist/breakouts/request.js.map +0 -1
  384. package/dist/breakouts/utils.d.ts +0 -15
  385. package/dist/breakouts/utils.js +0 -64
  386. package/dist/breakouts/utils.js.map +0 -1
  387. package/dist/common/errors/no-meeting-info.d.ts +0 -14
  388. package/dist/common/errors/no-meeting-info.js +0 -50
  389. package/dist/common/errors/no-meeting-info.js.map +0 -1
  390. package/dist/common/errors/reclaim-host-role-errors.js.map +0 -1
  391. package/dist/controls-options-manager/types.d.ts +0 -43
  392. package/dist/controls-options-manager/types.js +0 -7
  393. package/dist/controls-options-manager/types.js.map +0 -1
  394. package/dist/interpretation/collection.d.ts +0 -5
  395. package/dist/interpretation/collection.js +0 -22
  396. package/dist/interpretation/collection.js.map +0 -1
  397. package/dist/interpretation/index.d.ts +0 -5
  398. package/dist/interpretation/index.js +0 -365
  399. package/dist/interpretation/index.js.map +0 -1
  400. package/dist/interpretation/siLanguage.d.ts +0 -5
  401. package/dist/interpretation/siLanguage.js +0 -24
  402. package/dist/interpretation/siLanguage.js.map +0 -1
  403. package/dist/meeting/locusMediaRequest.d.ts +0 -74
  404. package/dist/meeting/locusMediaRequest.js +0 -291
  405. package/dist/meeting/locusMediaRequest.js.map +0 -1
  406. package/dist/meeting/request.type.d.ts +0 -11
  407. package/dist/meeting/request.type.js +0 -7
  408. package/dist/meeting/request.type.js.map +0 -1
  409. package/dist/meetings/meetings.types.d.ts +0 -4
  410. package/dist/meetings/meetings.types.js +0 -7
  411. package/dist/meetings/meetings.types.js.map +0 -1
  412. package/dist/member/types.d.ts +0 -32
  413. package/dist/member/types.js +0 -23
  414. package/dist/member/types.js.map +0 -1
  415. package/dist/multistream/mediaRequestManager.d.ts +0 -118
  416. package/dist/multistream/mediaRequestManager.js +0 -344
  417. package/dist/multistream/mediaRequestManager.js.map +0 -1
  418. package/dist/multistream/receiveSlot.d.ts +0 -68
  419. package/dist/multistream/receiveSlot.js +0 -200
  420. package/dist/multistream/receiveSlot.js.map +0 -1
  421. package/dist/multistream/receiveSlotManager.d.ts +0 -56
  422. package/dist/multistream/receiveSlotManager.js +0 -174
  423. package/dist/multistream/receiveSlotManager.js.map +0 -1
  424. package/dist/multistream/remoteMedia.d.ts +0 -72
  425. package/dist/multistream/remoteMedia.js +0 -268
  426. package/dist/multistream/remoteMedia.js.map +0 -1
  427. package/dist/multistream/remoteMediaGroup.d.ts +0 -47
  428. package/dist/multistream/remoteMediaGroup.js +0 -267
  429. package/dist/multistream/remoteMediaGroup.js.map +0 -1
  430. package/dist/multistream/remoteMediaManager.d.ts +0 -285
  431. package/dist/multistream/remoteMediaManager.js +0 -1211
  432. package/dist/multistream/remoteMediaManager.js.map +0 -1
  433. package/dist/multistream/sendSlotManager.d.ts +0 -61
  434. package/dist/multistream/sendSlotManager.js +0 -236
  435. package/dist/multistream/sendSlotManager.js.map +0 -1
  436. package/dist/reactions/constants.d.ts +0 -3
  437. package/dist/reactions/constants.js +0 -12
  438. package/dist/reactions/constants.js.map +0 -1
  439. package/dist/rtcMetrics/constants.d.ts +0 -4
  440. package/dist/rtcMetrics/constants.js +0 -11
  441. package/dist/rtcMetrics/constants.js.map +0 -1
  442. package/dist/rtcMetrics/index.d.ts +0 -54
  443. package/dist/rtcMetrics/index.js +0 -140
  444. package/dist/rtcMetrics/index.js.map +0 -1
  445. package/dist/webinar/collection.d.ts +0 -16
  446. package/dist/webinar/collection.js +0 -43
  447. package/dist/webinar/collection.js.map +0 -1
  448. package/dist/webinar/index.d.ts +0 -5
  449. package/dist/webinar/index.js +0 -68
  450. package/dist/webinar/index.js.map +0 -1
  451. package/src/annotation/annotation.types.ts +0 -50
  452. package/src/annotation/constants.ts +0 -36
  453. package/src/annotation/index.ts +0 -328
  454. package/src/breakouts/README.md +0 -220
  455. package/src/breakouts/breakout.ts +0 -188
  456. package/src/breakouts/collection.ts +0 -19
  457. package/src/breakouts/edit-lock-error.ts +0 -25
  458. package/src/breakouts/events.ts +0 -56
  459. package/src/breakouts/index.ts +0 -925
  460. package/src/breakouts/request.ts +0 -55
  461. package/src/breakouts/utils.ts +0 -57
  462. package/src/common/errors/no-meeting-info.ts +0 -24
  463. package/src/controls-options-manager/types.ts +0 -59
  464. package/src/index.ts +0 -40
  465. package/src/interpretation/README.md +0 -60
  466. package/src/interpretation/collection.ts +0 -19
  467. package/src/interpretation/index.ts +0 -332
  468. package/src/interpretation/siLanguage.ts +0 -18
  469. package/src/meeting/locusMediaRequest.ts +0 -313
  470. package/src/meeting/request.type.ts +0 -13
  471. package/src/meetings/meetings.types.ts +0 -12
  472. package/src/member/types.ts +0 -38
  473. package/src/multistream/mediaRequestManager.ts +0 -440
  474. package/src/multistream/receiveSlot.ts +0 -184
  475. package/src/multistream/receiveSlotManager.ts +0 -166
  476. package/src/multistream/remoteMedia.ts +0 -254
  477. package/src/multistream/remoteMediaGroup.ts +0 -284
  478. package/src/multistream/remoteMediaManager.ts +0 -1145
  479. package/src/multistream/sendSlotManager.ts +0 -170
  480. package/src/reactions/constants.ts +0 -4
  481. package/src/rtcMetrics/constants.ts +0 -3
  482. package/src/rtcMetrics/index.ts +0 -124
  483. package/src/webinar/collection.ts +0 -31
  484. package/src/webinar/index.ts +0 -62
  485. package/test/integration/spec/converged-space-meetings.js +0 -233
  486. package/test/unit/spec/annotation/index.ts +0 -418
  487. package/test/unit/spec/breakouts/breakout.ts +0 -237
  488. package/test/unit/spec/breakouts/collection.ts +0 -15
  489. package/test/unit/spec/breakouts/edit-lock-error.ts +0 -30
  490. package/test/unit/spec/breakouts/events.ts +0 -89
  491. package/test/unit/spec/breakouts/index.ts +0 -1790
  492. package/test/unit/spec/breakouts/request.ts +0 -104
  493. package/test/unit/spec/breakouts/utils.js +0 -72
  494. package/test/unit/spec/interpretation/collection.ts +0 -15
  495. package/test/unit/spec/interpretation/index.ts +0 -589
  496. package/test/unit/spec/interpretation/siLanguage.ts +0 -28
  497. package/test/unit/spec/locus-info/mediaSharesUtils.ts +0 -32
  498. package/test/unit/spec/media/index.ts +0 -290
  499. package/test/unit/spec/meeting/locusMediaRequest.ts +0 -442
  500. package/test/unit/spec/meeting-info/index.js +0 -300
  501. package/test/unit/spec/multistream/mediaRequestManager.ts +0 -1418
  502. package/test/unit/spec/multistream/receiveSlot.ts +0 -163
  503. package/test/unit/spec/multistream/receiveSlotManager.ts +0 -203
  504. package/test/unit/spec/multistream/remoteMedia.ts +0 -255
  505. package/test/unit/spec/multistream/remoteMediaGroup.ts +0 -662
  506. package/test/unit/spec/multistream/remoteMediaManager.ts +0 -1924
  507. package/test/unit/spec/multistream/sendSlotManager.ts +0 -242
  508. package/test/unit/spec/reachability/request.js +0 -68
  509. package/test/unit/spec/roap/request.ts +0 -232
  510. package/test/unit/spec/rtcMetrics/index.ts +0 -93
  511. package/test/unit/spec/webinar/collection.ts +0 -13
  512. package/test/unit/spec/webinar/index.ts +0 -60
  513. package/test/utils/constants.js +0 -9
  514. package/test/utils/integrationTestUtils.js +0 -46
  515. /package/dist/common/errors/{reclaim-host-role-errors.d.ts → reclaim-host-role-error.d.ts} +0 -0
  516. /package/src/common/errors/{reclaim-host-role-errors.ts → reclaim-host-role-error.ts} +0 -0
@@ -1,7 +1,9 @@
1
- import {LocalCameraStream, LocalMicrophoneStream} from '@webex/media-helpers';
1
+ import {isEmpty} from 'lodash';
2
2
 
3
- import {cloneDeep} from 'lodash';
4
3
  import {MeetingNotActiveError, UserNotJoinedError} from '../common/errors/webex-errors';
4
+ import Metrics from '../metrics';
5
+ import {eventType, trigger} from '../metrics/config';
6
+ import Media from '../media';
5
7
  import LoggerProxy from '../common/logs/logger-proxy';
6
8
  import {
7
9
  INTENT_TO_JOIN,
@@ -11,687 +13,518 @@ import {
11
13
  PASSWORD_STATUS,
12
14
  DISPLAY_HINTS,
13
15
  FULL_STATE,
14
- SELF_POLICY,
15
- EVENT_TRIGGERS,
16
- IP_VERSION,
17
16
  } from '../constants';
18
- import BrowserDetection from '../common/browser-detection';
19
17
  import IntentToJoinError from '../common/errors/intent-to-join';
20
18
  import JoinMeetingError from '../common/errors/join-meeting';
21
19
  import ParameterError from '../common/errors/parameter';
22
20
  import PermissionError from '../common/errors/permission';
23
21
  import PasswordError from '../common/errors/password-error';
24
22
  import CaptchaError from '../common/errors/captcha-error';
25
- import Trigger from '../common/events/trigger-proxy';
26
-
27
- const MeetingUtil = {
28
- parseLocusJoin: (response) => {
29
- const parsed: any = {};
30
-
31
- // First todo: add check for existance
32
- parsed.locus = response.body.locus;
33
- parsed.mediaConnections = response.body.mediaConnections;
34
- parsed.locusUrl = parsed.locus.url;
35
- parsed.locusId = parsed.locus.url.split('/').pop();
36
- parsed.selfId = parsed.locus.self.id;
37
-
38
- // we need mediaId before making roap calls
39
- parsed.mediaConnections.forEach((mediaConnection) => {
40
- if (mediaConnection.mediaId) {
41
- parsed.mediaId = mediaConnection.mediaId;
42
- }
43
- });
44
-
45
- return parsed;
46
- },
47
-
48
- remoteUpdateAudioVideo: (meeting, audioMuted?: boolean, videoMuted?: boolean) => {
49
- const webex = meeting.getWebexObject();
50
- if (!meeting) {
51
- return Promise.reject(new ParameterError('You need a meeting object.'));
52
- }
53
-
54
- if (!meeting.locusMediaRequest) {
55
- return Promise.reject(
56
- new ParameterError(
57
- 'You need a meeting with a media connection, call Meeting.addMedia() first.'
58
- )
59
- );
60
- }
61
-
62
- // @ts-ignore
63
- webex.internal.newMetrics.submitClientEvent({
64
- name: 'client.locus.media.request',
65
- options: {meetingId: meeting.id},
66
- });
67
23
 
68
- return meeting.locusMediaRequest
69
- .send({
70
- type: 'LocalMute',
71
- selfUrl: meeting.selfUrl,
72
- mediaId: meeting.mediaId,
73
- sequence: meeting.locusInfo.sequence,
74
- muteOptions: {
75
- audioMuted,
76
- videoMuted,
77
- },
78
- })
79
- .then((response) => {
80
- // @ts-ignore
81
- webex.internal.newMetrics.submitClientEvent({
82
- name: 'client.locus.media.response',
83
- options: {meetingId: meeting.id},
84
- });
85
-
86
- return response?.body?.locus;
87
- });
88
- },
89
-
90
- hasOwner: (info) => info && info.owner,
24
+ const MeetingUtil: any = {};
91
25
 
92
- isOwnerSelf: (owner, selfId) => owner === selfId,
26
+ MeetingUtil.parseLocusJoin = (response) => {
27
+ const parsed: any = {};
93
28
 
94
- isPinOrGuest: (err) => err?.body?.errorCode && INTENT_TO_JOIN.includes(err.body.errorCode),
95
-
96
- /**
97
- * Returns the current state of knowledge about whether we are on an ipv4-only or ipv6-only or mixed (ipv4 and ipv6) network.
98
- * The return value matches the possible values of "ipver" parameter used by the backend APIs.
99
- *
100
- * @param {Object} webex webex instance
101
- * @returns {IP_VERSION|undefined} ipver value to be passed to the backend APIs or undefined if we should not pass any value to the backend
102
- */
103
- getIpVersion(webex: any): IP_VERSION | undefined {
104
- const {supportsIpV4, supportsIpV6} = webex.internal.device.ipNetworkDetector;
105
-
106
- if (BrowserDetection().isBrowser('firefox')) {
107
- // our ipv6 solution relies on FQDN ICE candidates, but Firefox doesn't support them,
108
- // see https://bugzilla.mozilla.org/show_bug.cgi?id=1713128
109
- // so for Firefox we don't want the backend to activate the "ipv6 feature"
110
- return undefined;
111
- }
112
-
113
- if (supportsIpV4 && supportsIpV6) {
114
- return IP_VERSION.ipv4_and_ipv6;
115
- }
29
+ // First todo: add check for existance
30
+ parsed.locus = response.body.locus;
31
+ parsed.mediaConnections = response.body.mediaConnections;
32
+ parsed.locusUrl = parsed.locus.url;
33
+ parsed.locusId = parsed.locus.url.split('/').pop();
34
+ parsed.selfId = parsed.locus.self.id;
116
35
 
117
- if (supportsIpV4) {
118
- return IP_VERSION.only_ipv4;
36
+ // we need mediaId before making roap calls
37
+ parsed.mediaConnections.forEach((mediaConnection) => {
38
+ if (mediaConnection.mediaId) {
39
+ parsed.mediaId = mediaConnection.mediaId;
119
40
  }
41
+ });
120
42
 
121
- if (supportsIpV6) {
122
- return IP_VERSION.only_ipv6;
123
- }
124
-
125
- return IP_VERSION.unknown;
126
- },
127
-
128
- joinMeeting: (meeting, options) => {
129
- if (!meeting) {
130
- return Promise.reject(new ParameterError('You need a meeting object.'));
131
- }
132
- const webex = meeting.getWebexObject();
43
+ return parsed;
44
+ };
133
45
 
134
- // @ts-ignore
135
- webex.internal.newMetrics.submitClientEvent({
136
- name: 'client.locus.join.request',
137
- options: {meetingId: meeting.id},
138
- });
46
+ MeetingUtil.remoteUpdateAudioVideo = (audioMuted, videoMuted, meeting) => {
47
+ if (!meeting) {
48
+ return Promise.reject(new ParameterError('You need a meeting object.'));
49
+ }
50
+ const localMedias = Media.generateLocalMedias(meeting.mediaId, audioMuted, videoMuted);
139
51
 
140
- // eslint-disable-next-line no-warning-comments
141
- // TODO: check if the meeting is in JOINING state
142
- // if Joining state termintate the request as user might click multiple times
143
- return meeting.meetingRequest
144
- .joinMeeting({
145
- inviteeAddress: meeting.meetingJoinUrl || meeting.sipUri,
146
- meetingNumber: meeting.meetingNumber,
147
- deviceUrl: meeting.deviceUrl,
148
- locusUrl: meeting.locusUrl,
149
- locusClusterUrl: meeting.meetingInfo?.locusClusterUrl,
150
- correlationId: meeting.correlationId,
151
- roapMessage: options.roapMessage,
152
- permissionToken: meeting.permissionToken,
153
- resourceId: options.resourceId || null,
154
- moderator: options.moderator,
155
- pin: options.pin,
156
- moveToResource: options.moveToResource,
157
- preferTranscoding: !meeting.isMultistream,
158
- asResourceOccupant: options.asResourceOccupant,
159
- breakoutsSupported: options.breakoutsSupported,
160
- locale: options.locale,
161
- deviceCapabilities: options.deviceCapabilities,
162
- liveAnnotationSupported: options.liveAnnotationSupported,
163
- ipVersion: MeetingUtil.getIpVersion(meeting.getWebexObject()),
164
- })
165
- .then((res) => {
166
- // @ts-ignore
167
- webex.internal.newMetrics.submitClientEvent({
168
- name: 'client.locus.join.response',
169
- payload: {
170
- trigger: 'loci-update',
171
- identifiers: {
172
- trackingId: res.headers.trackingid,
173
- },
174
- },
175
- options: {
176
- meetingId: meeting.id,
177
- mediaConnections: res.body.mediaConnections,
178
- },
179
- });
52
+ if (isEmpty(localMedias)) {
53
+ return Promise.reject(
54
+ new ParameterError('You need a media id on the meeting to change remote audio.')
55
+ );
56
+ }
180
57
 
181
- return MeetingUtil.parseLocusJoin(res);
182
- });
183
- },
184
-
185
- cleanUp: (meeting) => {
186
- meeting.breakouts.cleanUp();
187
- meeting.simultaneousInterpretation.cleanUp();
188
-
189
- // make sure we send last metrics before we close the peerconnection
190
- const stopStatsAnalyzer = meeting.statsAnalyzer
191
- ? meeting.statsAnalyzer.stopAnalyzer()
192
- : Promise.resolve();
193
-
194
- return stopStatsAnalyzer
195
- .then(() => meeting.closeRemoteStreams())
196
- .then(() => meeting.closePeerConnections())
197
- .then(() => {
198
- meeting.cleanupLocalStreams();
199
- meeting.unsetRemoteStreams();
200
- meeting.unsetPeerConnections();
201
- meeting.reconnectionManager.cleanUp();
202
- })
203
- .then(() => meeting.stopKeepAlive())
204
- .then(() => meeting.updateLLMConnection());
205
- },
206
-
207
- disconnectPhoneAudio: (meeting, phoneUrl) => {
208
- if (meeting.meetingState === FULL_STATE.INACTIVE) {
209
- return Promise.reject(new MeetingNotActiveError());
210
- }
58
+ Metrics.postEvent({event: eventType.MEDIA_REQUEST, meeting});
211
59
 
212
- const options = {
60
+ return meeting.meetingRequest
61
+ .remoteAudioVideoToggle({
213
62
  locusUrl: meeting.locusUrl,
214
63
  selfId: meeting.selfId,
64
+ localMedias,
65
+ deviceUrl: meeting.deviceUrl,
215
66
  correlationId: meeting.correlationId,
216
- phoneUrl,
217
- };
218
-
219
- return meeting.meetingRequest.disconnectPhoneAudio(options).catch((err) => {
220
- LoggerProxy.logger.error(
221
- `Meeting:util#disconnectPhoneAudio --> An error occured while disconnecting phone audio in meeting ${meeting.id}, error: ${err}`
222
- );
67
+ })
68
+ .then((response) => {
69
+ Metrics.postEvent({event: eventType.MEDIA_RESPONSE, meeting});
223
70
 
224
- return Promise.reject(err);
71
+ return response.body.locus;
225
72
  });
226
- },
227
-
228
- /**
229
- * Returns options for leaving a meeting.
230
- * @param {any} meeting
231
- * @param {any} options
232
- * @returns {any} leave options
233
- */
234
- prepareLeaveMeetingOptions: (meeting, options: any = {}) => {
235
- const defaultOptions = {
236
- locusUrl: meeting.locusUrl,
237
- selfId: meeting.selfId,
238
- correlationId: meeting.correlationId,
239
- resourceId: meeting.resourceId,
240
- deviceUrl: meeting.deviceUrl,
241
- };
242
-
243
- return {...defaultOptions, ...options};
244
- },
245
-
246
- // by default will leave on meeting's resourceId
247
- // if you explicity want it not to leave on resource id, pass
248
- // {resourceId: null}
249
- // TODO: chris, you can modify this however you want
250
- leaveMeeting: (meeting, options: any = {}) => {
251
- if (meeting.meetingState === FULL_STATE.INACTIVE) {
252
- // TODO: clean up if the meeting is already inactive
253
- return Promise.reject(new MeetingNotActiveError());
254
- }
255
-
256
- if (MeetingUtil.isUserInLeftState(meeting.locusInfo)) {
257
- return Promise.reject(new UserNotJoinedError());
258
- }
259
-
260
- const leaveOptions = MeetingUtil.prepareLeaveMeetingOptions(meeting, options);
261
-
262
- return meeting.meetingRequest
263
- .leaveMeeting(leaveOptions)
264
- .then(() => {
265
- if (options.moveMeeting) {
266
- return Promise.resolve();
267
- }
268
-
269
- return MeetingUtil.cleanUp(meeting);
270
- })
271
- .catch((err) => {
272
- // TODO: If the meeting state comes as LEFT or INACTIVE as response then
273
- // 1) on leave clean up the meeting or simply do a sync on the meeting
274
- // 2) If the error says meeting is inactive then destroy the meeting object
275
- LoggerProxy.logger.error(
276
- `Meeting:util#leaveMeeting --> An error occured while trying to leave meeting with an id of ${meeting.id}, error: ${err}`
277
- );
278
-
279
- return Promise.reject(err);
280
- });
281
- },
282
- declineMeeting: (meeting, reason) =>
283
- meeting.meetingRequest.declineMeeting({
284
- locusUrl: meeting.locusUrl,
285
- deviceUrl: meeting.deviceUrl,
286
- reason,
287
- }),
288
-
289
- isUserInLeftState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _LEFT_,
290
-
291
- isUserInIdleState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _IDLE_,
73
+ };
292
74
 
293
- isUserInJoinedState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _JOINED_,
75
+ MeetingUtil.hasOwner = (info) => info && info.owner;
294
76
 
295
- isMediaEstablished: (currentMediaStatus) =>
296
- currentMediaStatus &&
297
- (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share),
77
+ MeetingUtil.isOwnerSelf = (owner, selfId) => owner === selfId;
298
78
 
299
- joinMeetingOptions: (meeting, options: any = {}) => {
300
- const webex = meeting.getWebexObject();
79
+ MeetingUtil.isPinOrGuest = (err) =>
80
+ err?.body?.errorCode && INTENT_TO_JOIN.includes(err.body.errorCode);
301
81
 
302
- meeting.resourceId = meeting.resourceId || options.resourceId;
82
+ MeetingUtil.joinMeeting = (meeting, options) => {
83
+ if (!meeting) {
84
+ return Promise.reject(new ParameterError('You need a meeting object.'));
85
+ }
303
86
 
304
- if (meeting.requiredCaptcha) {
305
- return Promise.reject(new CaptchaError());
306
- }
307
- if (meeting.passwordStatus === PASSWORD_STATUS.REQUIRED) {
308
- return Promise.reject(new PasswordError());
309
- }
87
+ Metrics.postEvent({event: eventType.LOCUS_JOIN_REQUEST, meeting});
310
88
 
311
- if (options.pin) {
312
- // @ts-ignore
313
- webex.internal.newMetrics.submitClientEvent({
314
- name: 'client.pin.collected',
315
- options: {
316
- meetingId: meeting.id,
89
+ // eslint-disable-next-line no-warning-comments
90
+ // TODO: check if the meeting is in JOINING state
91
+ // if Joining state termintate the request as user might click multiple times
92
+ return meeting.meetingRequest
93
+ .joinMeeting({
94
+ inviteeAddress: meeting.meetingJoinUrl || meeting.sipUri,
95
+ meetingNumber: meeting.meetingNumber,
96
+ deviceUrl: meeting.deviceUrl,
97
+ locusUrl: meeting.locusUrl,
98
+ correlationId: meeting.correlationId,
99
+ roapMessage: options.roapMessage,
100
+ permissionToken: meeting.permissionToken,
101
+ resourceId: options.resourceId || null,
102
+ moderator: options.moderator,
103
+ pin: options.pin,
104
+ moveToResource: options.moveToResource,
105
+ preferTranscoding: options.preferTranscoding,
106
+ asResourceOccupant: options.asResourceOccupant,
107
+ })
108
+ .then((res) => {
109
+ Metrics.postEvent({
110
+ event: eventType.LOCUS_JOIN_RESPONSE,
111
+ meeting,
112
+ data: {
113
+ trigger: trigger.LOCI_UPDATE,
114
+ locus: res.body.locus,
115
+ mediaConnections: res.body.mediaConnections,
116
+ trackingId: res.headers.trackingid,
317
117
  },
318
118
  });
319
- }
320
119
 
321
- // normal join meeting, scenario A, D
322
- return MeetingUtil.joinMeeting(meeting, options)
323
- .then((response) => {
324
- meeting.setLocus(response);
325
-
326
- return Promise.resolve(response);
327
- })
328
- .catch((err) => {
329
- // joining a claimed PMR that is not my own, scenario B
330
- if (MeetingUtil.isPinOrGuest(err)) {
331
- // @ts-ignore
332
- webex.internal.newMetrics.submitClientEvent({
333
- name: 'client.pin.prompt',
334
- options: {
335
- meetingId: meeting.id,
336
- },
337
- });
338
-
339
- // request host pin or non host for unclaimed PMR, start of Scenario C
340
- // see https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-Lobby-and--IVR-Feature
341
- return Promise.reject(new IntentToJoinError('Error Joining Meeting', err));
342
- }
343
- LoggerProxy.logger.error(
344
- 'Meeting:util#joinMeetingOptions --> Error joining the call, ',
345
- err
346
- );
347
-
348
- return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));
349
- });
350
- },
351
-
352
- /**
353
- * Returns request options for leaving a meeting.
354
- * @param {any} meeting
355
- * @param {any} options
356
- * @returns {any} request options
357
- */
358
- buildLeaveFetchRequestOptions: (meeting, options: any = {}) => {
359
- const leaveOptions = MeetingUtil.prepareLeaveMeetingOptions(meeting, options);
360
-
361
- return meeting.meetingRequest.buildLeaveMeetingRequestOptions(leaveOptions);
362
- },
363
-
364
- getTrack: (stream) => {
365
- let audioTrack = null;
366
- let videoTrack = null;
367
- let audioTracks = null;
368
- let videoTracks = null;
369
-
370
- if (!stream) {
371
- return {audioTrack: null, videoTrack: null};
372
- }
373
- if (stream.getAudioTracks) {
374
- audioTracks = stream.getAudioTracks();
375
- }
376
- if (stream.getVideoTracks) {
377
- videoTracks = stream.getVideoTracks();
378
- }
379
-
380
- if (audioTracks && audioTracks.length > 0) {
381
- [audioTrack] = audioTracks;
382
- }
383
-
384
- if (videoTracks && videoTracks.length > 0) {
385
- [videoTrack] = videoTracks;
386
- }
387
-
388
- return {audioTrack, videoTrack};
389
- },
390
-
391
- getModeratorFromLocusInfo: (locusInfo) =>
392
- locusInfo &&
393
- locusInfo.parsedLocus &&
394
- locusInfo.parsedLocus.info &&
395
- locusInfo.parsedLocus.info &&
396
- locusInfo.parsedLocus.info.moderator,
397
-
398
- getPolicyFromLocusInfo: (locusInfo) =>
399
- locusInfo &&
400
- locusInfo.parsedLocus &&
401
- locusInfo.parsedLocus.info &&
402
- locusInfo.parsedLocus.info &&
403
- locusInfo.parsedLocus.info.policy,
404
-
405
- getUserDisplayHintsFromLocusInfo: (locusInfo) =>
406
- locusInfo?.parsedLocus?.info?.userDisplayHints || [],
407
-
408
- canInviteNewParticipants: (displayHints) => displayHints.includes(DISPLAY_HINTS.ADD_GUEST),
409
-
410
- canAdmitParticipant: (displayHints) =>
411
- displayHints.includes(DISPLAY_HINTS.ROSTER_WAITING_TO_JOIN),
412
-
413
- canUserLock: (displayHints) =>
414
- displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_LOCK) &&
415
- displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_UNLOCKED),
120
+ return MeetingUtil.parseLocusJoin(res);
121
+ });
122
+ };
416
123
 
417
- canUserUnlock: (displayHints) =>
418
- displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_UNLOCK) &&
419
- displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_LOCKED),
124
+ MeetingUtil.cleanUp = (meeting) => {
125
+ // make sure we send last metrics before we close the peerconnection
126
+ const stopStatsAnalyzer = meeting.statsAnalyzer
127
+ ? meeting.statsAnalyzer.stopAnalyzer()
128
+ : Promise.resolve();
129
+
130
+ return stopStatsAnalyzer
131
+ .then(() => meeting.closeLocalStream())
132
+ .then(() => meeting.closeLocalShare())
133
+ .then(() => meeting.closeRemoteTracks())
134
+ .then(() => meeting.closePeerConnections())
135
+ .then(() => {
136
+ meeting.unsetLocalVideoTrack();
137
+ meeting.unsetLocalShareTrack();
138
+ meeting.unsetRemoteTracks();
139
+ meeting.unsetPeerConnections();
140
+ meeting.reconnectionManager.cleanUp();
141
+ })
142
+ .then(() => meeting.roap.stop(meeting.correlationId, meeting.roapSeq))
143
+ .then(() => meeting.stopKeepAlive());
144
+ };
420
145
 
421
- canUserRaiseHand: (displayHints) => displayHints.includes(DISPLAY_HINTS.RAISE_HAND),
146
+ MeetingUtil.disconnectPhoneAudio = (meeting, phoneUrl) => {
147
+ if (meeting.meetingState === FULL_STATE.INACTIVE) {
148
+ return Promise.reject(new MeetingNotActiveError());
149
+ }
150
+
151
+ const options = {
152
+ locusUrl: meeting.locusUrl,
153
+ selfId: meeting.selfId,
154
+ correlationId: meeting.correlationId,
155
+ phoneUrl,
156
+ };
157
+
158
+ return meeting.meetingRequest
159
+ .disconnectPhoneAudio(options)
160
+ .then((response) => {
161
+ if (response?.body?.locus) {
162
+ meeting.locusInfo.onFullLocus(response.body.locus);
163
+ }
164
+ })
165
+ .catch((err) => {
166
+ LoggerProxy.logger.error(
167
+ `Meeting:util#disconnectPhoneAudio --> An error occured while disconnecting phone audio in meeting ${meeting.id}, error: ${err}`
168
+ );
422
169
 
423
- canUserLowerAllHands: (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_ALL_HANDS),
170
+ return Promise.reject(err);
171
+ });
172
+ };
424
173
 
425
- canUserLowerSomeoneElsesHand: (displayHints) =>
426
- displayHints.includes(DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND),
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
+ MeetingUtil.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
+ }
183
+
184
+ if (MeetingUtil.isUserInLeftState(meeting.locusInfo)) {
185
+ return Promise.reject(new UserNotJoinedError());
186
+ }
187
+
188
+ const defaultOptions = {
189
+ locusUrl: meeting.locusUrl,
190
+ selfId: meeting.selfId,
191
+ correlationId: meeting.correlationId,
192
+ resourceId: meeting.resourceId,
193
+ deviceUrl: meeting.deviceUrl,
194
+ };
195
+
196
+ const leaveOptions = {...defaultOptions, ...options};
197
+
198
+ return meeting.meetingRequest
199
+ .leaveMeeting(leaveOptions)
200
+ .then((response) => {
201
+ if (response && response.body && response.body.locus) {
202
+ // && !options.moveMeeting) {
203
+ meeting.locusInfo.onFullLocus(response.body.locus);
204
+ }
427
205
 
428
- bothLeaveAndEndMeetingAvailable: (displayHints) =>
429
- displayHints.includes(DISPLAY_HINTS.LEAVE_TRANSFER_HOST_END_MEETING) ||
430
- displayHints.includes(DISPLAY_HINTS.LEAVE_END_MEETING),
206
+ return Promise.resolve();
207
+ })
208
+ .then(() => {
209
+ if (options.moveMeeting) {
210
+ return Promise.resolve();
211
+ }
431
212
 
432
- canManageBreakout: (displayHints) => displayHints.includes(DISPLAY_HINTS.BREAKOUT_MANAGEMENT),
433
- canBroadcastMessageToBreakout: (displayHints, policies = {}) =>
434
- displayHints.includes(DISPLAY_HINTS.BROADCAST_MESSAGE_TO_BREAKOUT) &&
435
- !!policies[SELF_POLICY.SUPPORT_BROADCAST_MESSAGE],
213
+ return MeetingUtil.cleanUp(meeting);
214
+ })
215
+ .catch((err) => {
216
+ // TODO: If the meeting state comes as LEFT or INACTIVE as response then
217
+ // 1) on leave clean up the meeting or simply do a sync on the meeting
218
+ // 2) If the error says meeting is inactive then destroy the meeting object
219
+ LoggerProxy.logger.error(
220
+ `Meeting:util#leaveMeeting --> An error occured while trying to leave meeting with an id of ${meeting.id}, error: ${err}`
221
+ );
436
222
 
437
- isSuppressBreakoutSupport: (displayHints) =>
438
- displayHints.includes(DISPLAY_HINTS.UCF_SUPPRESS_BREAKOUTS_SUPPORT),
223
+ return Promise.reject(err);
224
+ });
225
+ };
226
+ MeetingUtil.declineMeeting = (meeting, reason) =>
227
+ meeting.meetingRequest.declineMeeting({
228
+ locusUrl: meeting.locusUrl,
229
+ deviceUrl: meeting.deviceUrl,
230
+ reason,
231
+ });
439
232
 
440
- canAdmitLobbyToBreakout: (displayHints) =>
441
- !displayHints.includes(DISPLAY_HINTS.DISABLE_LOBBY_TO_BREAKOUT),
233
+ MeetingUtil.isUserInLeftState = (locusInfo) => locusInfo.parsedLocus?.self?.state === _LEFT_;
442
234
 
443
- isBreakoutPreassignmentsEnabled: (displayHints) =>
444
- !displayHints.includes(DISPLAY_HINTS.DISABLE_BREAKOUT_PREASSIGNMENTS),
235
+ MeetingUtil.isUserInIdleState = (locusInfo) => locusInfo.parsedLocus?.self?.state === _IDLE_;
445
236
 
446
- canUserAskForHelp: (displayHints) => !displayHints.includes(DISPLAY_HINTS.DISABLE_ASK_FOR_HELP),
237
+ MeetingUtil.isUserInJoinedState = (locusInfo) => locusInfo.parsedLocus?.self?.state === _JOINED_;
447
238
 
448
- lockMeeting: (actions, request, locusUrl) => {
449
- if (actions && actions.canLock) {
450
- return request.lockMeeting({locusUrl, lock: true});
451
- }
239
+ MeetingUtil.isMediaEstablished = (currentMediaStatus) =>
240
+ currentMediaStatus &&
241
+ (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share);
452
242
 
453
- return Promise.reject(new PermissionError('Lock not allowed, due to joined property.'));
454
- },
243
+ MeetingUtil.joinMeetingOptions = (meeting, options: any = {}) => {
244
+ meeting.resourceId = meeting.resourceId || options.resourceId;
455
245
 
456
- unlockMeeting: (actions, request, locusUrl) => {
457
- if (actions && actions.canUnlock) {
458
- return request.lockMeeting({locusUrl, lock: false});
459
- }
246
+ if (meeting.requiredCaptcha) {
247
+ return Promise.reject(new CaptchaError());
248
+ }
249
+ if (meeting.passwordStatus === PASSWORD_STATUS.REQUIRED) {
250
+ return Promise.reject(new PasswordError());
251
+ }
460
252
 
461
- return Promise.reject(new PermissionError('Unlock not allowed, due to joined property.'));
462
- },
253
+ if (options.pin) {
254
+ Metrics.postEvent({
255
+ event: eventType.PIN_COLLECTED,
256
+ meeting,
257
+ });
258
+ }
259
+
260
+ // normal join meeting, scenario A, D
261
+ return MeetingUtil.joinMeeting(meeting, options)
262
+ .then((response) => {
263
+ meeting.setLocus(response);
264
+
265
+ return Promise.resolve(response);
266
+ })
267
+ .catch((err) => {
268
+ // joining a claimed PMR that is not my own, scenario B
269
+ if (MeetingUtil.isPinOrGuest(err)) {
270
+ Metrics.postEvent({
271
+ event: eventType.PIN_PROMPT,
272
+ meeting,
273
+ });
463
274
 
464
- handleAudioLogging: (audioStream?: LocalMicrophoneStream) => {
465
- const LOG_HEADER = 'MeetingUtil#handleAudioLogging -->';
275
+ // request host pin or non host for unclaimed PMR, start of Scenario C
276
+ // see https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-Lobby-and--IVR-Feature
277
+ return Promise.reject(new IntentToJoinError('Error Joining Meeting', err));
278
+ }
279
+ LoggerProxy.logger.error('Meeting:util#joinMeetingOptions --> Error joining the call, ', err);
466
280
 
467
- if (audioStream) {
468
- const settings = audioStream.getSettings();
469
- const {deviceId} = settings;
281
+ return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));
282
+ });
283
+ };
470
284
 
471
- LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);
472
- LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));
473
- }
474
- },
285
+ MeetingUtil.updateTransceiver = (options, meetingOptions) => {
286
+ const {
287
+ type,
288
+ sendTrack,
289
+ receiveTrack,
290
+ track,
291
+ transceiver,
292
+ peerConnection,
293
+ previousMediaDirection,
294
+ } = options;
295
+
296
+ if (
297
+ (sendTrack !== undefined && sendTrack !== previousMediaDirection.sendTrack) ||
298
+ (receiveTrack !== undefined && receiveTrack !== previousMediaDirection.receiveTrack)
299
+ ) {
300
+ return Media.updateTransceiver(
301
+ {
302
+ meetingId: meetingOptions.meeting.id,
303
+ remoteQualityLevel: meetingOptions.mediaProperties.remoteQualityLevel,
304
+ enableRtx: meetingOptions.meeting.config.enableRtx,
305
+ enableExtmap: meetingOptions.meeting.config.enableExtmap,
306
+ },
307
+ peerConnection,
308
+ transceiver,
309
+ {
310
+ track,
311
+ type,
312
+ receiveTrack,
313
+ sendTrack,
314
+ }
315
+ )
316
+ .then(() =>
317
+ meetingOptions.meeting.roap.sendRoapMediaRequest({
318
+ sdp: meetingOptions.mediaProperties.peerConnection.sdp,
319
+ roapSeq: meetingOptions.meeting.roapSeq,
320
+ meeting: meetingOptions.meeting, // or can pass meeting ID
321
+ })
322
+ )
323
+ .catch((e) => {
324
+ LoggerProxy.logger.error(
325
+ `Meeting:util#updateTransceiver --> Error updating the ${type} streams with error: ${e}`
326
+ );
327
+ });
328
+ }
329
+ if (track) {
330
+ transceiver.sender.replaceTrack(track);
475
331
 
476
- handleVideoLogging: (videoStream?: LocalCameraStream) => {
477
- const LOG_HEADER = 'MeetingUtil#handleVideoLogging -->';
332
+ return Promise.resolve();
333
+ }
478
334
 
479
- if (videoStream) {
480
- const settings = videoStream.getSettings();
481
- const {deviceId} = settings;
335
+ return Promise.reject(new ParameterError('update Failed: please pass valid parameter'));
336
+ };
482
337
 
483
- LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);
484
- LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));
485
- }
486
- },
338
+ MeetingUtil.validateOptions = (options) => {
339
+ const {sendVideo, sendAudio, sendShare, localStream, localShare} = options;
487
340
 
488
- handleDeviceLogging: (devices = []) => {
489
- const LOG_HEADER = 'MeetingUtil#handleDeviceLogging -->';
341
+ if (sendVideo && !MeetingUtil.getTrack(localStream).videoTrack) {
342
+ return Promise.reject(new ParameterError('please pass valid video streams'));
343
+ }
490
344
 
491
- devices.forEach((device) => {
492
- LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${device.deviceId}`);
493
- LoggerProxy.logger.log(LOG_HEADER, 'settings', JSON.stringify(device));
494
- });
495
- },
345
+ if (sendAudio && !MeetingUtil.getTrack(localStream).audioTrack) {
346
+ return Promise.reject(new ParameterError('please pass valid audio streams'));
347
+ }
496
348
 
497
- endMeetingForAll: (meeting) => {
498
- if (meeting.meetingState === FULL_STATE.INACTIVE) {
499
- return Promise.reject(new MeetingNotActiveError());
500
- }
349
+ if (sendShare && !MeetingUtil.getTrack(localShare).videoTrack) {
350
+ return Promise.reject(new ParameterError('please pass valid share streams'));
351
+ }
501
352
 
502
- const endOptions = {
503
- locusUrl: meeting.locusUrl,
504
- };
353
+ return Promise.resolve();
354
+ };
505
355
 
506
- return meeting.meetingRequest
507
- .endMeetingForAll(endOptions)
508
- .then(() => MeetingUtil.cleanUp(meeting))
509
- .catch((err) => {
510
- LoggerProxy.logger.error(
511
- `Meeting:util#endMeetingForAll An error occured while trying to end meeting for all with an id of ${meeting.id}, error: ${err}`
512
- );
356
+ MeetingUtil.getTrack = (stream) => {
357
+ let audioTrack = null;
358
+ let videoTrack = null;
359
+ let audioTracks = null;
360
+ let videoTracks = null;
361
+
362
+ if (!stream) {
363
+ return {audioTrack: null, videoTrack: null};
364
+ }
365
+ if (stream.getAudioTracks) {
366
+ audioTracks = stream.getAudioTracks();
367
+ }
368
+ if (stream.getVideoTracks) {
369
+ videoTracks = stream.getVideoTracks();
370
+ }
371
+
372
+ if (audioTracks && audioTracks.length > 0) {
373
+ [audioTrack] = audioTracks;
374
+ }
375
+
376
+ if (videoTracks && videoTracks.length > 0) {
377
+ [videoTrack] = videoTracks;
378
+ }
379
+
380
+ return {audioTrack, videoTrack};
381
+ };
513
382
 
514
- return Promise.reject(err);
515
- });
516
- },
383
+ MeetingUtil.getModeratorFromLocusInfo = (locusInfo) =>
384
+ locusInfo &&
385
+ locusInfo.parsedLocus &&
386
+ locusInfo.parsedLocus.info &&
387
+ locusInfo.parsedLocus.info &&
388
+ locusInfo.parsedLocus.info.moderator;
517
389
 
518
- canEnableClosedCaption: (displayHints) => displayHints.includes(DISPLAY_HINTS.CAPTION_START),
390
+ MeetingUtil.getPolicyFromLocusInfo = (locusInfo) =>
391
+ locusInfo &&
392
+ locusInfo.parsedLocus &&
393
+ locusInfo.parsedLocus.info &&
394
+ locusInfo.parsedLocus.info &&
395
+ locusInfo.parsedLocus.info.policy;
519
396
 
520
- isSaveTranscriptsEnabled: (displayHints) =>
521
- displayHints.includes(DISPLAY_HINTS.SAVE_TRANSCRIPTS_ENABLED),
397
+ MeetingUtil.getUserDisplayHintsFromLocusInfo = (locusInfo) =>
398
+ locusInfo?.parsedLocus?.info?.userDisplayHints || [];
522
399
 
523
- canStartTranscribing: (displayHints) =>
524
- displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_START),
400
+ MeetingUtil.canInviteNewParticipants = (displayHints) =>
401
+ displayHints.includes(DISPLAY_HINTS.ADD_GUEST);
525
402
 
526
- canStopTranscribing: (displayHints) =>
527
- displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_STOP),
403
+ MeetingUtil.canAdmitParticipant = (displayHints) =>
404
+ displayHints.includes(DISPLAY_HINTS.ROSTER_WAITING_TO_JOIN);
528
405
 
529
- isClosedCaptionActive: (displayHints) =>
530
- displayHints.includes(DISPLAY_HINTS.CAPTION_STATUS_ACTIVE),
406
+ MeetingUtil.canUserLock = (displayHints) =>
407
+ displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_LOCK) &&
408
+ displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_UNLOCKED);
531
409
 
532
- isWebexAssistantActive: (displayHints) =>
533
- displayHints.includes(DISPLAY_HINTS.WEBEX_ASSISTANT_STATUS_ACTIVE),
410
+ MeetingUtil.canUserUnlock = (displayHints) =>
411
+ displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_UNLOCK) &&
412
+ displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_LOCKED);
534
413
 
535
- canViewCaptionPanel: (displayHints) => displayHints.includes(DISPLAY_HINTS.ENABLE_CAPTION_PANEL),
414
+ MeetingUtil.canUserRaiseHand = (displayHints) => displayHints.includes(DISPLAY_HINTS.RAISE_HAND);
536
415
 
537
- isRealTimeTranslationEnabled: (displayHints) =>
538
- displayHints.includes(DISPLAY_HINTS.DISPLAY_REAL_TIME_TRANSLATION),
416
+ MeetingUtil.canUserLowerAllHands = (displayHints) =>
417
+ displayHints.includes(DISPLAY_HINTS.LOWER_ALL_HANDS);
539
418
 
540
- canSelectSpokenLanguages: (displayHints) =>
541
- displayHints.includes(DISPLAY_HINTS.DISPLAY_NON_ENGLISH_ASR),
419
+ MeetingUtil.canUserLowerSomeoneElsesHand = (displayHints) =>
420
+ displayHints.includes(DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND);
542
421
 
543
- waitingForOthersToJoin: (displayHints) => displayHints.includes(DISPLAY_HINTS.WAITING_FOR_OTHERS),
422
+ MeetingUtil.bothLeaveAndEndMeetingAvailable = (displayHints) =>
423
+ displayHints.includes(DISPLAY_HINTS.LEAVE_TRANSFER_HOST_END_MEETING) ||
424
+ displayHints.includes(DISPLAY_HINTS.LEAVE_END_MEETING);
544
425
 
545
- canSendReactions: (originalValue, displayHints) => {
546
- if (displayHints.includes(DISPLAY_HINTS.REACTIONS_ACTIVE)) {
547
- return true;
548
- }
549
- if (displayHints.includes(DISPLAY_HINTS.REACTIONS_INACTIVE)) {
550
- return false;
551
- }
426
+ MeetingUtil.lockMeeting = (actions, request, locusUrl) => {
427
+ if (actions && actions.canLock) {
428
+ return request.lockMeeting({locusUrl, lock: true});
429
+ }
552
430
 
553
- return originalValue;
554
- },
555
- canUserRenameSelfAndObserved: (displayHints) =>
556
- displayHints.includes(DISPLAY_HINTS.CAN_RENAME_SELF_AND_OBSERVED),
431
+ return Promise.reject(new PermissionError('Lock not allowed, due to joined property.'));
432
+ };
557
433
 
558
- canUserRenameOthers: (displayHints) => displayHints.includes(DISPLAY_HINTS.CAN_RENAME_OTHERS),
434
+ MeetingUtil.unlockMeeting = (actions, request, locusUrl) => {
435
+ if (actions && actions.canUnlock) {
436
+ return request.lockMeeting({locusUrl, lock: false});
437
+ }
559
438
 
560
- canShareWhiteBoard: (displayHints) => displayHints.includes(DISPLAY_HINTS.SHARE_WHITEBOARD),
439
+ return Promise.reject(new PermissionError('Unlock not allowed, due to joined property.'));
440
+ };
561
441
 
562
- /**
563
- * Adds the current locus sequence information to a request body
564
- * @param {Object} meeting The meeting object
565
- * @param {Object} requestBody The body of a request to locus
566
- * @returns {void}
567
- */
568
- addSequence: (meeting, requestBody) => {
569
- const sequence = meeting?.locusInfo?.sequence;
442
+ MeetingUtil.handleAudioLogging = (audioTrack) => {
443
+ const LOG_HEADER = 'MeetingUtil#handleAudioLogging -->';
570
444
 
571
- if (!sequence) {
572
- return;
573
- }
445
+ if (audioTrack) {
446
+ const settings = audioTrack.getSettings();
447
+ const {deviceId} = settings;
574
448
 
575
- requestBody.sequence = sequence;
576
- },
577
-
578
- /**
579
- * Updates the locus info for the meeting with the delta locus
580
- * returned from requests that include the sequence information
581
- * Returns the original response object
582
- * @param {Object} meeting The meeting object
583
- * @param {Object} response The response of the http request
584
- * @returns {Object}
585
- */
586
- updateLocusWithDelta: (meeting, response) => {
587
- if (!meeting) {
588
- return response;
589
- }
449
+ LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);
450
+ LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));
451
+ }
452
+ };
590
453
 
591
- const locus = response?.body?.locus;
454
+ MeetingUtil.handleVideoLogging = (videoTrack) => {
455
+ const LOG_HEADER = 'MeetingUtil#handleVideoLogging -->';
592
456
 
593
- if (locus) {
594
- meeting.locusInfo.handleLocusDelta(locus, meeting);
595
- }
457
+ if (videoTrack) {
458
+ const settings = videoTrack.getSettings();
459
+ const {deviceId} = settings;
596
460
 
597
- return response;
598
- },
461
+ LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);
462
+ LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));
463
+ }
464
+ };
599
465
 
600
- generateBuildLocusDeltaRequestOptions: (originalMeeting) => {
601
- const meetingRef = new WeakRef(originalMeeting);
466
+ MeetingUtil.handleDeviceLogging = (devices = []) => {
467
+ const LOG_HEADER = 'MeetingUtil#handleDeviceLogging -->';
602
468
 
603
- const buildLocusDeltaRequestOptions = (originalOptions) => {
604
- const meeting = meetingRef.deref();
469
+ devices.forEach((device) => {
470
+ LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${device.deviceId}`);
471
+ LoggerProxy.logger.log(LOG_HEADER, 'settings', JSON.stringify(device));
472
+ });
473
+ };
605
474
 
606
- if (!meeting) {
607
- return originalOptions;
608
- }
475
+ MeetingUtil.endMeetingForAll = (meeting) => {
476
+ if (meeting.meetingState === FULL_STATE.INACTIVE) {
477
+ return Promise.reject(new MeetingNotActiveError());
478
+ }
609
479
 
610
- const options = cloneDeep(originalOptions);
480
+ const endOptions = {
481
+ locusUrl: meeting.locusUrl,
482
+ };
611
483
 
612
- if (!options.body) {
613
- options.body = {};
484
+ return meeting.meetingRequest
485
+ .endMeetingForAll(endOptions)
486
+ .then((response) => {
487
+ if (response && response.body && response.body.locus) {
488
+ meeting.locusInfo.onFullLocus(response.body.locus);
614
489
  }
615
490
 
616
- MeetingUtil.addSequence(meeting, options.body);
617
-
618
- return options;
619
- };
620
-
621
- return buildLocusDeltaRequestOptions;
622
- },
623
-
624
- generateLocusDeltaRequest: (originalMeeting) => {
625
- const meetingRef = new WeakRef(originalMeeting);
491
+ return Promise.resolve();
492
+ })
493
+ .then(() => MeetingUtil.cleanUp(meeting))
494
+ .catch((err) => {
495
+ LoggerProxy.logger.error(
496
+ `Meeting:util#endMeetingForAll An error occured while trying to end meeting for all with an id of ${meeting.id}, error: ${err}`
497
+ );
626
498
 
627
- const buildLocusDeltaRequestOptions =
628
- MeetingUtil.generateBuildLocusDeltaRequestOptions(originalMeeting);
499
+ return Promise.reject(err);
500
+ });
501
+ };
629
502
 
630
- const locusDeltaRequest = (originalOptions) => {
631
- const meeting = meetingRef.deref();
503
+ MeetingUtil.canEnableClosedCaption = (displayHints) =>
504
+ displayHints.includes(DISPLAY_HINTS.CAPTION_START);
632
505
 
633
- if (!meeting) {
634
- return Promise.resolve();
635
- }
506
+ MeetingUtil.canStartTranscribing = (displayHints) =>
507
+ displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_START);
636
508
 
637
- const options = buildLocusDeltaRequestOptions(originalOptions);
509
+ MeetingUtil.canStopTranscribing = (displayHints) =>
510
+ displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_STOP);
638
511
 
639
- return meeting
640
- .request(options)
641
- .then((response) => MeetingUtil.updateLocusWithDelta(meeting, response));
642
- };
512
+ MeetingUtil.isClosedCaptionActive = (displayHints) =>
513
+ displayHints.includes(DISPLAY_HINTS.CAPTION_STATUS_ACTIVE);
643
514
 
644
- return locusDeltaRequest;
645
- },
515
+ MeetingUtil.isWebexAssistantActive = (displayHints) =>
516
+ displayHints.includes(DISPLAY_HINTS.WEBEX_ASSISTANT_STATUS_ACTIVE);
646
517
 
647
- selfSupportsFeature: (feature: SELF_POLICY, userPolicies: Record<SELF_POLICY, boolean>) => {
648
- if (!userPolicies) {
649
- return true;
650
- }
518
+ MeetingUtil.canViewCaptionPanel = (displayHints) =>
519
+ displayHints.includes(DISPLAY_HINTS.ENABLE_CAPTION_PANEL);
651
520
 
652
- return userPolicies[feature];
653
- },
521
+ MeetingUtil.isRealTimeTranslationEnabled = (displayHints) =>
522
+ displayHints.includes(DISPLAY_HINTS.DISPLAY_REAL_TIME_TRANSLATION);
654
523
 
655
- parseInterpretationInfo: (meeting, meetingInfo) => {
656
- if (!meeting || !meetingInfo) {
657
- return;
658
- }
659
- const siInfo = meetingInfo.simultaneousInterpretation;
660
- meeting.simultaneousInterpretation.updateMeetingSIEnabled(
661
- !!meetingInfo.turnOnSimultaneousInterpretation,
662
- !!siInfo?.currentSIInterpreter
663
- );
664
- const hostSIEnabled = !!(
665
- meetingInfo.turnOnSimultaneousInterpretation &&
666
- meetingInfo?.meetingSiteSetting?.enableHostInterpreterControlSI
667
- );
668
- meeting.simultaneousInterpretation.updateHostSIEnabled(hostSIEnabled);
524
+ MeetingUtil.canSelectSpokenLanguages = (displayHints) =>
525
+ displayHints.includes(DISPLAY_HINTS.DISPLAY_NON_ENGLISH_ASR);
669
526
 
670
- function renameKey(obj, oldKey, newKey) {
671
- if (oldKey in obj) {
672
- obj[newKey] = obj[oldKey];
673
- delete obj[oldKey];
674
- }
675
- }
676
- if (siInfo) {
677
- const lanuagesInfo = cloneDeep(siInfo.siLanguages);
678
- for (const language of lanuagesInfo) {
679
- renameKey(language, 'languageCode', 'languageName');
680
- renameKey(language, 'languageGroupId', 'languageCode');
681
- }
682
- if (!meeting.simultaneousInterpretation?.siLanguages?.length) {
683
- meeting.simultaneousInterpretation.updateInterpretation({siLanguages: lanuagesInfo});
684
- }
685
- }
686
- Trigger.trigger(
687
- meeting,
688
- {
689
- file: 'meeting/util',
690
- function: 'parseInterpretationInfo',
691
- },
692
- EVENT_TRIGGERS.MEETING_INTERPRETATION_UPDATE
693
- );
694
- },
695
- };
527
+ MeetingUtil.waitingForOthersToJoin = (displayHints) =>
528
+ displayHints.includes(DISPLAY_HINTS.WAITING_FOR_OTHERS);
696
529
 
697
530
  export default MeetingUtil;