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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (519) hide show
  1. package/README.md +45 -1
  2. package/UPGRADING.md +9 -9
  3. package/browsers.js +19 -24
  4. package/dist/annotation/annotation.types.js +7 -0
  5. package/dist/annotation/annotation.types.js.map +1 -0
  6. package/dist/annotation/constants.js +48 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +357 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +193 -0
  11. package/dist/breakouts/breakout.js.map +1 -0
  12. package/dist/breakouts/collection.js +23 -0
  13. package/dist/breakouts/collection.js.map +1 -0
  14. package/dist/breakouts/edit-lock-error.js +52 -0
  15. package/dist/breakouts/edit-lock-error.js.map +1 -0
  16. package/dist/breakouts/events.js +43 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +995 -0
  19. package/dist/breakouts/index.js.map +1 -0
  20. package/dist/breakouts/request.js +78 -0
  21. package/dist/breakouts/request.js.map +1 -0
  22. package/dist/breakouts/utils.js +67 -0
  23. package/dist/breakouts/utils.js.map +1 -0
  24. package/dist/common/browser-detection.js +1 -20
  25. package/dist/common/browser-detection.js.map +1 -1
  26. package/dist/common/collection.js +5 -20
  27. package/dist/common/collection.js.map +1 -1
  28. package/dist/common/config.js +0 -7
  29. package/dist/common/config.js.map +1 -1
  30. package/dist/common/errors/captcha-error.js +5 -26
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +5 -26
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +6 -27
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +5 -26
  37. package/dist/common/errors/media.js.map +1 -1
  38. package/dist/common/errors/parameter.js +5 -33
  39. package/dist/common/errors/parameter.js.map +1 -1
  40. package/dist/common/errors/password-error.js +5 -26
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +4 -25
  43. package/dist/common/errors/permission.js.map +1 -1
  44. package/dist/common/errors/reconnection-in-progress.js +0 -17
  45. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  46. package/dist/common/errors/reconnection.js +5 -26
  47. package/dist/common/errors/reconnection.js.map +1 -1
  48. package/dist/common/errors/stats.js +5 -26
  49. package/dist/common/errors/stats.js.map +1 -1
  50. package/dist/common/errors/webex-errors.js +6 -41
  51. package/dist/common/errors/webex-errors.js.map +1 -1
  52. package/dist/common/errors/webex-meetings-error.js +1 -24
  53. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  54. package/dist/common/events/events-scope.js +0 -22
  55. package/dist/common/events/events-scope.js.map +1 -1
  56. package/dist/common/events/events.js +0 -23
  57. package/dist/common/events/events.js.map +1 -1
  58. package/dist/common/events/trigger-proxy.js +0 -12
  59. package/dist/common/events/trigger-proxy.js.map +1 -1
  60. package/dist/common/events/util.js +0 -15
  61. package/dist/common/events/util.js.map +1 -1
  62. package/dist/common/logs/logger-config.js +0 -4
  63. package/dist/common/logs/logger-config.js.map +1 -1
  64. package/dist/common/logs/logger-proxy.js +1 -8
  65. package/dist/common/logs/logger-proxy.js.map +1 -1
  66. package/dist/common/logs/request.js +35 -61
  67. package/dist/common/logs/request.js.map +1 -1
  68. package/dist/common/queue.js +4 -14
  69. package/dist/common/queue.js.map +1 -1
  70. package/dist/config.js +6 -6
  71. package/dist/config.js.map +1 -1
  72. package/dist/constants.js +196 -53
  73. package/dist/constants.js.map +1 -1
  74. package/dist/controls-options-manager/constants.js +14 -0
  75. package/dist/controls-options-manager/constants.js.map +1 -0
  76. package/dist/controls-options-manager/enums.js +27 -0
  77. package/dist/controls-options-manager/enums.js.map +1 -0
  78. package/dist/controls-options-manager/index.js +297 -0
  79. package/dist/controls-options-manager/index.js.map +1 -0
  80. package/dist/controls-options-manager/types.js +7 -0
  81. package/dist/controls-options-manager/types.js.map +1 -0
  82. package/dist/controls-options-manager/util.js +294 -0
  83. package/dist/controls-options-manager/util.js.map +1 -0
  84. package/dist/index.js +72 -17
  85. package/dist/index.js.map +1 -1
  86. package/dist/locus-info/controlsUtils.js +95 -29
  87. package/dist/locus-info/controlsUtils.js.map +1 -1
  88. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  89. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  90. package/dist/locus-info/fullState.js +0 -15
  91. package/dist/locus-info/fullState.js.map +1 -1
  92. package/dist/locus-info/hostUtils.js +4 -12
  93. package/dist/locus-info/hostUtils.js.map +1 -1
  94. package/dist/locus-info/index.js +392 -212
  95. package/dist/locus-info/index.js.map +1 -1
  96. package/dist/locus-info/infoUtils.js +0 -38
  97. package/dist/locus-info/infoUtils.js.map +1 -1
  98. package/dist/locus-info/mediaSharesUtils.js +54 -38
  99. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  100. package/dist/locus-info/parser.js +88 -123
  101. package/dist/locus-info/parser.js.map +1 -1
  102. package/dist/locus-info/selfUtils.js +99 -91
  103. package/dist/locus-info/selfUtils.js.map +1 -1
  104. package/dist/media/index.js +55 -165
  105. package/dist/media/index.js.map +1 -1
  106. package/dist/media/properties.js +71 -117
  107. package/dist/media/properties.js.map +1 -1
  108. package/dist/media/util.js +2 -9
  109. package/dist/media/util.js.map +1 -1
  110. package/dist/mediaQualityMetrics/config.js +505 -495
  111. package/dist/mediaQualityMetrics/config.js.map +1 -1
  112. package/dist/meeting/in-meeting-actions.js +67 -14
  113. package/dist/meeting/in-meeting-actions.js.map +1 -1
  114. package/dist/meeting/index.js +2506 -2444
  115. package/dist/meeting/index.js.map +1 -1
  116. package/dist/meeting/locusMediaRequest.js +291 -0
  117. package/dist/meeting/locusMediaRequest.js.map +1 -0
  118. package/dist/meeting/muteState.js +292 -138
  119. package/dist/meeting/muteState.js.map +1 -1
  120. package/dist/meeting/request.js +315 -336
  121. package/dist/meeting/request.js.map +1 -1
  122. package/dist/meeting/request.type.js +7 -0
  123. package/dist/meeting/request.type.js.map +1 -0
  124. package/dist/meeting/state.js +21 -31
  125. package/dist/meeting/state.js.map +1 -1
  126. package/dist/meeting/util.js +462 -583
  127. package/dist/meeting/util.js.map +1 -1
  128. package/dist/meeting-info/collection.js +3 -25
  129. package/dist/meeting-info/collection.js.map +1 -1
  130. package/dist/meeting-info/index.js +10 -33
  131. package/dist/meeting-info/index.js.map +1 -1
  132. package/dist/meeting-info/meeting-info-v2.js +305 -286
  133. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  134. package/dist/meeting-info/request.js +1 -16
  135. package/dist/meeting-info/request.js.map +1 -1
  136. package/dist/meeting-info/util.js +98 -183
  137. package/dist/meeting-info/util.js.map +1 -1
  138. package/dist/meeting-info/utilv2.js +156 -232
  139. package/dist/meeting-info/utilv2.js.map +1 -1
  140. package/dist/meetings/collection.js +24 -20
  141. package/dist/meetings/collection.js.map +1 -1
  142. package/dist/meetings/index.js +675 -593
  143. package/dist/meetings/index.js.map +1 -1
  144. package/dist/meetings/request.js +23 -42
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +177 -155
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.js +89 -88
  149. package/dist/member/index.js.map +1 -1
  150. package/dist/member/types.js +15 -0
  151. package/dist/member/types.js.map +1 -0
  152. package/dist/member/util.js +101 -69
  153. package/dist/member/util.js.map +1 -1
  154. package/dist/members/collection.js +12 -12
  155. package/dist/members/collection.js.map +1 -1
  156. package/dist/members/index.js +166 -205
  157. package/dist/members/index.js.map +1 -1
  158. package/dist/members/request.js +120 -85
  159. package/dist/members/request.js.map +1 -1
  160. package/dist/members/types.js +15 -0
  161. package/dist/members/types.js.map +1 -0
  162. package/dist/members/util.js +314 -260
  163. package/dist/members/util.js.map +1 -1
  164. package/dist/metrics/config.js +50 -16
  165. package/dist/metrics/config.js.map +1 -1
  166. package/dist/metrics/constants.js +3 -7
  167. package/dist/metrics/constants.js.map +1 -1
  168. package/dist/metrics/index.js +93 -162
  169. package/dist/metrics/index.js.map +1 -1
  170. package/dist/multistream/mediaRequestManager.js +167 -50
  171. package/dist/multistream/mediaRequestManager.js.map +1 -1
  172. package/dist/multistream/receiveSlot.js +58 -65
  173. package/dist/multistream/receiveSlot.js.map +1 -1
  174. package/dist/multistream/receiveSlotManager.js +74 -93
  175. package/dist/multistream/receiveSlotManager.js.map +1 -1
  176. package/dist/multistream/remoteMedia.js +55 -74
  177. package/dist/multistream/remoteMedia.js.map +1 -1
  178. package/dist/multistream/remoteMediaGroup.js +6 -40
  179. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  180. package/dist/multistream/remoteMediaManager.js +466 -442
  181. package/dist/multistream/remoteMediaManager.js.map +1 -1
  182. package/dist/networkQualityMonitor/index.js +32 -59
  183. package/dist/networkQualityMonitor/index.js.map +1 -1
  184. package/dist/personal-meeting-room/index.js +10 -45
  185. package/dist/personal-meeting-room/index.js.map +1 -1
  186. package/dist/personal-meeting-room/request.js +2 -33
  187. package/dist/personal-meeting-room/request.js.map +1 -1
  188. package/dist/personal-meeting-room/util.js +0 -13
  189. package/dist/personal-meeting-room/util.js.map +1 -1
  190. package/dist/reachability/index.js +190 -199
  191. package/dist/reachability/index.js.map +1 -1
  192. package/dist/reachability/request.js +14 -23
  193. package/dist/reachability/request.js.map +1 -1
  194. package/dist/reactions/constants.js +13 -0
  195. package/dist/reactions/constants.js.map +1 -0
  196. package/dist/reactions/reactions.js +2 -4
  197. package/dist/reactions/reactions.js.map +1 -1
  198. package/dist/reactions/reactions.type.js +19 -23
  199. package/dist/reactions/reactions.type.js.map +1 -1
  200. package/dist/reconnection-manager/index.js +326 -465
  201. package/dist/reconnection-manager/index.js.map +1 -1
  202. package/dist/recording-controller/enums.js +17 -0
  203. package/dist/recording-controller/enums.js.map +1 -0
  204. package/dist/recording-controller/index.js +343 -0
  205. package/dist/recording-controller/index.js.map +1 -0
  206. package/dist/recording-controller/util.js +63 -0
  207. package/dist/recording-controller/util.js.map +1 -0
  208. package/dist/roap/index.js +31 -75
  209. package/dist/roap/index.js.map +1 -1
  210. package/dist/roap/request.js +129 -136
  211. package/dist/roap/request.js.map +1 -1
  212. package/dist/roap/turnDiscovery.js +143 -103
  213. package/dist/roap/turnDiscovery.js.map +1 -1
  214. package/dist/statsAnalyzer/global.js +1 -95
  215. package/dist/statsAnalyzer/global.js.map +1 -1
  216. package/dist/statsAnalyzer/index.js +369 -461
  217. package/dist/statsAnalyzer/index.js.map +1 -1
  218. package/dist/statsAnalyzer/mqaUtil.js +144 -94
  219. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  220. package/dist/transcription/index.js +13 -45
  221. package/dist/transcription/index.js.map +1 -1
  222. package/dist/types/annotation/annotation.types.d.ts +35 -0
  223. package/dist/types/annotation/constants.d.ts +31 -0
  224. package/dist/types/annotation/index.d.ts +124 -0
  225. package/dist/types/breakouts/breakout.d.ts +8 -0
  226. package/dist/types/breakouts/collection.d.ts +5 -0
  227. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  228. package/dist/types/breakouts/events.d.ts +2 -0
  229. package/dist/types/breakouts/index.d.ts +5 -0
  230. package/dist/types/breakouts/request.d.ts +22 -0
  231. package/dist/types/breakouts/utils.d.ts +15 -0
  232. package/dist/types/common/browser-detection.d.ts +9 -0
  233. package/dist/types/common/collection.d.ts +48 -0
  234. package/dist/types/common/config.d.ts +2 -0
  235. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  236. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  237. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  238. package/dist/types/common/errors/media.d.ts +15 -0
  239. package/dist/types/common/errors/parameter.d.ts +15 -0
  240. package/dist/types/common/errors/password-error.d.ts +15 -0
  241. package/dist/types/common/errors/permission.d.ts +14 -0
  242. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  243. package/dist/types/common/errors/reconnection.d.ts +15 -0
  244. package/dist/types/common/errors/stats.d.ts +15 -0
  245. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  246. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  247. package/dist/types/common/events/events-scope.d.ts +17 -0
  248. package/dist/types/common/events/events.d.ts +12 -0
  249. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  250. package/dist/types/common/events/util.d.ts +2 -0
  251. package/dist/types/common/logs/logger-config.d.ts +2 -0
  252. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  253. package/dist/types/common/logs/request.d.ts +34 -0
  254. package/dist/types/common/queue.d.ts +32 -0
  255. package/dist/types/config.d.ts +78 -0
  256. package/dist/types/constants.d.ts +987 -0
  257. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  258. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  259. package/dist/types/controls-options-manager/index.d.ts +136 -0
  260. package/dist/types/controls-options-manager/types.d.ts +43 -0
  261. package/dist/types/controls-options-manager/util.d.ts +1 -0
  262. package/dist/types/index.d.ts +7 -0
  263. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  264. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  265. package/dist/types/locus-info/fullState.d.ts +2 -0
  266. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  267. package/dist/types/locus-info/index.d.ts +315 -0
  268. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  269. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  270. package/dist/types/locus-info/parser.d.ts +212 -0
  271. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  272. package/dist/types/media/index.d.ts +34 -0
  273. package/dist/types/media/properties.d.ts +108 -0
  274. package/dist/types/media/util.d.ts +2 -0
  275. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  276. package/dist/types/meeting/in-meeting-actions.d.ts +137 -0
  277. package/dist/types/meeting/index.d.ts +1755 -0
  278. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  279. package/dist/types/meeting/muteState.d.ts +186 -0
  280. package/dist/types/meeting/request.d.ts +269 -0
  281. package/dist/types/meeting/request.type.d.ts +11 -0
  282. package/dist/types/meeting/state.d.ts +9 -0
  283. package/dist/types/meeting/util.d.ts +76 -0
  284. package/dist/types/meeting-info/collection.d.ts +20 -0
  285. package/dist/types/meeting-info/index.d.ts +57 -0
  286. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  287. package/dist/types/meeting-info/request.d.ts +22 -0
  288. package/dist/types/meeting-info/util.d.ts +2 -0
  289. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  290. package/dist/types/meetings/collection.d.ts +31 -0
  291. package/dist/types/meetings/index.d.ts +345 -0
  292. package/dist/types/meetings/request.d.ts +27 -0
  293. package/dist/types/meetings/util.d.ts +18 -0
  294. package/dist/types/member/index.d.ts +157 -0
  295. package/dist/types/member/types.d.ts +21 -0
  296. package/dist/types/member/util.d.ts +2 -0
  297. package/dist/types/members/collection.d.ts +29 -0
  298. package/dist/types/members/index.d.ts +353 -0
  299. package/dist/types/members/request.d.ts +114 -0
  300. package/dist/types/members/types.d.ts +24 -0
  301. package/dist/types/members/util.d.ts +210 -0
  302. package/dist/types/metrics/config.d.ts +195 -0
  303. package/dist/types/metrics/constants.d.ts +54 -0
  304. package/dist/types/metrics/index.d.ts +169 -0
  305. package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
  306. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  307. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  308. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  309. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  310. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  311. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  312. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  313. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  314. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  315. package/dist/types/reachability/index.d.ts +152 -0
  316. package/dist/types/reachability/request.d.ts +37 -0
  317. package/dist/types/reactions/constants.d.ts +3 -0
  318. package/dist/types/reactions/reactions.d.ts +4 -0
  319. package/dist/types/reactions/reactions.type.d.ts +52 -0
  320. package/dist/types/reconnection-manager/index.d.ts +126 -0
  321. package/dist/types/recording-controller/enums.d.ts +7 -0
  322. package/dist/types/recording-controller/index.d.ts +193 -0
  323. package/dist/types/recording-controller/util.d.ts +13 -0
  324. package/dist/types/roap/index.d.ts +77 -0
  325. package/dist/types/roap/request.d.ts +36 -0
  326. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  327. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  328. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  329. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  330. package/dist/types/transcription/index.d.ts +64 -0
  331. package/internal-README.md +7 -6
  332. package/package.json +28 -21
  333. package/src/annotation/annotation.types.ts +42 -0
  334. package/src/annotation/constants.ts +36 -0
  335. package/src/annotation/index.ts +339 -0
  336. package/src/breakouts/README.md +220 -0
  337. package/src/breakouts/breakout.ts +163 -0
  338. package/src/breakouts/collection.ts +19 -0
  339. package/src/breakouts/edit-lock-error.ts +25 -0
  340. package/src/breakouts/events.ts +37 -0
  341. package/src/breakouts/index.ts +861 -0
  342. package/src/breakouts/request.ts +55 -0
  343. package/src/breakouts/utils.ts +57 -0
  344. package/src/common/browser-detection.ts +9 -6
  345. package/src/common/collection.ts +3 -1
  346. package/src/common/errors/captcha-error.ts +6 -6
  347. package/src/common/errors/intent-to-join.ts +6 -6
  348. package/src/common/errors/join-meeting.ts +12 -8
  349. package/src/common/errors/media.ts +6 -6
  350. package/src/common/errors/parameter.ts +9 -6
  351. package/src/common/errors/password-error.ts +6 -6
  352. package/src/common/errors/permission.ts +5 -5
  353. package/src/common/errors/reconnection.ts +6 -6
  354. package/src/common/errors/stats.ts +6 -6
  355. package/src/common/errors/webex-errors.ts +7 -5
  356. package/src/common/errors/webex-meetings-error.ts +1 -1
  357. package/src/common/events/events-scope.ts +5 -1
  358. package/src/common/events/events.ts +5 -1
  359. package/src/common/events/trigger-proxy.ts +8 -3
  360. package/src/common/events/util.ts +1 -2
  361. package/src/common/logs/logger-proxy.ts +21 -10
  362. package/src/common/logs/request.ts +11 -8
  363. package/src/config.ts +16 -12
  364. package/src/constants.ts +144 -6
  365. package/src/controls-options-manager/constants.ts +5 -0
  366. package/src/controls-options-manager/enums.ts +18 -0
  367. package/src/controls-options-manager/index.ts +278 -0
  368. package/src/controls-options-manager/types.ts +59 -0
  369. package/src/controls-options-manager/util.ts +281 -0
  370. package/src/index.ts +33 -0
  371. package/src/locus-info/controlsUtils.ts +148 -24
  372. package/src/locus-info/fullState.ts +15 -11
  373. package/src/locus-info/hostUtils.ts +4 -3
  374. package/src/locus-info/index.ts +335 -55
  375. package/src/locus-info/infoUtils.ts +12 -4
  376. package/src/locus-info/mediaSharesUtils.ts +52 -4
  377. package/src/locus-info/parser.ts +46 -68
  378. package/src/locus-info/selfUtils.ts +187 -56
  379. package/src/media/index.ts +139 -196
  380. package/src/media/properties.ts +43 -36
  381. package/src/media/util.ts +1 -1
  382. package/src/mediaQualityMetrics/config.ts +380 -378
  383. package/src/meeting/in-meeting-actions.ts +139 -3
  384. package/src/meeting/index.ts +2733 -1589
  385. package/src/meeting/locusMediaRequest.ts +309 -0
  386. package/src/meeting/muteState.ts +290 -72
  387. package/src/meeting/request.ts +247 -178
  388. package/src/meeting/request.type.ts +13 -0
  389. package/src/meeting/state.ts +45 -30
  390. package/src/meeting/util.ts +444 -395
  391. package/src/meeting-info/collection.ts +2 -1
  392. package/src/meeting-info/index.ts +32 -30
  393. package/src/meeting-info/meeting-info-v2.ts +235 -116
  394. package/src/meeting-info/request.ts +9 -3
  395. package/src/meeting-info/util.ts +54 -46
  396. package/src/meeting-info/utilv2.ts +71 -55
  397. package/src/meetings/collection.ts +21 -1
  398. package/src/meetings/index.ts +749 -437
  399. package/src/meetings/request.ts +29 -25
  400. package/src/meetings/util.ts +122 -33
  401. package/src/member/index.ts +95 -49
  402. package/src/member/types.ts +24 -0
  403. package/src/member/util.ts +106 -13
  404. package/src/members/collection.ts +8 -1
  405. package/src/members/index.ts +288 -130
  406. package/src/members/request.ts +144 -31
  407. package/src/members/types.ts +28 -0
  408. package/src/members/util.ts +316 -235
  409. package/src/metrics/config.ts +302 -90
  410. package/src/metrics/constants.ts +1 -6
  411. package/src/metrics/index.ts +124 -95
  412. package/src/multistream/mediaRequestManager.ts +203 -45
  413. package/src/multistream/receiveSlot.ts +69 -26
  414. package/src/multistream/receiveSlotManager.ts +62 -38
  415. package/src/multistream/remoteMedia.ts +30 -4
  416. package/src/multistream/remoteMediaGroup.ts +4 -3
  417. package/src/multistream/remoteMediaManager.ts +230 -66
  418. package/src/networkQualityMonitor/index.ts +24 -27
  419. package/src/personal-meeting-room/index.ts +12 -16
  420. package/src/personal-meeting-room/request.ts +10 -3
  421. package/src/personal-meeting-room/util.ts +3 -3
  422. package/src/reachability/index.ts +131 -79
  423. package/src/reachability/request.ts +43 -34
  424. package/src/reactions/constants.ts +4 -0
  425. package/src/reactions/reactions.ts +8 -8
  426. package/src/reactions/reactions.type.ts +31 -5
  427. package/src/reconnection-manager/index.ts +193 -111
  428. package/src/recording-controller/enums.ts +8 -0
  429. package/src/recording-controller/index.ts +315 -0
  430. package/src/recording-controller/util.ts +58 -0
  431. package/src/roap/index.ts +53 -53
  432. package/src/roap/request.ts +77 -64
  433. package/src/roap/turnDiscovery.ts +101 -48
  434. package/src/statsAnalyzer/global.ts +8 -104
  435. package/src/statsAnalyzer/index.ts +624 -376
  436. package/src/statsAnalyzer/mqaUtil.ts +203 -90
  437. package/src/transcription/index.ts +34 -32
  438. package/test/integration/spec/converged-space-meetings.js +177 -0
  439. package/test/integration/spec/journey.js +670 -466
  440. package/test/integration/spec/space-meeting.js +320 -204
  441. package/test/integration/spec/transcription.js +7 -8
  442. package/test/unit/spec/annotation/index.ts +436 -0
  443. package/test/unit/spec/breakouts/breakout.ts +203 -0
  444. package/test/unit/spec/breakouts/collection.ts +15 -0
  445. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  446. package/test/unit/spec/breakouts/events.ts +77 -0
  447. package/test/unit/spec/breakouts/index.ts +1611 -0
  448. package/test/unit/spec/breakouts/request.ts +104 -0
  449. package/test/unit/spec/breakouts/utils.js +72 -0
  450. package/test/unit/spec/common/browser-detection.js +9 -28
  451. package/test/unit/spec/controls-options-manager/index.js +287 -0
  452. package/test/unit/spec/controls-options-manager/util.js +504 -0
  453. package/test/unit/spec/fixture/locus.js +93 -90
  454. package/test/unit/spec/locus-info/controlsUtils.js +297 -32
  455. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  456. package/test/unit/spec/locus-info/index.js +598 -5
  457. package/test/unit/spec/locus-info/infoUtils.js +26 -33
  458. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  459. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  460. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  461. package/test/unit/spec/locus-info/parser.js +3 -9
  462. package/test/unit/spec/locus-info/selfConstant.js +110 -103
  463. package/test/unit/spec/locus-info/selfUtils.js +236 -12
  464. package/test/unit/spec/media/index.ts +104 -8
  465. package/test/unit/spec/media/properties.ts +9 -9
  466. package/test/unit/spec/meeting/in-meeting-actions.ts +66 -3
  467. package/test/unit/spec/meeting/index.js +2908 -887
  468. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  469. package/test/unit/spec/meeting/muteState.js +421 -94
  470. package/test/unit/spec/meeting/request.js +421 -79
  471. package/test/unit/spec/meeting/utils.js +308 -189
  472. package/test/unit/spec/meeting-info/meetinginfov2.js +481 -76
  473. package/test/unit/spec/meeting-info/request.js +7 -9
  474. package/test/unit/spec/meeting-info/util.js +11 -12
  475. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  476. package/test/unit/spec/meetings/collection.js +15 -1
  477. package/test/unit/spec/meetings/index.js +1052 -329
  478. package/test/unit/spec/meetings/utils.js +163 -14
  479. package/test/unit/spec/member/index.js +24 -1
  480. package/test/unit/spec/member/util.js +383 -32
  481. package/test/unit/spec/members/index.js +424 -55
  482. package/test/unit/spec/members/request.js +228 -40
  483. package/test/unit/spec/members/utils.js +191 -4
  484. package/test/unit/spec/metrics/index.js +113 -20
  485. package/test/unit/spec/multistream/mediaRequestManager.ts +650 -105
  486. package/test/unit/spec/multistream/receiveSlot.ts +76 -17
  487. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  488. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  489. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  490. package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
  491. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  492. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  493. package/test/unit/spec/reachability/index.ts +176 -27
  494. package/test/unit/spec/reachability/request.js +66 -0
  495. package/test/unit/spec/reconnection-manager/index.js +62 -31
  496. package/test/unit/spec/recording-controller/index.js +231 -0
  497. package/test/unit/spec/recording-controller/util.js +102 -0
  498. package/test/unit/spec/roap/index.ts +19 -49
  499. package/test/unit/spec/roap/request.ts +187 -0
  500. package/test/unit/spec/roap/turnDiscovery.ts +92 -50
  501. package/test/unit/spec/stats-analyzer/index.js +116 -60
  502. package/test/utils/cmr.js +44 -42
  503. package/test/utils/constants.js +9 -0
  504. package/test/utils/integrationTestUtils.js +64 -0
  505. package/test/utils/testUtils.js +63 -99
  506. package/test/utils/webex-config.js +22 -18
  507. package/test/utils/webex-test-users.js +57 -50
  508. package/tsconfig.json +6 -0
  509. package/dist/media/internal-media-core-wrapper.js +0 -22
  510. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  511. package/dist/meeting/effectsState.js +0 -334
  512. package/dist/meeting/effectsState.js.map +0 -1
  513. package/dist/multistream/multistreamMedia.js +0 -116
  514. package/dist/multistream/multistreamMedia.js.map +0 -1
  515. package/src/index.js +0 -15
  516. package/src/media/internal-media-core-wrapper.ts +0 -9
  517. package/src/meeting/effectsState.ts +0 -211
  518. package/src/multistream/multistreamMedia.ts +0 -92
  519. package/test/unit/spec/meeting/effectsState.js +0 -291
