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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (535) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.d.ts +42 -0
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.d.ts +31 -0
  6. package/dist/annotation/constants.js +41 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.d.ts +117 -0
  9. package/dist/annotation/index.js +357 -0
  10. package/dist/annotation/index.js.map +1 -0
  11. package/dist/breakouts/breakout.d.ts +8 -0
  12. package/dist/breakouts/breakout.js +215 -0
  13. package/dist/breakouts/breakout.js.map +1 -0
  14. package/dist/breakouts/collection.d.ts +5 -0
  15. package/dist/breakouts/collection.js +22 -0
  16. package/dist/breakouts/collection.js.map +1 -0
  17. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  18. package/dist/breakouts/edit-lock-error.js +51 -0
  19. package/dist/breakouts/edit-lock-error.js.map +1 -0
  20. package/dist/breakouts/events.d.ts +8 -0
  21. package/dist/breakouts/events.js +44 -0
  22. package/dist/breakouts/events.js.map +1 -0
  23. package/dist/breakouts/index.d.ts +5 -0
  24. package/dist/breakouts/index.js +1047 -0
  25. package/dist/breakouts/index.js.map +1 -0
  26. package/dist/breakouts/request.d.ts +22 -0
  27. package/dist/breakouts/request.js +77 -0
  28. package/dist/breakouts/request.js.map +1 -0
  29. package/dist/breakouts/utils.d.ts +15 -0
  30. package/dist/breakouts/utils.js +64 -0
  31. package/dist/breakouts/utils.js.map +1 -0
  32. package/dist/common/browser-detection.js +2 -3
  33. package/dist/common/browser-detection.js.map +1 -1
  34. package/dist/common/collection.js +3 -4
  35. package/dist/common/collection.js.map +1 -1
  36. package/dist/common/config.js +1 -2
  37. package/dist/common/config.js.map +1 -1
  38. package/dist/common/errors/captcha-error.js +1 -2
  39. package/dist/common/errors/captcha-error.js.map +1 -1
  40. package/dist/common/errors/intent-to-join.js +1 -2
  41. package/dist/common/errors/intent-to-join.js.map +1 -1
  42. package/dist/common/errors/join-meeting.js +1 -2
  43. package/dist/common/errors/join-meeting.js.map +1 -1
  44. package/dist/common/errors/media.js +1 -2
  45. package/dist/common/errors/media.js.map +1 -1
  46. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  47. package/dist/common/errors/no-meeting-info.js +50 -0
  48. package/dist/common/errors/no-meeting-info.js.map +1 -0
  49. package/dist/common/errors/parameter.js +3 -4
  50. package/dist/common/errors/parameter.js.map +1 -1
  51. package/dist/common/errors/password-error.js +1 -2
  52. package/dist/common/errors/password-error.js.map +1 -1
  53. package/dist/common/errors/permission.js +1 -2
  54. package/dist/common/errors/permission.js.map +1 -1
  55. package/dist/common/errors/{reclaim-host-role-error.js → reclaim-host-role-errors.js} +7 -11
  56. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  57. package/dist/common/errors/reconnection-in-progress.js +1 -2
  58. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  59. package/dist/common/errors/reconnection.js +1 -2
  60. package/dist/common/errors/reconnection.js.map +1 -1
  61. package/dist/common/errors/stats.js +1 -2
  62. package/dist/common/errors/stats.js.map +1 -1
  63. package/dist/common/errors/webex-errors.d.ts +20 -8
  64. package/dist/common/errors/webex-errors.js +48 -28
  65. package/dist/common/errors/webex-errors.js.map +1 -1
  66. package/dist/common/errors/webex-meetings-error.js +1 -2
  67. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  68. package/dist/common/events/events-scope.js +1 -2
  69. package/dist/common/events/events-scope.js.map +1 -1
  70. package/dist/common/events/events.js +1 -2
  71. package/dist/common/events/events.js.map +1 -1
  72. package/dist/common/events/trigger-proxy.js +1 -2
  73. package/dist/common/events/trigger-proxy.js.map +1 -1
  74. package/dist/common/events/util.js +1 -2
  75. package/dist/common/events/util.js.map +1 -1
  76. package/dist/common/logs/logger-config.js +1 -2
  77. package/dist/common/logs/logger-config.js.map +1 -1
  78. package/dist/common/logs/logger-proxy.js +2 -3
  79. package/dist/common/logs/logger-proxy.js.map +1 -1
  80. package/dist/common/logs/request.d.ts +3 -1
  81. package/dist/common/logs/request.js +8 -5
  82. package/dist/common/logs/request.js.map +1 -1
  83. package/dist/common/queue.d.ts +9 -7
  84. package/dist/common/queue.js +22 -9
  85. package/dist/common/queue.js.map +1 -1
  86. package/dist/config.d.ts +6 -7
  87. package/dist/config.js +8 -10
  88. package/dist/config.js.map +1 -1
  89. package/dist/constants.d.ts +217 -97
  90. package/dist/constants.js +416 -441
  91. package/dist/constants.js.map +1 -1
  92. package/dist/controls-options-manager/constants.js +3 -6
  93. package/dist/controls-options-manager/constants.js.map +1 -1
  94. package/dist/controls-options-manager/enums.d.ts +11 -1
  95. package/dist/controls-options-manager/enums.js +15 -6
  96. package/dist/controls-options-manager/enums.js.map +1 -1
  97. package/dist/controls-options-manager/index.d.ts +17 -1
  98. package/dist/controls-options-manager/index.js +127 -38
  99. package/dist/controls-options-manager/index.js.map +1 -1
  100. package/dist/controls-options-manager/types.d.ts +43 -0
  101. package/dist/controls-options-manager/types.js +7 -0
  102. package/dist/controls-options-manager/types.js.map +1 -0
  103. package/dist/controls-options-manager/util.d.ts +1 -7
  104. package/dist/controls-options-manager/util.js +309 -19
  105. package/dist/controls-options-manager/util.js.map +1 -1
  106. package/dist/index.d.ts +6 -3
  107. package/dist/index.js +121 -5
  108. package/dist/index.js.map +1 -1
  109. package/dist/interceptors/index.d.ts +2 -0
  110. package/dist/interceptors/index.js +15 -0
  111. package/dist/interceptors/index.js.map +1 -0
  112. package/dist/interceptors/locusRetry.d.ts +27 -0
  113. package/dist/interceptors/locusRetry.js +94 -0
  114. package/dist/interceptors/locusRetry.js.map +1 -0
  115. package/dist/interpretation/collection.d.ts +5 -0
  116. package/dist/interpretation/collection.js +22 -0
  117. package/dist/interpretation/collection.js.map +1 -0
  118. package/dist/interpretation/index.d.ts +5 -0
  119. package/dist/interpretation/index.js +365 -0
  120. package/dist/interpretation/index.js.map +1 -0
  121. package/dist/interpretation/siLanguage.d.ts +5 -0
  122. package/dist/interpretation/siLanguage.js +24 -0
  123. package/dist/interpretation/siLanguage.js.map +1 -0
  124. package/dist/locus-info/controlsUtils.js +100 -11
  125. package/dist/locus-info/controlsUtils.js.map +1 -1
  126. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  127. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  128. package/dist/locus-info/fullState.js +1 -2
  129. package/dist/locus-info/fullState.js.map +1 -1
  130. package/dist/locus-info/hostUtils.js +1 -2
  131. package/dist/locus-info/hostUtils.js.map +1 -1
  132. package/dist/locus-info/index.d.ts +57 -4
  133. package/dist/locus-info/index.js +425 -84
  134. package/dist/locus-info/index.js.map +1 -1
  135. package/dist/locus-info/infoUtils.js +13 -5
  136. package/dist/locus-info/infoUtils.js.map +1 -1
  137. package/dist/locus-info/mediaSharesUtils.js +58 -3
  138. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  139. package/dist/locus-info/parser.d.ts +66 -6
  140. package/dist/locus-info/parser.js +253 -80
  141. package/dist/locus-info/parser.js.map +1 -1
  142. package/dist/locus-info/selfUtils.js +97 -13
  143. package/dist/locus-info/selfUtils.js.map +1 -1
  144. package/dist/media/index.d.ts +2 -0
  145. package/dist/media/index.js +107 -319
  146. package/dist/media/index.js.map +1 -1
  147. package/dist/media/properties.d.ts +38 -53
  148. package/dist/media/properties.js +96 -153
  149. package/dist/media/properties.js.map +1 -1
  150. package/dist/media/util.js +1 -22
  151. package/dist/media/util.js.map +1 -1
  152. package/dist/mediaQualityMetrics/config.d.ts +234 -230
  153. package/dist/mediaQualityMetrics/config.js +302 -498
  154. package/dist/mediaQualityMetrics/config.js.map +1 -1
  155. package/dist/meeting/in-meeting-actions.d.ts +88 -0
  156. package/dist/meeting/in-meeting-actions.js +94 -3
  157. package/dist/meeting/in-meeting-actions.js.map +1 -1
  158. package/dist/meeting/index.d.ts +591 -494
  159. package/dist/meeting/index.js +4732 -2990
  160. package/dist/meeting/index.js.map +1 -1
  161. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  162. package/dist/meeting/locusMediaRequest.js +291 -0
  163. package/dist/meeting/locusMediaRequest.js.map +1 -0
  164. package/dist/meeting/muteState.d.ts +93 -25
  165. package/dist/meeting/muteState.js +224 -133
  166. package/dist/meeting/muteState.js.map +1 -1
  167. package/dist/meeting/request.d.ts +82 -47
  168. package/dist/meeting/request.js +297 -199
  169. package/dist/meeting/request.js.map +1 -1
  170. package/dist/meeting/request.type.d.ts +11 -0
  171. package/dist/meeting/request.type.js +7 -0
  172. package/dist/meeting/request.type.js.map +1 -0
  173. package/dist/meeting/state.js +1 -2
  174. package/dist/meeting/state.js.map +1 -1
  175. package/dist/meeting/util.d.ts +102 -1
  176. package/dist/meeting/util.js +605 -435
  177. package/dist/meeting/util.js.map +1 -1
  178. package/dist/meeting-info/collection.js +3 -4
  179. package/dist/meeting-info/collection.js.map +1 -1
  180. package/dist/meeting-info/index.d.ts +13 -1
  181. package/dist/meeting-info/index.js +74 -7
  182. package/dist/meeting-info/index.js.map +1 -1
  183. package/dist/meeting-info/meeting-info-v2.d.ts +31 -1
  184. package/dist/meeting-info/meeting-info-v2.js +200 -63
  185. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  186. package/dist/meeting-info/request.js +1 -2
  187. package/dist/meeting-info/request.js.map +1 -1
  188. package/dist/meeting-info/util.js +2 -3
  189. package/dist/meeting-info/util.js.map +1 -1
  190. package/dist/meeting-info/utilv2.js +39 -41
  191. package/dist/meeting-info/utilv2.js.map +1 -1
  192. package/dist/meetings/collection.d.ts +17 -0
  193. package/dist/meetings/collection.js +42 -4
  194. package/dist/meetings/collection.js.map +1 -1
  195. package/dist/meetings/index.d.ts +93 -21
  196. package/dist/meetings/index.js +490 -127
  197. package/dist/meetings/index.js.map +1 -1
  198. package/dist/meetings/meetings.types.d.ts +4 -0
  199. package/dist/meetings/meetings.types.js +7 -0
  200. package/dist/meetings/meetings.types.js.map +1 -0
  201. package/dist/meetings/request.js +4 -3
  202. package/dist/meetings/request.js.map +1 -1
  203. package/dist/meetings/util.js +107 -6
  204. package/dist/meetings/util.js.map +1 -1
  205. package/dist/member/index.d.ts +13 -1
  206. package/dist/member/index.js +45 -2
  207. package/dist/member/index.js.map +1 -1
  208. package/dist/member/member.types.js +3 -4
  209. package/dist/member/member.types.js.map +1 -1
  210. package/dist/member/types.d.ts +32 -0
  211. package/dist/member/types.js +23 -0
  212. package/dist/member/types.js.map +1 -0
  213. package/dist/member/util.js +120 -29
  214. package/dist/member/util.js.map +1 -1
  215. package/dist/members/collection.d.ts +5 -0
  216. package/dist/members/collection.js +11 -2
  217. package/dist/members/collection.js.map +1 -1
  218. package/dist/members/index.d.ts +56 -11
  219. package/dist/members/index.js +174 -47
  220. package/dist/members/index.js.map +1 -1
  221. package/dist/members/request.d.ts +67 -11
  222. package/dist/members/request.js +102 -54
  223. package/dist/members/request.js.map +1 -1
  224. package/dist/members/types.js +3 -4
  225. package/dist/members/types.js.map +1 -1
  226. package/dist/members/util.d.ts +214 -1
  227. package/dist/members/util.js +327 -284
  228. package/dist/members/util.js.map +1 -1
  229. package/dist/metrics/constants.d.ts +15 -6
  230. package/dist/metrics/constants.js +17 -9
  231. package/dist/metrics/constants.js.map +1 -1
  232. package/dist/metrics/index.d.ts +4 -111
  233. package/dist/metrics/index.js +4 -452
  234. package/dist/metrics/index.js.map +1 -1
  235. package/dist/multistream/mediaRequestManager.d.ts +118 -0
  236. package/dist/multistream/mediaRequestManager.js +344 -0
  237. package/dist/multistream/mediaRequestManager.js.map +1 -0
  238. package/dist/multistream/receiveSlot.d.ts +68 -0
  239. package/dist/multistream/receiveSlot.js +200 -0
  240. package/dist/multistream/receiveSlot.js.map +1 -0
  241. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  242. package/dist/multistream/receiveSlotManager.js +174 -0
  243. package/dist/multistream/receiveSlotManager.js.map +1 -0
  244. package/dist/multistream/remoteMedia.d.ts +72 -0
  245. package/dist/multistream/remoteMedia.js +268 -0
  246. package/dist/multistream/remoteMedia.js.map +1 -0
  247. package/dist/multistream/remoteMediaGroup.d.ts +47 -0
  248. package/dist/multistream/remoteMediaGroup.js +267 -0
  249. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  250. package/dist/multistream/remoteMediaManager.d.ts +285 -0
  251. package/dist/multistream/remoteMediaManager.js +1211 -0
  252. package/dist/multistream/remoteMediaManager.js.map +1 -0
  253. package/dist/multistream/sendSlotManager.d.ts +61 -0
  254. package/dist/multistream/sendSlotManager.js +236 -0
  255. package/dist/multistream/sendSlotManager.js.map +1 -0
  256. package/dist/networkQualityMonitor/index.js +5 -4
  257. package/dist/networkQualityMonitor/index.js.map +1 -1
  258. package/dist/personal-meeting-room/index.js +2 -3
  259. package/dist/personal-meeting-room/index.js.map +1 -1
  260. package/dist/personal-meeting-room/request.js +2 -3
  261. package/dist/personal-meeting-room/request.js.map +1 -1
  262. package/dist/personal-meeting-room/util.js +1 -2
  263. package/dist/personal-meeting-room/util.js.map +1 -1
  264. package/dist/reachability/clusterReachability.d.ts +109 -0
  265. package/dist/reachability/clusterReachability.js +357 -0
  266. package/dist/reachability/clusterReachability.js.map +1 -0
  267. package/dist/reachability/index.d.ts +61 -95
  268. package/dist/reachability/index.js +300 -393
  269. package/dist/reachability/index.js.map +1 -1
  270. package/dist/reachability/request.d.ts +7 -3
  271. package/dist/reachability/request.js +18 -10
  272. package/dist/reachability/request.js.map +1 -1
  273. package/dist/reachability/util.d.ts +8 -0
  274. package/dist/reachability/util.js +29 -0
  275. package/dist/reachability/util.js.map +1 -0
  276. package/dist/reactions/constants.d.ts +3 -0
  277. package/dist/reactions/constants.js +12 -0
  278. package/dist/reactions/constants.js.map +1 -0
  279. package/dist/reactions/reactions.d.ts +2 -2
  280. package/dist/reactions/reactions.js +4 -6
  281. package/dist/reactions/reactions.js.map +1 -1
  282. package/dist/reactions/reactions.type.d.ts +23 -3
  283. package/dist/reactions/reactions.type.js +21 -23
  284. package/dist/reactions/reactions.type.js.map +1 -1
  285. package/dist/reconnection-manager/index.d.ts +32 -8
  286. package/dist/reconnection-manager/index.js +282 -231
  287. package/dist/reconnection-manager/index.js.map +1 -1
  288. package/dist/recording-controller/enums.js +4 -5
  289. package/dist/recording-controller/enums.js.map +1 -1
  290. package/dist/recording-controller/index.d.ts +15 -1
  291. package/dist/recording-controller/index.js +57 -46
  292. package/dist/recording-controller/index.js.map +1 -1
  293. package/dist/recording-controller/util.d.ts +5 -4
  294. package/dist/recording-controller/util.js +10 -10
  295. package/dist/recording-controller/util.js.map +1 -1
  296. package/dist/roap/index.d.ts +9 -47
  297. package/dist/roap/index.js +101 -235
  298. package/dist/roap/index.js.map +1 -1
  299. package/dist/roap/request.d.ts +18 -12
  300. package/dist/roap/request.js +126 -180
  301. package/dist/roap/request.js.map +1 -1
  302. package/dist/roap/turnDiscovery.d.ts +27 -16
  303. package/dist/roap/turnDiscovery.js +115 -105
  304. package/dist/roap/turnDiscovery.js.map +1 -1
  305. package/dist/rtcMetrics/constants.d.ts +4 -0
  306. package/dist/rtcMetrics/constants.js +11 -0
  307. package/dist/rtcMetrics/constants.js.map +1 -0
  308. package/dist/rtcMetrics/index.d.ts +54 -0
  309. package/dist/rtcMetrics/index.js +140 -0
  310. package/dist/rtcMetrics/index.js.map +1 -0
  311. package/dist/statsAnalyzer/global.d.ts +1 -83
  312. package/dist/statsAnalyzer/global.js +2 -85
  313. package/dist/statsAnalyzer/global.js.map +1 -1
  314. package/dist/statsAnalyzer/index.d.ts +50 -30
  315. package/dist/statsAnalyzer/index.js +435 -510
  316. package/dist/statsAnalyzer/index.js.map +1 -1
  317. package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
  318. package/dist/statsAnalyzer/mqaUtil.js +120 -83
  319. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  320. package/dist/transcription/index.js +1 -2
  321. package/dist/transcription/index.js.map +1 -1
  322. package/dist/webinar/collection.d.ts +16 -0
  323. package/dist/webinar/collection.js +43 -0
  324. package/dist/webinar/collection.js.map +1 -0
  325. package/dist/webinar/index.d.ts +5 -0
  326. package/dist/webinar/index.js +68 -0
  327. package/dist/webinar/index.js.map +1 -0
  328. package/package.json +38 -26
  329. package/src/annotation/annotation.types.ts +50 -0
  330. package/src/annotation/constants.ts +36 -0
  331. package/src/annotation/index.ts +328 -0
  332. package/src/breakouts/README.md +220 -0
  333. package/src/breakouts/breakout.ts +188 -0
  334. package/src/breakouts/collection.ts +19 -0
  335. package/src/breakouts/edit-lock-error.ts +25 -0
  336. package/src/breakouts/events.ts +56 -0
  337. package/src/breakouts/index.ts +925 -0
  338. package/src/breakouts/request.ts +55 -0
  339. package/src/breakouts/utils.ts +57 -0
  340. package/src/common/errors/no-meeting-info.ts +24 -0
  341. package/src/common/errors/webex-errors.ts +36 -12
  342. package/src/common/logs/logger-proxy.ts +1 -1
  343. package/src/common/logs/request.ts +5 -1
  344. package/src/common/queue.ts +22 -8
  345. package/src/config.ts +6 -7
  346. package/src/constants.ts +244 -97
  347. package/src/controls-options-manager/enums.ts +12 -0
  348. package/src/controls-options-manager/index.ts +116 -21
  349. package/src/controls-options-manager/types.ts +59 -0
  350. package/src/controls-options-manager/util.ts +294 -14
  351. package/src/index.ts +44 -0
  352. package/src/interceptors/index.ts +3 -0
  353. package/src/interceptors/locusRetry.ts +67 -0
  354. package/src/interpretation/README.md +60 -0
  355. package/src/interpretation/collection.ts +19 -0
  356. package/src/interpretation/index.ts +332 -0
  357. package/src/interpretation/siLanguage.ts +18 -0
  358. package/src/locus-info/controlsUtils.ts +110 -0
  359. package/src/locus-info/index.ts +449 -61
  360. package/src/locus-info/infoUtils.ts +14 -2
  361. package/src/locus-info/mediaSharesUtils.ts +64 -0
  362. package/src/locus-info/parser.ts +258 -47
  363. package/src/locus-info/selfUtils.ts +85 -2
  364. package/src/media/index.ts +153 -370
  365. package/src/media/properties.ts +106 -136
  366. package/src/media/util.ts +0 -21
  367. package/src/mediaQualityMetrics/config.ts +244 -377
  368. package/src/meeting/in-meeting-actions.ts +176 -0
  369. package/src/meeting/index.ts +3944 -2489
  370. package/src/meeting/locusMediaRequest.ts +313 -0
  371. package/src/meeting/muteState.ts +224 -138
  372. package/src/meeting/request.ts +207 -127
  373. package/src/meeting/request.type.ts +13 -0
  374. package/src/meeting/util.ts +590 -423
  375. package/src/meeting-info/index.ts +81 -8
  376. package/src/meeting-info/meeting-info-v2.ts +163 -13
  377. package/src/meeting-info/util.ts +1 -1
  378. package/src/meeting-info/utilv2.ts +28 -28
  379. package/src/meetings/collection.ts +33 -0
  380. package/src/meetings/index.ts +487 -126
  381. package/src/meetings/meetings.types.ts +12 -0
  382. package/src/meetings/request.ts +2 -0
  383. package/src/meetings/util.ts +116 -5
  384. package/src/member/index.ts +43 -1
  385. package/src/member/types.ts +38 -0
  386. package/src/member/util.ts +125 -28
  387. package/src/members/collection.ts +8 -0
  388. package/src/members/index.ts +187 -52
  389. package/src/members/request.ts +87 -27
  390. package/src/members/util.ts +332 -291
  391. package/src/metrics/constants.ts +15 -6
  392. package/src/metrics/index.ts +1 -471
  393. package/src/multistream/mediaRequestManager.ts +440 -0
  394. package/src/multistream/receiveSlot.ts +184 -0
  395. package/src/multistream/receiveSlotManager.ts +166 -0
  396. package/src/multistream/remoteMedia.ts +254 -0
  397. package/src/multistream/remoteMediaGroup.ts +284 -0
  398. package/src/multistream/remoteMediaManager.ts +1145 -0
  399. package/src/multistream/sendSlotManager.ts +170 -0
  400. package/src/networkQualityMonitor/index.ts +6 -6
  401. package/src/reachability/clusterReachability.ts +320 -0
  402. package/src/reachability/index.ts +243 -347
  403. package/src/reachability/request.ts +17 -8
  404. package/src/reachability/util.ts +24 -0
  405. package/src/reactions/constants.ts +4 -0
  406. package/src/reactions/reactions.ts +4 -4
  407. package/src/reactions/reactions.type.ts +30 -4
  408. package/src/reconnection-manager/index.ts +168 -156
  409. package/src/recording-controller/index.ts +20 -3
  410. package/src/recording-controller/util.ts +26 -9
  411. package/src/roap/index.ts +98 -241
  412. package/src/roap/request.ts +74 -148
  413. package/src/roap/turnDiscovery.ts +62 -56
  414. package/src/rtcMetrics/constants.ts +3 -0
  415. package/src/rtcMetrics/index.ts +124 -0
  416. package/src/statsAnalyzer/global.ts +1 -84
  417. package/src/statsAnalyzer/index.ts +477 -643
  418. package/src/statsAnalyzer/mqaUtil.ts +115 -114
  419. package/src/webinar/collection.ts +31 -0
  420. package/src/webinar/index.ts +62 -0
  421. package/test/integration/spec/converged-space-meetings.js +233 -0
  422. package/test/integration/spec/journey.js +320 -264
  423. package/test/integration/spec/space-meeting.js +77 -4
  424. package/test/unit/spec/annotation/index.ts +418 -0
  425. package/test/unit/spec/breakouts/breakout.ts +237 -0
  426. package/test/unit/spec/breakouts/collection.ts +15 -0
  427. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  428. package/test/unit/spec/breakouts/events.ts +89 -0
  429. package/test/unit/spec/breakouts/index.ts +1790 -0
  430. package/test/unit/spec/breakouts/request.ts +104 -0
  431. package/test/unit/spec/breakouts/utils.js +72 -0
  432. package/test/unit/spec/common/queue.js +31 -2
  433. package/test/unit/spec/controls-options-manager/index.js +163 -0
  434. package/test/unit/spec/controls-options-manager/util.js +576 -60
  435. package/test/unit/spec/fixture/locus.js +1 -0
  436. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  437. package/test/unit/spec/interpretation/collection.ts +15 -0
  438. package/test/unit/spec/interpretation/index.ts +589 -0
  439. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  440. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  441. package/test/unit/spec/locus-info/index.js +1390 -16
  442. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  443. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  444. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  445. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  446. package/test/unit/spec/locus-info/parser.js +116 -35
  447. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  448. package/test/unit/spec/media/index.ts +290 -0
  449. package/test/unit/spec/media/properties.ts +75 -84
  450. package/test/unit/spec/meeting/in-meeting-actions.ts +86 -0
  451. package/test/unit/spec/meeting/index.js +8187 -2769
  452. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  453. package/test/unit/spec/meeting/muteState.js +409 -213
  454. package/test/unit/spec/meeting/request.js +512 -42
  455. package/test/unit/spec/meeting/utils.js +741 -24
  456. package/test/unit/spec/meeting-info/index.js +300 -0
  457. package/test/unit/spec/meeting-info/meetinginfov2.js +527 -5
  458. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  459. package/test/unit/spec/meetings/collection.js +26 -0
  460. package/test/unit/spec/meetings/index.js +1313 -243
  461. package/test/unit/spec/meetings/utils.js +202 -2
  462. package/test/unit/spec/member/index.js +32 -9
  463. package/test/unit/spec/member/util.js +499 -61
  464. package/test/unit/spec/members/index.js +394 -5
  465. package/test/unit/spec/members/request.js +206 -27
  466. package/test/unit/spec/members/utils.js +173 -38
  467. package/test/unit/spec/metrics/index.js +1 -50
  468. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  469. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  470. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  471. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  472. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  473. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  474. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  475. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  476. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  477. package/test/unit/spec/reachability/index.ts +531 -24
  478. package/test/unit/spec/reachability/request.js +68 -0
  479. package/test/unit/spec/reachability/util.ts +40 -0
  480. package/test/unit/spec/reconnection-manager/index.js +162 -24
  481. package/test/unit/spec/recording-controller/index.js +293 -218
  482. package/test/unit/spec/recording-controller/util.js +223 -96
  483. package/test/unit/spec/roap/index.ts +200 -76
  484. package/test/unit/spec/roap/request.ts +255 -0
  485. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  486. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  487. package/test/unit/spec/stats-analyzer/index.js +261 -167
  488. package/test/unit/spec/webinar/collection.ts +13 -0
  489. package/test/unit/spec/webinar/index.ts +60 -0
  490. package/test/utils/constants.js +9 -0
  491. package/test/utils/integrationTestUtils.js +46 -0
  492. package/test/utils/testUtils.js +0 -45
  493. package/test/utils/webex-config.js +4 -0
  494. package/test/utils/webex-test-users.js +7 -3
  495. package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
  496. package/dist/meeting/effectsState.d.ts +0 -42
  497. package/dist/meeting/effectsState.js +0 -260
  498. package/dist/meeting/effectsState.js.map +0 -1
  499. package/dist/metrics/config.d.ts +0 -169
  500. package/dist/metrics/config.js +0 -289
  501. package/dist/metrics/config.js.map +0 -1
  502. package/dist/peer-connection-manager/index.d.ts +0 -6
  503. package/dist/peer-connection-manager/index.js +0 -671
  504. package/dist/peer-connection-manager/index.js.map +0 -1
  505. package/dist/peer-connection-manager/util.d.ts +0 -6
  506. package/dist/peer-connection-manager/util.js +0 -110
  507. package/dist/peer-connection-manager/util.js.map +0 -1
  508. package/dist/roap/collection.d.ts +0 -10
  509. package/dist/roap/collection.js +0 -63
  510. package/dist/roap/collection.js.map +0 -1
  511. package/dist/roap/handler.d.ts +0 -47
  512. package/dist/roap/handler.js +0 -279
  513. package/dist/roap/handler.js.map +0 -1
  514. package/dist/roap/state.d.ts +0 -9
  515. package/dist/roap/state.js +0 -127
  516. package/dist/roap/state.js.map +0 -1
  517. package/dist/roap/util.d.ts +0 -2
  518. package/dist/roap/util.js +0 -76
  519. package/dist/roap/util.js.map +0 -1
  520. package/src/index.js +0 -15
  521. package/src/meeting/effectsState.ts +0 -209
  522. package/src/metrics/config.ts +0 -485
  523. package/src/peer-connection-manager/index.ts +0 -847
  524. package/src/peer-connection-manager/util.ts +0 -119
  525. package/src/roap/collection.ts +0 -62
  526. package/src/roap/handler.ts +0 -294
  527. package/src/roap/state.ts +0 -156
  528. package/src/roap/util.ts +0 -100
  529. package/test/unit/spec/meeting/effectsState.js +0 -281
  530. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  531. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  532. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  533. package/test/unit/spec/roap/util.js +0 -30
  534. /package/dist/common/errors/{reclaim-host-role-error.d.ts → reclaim-host-role-errors.d.ts} +0 -0
  535. /package/src/common/errors/{reclaim-host-role-error.ts → reclaim-host-role-errors.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import {isEqual} from 'lodash';
1
+ import {isEqual, assignWith, cloneDeep, isEmpty} from 'lodash';
2
2
 
3
3
  import LoggerProxy from '../common/logs/logger-proxy';
4
4
  import EventsScope from '../common/events/events-scope';
@@ -17,8 +17,6 @@ import {
17
17
  CALL_REMOVED_REASON,
18
18
  RECORDING_STATE,
19
19
  } from '../constants';
20
- import Metrics from '../metrics';
21
- import {eventType} from '../metrics/config';
22
20
  import InfoUtils from './infoUtils';
23
21
  import FullState from './fullState';
24
22
  import SelfUtils from './selfUtils';
@@ -27,6 +25,8 @@ import ControlsUtils from './controlsUtils';
27
25
  import EmbeddedAppsUtils from './embeddedAppsUtils';
28
26
  import MediaSharesUtils from './mediaSharesUtils';
29
27
  import LocusDeltaParser from './parser';
28
+ import Metrics from '../metrics';
29
+ import BEHAVIORAL_METRICS from '../metrics/constants';
30
30
 
31
31
  /**
32
32
  * @description LocusInfo extends ChildEmitter to convert locusInfo info a private emitter to parent object
@@ -59,11 +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;
66
-
67
+ mainSessionLocusCache: any;
68
+ /**
69
+ * Constructor
70
+ * @param {function} updateMeeting callback to update the meeting object from an object
71
+ * @param {object} webex
72
+ * @param {string} meetingId
73
+ * @returns {undefined}
74
+ */
67
75
  constructor(updateMeeting, webex, meetingId) {
68
76
  super();
69
77
  this.parsedLocus = {
@@ -77,6 +85,82 @@ export default class LocusInfo extends EventsScope {
77
85
  this.locusParser = new LocusDeltaParser();
78
86
  }
79
87
 
88
+ /**
89
+ * Does a Locus sync. It tries to get the latest delta DTO or if it can't, it falls back to getting the full Locus DTO.
90
+ *
91
+ * @param {Meeting} meeting
92
+ * @returns {undefined}
93
+ */
94
+ private doLocusSync(meeting: any) {
95
+ let isDelta;
96
+ let url;
97
+
98
+ if (this.locusParser.workingCopy.syncUrl) {
99
+ url = this.locusParser.workingCopy.syncUrl;
100
+ isDelta = true;
101
+ } else {
102
+ url = meeting.locusUrl;
103
+ isDelta = false;
104
+ }
105
+
106
+ LoggerProxy.logger.info(
107
+ `Locus-info:index#doLocusSync --> doing Locus sync (getting ${
108
+ isDelta ? 'delta' : 'full'
109
+ } DTO)`
110
+ );
111
+
112
+ // return value ignored on purpose
113
+ meeting.meetingRequest
114
+ .getLocusDTO({url})
115
+ .catch((e) => {
116
+ if (isDelta) {
117
+ LoggerProxy.logger.info(
118
+ 'Locus-info:index#doLocusSync --> delta sync failed, falling back to full sync'
119
+ );
120
+
121
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.LOCUS_DELTA_SYNC_FAILED, {
122
+ correlationId: meeting.correlationId,
123
+ url,
124
+ reason: e.message,
125
+ errorName: e.name,
126
+ stack: e.stack,
127
+ code: e.code,
128
+ });
129
+
130
+ isDelta = false;
131
+
132
+ return meeting.meetingRequest.getLocusDTO({url: meeting.locusUrl}).catch((err) => {
133
+ LoggerProxy.logger.info(
134
+ 'Locus-info:index#doLocusSync --> fallback full sync failed, destroying the meeting'
135
+ );
136
+ this.webex.meetings.destroy(meeting, MEETING_REMOVED_REASON.LOCUS_DTO_SYNC_FAILED);
137
+ throw err;
138
+ });
139
+ }
140
+ LoggerProxy.logger.info(
141
+ 'Locus-info:index#doLocusSync --> fallback full sync failed, destroying the meeting'
142
+ );
143
+ this.webex.meetings.destroy(meeting, MEETING_REMOVED_REASON.LOCUS_DTO_SYNC_FAILED);
144
+ throw e;
145
+ })
146
+ .then((res) => {
147
+ if (isDelta) {
148
+ if (!isEmpty(res.body)) {
149
+ meeting.locusInfo.handleLocusDelta(res.body, meeting);
150
+ } else {
151
+ LoggerProxy.logger.info(
152
+ 'Locus-info:index#doLocusSync --> received empty body from syncUrl, so we already have latest Locus DTO'
153
+ );
154
+ }
155
+ } else {
156
+ meeting.locusInfo.onFullLocus(res.body);
157
+ }
158
+ // Notify parser to resume processing delta events.
159
+ // Any deltas in the queue that have now been superseded by this sync will simply be ignored
160
+ this.locusParser.resume();
161
+ });
162
+ }
163
+
80
164
  /**
81
165
  * Apply locus delta data to meeting
82
166
  * @param {string} action Locus delta action
@@ -85,28 +169,19 @@ export default class LocusInfo extends EventsScope {
85
169
  * @returns {undefined}
86
170
  */
87
171
  applyLocusDeltaData(action: string, locus: any, meeting: any) {
88
- const {DESYNC, USE_CURRENT, USE_INCOMING} = LocusDeltaParser.loci;
172
+ const {DESYNC, USE_CURRENT, USE_INCOMING, WAIT, LOCUS_URL_CHANGED} = LocusDeltaParser.loci;
89
173
 
90
174
  switch (action) {
91
175
  case USE_INCOMING:
92
176
  meeting.locusInfo.onDeltaLocus(locus);
93
177
  break;
94
178
  case USE_CURRENT:
95
- meeting.locusDesync = false;
96
- meeting.needToGetFullLocus = false;
179
+ case WAIT:
180
+ // do nothing
97
181
  break;
98
182
  case DESYNC:
99
- meeting.meetingRequest
100
- .getFullLocus({
101
- desync: true,
102
- locusUrl: meeting.locusUrl,
103
- })
104
- .then((res) => {
105
- meeting.locusInfo.onFullLocus(res.body);
106
- // Notify parser to resume processing delta events
107
- // now that we have full locus from DESYNC.
108
- this.locusParser.resume();
109
- });
183
+ case LOCUS_URL_CHANGED:
184
+ this.doLocusSync(meeting);
110
185
  break;
111
186
  default:
112
187
  LoggerProxy.logger.info(
@@ -172,12 +247,13 @@ export default class LocusInfo extends EventsScope {
172
247
  */
173
248
  this.deltaParticipants = [];
174
249
 
250
+ this.updateLocusCache(locus);
175
251
  // above section only updates the locusInfo object
176
252
  // The below section makes sure it updates the locusInfo as well as updates the meeting object
177
253
  this.updateParticipants(locus.participants);
178
254
  // For 1:1 space meeting the conversation Url does not exist in locus.conversation
179
255
  this.updateConversationUrl(locus.conversationUrl, locus.info);
180
- this.updateControls(locus.controls);
256
+ this.updateControls(locus.controls, locus.self);
181
257
  this.updateLocusUrl(locus.url);
182
258
  this.updateFullState(locus.fullState);
183
259
  this.updateMeetingInfo(locus.info);
@@ -195,6 +271,7 @@ export default class LocusInfo extends EventsScope {
195
271
  * @memberof LocusInfo
196
272
  */
197
273
  initialSetup(locus: object) {
274
+ this.updateLocusCache(locus);
198
275
  this.onFullLocus(locus);
199
276
 
200
277
  // Change it to true after it receives it first locus object
@@ -210,7 +287,7 @@ export default class LocusInfo extends EventsScope {
210
287
  parse(meeting: any, data: any) {
211
288
  // eslint-disable-next-line @typescript-eslint/no-shadow
212
289
  const {eventType} = data;
213
-
290
+ const locus = this.getTheLocusToUpdate(data.locus);
214
291
  LoggerProxy.logger.info(`Locus-info:index#parse --> received locus data: ${eventType}`);
215
292
 
216
293
  switch (eventType) {
@@ -228,16 +305,16 @@ export default class LocusInfo extends EventsScope {
228
305
  case LOCUSEVENT.PARTICIPANT_DECLINED:
229
306
  case LOCUSEVENT.FLOOR_GRANTED:
230
307
  case LOCUSEVENT.FLOOR_RELEASED:
231
- this.onFullLocus(data.locus, eventType);
308
+ this.onFullLocus(locus, eventType);
232
309
  break;
233
310
  case LOCUSEVENT.DIFFERENCE:
234
- this.handleLocusDelta(data.locus, meeting);
311
+ this.handleLocusDelta(locus, meeting);
235
312
  break;
236
313
 
237
314
  default:
238
315
  // Why will there be a event with no eventType ????
239
316
  // we may not need this, we can get full locus
240
- this.handleLocusDelta(data.locus, meeting);
317
+ this.handleLocusDelta(locus, meeting);
241
318
  }
242
319
  }
243
320
 
@@ -259,18 +336,27 @@ export default class LocusInfo extends EventsScope {
259
336
  * @returns {object} null
260
337
  * @memberof LocusInfo
261
338
  */
262
- // eslint-disable-next-line @typescript-eslint/no-shadow
263
339
  onFullLocus(locus: any, eventType?: string) {
264
340
  if (!locus) {
265
341
  LoggerProxy.logger.error(
266
342
  'Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.'
267
343
  );
268
344
  }
345
+
346
+ if (!this.locusParser.isNewFullLocus(locus)) {
347
+ LoggerProxy.logger.info(
348
+ `Locus-info:index#onFullLocus --> ignoring old full locus DTO, eventType=${eventType}`
349
+ );
350
+
351
+ return;
352
+ }
353
+
269
354
  this.updateParticipantDeltas(locus.participants);
270
355
  this.scheduledMeeting = locus.meeting || null;
271
356
  this.participants = locus.participants;
357
+ const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);
272
358
  this.updateLocusInfo(locus);
273
- this.updateParticipants(locus.participants);
359
+ this.updateParticipants(locus.participants, isReplaceMembers);
274
360
  this.isMeetingActive();
275
361
  this.handleOneOnOneEvent(eventType);
276
362
  this.updateEmbeddedApps(locus.embeddedApps);
@@ -329,8 +415,9 @@ export default class LocusInfo extends EventsScope {
329
415
  * @memberof LocusInfo
330
416
  */
331
417
  onDeltaLocus(locus: any) {
418
+ const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);
332
419
  this.updateLocusInfo(locus);
333
- this.updateParticipants(locus.participants);
420
+ this.updateParticipants(locus.participants, isReplaceMembers);
334
421
  this.isMeetingActive();
335
422
  }
336
423
 
@@ -339,8 +426,15 @@ export default class LocusInfo extends EventsScope {
339
426
  * @returns {undefined}
340
427
  * @memberof LocusInfo
341
428
  */
342
- updateLocusInfo(locus: any) {
343
- this.updateControls(locus.controls);
429
+ updateLocusInfo(locus) {
430
+ if (locus.self?.reason === 'MOVED' && locus.self?.state === 'LEFT') {
431
+ // When moved to a breakout session locus sends a message for the previous locus
432
+ // indicating that we have been moved. It isn't helpful to continue parsing this
433
+ // as it gets interpreted as if we have left the call
434
+ return;
435
+ }
436
+
437
+ this.updateControls(locus.controls, locus.self);
344
438
  this.updateConversationUrl(locus.conversationUrl, locus.info);
345
439
  this.updateCreated(locus.created);
346
440
  this.updateFullState(locus.fullState);
@@ -411,10 +505,15 @@ export default class LocusInfo extends EventsScope {
411
505
  LoggerProxy.logger.warn(
412
506
  'Locus-info:index#isMeetingActive --> Call Ended, locus state is inactive.'
413
507
  );
414
- Metrics.postEvent({
415
- event: eventType.REMOTE_ENDED,
416
- meetingId: this.meetingId,
508
+
509
+ // @ts-ignore
510
+ this.webex.internal.newMetrics.submitClientEvent({
511
+ name: 'client.call.remote-ended',
512
+ options: {
513
+ meetingId: this.meetingId,
514
+ },
417
515
  });
516
+
418
517
  this.emitScoped(
419
518
  {
420
519
  file: 'locus-info',
@@ -433,9 +532,12 @@ export default class LocusInfo extends EventsScope {
433
532
  this.parsedLocus.self.state === MEETING_STATE.STATES.NOTIFIED ||
434
533
  this.parsedLocus.self.state === MEETING_STATE.STATES.JOINED)
435
534
  ) {
436
- Metrics.postEvent({
437
- event: eventType.REMOTE_ENDED,
438
- meetingId: this.meetingId,
535
+ // @ts-ignore
536
+ this.webex.internal.newMetrics.submitClientEvent({
537
+ name: 'client.call.remote-ended',
538
+ options: {
539
+ meetingId: this.meetingId,
540
+ },
439
541
  });
440
542
  this.emitScoped(
441
543
  {
@@ -457,10 +559,14 @@ export default class LocusInfo extends EventsScope {
457
559
  partner.state === MEETING_STATE.STATES.NOTIFIED ||
458
560
  partner.state === MEETING_STATE.STATES.IDLE) // Happens when user just joins and adds no Media
459
561
  ) {
460
- Metrics.postEvent({
461
- event: eventType.REMOTE_ENDED,
462
- meetingId: this.meetingId,
562
+ // @ts-ignore
563
+ this.webex.internal.newMetrics.submitClientEvent({
564
+ name: 'client.call.remote-ended',
565
+ options: {
566
+ meetingId: this.meetingId,
567
+ },
463
568
  });
569
+
464
570
  this.emitScoped(
465
571
  {
466
572
  file: 'locus-info',
@@ -483,9 +589,13 @@ export default class LocusInfo extends EventsScope {
483
589
  LoggerProxy.logger.warn(
484
590
  'Locus-info:index#isMeetingActive --> Meeting is ending due to inactive or terminating'
485
591
  );
486
- Metrics.postEvent({
487
- event: eventType.REMOTE_ENDED,
488
- meetingId: this.meetingId,
592
+
593
+ // @ts-ignore
594
+ this.webex.internal.newMetrics.submitClientEvent({
595
+ name: 'client.call.remote-ended',
596
+ options: {
597
+ meetingId: this.meetingId,
598
+ },
489
599
  });
490
600
  this.emitScoped(
491
601
  {
@@ -500,9 +610,13 @@ export default class LocusInfo extends EventsScope {
500
610
  );
501
611
  } else if (this.fullState && this.fullState.removed) {
502
612
  // user has been dropped from a meeting
503
- Metrics.postEvent({
504
- event: eventType.REMOTE_ENDED,
505
- meetingId: this.meetingId,
613
+
614
+ // @ts-ignore
615
+ this.webex.internal.newMetrics.submitClientEvent({
616
+ name: 'client.call.remote-ended',
617
+ options: {
618
+ meetingId: this.meetingId,
619
+ },
506
620
  });
507
621
  this.emitScoped(
508
622
  {
@@ -639,13 +753,13 @@ export default class LocusInfo extends EventsScope {
639
753
  }
640
754
 
641
755
  /**
642
- *
756
+ * update meeting's members
643
757
  * @param {Object} participants new participants object
644
- * @param {boolen} deltaParticpantFlag delta event
758
+ * @param {Boolean} isReplace is replace the whole members
645
759
  * @returns {Array} updatedParticipants
646
760
  * @memberof LocusInfo
647
761
  */
648
- updateParticipants(participants: object) {
762
+ updateParticipants(participants: object, isReplace?: boolean) {
649
763
  this.emitScoped(
650
764
  {
651
765
  file: 'locus-info',
@@ -658,16 +772,18 @@ export default class LocusInfo extends EventsScope {
658
772
  selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,
659
773
  selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,
660
774
  hostId: this.parsedLocus.host && this.parsedLocus.host.hostId,
775
+ isReplace,
661
776
  }
662
777
  );
663
778
  }
664
779
 
665
780
  /**
666
781
  * @param {Object} controls
782
+ * @param {Object} self
667
783
  * @returns {undefined}
668
784
  * @memberof LocusInfo
669
785
  */
670
- updateControls(controls: object) {
786
+ updateControls(controls: object, self: object) {
671
787
  if (controls && !isEqual(this.controls, controls)) {
672
788
  this.parsedLocus.controls = ControlsUtils.parse(controls);
673
789
  const {
@@ -677,10 +793,77 @@ export default class LocusInfo extends EventsScope {
677
793
  hasMeetingContainerChanged,
678
794
  hasTranscribeChanged,
679
795
  hasEntryExitToneChanged,
796
+ hasBreakoutChanged,
797
+ hasVideoEnabledChanged,
798
+ hasMuteOnEntryChanged,
799
+ hasShareControlChanged,
800
+ hasDisallowUnmuteChanged,
801
+ hasReactionsChanged,
802
+ hasReactionDisplayNamesChanged,
803
+ hasViewTheParticipantListChanged,
804
+ hasRaiseHandChanged,
805
+ hasVideoChanged,
806
+ hasInterpretationChanged,
680
807
  },
681
808
  current,
682
809
  } = ControlsUtils.getControls(this.controls, controls);
683
810
 
811
+ if (hasMuteOnEntryChanged) {
812
+ this.emitScoped(
813
+ {file: 'locus-info', function: 'updateControls'},
814
+ LOCUSINFO.EVENTS.CONTROLS_MUTE_ON_ENTRY_CHANGED,
815
+ {state: current.muteOnEntry}
816
+ );
817
+ }
818
+
819
+ if (hasShareControlChanged) {
820
+ this.emitScoped(
821
+ {file: 'locus-info', function: 'updateControls'},
822
+ LOCUSINFO.EVENTS.CONTROLS_SHARE_CONTROL_CHANGED,
823
+ {state: current.shareControl}
824
+ );
825
+ }
826
+
827
+ if (hasDisallowUnmuteChanged) {
828
+ this.emitScoped(
829
+ {file: 'locus-info', function: 'updateControls'},
830
+ LOCUSINFO.EVENTS.CONTROLS_DISALLOW_UNMUTE_CHANGED,
831
+ {state: current.disallowUnmute}
832
+ );
833
+ }
834
+
835
+ if (hasReactionsChanged || hasReactionDisplayNamesChanged) {
836
+ this.emitScoped(
837
+ {file: 'locus-info', function: 'updateControls'},
838
+ LOCUSINFO.EVENTS.CONTROLS_REACTIONS_CHANGED,
839
+ {state: current.reactions}
840
+ );
841
+ }
842
+
843
+ if (hasViewTheParticipantListChanged) {
844
+ this.emitScoped(
845
+ {file: 'locus-info', function: 'updateControls'},
846
+ LOCUSINFO.EVENTS.CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED,
847
+ {state: current.viewTheParticipantList}
848
+ );
849
+ }
850
+
851
+ if (hasRaiseHandChanged) {
852
+ this.emitScoped(
853
+ {file: 'locus-info', function: 'updateControls'},
854
+ LOCUSINFO.EVENTS.CONTROLS_RAISE_HAND_CHANGED,
855
+ {state: current.raiseHand}
856
+ );
857
+ }
858
+
859
+ if (hasVideoChanged) {
860
+ this.emitScoped(
861
+ {file: 'locus-info', function: 'updateControls'},
862
+ LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED,
863
+ {state: current.video}
864
+ );
865
+ }
866
+
684
867
  if (hasRecordingChanged || hasRecordingPausedChanged) {
685
868
  let state = null;
686
869
 
@@ -740,9 +923,43 @@ export default class LocusInfo extends EventsScope {
740
923
  );
741
924
  }
742
925
 
926
+ if (hasBreakoutChanged) {
927
+ const {breakout} = current;
928
+ breakout.breakoutMoveId = SelfUtils.getReplacedBreakoutMoveId(
929
+ self,
930
+ this.webex.internal.device.url
931
+ );
932
+ this.emitScoped(
933
+ {
934
+ file: 'locus-info',
935
+ function: 'updateControls',
936
+ },
937
+ LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED,
938
+ {
939
+ breakout,
940
+ }
941
+ );
942
+ }
943
+
944
+ if (hasInterpretationChanged) {
945
+ const {interpretation} = current;
946
+ this.emitScoped(
947
+ {
948
+ file: 'locus-info',
949
+ function: 'updateControls',
950
+ },
951
+ LOCUSINFO.EVENTS.CONTROLS_MEETING_INTERPRETATION_UPDATED,
952
+ {
953
+ interpretation,
954
+ }
955
+ );
956
+ }
957
+
743
958
  if (hasEntryExitToneChanged) {
744
959
  const {entryExitTone} = current;
745
960
 
961
+ this.updateMeeting({entryExitTone});
962
+
746
963
  this.emitScoped(
747
964
  {
748
965
  file: 'locus-info',
@@ -753,8 +970,26 @@ export default class LocusInfo extends EventsScope {
753
970
  entryExitTone,
754
971
  }
755
972
  );
973
+ }
756
974
 
757
- this.updateMeeting({entryExitTone});
975
+ // videoEnabled is handled differently than other controls,
976
+ // to fit with audio mute status logic
977
+ if (hasVideoEnabledChanged) {
978
+ const {videoEnabled} = current;
979
+
980
+ this.updateMeeting({unmuteVideoAllowed: videoEnabled});
981
+
982
+ this.emitScoped(
983
+ {
984
+ file: 'locus-info',
985
+ function: 'updateControls',
986
+ },
987
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
988
+ {
989
+ // muted: not part of locus.controls
990
+ unmuteAllowed: videoEnabled,
991
+ }
992
+ );
758
993
  }
759
994
 
760
995
  this.controls = controls;
@@ -895,20 +1130,14 @@ export default class LocusInfo extends EventsScope {
895
1130
  * @memberof LocusInfo
896
1131
  */
897
1132
  updateMeetingInfo(info: object, self?: object) {
898
- if (info && !isEqual(this.info, info)) {
899
- const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
1133
+ const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
1134
+ if (
1135
+ (info && !isEqual(this.info, info)) ||
1136
+ (roles.length && !isEqual(this.roles, roles) && info)
1137
+ ) {
900
1138
  const isJoined = SelfUtils.isJoined(self || this.parsedLocus.self);
901
1139
  const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles, isJoined);
902
1140
 
903
- this.emitScoped(
904
- {
905
- file: 'locus-info',
906
- function: 'updateMeetingInfo',
907
- },
908
- LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,
909
- {info: parsedInfo.current, self}
910
- );
911
-
912
1141
  if (parsedInfo.updates.isLocked) {
913
1142
  this.emitScoped(
914
1143
  {
@@ -934,7 +1163,16 @@ export default class LocusInfo extends EventsScope {
934
1163
  this.parsedLocus.info = parsedInfo.current;
935
1164
  // Parses the info and adds necessary values
936
1165
  this.updateMeeting(parsedInfo.current);
1166
+
1167
+ this.emitScoped(
1168
+ {
1169
+ file: 'locus-info',
1170
+ function: 'updateMeetingInfo',
1171
+ },
1172
+ LOCUSINFO.EVENTS.MEETING_INFO_UPDATED
1173
+ );
937
1174
  }
1175
+ this.roles = roles;
938
1176
  }
939
1177
 
940
1178
  /**
@@ -975,6 +1213,8 @@ export default class LocusInfo extends EventsScope {
975
1213
  const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);
976
1214
 
977
1215
  this.updateMeeting(parsedMediaShares.current);
1216
+ this.parsedLocus.mediaShares = parsedMediaShares.current;
1217
+ this.mediaShares = mediaShares;
978
1218
  this.emitScoped(
979
1219
  {
980
1220
  file: 'locus-info',
@@ -986,8 +1226,6 @@ export default class LocusInfo extends EventsScope {
986
1226
  previous: parsedMediaShares.previous,
987
1227
  }
988
1228
  );
989
- this.parsedLocus.mediaShares = parsedMediaShares.current;
990
- this.mediaShares = mediaShares;
991
1229
  }
992
1230
  }
993
1231
 
@@ -1065,6 +1303,31 @@ export default class LocusInfo extends EventsScope {
1065
1303
  );
1066
1304
  }
1067
1305
 
1306
+ if (parsedSelves.updates.breakoutsChanged) {
1307
+ this.emitScoped(
1308
+ {
1309
+ file: 'locus-info',
1310
+ function: 'updateSelf',
1311
+ },
1312
+ LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED,
1313
+ {breakoutSessions: parsedSelves.current.breakoutSessions}
1314
+ );
1315
+ }
1316
+
1317
+ if (parsedSelves.updates.interpretationChanged) {
1318
+ this.emitScoped(
1319
+ {
1320
+ file: 'locus-info',
1321
+ function: 'updateSelf',
1322
+ },
1323
+ LOCUSINFO.EVENTS.SELF_MEETING_INTERPRETATION_CHANGED,
1324
+ {
1325
+ interpretation: parsedSelves.current.interpretation,
1326
+ selfParticipantId: parsedSelves.current.selfId,
1327
+ }
1328
+ );
1329
+ }
1330
+
1068
1331
  if (parsedSelves.updates.isMediaInactiveOrReleased) {
1069
1332
  this.emitScoped(
1070
1333
  {
@@ -1086,6 +1349,31 @@ export default class LocusInfo extends EventsScope {
1086
1349
  self
1087
1350
  );
1088
1351
  }
1352
+
1353
+ if (parsedSelves.updates.isRolesChanged) {
1354
+ this.emitScoped(
1355
+ {
1356
+ file: 'locus-info',
1357
+ function: 'updateSelf',
1358
+ },
1359
+ LOCUSINFO.EVENTS.SELF_ROLES_CHANGED,
1360
+ {oldRoles: parsedSelves.previous?.roles, newRoles: parsedSelves.current?.roles}
1361
+ );
1362
+ }
1363
+
1364
+ if (parsedSelves.updates.isVideoMutedByOthersChanged) {
1365
+ this.emitScoped(
1366
+ {
1367
+ file: 'locus-info',
1368
+ function: 'updateSelf',
1369
+ },
1370
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
1371
+ {
1372
+ muted: parsedSelves.current.remoteVideoMuted,
1373
+ // unmuteAllowed: not part of .self
1374
+ }
1375
+ );
1376
+ }
1089
1377
  if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {
1090
1378
  this.emitScoped(
1091
1379
  {
@@ -1300,4 +1588,104 @@ export default class LocusInfo extends EventsScope {
1300
1588
  this.identities = identities;
1301
1589
  }
1302
1590
  }
1591
+
1592
+ /**
1593
+ * check the locus is main session's one or not, if is main session's, update main session cache
1594
+ * @param {Object} locus
1595
+ * @returns {undefined}
1596
+ * @memberof LocusInfo
1597
+ */
1598
+ updateLocusCache(locus: any) {
1599
+ const isMainSessionDTO = ControlsUtils.isMainSessionDTO(locus);
1600
+ if (isMainSessionDTO) {
1601
+ this.updateMainSessionLocusCache(locus);
1602
+ }
1603
+ }
1604
+
1605
+ /**
1606
+ * if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)
1607
+ * if join breakout from main session, need to query main locus url (if response with 403 means no privilege, need to clear the cache)
1608
+ * @param {Object} newLocus
1609
+ * @returns {Object}
1610
+ * @memberof LocusInfo
1611
+ */
1612
+ getTheLocusToUpdate(newLocus: any) {
1613
+ const switchStatus = ControlsUtils.getSessionSwitchStatus(this.controls, newLocus?.controls);
1614
+ if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {
1615
+ return cloneDeep(this.mainSessionLocusCache);
1616
+ }
1617
+ if (switchStatus.isJoinToBreakout) {
1618
+ this.emitScoped(
1619
+ {
1620
+ file: 'locus-info',
1621
+ function: 'updateControls',
1622
+ },
1623
+ LOCUSINFO.EVENTS.CONTROLS_JOIN_BREAKOUT_FROM_MAIN,
1624
+ {
1625
+ mainLocusUrl: this.url,
1626
+ }
1627
+ );
1628
+ }
1629
+
1630
+ return newLocus;
1631
+ }
1632
+
1633
+ /**
1634
+ * merge participants by participant id
1635
+ * @param {Array} participants
1636
+ * @param {Array} sourceParticipants
1637
+ * @returns {Array} merged participants
1638
+ * @memberof LocusInfo
1639
+ */
1640
+ // eslint-disable-next-line class-methods-use-this
1641
+ mergeParticipants(participants, sourceParticipants) {
1642
+ if (!sourceParticipants || !sourceParticipants.length) return participants;
1643
+ if (!participants || !participants.length) {
1644
+ return sourceParticipants;
1645
+ }
1646
+ sourceParticipants.forEach((participant) => {
1647
+ const existIndex = participants.findIndex((p) => p.id === participant.id);
1648
+ if (existIndex > -1) {
1649
+ participants.splice(existIndex, 1, participant);
1650
+ } else {
1651
+ participants.push(participant);
1652
+ }
1653
+ });
1654
+
1655
+ return participants;
1656
+ }
1657
+
1658
+ /**
1659
+ * need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout
1660
+ * @param {Object} mainLocus
1661
+ * @returns {undefined}
1662
+ * @memberof LocusInfo
1663
+ */
1664
+ updateMainSessionLocusCache(mainLocus: any) {
1665
+ if (!mainLocus) {
1666
+ return;
1667
+ }
1668
+ const locusClone = cloneDeep(mainLocus);
1669
+ if (this.mainSessionLocusCache) {
1670
+ // shallow merge and do special merge for participants
1671
+ assignWith(this.mainSessionLocusCache, locusClone, (objValue, srcValue, key) => {
1672
+ if (key === 'participants') {
1673
+ return this.mergeParticipants(objValue, srcValue);
1674
+ }
1675
+
1676
+ return srcValue || objValue;
1677
+ });
1678
+ } else {
1679
+ this.mainSessionLocusCache = locusClone;
1680
+ }
1681
+ }
1682
+
1683
+ /**
1684
+ * clear main session cache
1685
+ * @returns {undefined}
1686
+ * @memberof LocusInfo
1687
+ */
1688
+ clearMainSessionLocusCache() {
1689
+ this.mainSessionLocusCache = null;
1690
+ }
1303
1691
  }