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

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