@@ -1,4 +1,4 @@
1
- import {isEqual} from 'lodash';
1
+ import {isArray, isEqual, assignWith, cloneDeep} from 'lodash';
2
2
 
3
3
  import LoggerProxy from '../common/logs/logger-proxy';
4
4
  import EventsScope from '../common/events/events-scope';
@@ -19,14 +19,14 @@ import {
19
19
  } from '../constants';
20
20
  import Metrics from '../metrics';
21
21
  import {eventType} from '../metrics/config';
22
- import InfoUtils from '../locus-info/infoUtils';
23
- import FullState from '../locus-info/fullState';
24
- import SelfUtils from '../locus-info/selfUtils';
25
- import HostUtils from '../locus-info/hostUtils';
26
- import ControlsUtils from '../locus-info/controlsUtils';
27
- import EmbeddedAppsUtils from '../locus-info/embeddedAppsUtils';
28
- import MediaSharesUtils from '../locus-info/mediaSharesUtils';
29
- import LocusDeltaParser from '../locus-info/parser';
22
+ import InfoUtils from './infoUtils';
23
+ import FullState from './fullState';
24
+ import SelfUtils from './selfUtils';
25
+ import HostUtils from './hostUtils';
26
+ import ControlsUtils from './controlsUtils';
27
+ import EmbeddedAppsUtils from './embeddedAppsUtils';
28
+ import MediaSharesUtils from './mediaSharesUtils';
29
+ import LocusDeltaParser from './parser';
30
30
 
31
31
  /**
32
32
  * @description LocusInfo extends ChildEmitter to convert locusInfo info a private emitter to parent object
@@ -59,10 +59,19 @@ export default class LocusInfo extends EventsScope {
59
59
  fullState: any;
60
60
  host: any;
61
61
  info: any;
62
+ roles: any;
62
63
  mediaShares: any;
63
64
  replace: any;
64
65
  url: any;
65
-
66
+ services: any;
67
+ mainSessionLocusCache: any;
68
+ /**
69
+ * Constructor
70
+ * @param {boolean} updateMeeting true if the meeting should be updated
71
+ * @param {object} webex
72
+ * @param {string} meetingId
73
+ * @returns {undefined}
74
+ */
66
75
  constructor(updateMeeting, webex, meetingId) {
67
76
  super();
68
77
  this.parsedLocus = {
@@ -98,7 +107,7 @@ export default class LocusInfo extends EventsScope {
98
107
  meeting.meetingRequest
99
108
  .getFullLocus({
100
109
  desync: true,
101
- locusUrl: meeting.locusUrl,
110
+ locusUrl: locus.url ? locus.url : meeting.locusUrl,
102
111
  })
103
112
  .then((res) => {
104
113
  meeting.locusInfo.onFullLocus(res.body);
@@ -171,12 +180,13 @@ export default class LocusInfo extends EventsScope {
171
180
  */
172
181
  this.deltaParticipants = [];
173
182
 
183
+ this.updateLocusCache(locus);
174
184
  // above section only updates the locusInfo object
175
185
  // The below section makes sure it updates the locusInfo as well as updates the meeting object
176
186
  this.updateParticipants(locus.participants);
177
187
  // For 1:1 space meeting the conversation Url does not exist in locus.conversation
178
188
  this.updateConversationUrl(locus.conversationUrl, locus.info);
179
- this.updateControls(locus.controls);
189
+ this.updateControls(locus.controls, locus.self);
180
190
  this.updateLocusUrl(locus.url);
181
191
  this.updateFullState(locus.fullState);
182
192
  this.updateMeetingInfo(locus.info);
@@ -185,6 +195,7 @@ export default class LocusInfo extends EventsScope {
185
195
  this.updateSelf(locus.self, locus.participants);
186
196
  this.updateHostInfo(locus.host);
187
197
  this.updateMediaShares(locus.mediaShares);
198
+ this.updateServices(locus.links?.services);
188
199
  }
189
200
 
190
201
  /**
@@ -193,6 +204,7 @@ export default class LocusInfo extends EventsScope {
193
204
  * @memberof LocusInfo
194
205
  */
195
206
  initialSetup(locus: object) {
207
+ this.updateLocusCache(locus);
196
208
  this.onFullLocus(locus);
197
209
 
198
210
  // Change it to true after it receives it first locus object
@@ -206,8 +218,9 @@ export default class LocusInfo extends EventsScope {
206
218
  * @memberof LocusInfo
207
219
  */
208
220
  parse(meeting: any, data: any) {
221
+ // eslint-disable-next-line @typescript-eslint/no-shadow
209
222
  const {eventType} = data;
210
-
223
+ const locus = this.getTheLocusToUpdate(data.locus);
211
224
  LoggerProxy.logger.info(`Locus-info:index#parse --> received locus data: ${eventType}`);
212
225
 
213
226
  switch (eventType) {
@@ -225,16 +238,16 @@ export default class LocusInfo extends EventsScope {
225
238
  case LOCUSEVENT.PARTICIPANT_DECLINED:
226
239
  case LOCUSEVENT.FLOOR_GRANTED:
227
240
  case LOCUSEVENT.FLOOR_RELEASED:
228
- this.onFullLocus(data.locus, eventType);
241
+ this.onFullLocus(locus, eventType);
229
242
  break;
230
243
  case LOCUSEVENT.DIFFERENCE:
231
- this.handleLocusDelta(data.locus, meeting);
244
+ this.handleLocusDelta(locus, meeting);
232
245
  break;
233
246
 
234
247
  default:
235
248
  // Why will there be a event with no eventType ????
236
249
  // we may not need this, we can get full locus
237
- this.handleLocusDelta(data.locus, meeting);
250
+ this.handleLocusDelta(locus, meeting);
238
251
  }
239
252
  }
240
253
 
@@ -256,6 +269,7 @@ export default class LocusInfo extends EventsScope {
256
269
  * @returns {object} null
257
270
  * @memberof LocusInfo
258
271
  */
272
+ // eslint-disable-next-line @typescript-eslint/no-shadow
259
273
  onFullLocus(locus: any, eventType?: string) {
260
274
  if (!locus) {
261
275
  LoggerProxy.logger.error(
@@ -265,8 +279,9 @@ export default class LocusInfo extends EventsScope {
265
279
  this.updateParticipantDeltas(locus.participants);
266
280
  this.scheduledMeeting = locus.meeting || null;
267
281
  this.participants = locus.participants;
282
+ const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);
268
283
  this.updateLocusInfo(locus);
269
- this.updateParticipants(locus.participants);
284
+ this.updateParticipants(locus.participants, isReplaceMembers);
270
285
  this.isMeetingActive();
271
286
  this.handleOneOnOneEvent(eventType);
272
287
  this.updateEmbeddedApps(locus.embeddedApps);
@@ -280,6 +295,7 @@ export default class LocusInfo extends EventsScope {
280
295
  * @returns {undefined}
281
296
  * @memberof LocusInfo
282
297
  */
298
+ // eslint-disable-next-line @typescript-eslint/no-shadow
283
299
  handleOneOnOneEvent(eventType: string) {
284
300
  if (
285
301
  this.parsedLocus.fullState.type === _CALL_ ||
@@ -324,8 +340,9 @@ export default class LocusInfo extends EventsScope {
324
340
  * @memberof LocusInfo
325
341
  */
326
342
  onDeltaLocus(locus: any) {
343
+ const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);
327
344
  this.updateLocusInfo(locus);
328
- this.updateParticipants(locus.participants);
345
+ this.updateParticipants(locus.participants, isReplaceMembers);
329
346
  this.isMeetingActive();
330
347
  }
331
348
 
@@ -334,8 +351,15 @@ export default class LocusInfo extends EventsScope {
334
351
  * @returns {undefined}
335
352
  * @memberof LocusInfo
336
353
  */
337
- updateLocusInfo(locus: any) {
338
- this.updateControls(locus.controls);
354
+ updateLocusInfo(locus) {
355
+ if (locus.self?.reason === 'MOVED' && locus.self?.state === 'LEFT') {
356
+ // When moved to a breakout session locus sends a message for the previous locus
357
+ // indicating that we have been moved. It isn't helpful to continue parsing this
358
+ // as it gets interpreted as if we have left the call
359
+ return;
360
+ }
361
+
362
+ this.updateControls(locus.controls, locus.self);
339
363
  this.updateConversationUrl(locus.conversationUrl, locus.info);
340
364
  this.updateCreated(locus.created);
341
365
  this.updateFullState(locus.fullState);
@@ -352,6 +376,7 @@ export default class LocusInfo extends EventsScope {
352
376
  this.updateMemberShip(locus.membership);
353
377
  this.updateIdentifiers(locus.identities);
354
378
  this.updateEmbeddedApps(locus.embeddedApps);
379
+ this.updateServices(locus.links?.services);
355
380
  this.compareAndUpdate();
356
381
  // update which required to compare different objects from locus
357
382
  }
@@ -373,7 +398,7 @@ export default class LocusInfo extends EventsScope {
373
398
  self &&
374
399
  participant.identity !== self.identity &&
375
400
  (participants.length <= 2 || (participant.type === _USER_ && !participant.removed))
376
- // @ts-ignore
401
+ // @ts-ignore
377
402
  ) || this.partner
378
403
  );
379
404
  }
@@ -420,8 +445,7 @@ export default class LocusInfo extends EventsScope {
420
445
  shouldLeave: false,
421
446
  }
422
447
  );
423
- }
424
- else if (
448
+ } else if (
425
449
  partner.state === MEETING_STATE.STATES.LEFT &&
426
450
  this.parsedLocus.self &&
427
451
  (this.parsedLocus.self.state === MEETING_STATE.STATES.DECLINED ||
@@ -444,8 +468,7 @@ export default class LocusInfo extends EventsScope {
444
468
  this.parsedLocus.self.joinedWith && this.parsedLocus.self.joinedWith.state !== _LEFT_,
445
469
  }
446
470
  );
447
- }
448
- else if (
471
+ } else if (
449
472
  this.parsedLocus.self &&
450
473
  this.parsedLocus.self.state === MEETING_STATE.STATES.LEFT &&
451
474
  (partner.state === MEETING_STATE.STATES.LEFT ||
@@ -469,8 +492,7 @@ export default class LocusInfo extends EventsScope {
469
492
  }
470
493
  );
471
494
  }
472
- }
473
- else if (this.parsedLocus.fullState.type === _MEETING_) {
495
+ } else if (this.parsedLocus.fullState.type === _MEETING_) {
474
496
  if (
475
497
  this.fullState &&
476
498
  (this.fullState.state === LOCUS.STATE.INACTIVE ||
@@ -495,8 +517,7 @@ export default class LocusInfo extends EventsScope {
495
517
  shouldLeave: false,
496
518
  }
497
519
  );
498
- }
499
- else if (this.fullState && this.fullState.removed) {
520
+ } else if (this.fullState && this.fullState.removed) {
500
521
  // user has been dropped from a meeting
501
522
  Metrics.postEvent({
502
523
  event: eventType.REMOTE_ENDED,
@@ -530,8 +551,7 @@ export default class LocusInfo extends EventsScope {
530
551
  }
531
552
  );
532
553
  }
533
- }
534
- else {
554
+ } else {
535
555
  LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Meeting Type is unknown.');
536
556
  }
537
557
  }
@@ -574,8 +594,7 @@ export default class LocusInfo extends EventsScope {
574
594
  canAssignHost: true,
575
595
  }
576
596
  );
577
- }
578
- else {
597
+ } else {
579
598
  this.emitScoped(
580
599
  {
581
600
  file: 'locus-info',
@@ -639,13 +658,13 @@ export default class LocusInfo extends EventsScope {
639
658
  }
640
659
 
641
660
  /**
642
- *
661
+ * update meeting's members
643
662
  * @param {Object} participants new participants object
644
- * @param {boolen} deltaParticpantFlag delta event
663
+ * @param {Boolean} isReplace is replace the whole members
645
664
  * @returns {Array} updatedParticipants
646
665
  * @memberof LocusInfo
647
666
  */
648
- updateParticipants(participants: object) {
667
+ updateParticipants(participants: object, isReplace?: boolean) {
649
668
  this.emitScoped(
650
669
  {
651
670
  file: 'locus-info',
@@ -658,16 +677,18 @@ export default class LocusInfo extends EventsScope {
658
677
  selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,
659
678
  selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,
660
679
  hostId: this.parsedLocus.host && this.parsedLocus.host.hostId,
680
+ isReplace,
661
681
  }
662
682
  );
663
683
  }
664
684
 
665
685
  /**
666
686
  * @param {Object} controls
687
+ * @param {Object} self
667
688
  * @returns {undefined}
668
689
  * @memberof LocusInfo
669
690
  */
670
- updateControls(controls: object) {
691
+ updateControls(controls: object, self: object) {
671
692
  if (controls && !isEqual(this.controls, controls)) {
672
693
  this.parsedLocus.controls = ControlsUtils.parse(controls);
673
694
  const {
@@ -677,23 +698,87 @@ export default class LocusInfo extends EventsScope {
677
698
  hasMeetingContainerChanged,
678
699
  hasTranscribeChanged,
679
700
  hasEntryExitToneChanged,
701
+ hasBreakoutChanged,
702
+ hasVideoEnabledChanged,
703
+ hasMuteOnEntryChanged,
704
+ hasShareControlChanged,
705
+ hasDisallowUnmuteChanged,
706
+ hasReactionsChanged,
707
+ hasReactionDisplayNamesChanged,
708
+ hasViewTheParticipantListChanged,
709
+ hasRaiseHandChanged,
710
+ hasVideoChanged,
680
711
  },
681
712
  current,
682
713
  } = ControlsUtils.getControls(this.controls, controls);
683
714
 
715
+ if (hasMuteOnEntryChanged) {
716
+ this.emitScoped(
717
+ {file: 'locus-info', function: 'updateControls'},
718
+ LOCUSINFO.EVENTS.CONTROLS_MUTE_ON_ENTRY_CHANGED,
719
+ {state: current.muteOnEntry}
720
+ );
721
+ }
722
+
723
+ if (hasShareControlChanged) {
724
+ this.emitScoped(
725
+ {file: 'locus-info', function: 'updateControls'},
726
+ LOCUSINFO.EVENTS.CONTROLS_SHARE_CONTROL_CHANGED,
727
+ {state: current.shareControl}
728
+ );
729
+ }
730
+
731
+ if (hasDisallowUnmuteChanged) {
732
+ this.emitScoped(
733
+ {file: 'locus-info', function: 'updateControls'},
734
+ LOCUSINFO.EVENTS.CONTROLS_DISALLOW_UNMUTE_CHANGED,
735
+ {state: current.disallowUnmute}
736
+ );
737
+ }
738
+
739
+ if (hasReactionsChanged || hasReactionDisplayNamesChanged) {
740
+ this.emitScoped(
741
+ {file: 'locus-info', function: 'updateControls'},
742
+ LOCUSINFO.EVENTS.CONTROLS_REACTIONS_CHANGED,
743
+ {state: current.reactions}
744
+ );
745
+ }
746
+
747
+ if (hasViewTheParticipantListChanged) {
748
+ this.emitScoped(
749
+ {file: 'locus-info', function: 'updateControls'},
750
+ LOCUSINFO.EVENTS.CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED,
751
+ {state: current.viewTheParticipantList}
752
+ );
753
+ }
754
+
755
+ if (hasRaiseHandChanged) {
756
+ this.emitScoped(
757
+ {file: 'locus-info', function: 'updateControls'},
758
+ LOCUSINFO.EVENTS.CONTROLS_RAISE_HAND_CHANGED,
759
+ {state: current.raiseHand}
760
+ );
761
+ }
762
+
763
+ if (hasVideoChanged) {
764
+ this.emitScoped(
765
+ {file: 'locus-info', function: 'updateControls'},
766
+ LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED,
767
+ {state: current.video}
768
+ );
769
+ }
770
+
684
771
  if (hasRecordingChanged || hasRecordingPausedChanged) {
685
772
  let state = null;
686
773
 
687
774
  if (hasRecordingPausedChanged) {
688
775
  if (current.record.paused) {
689
776
  state = RECORDING_STATE.PAUSED;
690
- }
691
- else {
777
+ } else {
692
778
  // state will be `IDLE` if the recording is not active, even when there is a `pause` status change.
693
779
  state = current.record.recording ? RECORDING_STATE.RESUMED : RECORDING_STATE.IDLE;
694
780
  }
695
- }
696
- else if (hasRecordingChanged) {
781
+ } else if (hasRecordingChanged) {
697
782
  state = current.record.recording ? RECORDING_STATE.RECORDING : RECORDING_STATE.IDLE;
698
783
  }
699
784
 
@@ -742,9 +827,29 @@ export default class LocusInfo extends EventsScope {
742
827
  );
743
828
  }
744
829
 
830
+ if (hasBreakoutChanged) {
831
+ const {breakout} = current;
832
+ breakout.breakoutMoveId = SelfUtils.getReplacedBreakoutMoveId(
833
+ self,
834
+ this.webex.internal.device.url
835
+ );
836
+ this.emitScoped(
837
+ {
838
+ file: 'locus-info',
839
+ function: 'updateControls',
840
+ },
841
+ LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED,
842
+ {
843
+ breakout,
844
+ }
845
+ );
846
+ }
847
+
745
848
  if (hasEntryExitToneChanged) {
746
849
  const {entryExitTone} = current;
747
850
 
851
+ this.updateMeeting({entryExitTone});
852
+
748
853
  this.emitScoped(
749
854
  {
750
855
  file: 'locus-info',
@@ -752,11 +857,29 @@ export default class LocusInfo extends EventsScope {
752
857
  },
753
858
  LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED,
754
859
  {
755
- entryExitTone
860
+ entryExitTone,
756
861
  }
757
862
  );
863
+ }
758
864
 
759
- this.updateMeeting({entryExitTone});
865
+ // videoEnabled is handled differently than other controls,
866
+ // to fit with audio mute status logic
867
+ if (hasVideoEnabledChanged) {
868
+ const {videoEnabled} = current;
869
+
870
+ this.updateMeeting({unmuteVideoAllowed: videoEnabled});
871
+
872
+ this.emitScoped(
873
+ {
874
+ file: 'locus-info',
875
+ function: 'updateControls',
876
+ },
877
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
878
+ {
879
+ // muted: not part of locus.controls
880
+ unmuteAllowed: videoEnabled,
881
+ }
882
+ );
760
883
  }
761
884
 
762
885
  this.controls = controls;
@@ -773,8 +896,7 @@ export default class LocusInfo extends EventsScope {
773
896
  if (conversationUrl && !isEqual(this.conversationUrl, conversationUrl)) {
774
897
  this.conversationUrl = conversationUrl;
775
898
  this.updateMeeting({conversationUrl});
776
- }
777
- else if (
899
+ } else if (
778
900
  info &&
779
901
  info.conversationUrl &&
780
902
  !isEqual(this.conversationUrl, info.conversationUrl)
@@ -795,6 +917,27 @@ export default class LocusInfo extends EventsScope {
795
917
  }
796
918
  }
797
919
 
920
+ /**
921
+ * @param {Object} services
922
+ * @returns {undefined}
923
+ * @memberof LocusInfo
924
+ */
925
+ updateServices(services: Record<'breakout' | 'record', {url: string}>) {
926
+ if (services && !isEqual(this.services, services)) {
927
+ this.services = services;
928
+ this.emitScoped(
929
+ {
930
+ file: 'locus-info',
931
+ function: 'updateServices',
932
+ },
933
+ LOCUSINFO.EVENTS.LINKS_SERVICES,
934
+ {
935
+ services,
936
+ }
937
+ );
938
+ }
939
+ }
940
+
798
941
  /**
799
942
  * @param {Object} fullState
800
943
  * @returns {undefined}
@@ -865,8 +1008,7 @@ export default class LocusInfo extends EventsScope {
865
1008
  );
866
1009
  }
867
1010
  this.host = host;
868
- }
869
- else {
1011
+ } else {
870
1012
  this.compareAndUpdateFlags.compareSelfAndHost = false;
871
1013
  }
872
1014
  }
@@ -878,8 +1020,11 @@ export default class LocusInfo extends EventsScope {
878
1020
  * @memberof LocusInfo
879
1021
  */
880
1022
  updateMeetingInfo(info: object, self?: object) {
881
- if (info && !isEqual(this.info, info)) {
882
- const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
1023
+ const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
1024
+ if (
1025
+ (info && !isEqual(this.info, info)) ||
1026
+ (roles.length && !isEqual(this.roles, roles) && info)
1027
+ ) {
883
1028
  const isJoined = SelfUtils.isJoined(self || this.parsedLocus.self);
884
1029
  const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles, isJoined);
885
1030
 
@@ -918,6 +1063,7 @@ export default class LocusInfo extends EventsScope {
918
1063
  // Parses the info and adds necessary values
919
1064
  this.updateMeeting(parsedInfo.current);
920
1065
  }
1066
+ this.roles = roles;
921
1067
  }
922
1068
 
923
1069
  /**
@@ -958,6 +1104,8 @@ export default class LocusInfo extends EventsScope {
958
1104
  const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);
959
1105
 
960
1106
  this.updateMeeting(parsedMediaShares.current);
1107
+ this.parsedLocus.mediaShares = parsedMediaShares.current;
1108
+ this.mediaShares = mediaShares;
961
1109
  this.emitScoped(
962
1110
  {
963
1111
  file: 'locus-info',
@@ -969,8 +1117,6 @@ export default class LocusInfo extends EventsScope {
969
1117
  previous: parsedMediaShares.previous,
970
1118
  }
971
1119
  );
972
- this.parsedLocus.mediaShares = parsedMediaShares.current;
973
- this.mediaShares = mediaShares;
974
1120
  }
975
1121
  }
976
1122
 
@@ -1033,8 +1179,7 @@ export default class LocusInfo extends EventsScope {
1033
1179
 
1034
1180
  if (parsedSelves.updates.moderatorChanged) {
1035
1181
  this.compareAndUpdateFlags.compareHostAndSelf = true;
1036
- }
1037
- else {
1182
+ } else {
1038
1183
  this.compareAndUpdateFlags.compareHostAndSelf = false;
1039
1184
  }
1040
1185
 
@@ -1049,6 +1194,17 @@ export default class LocusInfo extends EventsScope {
1049
1194
  );
1050
1195
  }
1051
1196
 
1197
+ if (parsedSelves.updates.breakoutsChanged) {
1198
+ this.emitScoped(
1199
+ {
1200
+ file: 'locus-info',
1201
+ function: 'updateSelf',
1202
+ },
1203
+ LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED,
1204
+ {breakoutSessions: parsedSelves.current.breakoutSessions}
1205
+ );
1206
+ }
1207
+
1052
1208
  if (parsedSelves.updates.isMediaInactiveOrReleased) {
1053
1209
  this.emitScoped(
1054
1210
  {
@@ -1070,6 +1226,31 @@ export default class LocusInfo extends EventsScope {
1070
1226
  self
1071
1227
  );
1072
1228
  }
1229
+ // When the user upgrades to moderator or cohost
1230
+ if (parsedSelves.updates.isUpgradeToModeratorOrCohost) {
1231
+ this.emitScoped(
1232
+ {
1233
+ file: 'locus-info',
1234
+ function: 'updateSelf',
1235
+ },
1236
+ LOCUSINFO.EVENTS.SELF_MODERATOR_OR_COHOST_UPGRADE,
1237
+ self
1238
+ );
1239
+ }
1240
+ //
1241
+ if (parsedSelves.updates.isVideoMutedByOthersChanged) {
1242
+ this.emitScoped(
1243
+ {
1244
+ file: 'locus-info',
1245
+ function: 'updateSelf',
1246
+ },
1247
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
1248
+ {
1249
+ muted: parsedSelves.current.remoteVideoMuted,
1250
+ // unmuteAllowed: not part of .self
1251
+ }
1252
+ );
1253
+ }
1073
1254
  if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {
1074
1255
  this.emitScoped(
1075
1256
  {
@@ -1204,8 +1385,7 @@ export default class LocusInfo extends EventsScope {
1204
1385
  this.parsedLocus.self = parsedSelves.current;
1205
1386
  // @ts-ignore
1206
1387
  this.self = self;
1207
- }
1208
- else {
1388
+ } else {
1209
1389
  this.compareAndUpdateFlags.compareHostAndSelf = false;
1210
1390
  }
1211
1391
  }
@@ -1285,4 +1465,104 @@ export default class LocusInfo extends EventsScope {
1285
1465
  this.identities = identities;
1286
1466
  }
1287
1467
  }
1468
+
1469
+ /**
1470
+ * check the locus is main session's one or not, if is main session's, update main session cache
1471
+ * @param {Object} locus
1472
+ * @returns {undefined}
1473
+ * @memberof LocusInfo
1474
+ */
1475
+ updateLocusCache(locus: any) {
1476
+ const isMainSessionDTO = ControlsUtils.isMainSessionDTO(locus);
1477
+ if (isMainSessionDTO) {
1478
+ this.updateMainSessionLocusCache(locus);
1479
+ }
1480
+ }
1481
+
1482
+ /**
1483
+ * if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)
1484
+ * if join breakout from main session, need to query main locus url (if response with 403 means no privilege, need to clear the cache)
1485
+ * @param {Object} newLocus
1486
+ * @returns {Object}
1487
+ * @memberof LocusInfo
1488
+ */
1489
+ getTheLocusToUpdate(newLocus: any) {
1490
+ const switchStatus = ControlsUtils.getSessionSwitchStatus(this.controls, newLocus.controls);
1491
+ if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {
1492
+ return cloneDeep(this.mainSessionLocusCache);
1493
+ }
1494
+ if (switchStatus.isJoinToBreakout) {
1495
+ this.emitScoped(
1496
+ {
1497
+ file: 'locus-info',
1498
+ function: 'updateControls',
1499
+ },
1500
+ LOCUSINFO.EVENTS.CONTROLS_JOIN_BREAKOUT_FROM_MAIN,
1501
+ {
1502
+ mainLocusUrl: this.url,
1503
+ }
1504
+ );
1505
+ }
1506
+
1507
+ return newLocus;
1508
+ }
1509
+
1510
+ /**
1511
+ * merge participants by participant id
1512
+ * @param {Array} participants
1513
+ * @param {Array} sourceParticipants
1514
+ * @returns {Array} merged participants
1515
+ * @memberof LocusInfo
1516
+ */
1517
+ // eslint-disable-next-line class-methods-use-this
1518
+ mergeParticipants(participants, sourceParticipants) {
1519
+ if (!sourceParticipants || !sourceParticipants.length) return participants;
1520
+ if (!participants || !participants.length) {
1521
+ return sourceParticipants;
1522
+ }
1523
+ sourceParticipants.forEach((participant) => {
1524
+ const existIndex = participants.findIndex((p) => p.id === participant.id);
1525
+ if (existIndex > -1) {
1526
+ participants.splice(existIndex, 1, participant);
1527
+ } else {
1528
+ participants.push(participant);
1529
+ }
1530
+ });
1531
+
1532
+ return participants;
1533
+ }
1534
+
1535
+ /**
1536
+ * need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout
1537
+ * @param {Object} mainLocus
1538
+ * @returns {undefined}
1539
+ * @memberof LocusInfo
1540
+ */
1541
+ updateMainSessionLocusCache(mainLocus: any) {
1542
+ if (!mainLocus) {
1543
+ return;
1544
+ }
1545
+ const locusClone = cloneDeep(mainLocus);
1546
+ if (this.mainSessionLocusCache) {
1547
+ // shallow merge and do special merge for participants
1548
+ assignWith(this.mainSessionLocusCache, locusClone, (objValue, srcValue, key) => {
1549
+ if (key === 'participants') {
1550
+ return this.mergeParticipants(objValue, srcValue);
1551
+ }
1552
+
1553
+ return srcValue || objValue;
1554
+ });
1555
+ } else {
1556
+ this.mainSessionLocusCache = locusClone;
1557
+ }
1558
+ }
1559
+
1560
+ /**
1561
+ * clear main session cache
1562
+ * @returns {undefined}
1563
+ * @memberof LocusInfo
1564
+ */
1565
+ clearMainSessionLocusCache() {
1566
+ this.mainSessionLocusCache = null;
1567
+ }
1288
1568
  }