@webex/plugin-meetings 3.0.0-beta.4 → 3.0.0-beta.400

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 (629) hide show
  1. package/README.md +58 -8
  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 +49 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +342 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +216 -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 +45 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +1048 -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 +10 -24
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +11 -24
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +12 -25
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +10 -24
  37. package/dist/common/errors/media.js.map +1 -1
  38. package/dist/common/errors/no-meeting-info.js +51 -0
  39. package/dist/common/errors/no-meeting-info.js.map +1 -0
  40. package/dist/common/errors/parameter.js +5 -33
  41. package/dist/common/errors/parameter.js.map +1 -1
  42. package/dist/common/errors/password-error.js +10 -24
  43. package/dist/common/errors/password-error.js.map +1 -1
  44. package/dist/common/errors/permission.js +9 -23
  45. package/dist/common/errors/permission.js.map +1 -1
  46. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  47. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  48. package/dist/common/errors/reconnection-in-progress.js +0 -17
  49. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  50. package/dist/common/errors/reconnection.js +10 -24
  51. package/dist/common/errors/reconnection.js.map +1 -1
  52. package/dist/common/errors/stats.js +10 -24
  53. package/dist/common/errors/stats.js.map +1 -1
  54. package/dist/common/errors/webex-errors.js +54 -48
  55. package/dist/common/errors/webex-errors.js.map +1 -1
  56. package/dist/common/errors/webex-meetings-error.js +5 -25
  57. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  58. package/dist/common/events/events-scope.js +0 -22
  59. package/dist/common/events/events-scope.js.map +1 -1
  60. package/dist/common/events/events.js +0 -23
  61. package/dist/common/events/events.js.map +1 -1
  62. package/dist/common/events/trigger-proxy.js +0 -12
  63. package/dist/common/events/trigger-proxy.js.map +1 -1
  64. package/dist/common/events/util.js +0 -15
  65. package/dist/common/events/util.js.map +1 -1
  66. package/dist/common/logs/logger-config.js +0 -4
  67. package/dist/common/logs/logger-config.js.map +1 -1
  68. package/dist/common/logs/logger-proxy.js +1 -8
  69. package/dist/common/logs/logger-proxy.js.map +1 -1
  70. package/dist/common/logs/request.js +41 -60
  71. package/dist/common/logs/request.js.map +1 -1
  72. package/dist/common/queue.js +28 -23
  73. package/dist/common/queue.js.map +1 -1
  74. package/dist/config.js +11 -15
  75. package/dist/config.js.map +1 -1
  76. package/dist/constants.js +347 -74
  77. package/dist/constants.js.map +1 -1
  78. package/dist/controls-options-manager/constants.js +14 -0
  79. package/dist/controls-options-manager/constants.js.map +1 -0
  80. package/dist/controls-options-manager/enums.js +27 -0
  81. package/dist/controls-options-manager/enums.js.map +1 -0
  82. package/dist/controls-options-manager/index.js +297 -0
  83. package/dist/controls-options-manager/index.js.map +1 -0
  84. package/dist/controls-options-manager/types.js +7 -0
  85. package/dist/controls-options-manager/types.js.map +1 -0
  86. package/dist/controls-options-manager/util.js +319 -0
  87. package/dist/controls-options-manager/util.js.map +1 -0
  88. package/dist/index.js +125 -18
  89. package/dist/index.js.map +1 -1
  90. package/dist/interceptors/index.js +15 -0
  91. package/dist/interceptors/index.js.map +1 -0
  92. package/dist/interceptors/locusRetry.js +93 -0
  93. package/dist/interceptors/locusRetry.js.map +1 -0
  94. package/dist/interpretation/collection.js +23 -0
  95. package/dist/interpretation/collection.js.map +1 -0
  96. package/dist/interpretation/index.js +380 -0
  97. package/dist/interpretation/index.js.map +1 -0
  98. package/dist/interpretation/siLanguage.js +25 -0
  99. package/dist/interpretation/siLanguage.js.map +1 -0
  100. package/dist/locus-info/controlsUtils.js +101 -29
  101. package/dist/locus-info/controlsUtils.js.map +1 -1
  102. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  103. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  104. package/dist/locus-info/fullState.js +0 -15
  105. package/dist/locus-info/fullState.js.map +1 -1
  106. package/dist/locus-info/hostUtils.js +4 -12
  107. package/dist/locus-info/hostUtils.js.map +1 -1
  108. package/dist/locus-info/index.js +564 -246
  109. package/dist/locus-info/index.js.map +1 -1
  110. package/dist/locus-info/infoUtils.js +10 -38
  111. package/dist/locus-info/infoUtils.js.map +1 -1
  112. package/dist/locus-info/mediaSharesUtils.js +82 -38
  113. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  114. package/dist/locus-info/parser.js +314 -163
  115. package/dist/locus-info/parser.js.map +1 -1
  116. package/dist/locus-info/selfUtils.js +110 -92
  117. package/dist/locus-info/selfUtils.js.map +1 -1
  118. package/dist/media/index.js +107 -231
  119. package/dist/media/index.js.map +1 -1
  120. package/dist/media/properties.js +137 -222
  121. package/dist/media/properties.js.map +1 -1
  122. package/dist/media/util.js +2 -9
  123. package/dist/media/util.js.map +1 -1
  124. package/dist/mediaQualityMetrics/config.js +316 -501
  125. package/dist/mediaQualityMetrics/config.js.map +1 -1
  126. package/dist/meeting/in-meeting-actions.js +97 -14
  127. package/dist/meeting/in-meeting-actions.js.map +1 -1
  128. package/dist/meeting/index.js +5311 -3871
  129. package/dist/meeting/index.js.map +1 -1
  130. package/dist/meeting/locusMediaRequest.js +292 -0
  131. package/dist/meeting/locusMediaRequest.js.map +1 -0
  132. package/dist/meeting/muteState.js +260 -183
  133. package/dist/meeting/muteState.js.map +1 -1
  134. package/dist/meeting/request.js +421 -347
  135. package/dist/meeting/request.js.map +1 -1
  136. package/dist/meeting/request.type.js +7 -0
  137. package/dist/meeting/request.type.js.map +1 -0
  138. package/dist/meeting/state.js +21 -31
  139. package/dist/meeting/state.js.map +1 -1
  140. package/dist/meeting/util.js +672 -585
  141. package/dist/meeting/util.js.map +1 -1
  142. package/dist/meeting/voicea-meeting.js +172 -0
  143. package/dist/meeting/voicea-meeting.js.map +1 -0
  144. package/dist/meeting-info/collection.js +6 -25
  145. package/dist/meeting-info/collection.js.map +1 -1
  146. package/dist/meeting-info/index.js +87 -39
  147. package/dist/meeting-info/index.js.map +1 -1
  148. package/dist/meeting-info/meeting-info-v2.js +352 -283
  149. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  150. package/dist/meeting-info/request.js +3 -15
  151. package/dist/meeting-info/request.js.map +1 -1
  152. package/dist/meeting-info/util.js +99 -183
  153. package/dist/meeting-info/util.js.map +1 -1
  154. package/dist/meeting-info/utilv2.js +147 -234
  155. package/dist/meeting-info/utilv2.js.map +1 -1
  156. package/dist/meetings/collection.js +43 -19
  157. package/dist/meetings/collection.js.map +1 -1
  158. package/dist/meetings/index.js +895 -600
  159. package/dist/meetings/index.js.map +1 -1
  160. package/dist/meetings/meetings.types.js +7 -0
  161. package/dist/meetings/meetings.types.js.map +1 -0
  162. package/dist/meetings/request.js +26 -41
  163. package/dist/meetings/request.js.map +1 -1
  164. package/dist/meetings/util.js +184 -157
  165. package/dist/meetings/util.js.map +1 -1
  166. package/dist/member/index.js +134 -85
  167. package/dist/member/index.js.map +1 -1
  168. package/dist/member/types.js +25 -0
  169. package/dist/member/types.js.map +1 -0
  170. package/dist/member/util.js +158 -88
  171. package/dist/member/util.js.map +1 -1
  172. package/dist/members/collection.js +13 -12
  173. package/dist/members/collection.js.map +1 -1
  174. package/dist/members/index.js +194 -204
  175. package/dist/members/index.js.map +1 -1
  176. package/dist/members/request.js +113 -68
  177. package/dist/members/request.js.map +1 -1
  178. package/dist/members/types.js +15 -0
  179. package/dist/members/types.js.map +1 -0
  180. package/dist/members/util.js +324 -259
  181. package/dist/members/util.js.map +1 -1
  182. package/dist/metrics/constants.js +19 -7
  183. package/dist/metrics/constants.js.map +1 -1
  184. package/dist/metrics/index.js +11 -558
  185. package/dist/metrics/index.js.map +1 -1
  186. package/dist/multistream/mediaRequestManager.js +263 -50
  187. package/dist/multistream/mediaRequestManager.js.map +1 -1
  188. package/dist/multistream/receiveSlot.js +58 -65
  189. package/dist/multistream/receiveSlot.js.map +1 -1
  190. package/dist/multistream/receiveSlotManager.js +76 -95
  191. package/dist/multistream/receiveSlotManager.js.map +1 -1
  192. package/dist/multistream/remoteMedia.js +62 -76
  193. package/dist/multistream/remoteMedia.js.map +1 -1
  194. package/dist/multistream/remoteMediaGroup.js +82 -45
  195. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  196. package/dist/multistream/remoteMediaManager.js +657 -448
  197. package/dist/multistream/remoteMediaManager.js.map +1 -1
  198. package/dist/multistream/sendSlotManager.js +255 -0
  199. package/dist/multistream/sendSlotManager.js.map +1 -0
  200. package/dist/networkQualityMonitor/index.js +40 -59
  201. package/dist/networkQualityMonitor/index.js.map +1 -1
  202. package/dist/personal-meeting-room/index.js +21 -45
  203. package/dist/personal-meeting-room/index.js.map +1 -1
  204. package/dist/personal-meeting-room/request.js +1 -31
  205. package/dist/personal-meeting-room/request.js.map +1 -1
  206. package/dist/personal-meeting-room/util.js +0 -13
  207. package/dist/personal-meeting-room/util.js.map +1 -1
  208. package/dist/reachability/clusterReachability.js +356 -0
  209. package/dist/reachability/clusterReachability.js.map +1 -0
  210. package/dist/reachability/index.js +297 -460
  211. package/dist/reachability/index.js.map +1 -1
  212. package/dist/reachability/request.js +20 -26
  213. package/dist/reachability/request.js.map +1 -1
  214. package/dist/reachability/util.js +29 -0
  215. package/dist/reachability/util.js.map +1 -0
  216. package/dist/reactions/constants.js +13 -0
  217. package/dist/reactions/constants.js.map +1 -0
  218. package/dist/reactions/reactions.js +109 -0
  219. package/dist/reactions/reactions.js.map +1 -0
  220. package/dist/reactions/reactions.type.js +36 -0
  221. package/dist/reactions/reactions.type.js.map +1 -0
  222. package/dist/reconnection-manager/index.js +413 -483
  223. package/dist/reconnection-manager/index.js.map +1 -1
  224. package/dist/recording-controller/enums.js +17 -0
  225. package/dist/recording-controller/enums.js.map +1 -0
  226. package/dist/recording-controller/index.js +362 -0
  227. package/dist/recording-controller/index.js.map +1 -0
  228. package/dist/recording-controller/util.js +64 -0
  229. package/dist/recording-controller/util.js.map +1 -0
  230. package/dist/roap/index.js +102 -86
  231. package/dist/roap/index.js.map +1 -1
  232. package/dist/roap/request.js +131 -135
  233. package/dist/roap/request.js.map +1 -1
  234. package/dist/roap/turnDiscovery.js +437 -116
  235. package/dist/roap/turnDiscovery.js.map +1 -1
  236. package/dist/rtcMetrics/constants.js +12 -0
  237. package/dist/rtcMetrics/constants.js.map +1 -0
  238. package/dist/rtcMetrics/index.js +179 -0
  239. package/dist/rtcMetrics/index.js.map +1 -0
  240. package/dist/statsAnalyzer/global.js +1 -95
  241. package/dist/statsAnalyzer/global.js.map +1 -1
  242. package/dist/statsAnalyzer/index.js +557 -583
  243. package/dist/statsAnalyzer/index.js.map +1 -1
  244. package/dist/statsAnalyzer/mqaUtil.js +326 -130
  245. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  246. package/dist/transcription/index.js +22 -47
  247. package/dist/transcription/index.js.map +1 -1
  248. package/dist/types/annotation/annotation.types.d.ts +42 -0
  249. package/dist/types/annotation/constants.d.ts +31 -0
  250. package/dist/types/annotation/index.d.ts +117 -0
  251. package/dist/types/breakouts/breakout.d.ts +8 -0
  252. package/dist/types/breakouts/collection.d.ts +5 -0
  253. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  254. package/dist/types/breakouts/events.d.ts +8 -0
  255. package/dist/types/breakouts/index.d.ts +5 -0
  256. package/dist/types/breakouts/request.d.ts +22 -0
  257. package/dist/types/breakouts/utils.d.ts +15 -0
  258. package/dist/types/common/browser-detection.d.ts +9 -0
  259. package/dist/types/common/collection.d.ts +48 -0
  260. package/dist/types/common/config.d.ts +2 -0
  261. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  262. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  263. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  264. package/dist/types/common/errors/media.d.ts +15 -0
  265. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  266. package/dist/types/common/errors/parameter.d.ts +15 -0
  267. package/dist/types/common/errors/password-error.d.ts +15 -0
  268. package/dist/types/common/errors/permission.d.ts +14 -0
  269. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  270. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  271. package/dist/types/common/errors/reconnection.d.ts +15 -0
  272. package/dist/types/common/errors/stats.d.ts +15 -0
  273. package/dist/types/common/errors/webex-errors.d.ts +93 -0
  274. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  275. package/dist/types/common/events/events-scope.d.ts +17 -0
  276. package/dist/types/common/events/events.d.ts +12 -0
  277. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  278. package/dist/types/common/events/util.d.ts +2 -0
  279. package/dist/types/common/logs/logger-config.d.ts +2 -0
  280. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  281. package/dist/types/common/logs/request.d.ts +36 -0
  282. package/dist/types/common/queue.d.ts +34 -0
  283. package/dist/types/config.d.ts +72 -0
  284. package/dist/types/constants.d.ts +1088 -0
  285. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  286. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  287. package/dist/types/controls-options-manager/index.d.ts +136 -0
  288. package/dist/types/controls-options-manager/types.d.ts +43 -0
  289. package/dist/types/controls-options-manager/util.d.ts +1 -0
  290. package/dist/types/index.d.ts +7 -0
  291. package/dist/types/interceptors/index.d.ts +2 -0
  292. package/dist/types/interceptors/locusRetry.d.ts +27 -0
  293. package/dist/types/interpretation/collection.d.ts +5 -0
  294. package/dist/types/interpretation/index.d.ts +5 -0
  295. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  296. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  297. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  298. package/dist/types/locus-info/fullState.d.ts +2 -0
  299. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  300. package/dist/types/locus-info/index.d.ts +322 -0
  301. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  302. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  303. package/dist/types/locus-info/parser.d.ts +272 -0
  304. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  305. package/dist/types/media/index.d.ts +34 -0
  306. package/dist/types/media/properties.d.ts +93 -0
  307. package/dist/types/media/util.d.ts +2 -0
  308. package/dist/types/mediaQualityMetrics/config.d.ts +241 -0
  309. package/dist/types/meeting/in-meeting-actions.d.ts +167 -0
  310. package/dist/types/meeting/index.d.ts +1824 -0
  311. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  312. package/dist/types/meeting/muteState.d.ts +178 -0
  313. package/dist/types/meeting/request.d.ts +293 -0
  314. package/dist/types/meeting/request.type.d.ts +11 -0
  315. package/dist/types/meeting/state.d.ts +9 -0
  316. package/dist/types/meeting/util.d.ts +118 -0
  317. package/dist/types/meeting/voicea-meeting.d.ts +16 -0
  318. package/dist/types/meeting-info/collection.d.ts +20 -0
  319. package/dist/types/meeting-info/index.d.ts +69 -0
  320. package/dist/types/meeting-info/meeting-info-v2.d.ts +123 -0
  321. package/dist/types/meeting-info/request.d.ts +22 -0
  322. package/dist/types/meeting-info/util.d.ts +2 -0
  323. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  324. package/dist/types/meetings/collection.d.ts +40 -0
  325. package/dist/types/meetings/index.d.ts +389 -0
  326. package/dist/types/meetings/meetings.types.d.ts +4 -0
  327. package/dist/types/meetings/request.d.ts +27 -0
  328. package/dist/types/meetings/util.d.ts +18 -0
  329. package/dist/types/member/index.d.ts +160 -0
  330. package/dist/types/member/types.d.ts +32 -0
  331. package/dist/types/member/util.d.ts +2 -0
  332. package/dist/types/members/collection.d.ts +29 -0
  333. package/dist/types/members/index.d.ts +353 -0
  334. package/dist/types/members/request.d.ts +114 -0
  335. package/dist/types/members/types.d.ts +25 -0
  336. package/dist/types/members/util.d.ts +215 -0
  337. package/dist/types/metrics/constants.d.ts +70 -0
  338. package/dist/types/metrics/index.d.ts +45 -0
  339. package/dist/types/multistream/mediaRequestManager.d.ts +120 -0
  340. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  341. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  342. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  343. package/dist/types/multistream/remoteMediaGroup.d.ts +49 -0
  344. package/dist/types/multistream/remoteMediaManager.d.ts +301 -0
  345. package/dist/types/multistream/sendSlotManager.d.ts +70 -0
  346. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  347. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  348. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  349. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  350. package/dist/types/reachability/clusterReachability.d.ts +109 -0
  351. package/dist/types/reachability/index.d.ts +105 -0
  352. package/dist/types/reachability/request.d.ts +39 -0
  353. package/dist/types/reachability/util.d.ts +8 -0
  354. package/dist/types/reactions/constants.d.ts +3 -0
  355. package/dist/types/reactions/reactions.d.ts +4 -0
  356. package/dist/types/reactions/reactions.type.d.ts +52 -0
  357. package/dist/types/reconnection-manager/index.d.ts +136 -0
  358. package/dist/types/recording-controller/enums.d.ts +7 -0
  359. package/dist/types/recording-controller/index.d.ts +207 -0
  360. package/dist/types/recording-controller/util.d.ts +14 -0
  361. package/dist/types/roap/index.d.ts +86 -0
  362. package/dist/types/roap/request.d.ts +39 -0
  363. package/dist/types/roap/turnDiscovery.d.ts +155 -0
  364. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  365. package/dist/types/rtcMetrics/index.d.ts +61 -0
  366. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  367. package/dist/types/statsAnalyzer/index.d.ts +217 -0
  368. package/dist/types/statsAnalyzer/mqaUtil.d.ts +48 -0
  369. package/dist/types/transcription/index.d.ts +64 -0
  370. package/dist/types/webinar/collection.d.ts +16 -0
  371. package/dist/types/webinar/index.d.ts +5 -0
  372. package/dist/webinar/collection.js +44 -0
  373. package/dist/webinar/collection.js.map +1 -0
  374. package/dist/webinar/index.js +69 -0
  375. package/dist/webinar/index.js.map +1 -0
  376. package/internal-README.md +7 -6
  377. package/package.json +30 -21
  378. package/src/annotation/annotation.types.ts +50 -0
  379. package/src/annotation/constants.ts +36 -0
  380. package/src/annotation/index.ts +328 -0
  381. package/src/breakouts/README.md +220 -0
  382. package/src/breakouts/breakout.ts +188 -0
  383. package/src/breakouts/collection.ts +19 -0
  384. package/src/breakouts/edit-lock-error.ts +25 -0
  385. package/src/breakouts/events.ts +56 -0
  386. package/src/breakouts/index.ts +925 -0
  387. package/src/breakouts/request.ts +55 -0
  388. package/src/breakouts/utils.ts +57 -0
  389. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  390. package/src/common/collection.ts +9 -7
  391. package/src/common/{config.js → config.ts} +1 -1
  392. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  393. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  394. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  395. package/src/common/errors/{media.js → media.ts} +11 -7
  396. package/src/common/errors/no-meeting-info.ts +24 -0
  397. package/src/common/errors/parameter.ts +11 -7
  398. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  399. package/src/common/errors/{permission.js → permission.ts} +10 -6
  400. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  401. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  402. package/src/common/errors/{stats.js → stats.ts} +11 -7
  403. package/src/common/errors/{webex-errors.js → webex-errors.ts} +51 -8
  404. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  405. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  406. package/src/common/events/{events.js → events.ts} +5 -1
  407. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  408. package/src/common/events/{util.js → util.ts} +2 -3
  409. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  410. package/src/common/logs/logger-proxy.ts +44 -0
  411. package/src/common/logs/{request.js → request.ts} +26 -9
  412. package/src/common/queue.ts +22 -9
  413. package/src/{config.js → config.ts} +19 -21
  414. package/src/constants.ts +296 -27
  415. package/src/controls-options-manager/constants.ts +5 -0
  416. package/src/controls-options-manager/enums.ts +18 -0
  417. package/src/controls-options-manager/index.ts +278 -0
  418. package/src/controls-options-manager/types.ts +59 -0
  419. package/src/controls-options-manager/util.ts +300 -0
  420. package/src/index.ts +45 -0
  421. package/src/interceptors/index.ts +3 -0
  422. package/src/interceptors/locusRetry.ts +67 -0
  423. package/src/interpretation/README.md +60 -0
  424. package/src/interpretation/collection.ts +19 -0
  425. package/src/interpretation/index.ts +349 -0
  426. package/src/interpretation/siLanguage.ts +18 -0
  427. package/src/locus-info/controlsUtils.ts +222 -0
  428. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  429. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  430. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  431. package/src/locus-info/{index.js → index.ts} +561 -119
  432. package/src/locus-info/{infoUtils.js → infoUtils.ts} +29 -10
  433. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +97 -17
  434. package/src/locus-info/{parser.js → parser.ts} +303 -104
  435. package/src/locus-info/{selfUtils.js → selfUtils.ts} +199 -68
  436. package/src/media/index.ts +460 -0
  437. package/src/media/properties.ts +283 -0
  438. package/src/media/{util.js → util.ts} +2 -2
  439. package/src/mediaQualityMetrics/config.ts +249 -0
  440. package/src/meeting/in-meeting-actions.ts +199 -3
  441. package/src/meeting/index.ts +8494 -0
  442. package/src/meeting/locusMediaRequest.ts +313 -0
  443. package/src/meeting/muteState.ts +465 -0
  444. package/src/meeting/request.ts +912 -0
  445. package/src/meeting/request.type.ts +13 -0
  446. package/src/meeting/{state.js → state.ts} +50 -35
  447. package/src/meeting/util.ts +799 -0
  448. package/src/meeting/voicea-meeting.ts +122 -0
  449. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  450. package/src/meeting-info/index.ts +210 -0
  451. package/src/meeting-info/meeting-info-v2.ts +423 -0
  452. package/src/meeting-info/{request.js → request.ts} +14 -4
  453. package/src/meeting-info/{util.js → util.ts} +70 -58
  454. package/src/meeting-info/{utilv2.js → utilv2.ts} +99 -82
  455. package/src/meetings/collection.ts +76 -0
  456. package/src/meetings/index.ts +1539 -0
  457. package/src/meetings/meetings.types.ts +12 -0
  458. package/src/meetings/{request.js → request.ts} +34 -25
  459. package/src/meetings/{util.js → util.ts} +133 -38
  460. package/src/member/{index.js → index.ts} +159 -56
  461. package/src/member/types.ts +38 -0
  462. package/src/member/util.ts +397 -0
  463. package/src/members/{collection.js → collection.ts} +10 -2
  464. package/src/members/{index.js → index.ts} +351 -146
  465. package/src/members/request.ts +255 -0
  466. package/src/members/types.ts +29 -0
  467. package/src/members/util.ts +353 -0
  468. package/src/metrics/{constants.js → constants.ts} +17 -6
  469. package/src/metrics/index.ts +73 -0
  470. package/src/multistream/mediaRequestManager.ts +341 -64
  471. package/src/multistream/receiveSlot.ts +69 -26
  472. package/src/multistream/receiveSlotManager.ts +66 -42
  473. package/src/multistream/remoteMedia.ts +40 -5
  474. package/src/multistream/remoteMediaGroup.ts +82 -3
  475. package/src/multistream/remoteMediaManager.ts +401 -81
  476. package/src/multistream/sendSlotManager.ts +199 -0
  477. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  478. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  479. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  480. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  481. package/src/reachability/clusterReachability.ts +320 -0
  482. package/src/reachability/index.ts +371 -0
  483. package/src/reachability/request.ts +50 -35
  484. package/src/reachability/util.ts +24 -0
  485. package/src/reactions/constants.ts +4 -0
  486. package/src/reactions/reactions.ts +104 -0
  487. package/src/reactions/reactions.type.ts +62 -0
  488. package/src/reconnection-manager/index.ts +643 -0
  489. package/src/recording-controller/enums.ts +8 -0
  490. package/src/recording-controller/index.ts +332 -0
  491. package/src/recording-controller/util.ts +75 -0
  492. package/src/roap/index.ts +288 -0
  493. package/src/roap/request.ts +153 -0
  494. package/src/roap/turnDiscovery.ts +374 -70
  495. package/src/rtcMetrics/constants.ts +3 -0
  496. package/src/rtcMetrics/index.ts +166 -0
  497. package/src/statsAnalyzer/global.ts +37 -0
  498. package/src/statsAnalyzer/index.ts +1275 -0
  499. package/src/statsAnalyzer/mqaUtil.ts +440 -0
  500. package/src/transcription/{index.js → index.ts} +46 -39
  501. package/src/webinar/collection.ts +31 -0
  502. package/src/webinar/index.ts +62 -0
  503. package/test/integration/spec/converged-space-meetings.js +233 -0
  504. package/test/integration/spec/journey.js +791 -531
  505. package/test/integration/spec/space-meeting.js +391 -204
  506. package/test/integration/spec/transcription.js +7 -8
  507. package/test/unit/spec/annotation/index.ts +418 -0
  508. package/test/unit/spec/breakouts/breakout.ts +238 -0
  509. package/test/unit/spec/breakouts/collection.ts +15 -0
  510. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  511. package/test/unit/spec/breakouts/events.ts +89 -0
  512. package/test/unit/spec/breakouts/index.ts +1793 -0
  513. package/test/unit/spec/breakouts/request.ts +104 -0
  514. package/test/unit/spec/breakouts/utils.js +72 -0
  515. package/test/unit/spec/common/browser-detection.js +9 -28
  516. package/test/unit/spec/common/queue.js +31 -2
  517. package/test/unit/spec/controls-options-manager/index.js +287 -0
  518. package/test/unit/spec/controls-options-manager/util.js +582 -0
  519. package/test/unit/spec/fixture/locus.js +93 -90
  520. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  521. package/test/unit/spec/interpretation/collection.ts +15 -0
  522. package/test/unit/spec/interpretation/index.ts +625 -0
  523. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  524. package/test/unit/spec/locus-info/controlsUtils.js +325 -32
  525. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  526. package/test/unit/spec/locus-info/index.js +1458 -21
  527. package/test/unit/spec/locus-info/infoUtils.js +71 -40
  528. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  529. package/test/unit/spec/locus-info/lib/SeqCmp.json +529 -685
  530. package/test/unit/spec/locus-info/mediaSharesUtils.ts +41 -0
  531. package/test/unit/spec/locus-info/parser.js +119 -44
  532. package/test/unit/spec/locus-info/selfConstant.js +120 -103
  533. package/test/unit/spec/locus-info/selfUtils.js +291 -12
  534. package/test/unit/spec/media/index.ts +194 -111
  535. package/test/unit/spec/media/properties.ts +11 -11
  536. package/test/unit/spec/meeting/in-meeting-actions.ts +96 -3
  537. package/test/unit/spec/meeting/index.js +8616 -1921
  538. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  539. package/test/unit/spec/meeting/muteState.js +568 -207
  540. package/test/unit/spec/meeting/request.js +602 -82
  541. package/test/unit/spec/meeting/utils.js +867 -179
  542. package/test/unit/spec/meeting/voicea-meeting.ts +266 -0
  543. package/test/unit/spec/meeting-info/index.js +300 -0
  544. package/test/unit/spec/meeting-info/meetinginfov2.js +631 -78
  545. package/test/unit/spec/meeting-info/request.js +7 -9
  546. package/test/unit/spec/meeting-info/util.js +11 -12
  547. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  548. package/test/unit/spec/meetings/collection.js +27 -1
  549. package/test/unit/spec/meetings/index.js +1826 -374
  550. package/test/unit/spec/meetings/utils.js +243 -14
  551. package/test/unit/spec/member/index.js +61 -7
  552. package/test/unit/spec/member/util.js +526 -26
  553. package/test/unit/spec/members/index.js +536 -55
  554. package/test/unit/spec/members/request.js +228 -40
  555. package/test/unit/spec/members/utils.js +217 -4
  556. package/test/unit/spec/metrics/index.js +13 -68
  557. package/test/unit/spec/multistream/mediaRequestManager.ts +1032 -110
  558. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  559. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  560. package/test/unit/spec/multistream/remoteMedia.ts +40 -2
  561. package/test/unit/spec/multistream/remoteMediaGroup.ts +350 -5
  562. package/test/unit/spec/multistream/remoteMediaManager.ts +937 -65
  563. package/test/unit/spec/multistream/sendSlotManager.ts +274 -0
  564. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  565. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  566. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  567. package/test/unit/spec/reachability/index.ts +606 -26
  568. package/test/unit/spec/reachability/request.js +68 -0
  569. package/test/unit/spec/reachability/util.ts +40 -0
  570. package/test/unit/spec/reconnection-manager/index.js +222 -34
  571. package/test/unit/spec/recording-controller/index.js +306 -0
  572. package/test/unit/spec/recording-controller/util.js +229 -0
  573. package/test/unit/spec/roap/index.ts +238 -82
  574. package/test/unit/spec/roap/request.ts +255 -0
  575. package/test/unit/spec/roap/turnDiscovery.ts +707 -110
  576. package/test/unit/spec/rtcMetrics/index.ts +122 -0
  577. package/test/unit/spec/stats-analyzer/index.js +1331 -62
  578. package/test/unit/spec/webinar/collection.ts +13 -0
  579. package/test/unit/spec/webinar/index.ts +60 -0
  580. package/test/utils/cmr.js +44 -42
  581. package/test/utils/constants.js +9 -0
  582. package/test/utils/integrationTestUtils.js +46 -0
  583. package/test/utils/testUtils.js +63 -99
  584. package/test/utils/webex-config.js +22 -18
  585. package/test/utils/webex-test-users.js +65 -50
  586. package/tsconfig.json +6 -0
  587. package/dist/media/internal-media-core-wrapper.js +0 -22
  588. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  589. package/dist/meeting/effectsState.js +0 -327
  590. package/dist/meeting/effectsState.js.map +0 -1
  591. package/dist/metrics/config.js +0 -301
  592. package/dist/metrics/config.js.map +0 -1
  593. package/dist/multistream/multistreamMedia.js +0 -116
  594. package/dist/multistream/multistreamMedia.js.map +0 -1
  595. package/dist/peer-connection-manager/util.js +0 -124
  596. package/dist/peer-connection-manager/util.js.map +0 -1
  597. package/src/common/logs/logger-proxy.js +0 -33
  598. package/src/index.js +0 -15
  599. package/src/locus-info/controlsUtils.js +0 -102
  600. package/src/media/index.js +0 -459
  601. package/src/media/internal-media-core-wrapper.ts +0 -9
  602. package/src/media/properties.js +0 -289
  603. package/src/mediaQualityMetrics/config.js +0 -382
  604. package/src/meeting/effectsState.js +0 -205
  605. package/src/meeting/index.js +0 -6284
  606. package/src/meeting/muteState.js +0 -318
  607. package/src/meeting/request.js +0 -684
  608. package/src/meeting/util.js +0 -506
  609. package/src/meeting-info/index.js +0 -131
  610. package/src/meeting-info/meeting-info-v2.js +0 -255
  611. package/src/meetings/collection.js +0 -40
  612. package/src/meetings/index.js +0 -1015
  613. package/src/member/util.js +0 -254
  614. package/src/members/request.js +0 -131
  615. package/src/members/util.js +0 -258
  616. package/src/metrics/config.js +0 -324
  617. package/src/metrics/index.js +0 -530
  618. package/src/multistream/multistreamMedia.ts +0 -92
  619. package/src/peer-connection-manager/util.ts +0 -117
  620. package/src/reachability/index.js +0 -464
  621. package/src/reconnection-manager/index.js +0 -519
  622. package/src/roap/index.js +0 -220
  623. package/src/roap/request.js +0 -127
  624. package/src/statsAnalyzer/global.js +0 -133
  625. package/src/statsAnalyzer/index.js +0 -1006
  626. package/src/statsAnalyzer/mqaUtil.js +0 -173
  627. package/test/unit/spec/meeting/effectsState.js +0 -291
  628. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  629. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.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,16 +17,16 @@ import {
17
17
  CALL_REMOVED_REASON,
18
18
  RECORDING_STATE,
19
19
  } from '../constants';
20
+ import InfoUtils from './infoUtils';
21
+ import FullState from './fullState';
22
+ import SelfUtils from './selfUtils';
23
+ import HostUtils from './hostUtils';
24
+ import ControlsUtils from './controlsUtils';
25
+ import EmbeddedAppsUtils from './embeddedAppsUtils';
26
+ import MediaSharesUtils from './mediaSharesUtils';
27
+ import LocusDeltaParser from './parser';
20
28
  import Metrics from '../metrics';
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';
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
@@ -35,6 +35,43 @@ import LocusDeltaParser from '../locus-info/parser';
35
35
  * @class LocusInfo
36
36
  */
37
37
  export default class LocusInfo extends EventsScope {
38
+ compareAndUpdateFlags: any;
39
+ emitChange: any;
40
+ locusParser: any;
41
+ meetingId: any;
42
+ parsedLocus: any;
43
+ updateMeeting: any;
44
+ webex: any;
45
+ aclUrl: any;
46
+ baseSequence: any;
47
+ created: any;
48
+ deltaParticipants: any;
49
+ identities: any;
50
+ membership: any;
51
+ participants: any;
52
+ participantsUrl: any;
53
+ replaces: any;
54
+ scheduledMeeting: any;
55
+ sequence: any;
56
+ controls: any;
57
+ conversationUrl: any;
58
+ embeddedApps: any;
59
+ fullState: any;
60
+ host: any;
61
+ info: any;
62
+ roles: any;
63
+ mediaShares: any;
64
+ replace: any;
65
+ url: any;
66
+ services: any;
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
+ */
38
75
  constructor(updateMeeting, webex, meetingId) {
39
76
  super();
40
77
  this.parsedLocus = {
@@ -48,6 +85,82 @@ export default class LocusInfo extends EventsScope {
48
85
  this.locusParser = new LocusDeltaParser();
49
86
  }
50
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
+
51
164
  /**
52
165
  * Apply locus delta data to meeting
53
166
  * @param {string} action Locus delta action
@@ -55,29 +168,20 @@ export default class LocusInfo extends EventsScope {
55
168
  * @param {Meeting} meeting
56
169
  * @returns {undefined}
57
170
  */
58
- applyLocusDeltaData(action, locus, meeting) {
59
- const {DESYNC, USE_CURRENT, USE_INCOMING} = LocusDeltaParser.loci;
171
+ applyLocusDeltaData(action: string, locus: any, meeting: any) {
172
+ const {DESYNC, USE_CURRENT, USE_INCOMING, WAIT, LOCUS_URL_CHANGED} = LocusDeltaParser.loci;
60
173
 
61
174
  switch (action) {
62
175
  case USE_INCOMING:
63
176
  meeting.locusInfo.onDeltaLocus(locus);
64
177
  break;
65
178
  case USE_CURRENT:
66
- meeting.locusDesync = false;
67
- meeting.needToGetFullLocus = false;
179
+ case WAIT:
180
+ // do nothing
68
181
  break;
69
182
  case DESYNC:
70
- meeting.meetingRequest
71
- .getFullLocus({
72
- desync: true,
73
- locusUrl: meeting.locusUrl,
74
- })
75
- .then((res) => {
76
- meeting.locusInfo.onFullLocus(res.body);
77
- // Notify parser to resume processing delta events
78
- // now that we have full locus from DESYNC.
79
- this.locusParser.resume();
80
- });
183
+ case LOCUS_URL_CHANGED:
184
+ this.doLocusSync(meeting);
81
185
  break;
82
186
  default:
83
187
  LoggerProxy.logger.info(
@@ -94,7 +198,7 @@ export default class LocusInfo extends EventsScope {
94
198
  * @param {Meeting} meeting
95
199
  * @returns {undefined}
96
200
  */
97
- handleLocusDelta(locus, meeting) {
201
+ handleLocusDelta(locus: any, meeting: any) {
98
202
  // register a function to process delta actions
99
203
  if (!this.locusParser.onDeltaAction) {
100
204
  // delta action, along with associated loci
@@ -112,7 +216,7 @@ export default class LocusInfo extends EventsScope {
112
216
  * @returns {undefined}
113
217
  * @memberof LocusInfo
114
218
  */
115
- init(locus = {}) {
219
+ init(locus: any = {}) {
116
220
  this.created = locus.created || null;
117
221
  this.scheduledMeeting = locus.meeting || null;
118
222
  this.participantsUrl = locus.participantsUrl || null;
@@ -143,12 +247,13 @@ export default class LocusInfo extends EventsScope {
143
247
  */
144
248
  this.deltaParticipants = [];
145
249
 
250
+ this.updateLocusCache(locus);
146
251
  // above section only updates the locusInfo object
147
252
  // The below section makes sure it updates the locusInfo as well as updates the meeting object
148
253
  this.updateParticipants(locus.participants);
149
254
  // For 1:1 space meeting the conversation Url does not exist in locus.conversation
150
255
  this.updateConversationUrl(locus.conversationUrl, locus.info);
151
- this.updateControls(locus.controls);
256
+ this.updateControls(locus.controls, locus.self);
152
257
  this.updateLocusUrl(locus.url);
153
258
  this.updateFullState(locus.fullState);
154
259
  this.updateMeetingInfo(locus.info);
@@ -157,6 +262,7 @@ export default class LocusInfo extends EventsScope {
157
262
  this.updateSelf(locus.self, locus.participants);
158
263
  this.updateHostInfo(locus.host);
159
264
  this.updateMediaShares(locus.mediaShares);
265
+ this.updateServices(locus.links?.services);
160
266
  }
161
267
 
162
268
  /**
@@ -164,7 +270,8 @@ export default class LocusInfo extends EventsScope {
164
270
  * @returns {undefined}
165
271
  * @memberof LocusInfo
166
272
  */
167
- initialSetup(locus) {
273
+ initialSetup(locus: object) {
274
+ this.updateLocusCache(locus);
168
275
  this.onFullLocus(locus);
169
276
 
170
277
  // Change it to true after it receives it first locus object
@@ -177,9 +284,10 @@ export default class LocusInfo extends EventsScope {
177
284
  * @returns {undefined}
178
285
  * @memberof LocusInfo
179
286
  */
180
- parse(meeting, data) {
287
+ parse(meeting: any, data: any) {
288
+ // eslint-disable-next-line @typescript-eslint/no-shadow
181
289
  const {eventType} = data;
182
-
290
+ const locus = this.getTheLocusToUpdate(data.locus);
183
291
  LoggerProxy.logger.info(`Locus-info:index#parse --> received locus data: ${eventType}`);
184
292
 
185
293
  switch (eventType) {
@@ -197,16 +305,16 @@ export default class LocusInfo extends EventsScope {
197
305
  case LOCUSEVENT.PARTICIPANT_DECLINED:
198
306
  case LOCUSEVENT.FLOOR_GRANTED:
199
307
  case LOCUSEVENT.FLOOR_RELEASED:
200
- this.onFullLocus(data.locus, eventType);
308
+ this.onFullLocus(locus, eventType);
201
309
  break;
202
310
  case LOCUSEVENT.DIFFERENCE:
203
- this.handleLocusDelta(data.locus, meeting);
311
+ this.handleLocusDelta(locus, meeting);
204
312
  break;
205
313
 
206
314
  default:
207
315
  // Why will there be a event with no eventType ????
208
316
  // we may not need this, we can get full locus
209
- this.handleLocusDelta(data.locus, meeting);
317
+ this.handleLocusDelta(locus, meeting);
210
318
  }
211
319
  }
212
320
 
@@ -217,28 +325,38 @@ export default class LocusInfo extends EventsScope {
217
325
  * @returns {undefined}
218
326
  * @memberof LocusInfo
219
327
  */
220
- emitScoped(scope, eventName, args) {
328
+ emitScoped(scope?: any, eventName?: string, args?: any) {
221
329
  return this.emit(scope, eventName, args);
222
330
  }
223
331
 
224
332
  /**
225
333
  * updates the locus with full locus object
226
334
  * @param {object} locus locus object
227
- * @param {sting} eventType particulat locus event
335
+ * @param {string} eventType particulat locus event
228
336
  * @returns {object} null
229
337
  * @memberof LocusInfo
230
338
  */
231
- onFullLocus(locus, eventType) {
339
+ onFullLocus(locus: any, eventType?: string) {
232
340
  if (!locus) {
233
341
  LoggerProxy.logger.error(
234
342
  'Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.'
235
343
  );
236
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
+
237
354
  this.updateParticipantDeltas(locus.participants);
238
355
  this.scheduledMeeting = locus.meeting || null;
239
356
  this.participants = locus.participants;
357
+ const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);
240
358
  this.updateLocusInfo(locus);
241
- this.updateParticipants(locus.participants);
359
+ this.updateParticipants(locus.participants, isReplaceMembers);
242
360
  this.isMeetingActive();
243
361
  this.handleOneOnOneEvent(eventType);
244
362
  this.updateEmbeddedApps(locus.embeddedApps);
@@ -252,7 +370,8 @@ export default class LocusInfo extends EventsScope {
252
370
  * @returns {undefined}
253
371
  * @memberof LocusInfo
254
372
  */
255
- handleOneOnOneEvent(eventType) {
373
+ // eslint-disable-next-line @typescript-eslint/no-shadow
374
+ handleOneOnOneEvent(eventType: string) {
256
375
  if (
257
376
  this.parsedLocus.fullState.type === _CALL_ ||
258
377
  this.parsedLocus.fullState.type === _SIP_BRIDGE_
@@ -295,9 +414,10 @@ export default class LocusInfo extends EventsScope {
295
414
  * @returns {undefined}
296
415
  * @memberof LocusInfo
297
416
  */
298
- onDeltaLocus(locus) {
417
+ onDeltaLocus(locus: any) {
418
+ const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);
299
419
  this.updateLocusInfo(locus);
300
- this.updateParticipants(locus.participants);
420
+ this.updateParticipants(locus.participants, isReplaceMembers);
301
421
  this.isMeetingActive();
302
422
  }
303
423
 
@@ -307,7 +427,14 @@ export default class LocusInfo extends EventsScope {
307
427
  * @memberof LocusInfo
308
428
  */
309
429
  updateLocusInfo(locus) {
310
- this.updateControls(locus.controls);
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);
311
438
  this.updateConversationUrl(locus.conversationUrl, locus.info);
312
439
  this.updateCreated(locus.created);
313
440
  this.updateFullState(locus.fullState);
@@ -324,6 +451,7 @@ export default class LocusInfo extends EventsScope {
324
451
  this.updateMemberShip(locus.membership);
325
452
  this.updateIdentifiers(locus.identities);
326
453
  this.updateEmbeddedApps(locus.embeddedApps);
454
+ this.updateServices(locus.links?.services);
327
455
  this.compareAndUpdate();
328
456
  // update which required to compare different objects from locus
329
457
  }
@@ -334,7 +462,7 @@ export default class LocusInfo extends EventsScope {
334
462
  * @returns {Array}
335
463
  * @memberof LocusInfo
336
464
  */
337
- getLocusPartner(participants, self) {
465
+ getLocusPartner(participants: Array<any>, self: any) {
338
466
  if (!participants || participants.length === 0) {
339
467
  return null;
340
468
  }
@@ -345,6 +473,7 @@ export default class LocusInfo extends EventsScope {
345
473
  self &&
346
474
  participant.identity !== self.identity &&
347
475
  (participants.length <= 2 || (participant.type === _USER_ && !participant.removed))
476
+ // @ts-ignore
348
477
  ) || this.partner
349
478
  );
350
479
  }
@@ -359,6 +488,7 @@ export default class LocusInfo extends EventsScope {
359
488
  this.parsedLocus.fullState.type === _CALL_ ||
360
489
  this.parsedLocus.fullState.type === _SIP_BRIDGE_
361
490
  ) {
491
+ // @ts-ignore
362
492
  const partner = this.getLocusPartner(this.participants, this.self);
363
493
 
364
494
  this.updateMeeting({partner});
@@ -375,10 +505,15 @@ export default class LocusInfo extends EventsScope {
375
505
  LoggerProxy.logger.warn(
376
506
  'Locus-info:index#isMeetingActive --> Call Ended, locus state is inactive.'
377
507
  );
378
- Metrics.postEvent({
379
- event: eventType.REMOTE_ENDED,
380
- 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
+ },
381
515
  });
516
+
382
517
  this.emitScoped(
383
518
  {
384
519
  file: 'locus-info',
@@ -390,17 +525,19 @@ export default class LocusInfo extends EventsScope {
390
525
  shouldLeave: false,
391
526
  }
392
527
  );
393
- }
394
- else if (
528
+ } else if (
395
529
  partner.state === MEETING_STATE.STATES.LEFT &&
396
530
  this.parsedLocus.self &&
397
531
  (this.parsedLocus.self.state === MEETING_STATE.STATES.DECLINED ||
398
532
  this.parsedLocus.self.state === MEETING_STATE.STATES.NOTIFIED ||
399
533
  this.parsedLocus.self.state === MEETING_STATE.STATES.JOINED)
400
534
  ) {
401
- Metrics.postEvent({
402
- event: eventType.REMOTE_ENDED,
403
- 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
+ },
404
541
  });
405
542
  this.emitScoped(
406
543
  {
@@ -414,8 +551,7 @@ export default class LocusInfo extends EventsScope {
414
551
  this.parsedLocus.self.joinedWith && this.parsedLocus.self.joinedWith.state !== _LEFT_,
415
552
  }
416
553
  );
417
- }
418
- else if (
554
+ } else if (
419
555
  this.parsedLocus.self &&
420
556
  this.parsedLocus.self.state === MEETING_STATE.STATES.LEFT &&
421
557
  (partner.state === MEETING_STATE.STATES.LEFT ||
@@ -423,10 +559,14 @@ export default class LocusInfo extends EventsScope {
423
559
  partner.state === MEETING_STATE.STATES.NOTIFIED ||
424
560
  partner.state === MEETING_STATE.STATES.IDLE) // Happens when user just joins and adds no Media
425
561
  ) {
426
- Metrics.postEvent({
427
- event: eventType.REMOTE_ENDED,
428
- 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
+ },
429
568
  });
569
+
430
570
  this.emitScoped(
431
571
  {
432
572
  file: 'locus-info',
@@ -439,19 +579,23 @@ export default class LocusInfo extends EventsScope {
439
579
  }
440
580
  );
441
581
  }
442
- }
443
- else if (this.parsedLocus.fullState.type === _MEETING_) {
582
+ } else if (this.parsedLocus.fullState.type === _MEETING_) {
444
583
  if (
445
584
  this.fullState &&
446
585
  (this.fullState.state === LOCUS.STATE.INACTIVE ||
586
+ // @ts-ignore
447
587
  this.fullState.state === LOCUS.STATE.TERMINATING)
448
588
  ) {
449
589
  LoggerProxy.logger.warn(
450
590
  'Locus-info:index#isMeetingActive --> Meeting is ending due to inactive or terminating'
451
591
  );
452
- Metrics.postEvent({
453
- event: eventType.REMOTE_ENDED,
454
- 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
+ },
455
599
  });
456
600
  this.emitScoped(
457
601
  {
@@ -464,12 +608,15 @@ export default class LocusInfo extends EventsScope {
464
608
  shouldLeave: false,
465
609
  }
466
610
  );
467
- }
468
- else if (this.fullState && this.fullState.removed) {
611
+ } else if (this.fullState && this.fullState.removed) {
469
612
  // user has been dropped from a meeting
470
- Metrics.postEvent({
471
- event: eventType.REMOTE_ENDED,
472
- 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
+ },
473
620
  });
474
621
  this.emitScoped(
475
622
  {
@@ -499,8 +646,7 @@ export default class LocusInfo extends EventsScope {
499
646
  }
500
647
  );
501
648
  }
502
- }
503
- else {
649
+ } else {
504
650
  LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Meeting Type is unknown.');
505
651
  }
506
652
  }
@@ -543,8 +689,7 @@ export default class LocusInfo extends EventsScope {
543
689
  canAssignHost: true,
544
690
  }
545
691
  );
546
- }
547
- else {
692
+ } else {
548
693
  this.emitScoped(
549
694
  {
550
695
  file: 'locus-info',
@@ -565,13 +710,13 @@ export default class LocusInfo extends EventsScope {
565
710
  * @param {Array} [participants] - The participants to update against.
566
711
  * @returns {void}
567
712
  */
568
- updateParticipantDeltas(participants = []) {
713
+ updateParticipantDeltas(participants: Array<any> = []) {
569
714
  // Used to find a participant within a participants collection.
570
715
  const findParticipant = (participant, collection) =>
571
716
  collection.find((item) => item.person.id === participant.person.id);
572
717
 
573
718
  // Generates an object that indicates which state properties have changed.
574
- const generateDelta = (prevState = {}, newState = {}) => {
719
+ const generateDelta = (prevState: any = {}, newState: any = {}) => {
575
720
  // Setup deltas.
576
721
  const deltas = {
577
722
  audioStatus: prevState.audioStatus !== newState.audioStatus,
@@ -608,13 +753,13 @@ export default class LocusInfo extends EventsScope {
608
753
  }
609
754
 
610
755
  /**
611
- *
756
+ * update meeting's members
612
757
  * @param {Object} participants new participants object
613
- * @param {boolen} deltaParticpantFlag delta event
758
+ * @param {Boolean} isReplace is replace the whole members
614
759
  * @returns {Array} updatedParticipants
615
760
  * @memberof LocusInfo
616
761
  */
617
- updateParticipants(participants) {
762
+ updateParticipants(participants: object, isReplace?: boolean) {
618
763
  this.emitScoped(
619
764
  {
620
765
  file: 'locus-info',
@@ -627,16 +772,18 @@ export default class LocusInfo extends EventsScope {
627
772
  selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,
628
773
  selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,
629
774
  hostId: this.parsedLocus.host && this.parsedLocus.host.hostId,
775
+ isReplace,
630
776
  }
631
777
  );
632
778
  }
633
779
 
634
780
  /**
635
781
  * @param {Object} controls
782
+ * @param {Object} self
636
783
  * @returns {undefined}
637
784
  * @memberof LocusInfo
638
785
  */
639
- updateControls(controls) {
786
+ updateControls(controls: object, self: object) {
640
787
  if (controls && !isEqual(this.controls, controls)) {
641
788
  this.parsedLocus.controls = ControlsUtils.parse(controls);
642
789
  const {
@@ -646,23 +793,88 @@ export default class LocusInfo extends EventsScope {
646
793
  hasMeetingContainerChanged,
647
794
  hasTranscribeChanged,
648
795
  hasEntryExitToneChanged,
796
+ hasBreakoutChanged,
797
+ hasVideoEnabledChanged,
798
+ hasMuteOnEntryChanged,
799
+ hasShareControlChanged,
800
+ hasDisallowUnmuteChanged,
801
+ hasReactionsChanged,
802
+ hasReactionDisplayNamesChanged,
803
+ hasViewTheParticipantListChanged,
804
+ hasRaiseHandChanged,
805
+ hasVideoChanged,
806
+ hasInterpretationChanged,
649
807
  },
650
808
  current,
651
809
  } = ControlsUtils.getControls(this.controls, controls);
652
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
+
653
867
  if (hasRecordingChanged || hasRecordingPausedChanged) {
654
868
  let state = null;
655
869
 
656
870
  if (hasRecordingPausedChanged) {
657
871
  if (current.record.paused) {
658
872
  state = RECORDING_STATE.PAUSED;
659
- }
660
- else {
873
+ } else {
661
874
  // state will be `IDLE` if the recording is not active, even when there is a `pause` status change.
662
875
  state = current.record.recording ? RECORDING_STATE.RESUMED : RECORDING_STATE.IDLE;
663
876
  }
664
- }
665
- else if (hasRecordingChanged) {
877
+ } else if (hasRecordingChanged) {
666
878
  state = current.record.recording ? RECORDING_STATE.RECORDING : RECORDING_STATE.IDLE;
667
879
  }
668
880
 
@@ -711,9 +923,43 @@ export default class LocusInfo extends EventsScope {
711
923
  );
712
924
  }
713
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
+
714
958
  if (hasEntryExitToneChanged) {
715
959
  const {entryExitTone} = current;
716
960
 
961
+ this.updateMeeting({entryExitTone});
962
+
717
963
  this.emitScoped(
718
964
  {
719
965
  file: 'locus-info',
@@ -721,11 +967,29 @@ export default class LocusInfo extends EventsScope {
721
967
  },
722
968
  LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED,
723
969
  {
724
- entryExitTone
970
+ entryExitTone,
725
971
  }
726
972
  );
973
+ }
727
974
 
728
- 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
+ );
729
993
  }
730
994
 
731
995
  this.controls = controls;
@@ -738,12 +1002,11 @@ export default class LocusInfo extends EventsScope {
738
1002
  * @returns {undefined}
739
1003
  * @memberof LocusInfo
740
1004
  */
741
- updateConversationUrl(conversationUrl, info) {
1005
+ updateConversationUrl(conversationUrl: string, info: any) {
742
1006
  if (conversationUrl && !isEqual(this.conversationUrl, conversationUrl)) {
743
1007
  this.conversationUrl = conversationUrl;
744
1008
  this.updateMeeting({conversationUrl});
745
- }
746
- else if (
1009
+ } else if (
747
1010
  info &&
748
1011
  info.conversationUrl &&
749
1012
  !isEqual(this.conversationUrl, info.conversationUrl)
@@ -758,18 +1021,39 @@ export default class LocusInfo extends EventsScope {
758
1021
  * @returns {undefined}
759
1022
  * @memberof LocusInfo
760
1023
  */
761
- updateCreated(created) {
1024
+ updateCreated(created: object) {
762
1025
  if (created && !isEqual(this.created, created)) {
763
1026
  this.created = created;
764
1027
  }
765
1028
  }
766
1029
 
1030
+ /**
1031
+ * @param {Object} services
1032
+ * @returns {undefined}
1033
+ * @memberof LocusInfo
1034
+ */
1035
+ updateServices(services: Record<'breakout' | 'record', {url: string}>) {
1036
+ if (services && !isEqual(this.services, services)) {
1037
+ this.services = services;
1038
+ this.emitScoped(
1039
+ {
1040
+ file: 'locus-info',
1041
+ function: 'updateServices',
1042
+ },
1043
+ LOCUSINFO.EVENTS.LINKS_SERVICES,
1044
+ {
1045
+ services,
1046
+ }
1047
+ );
1048
+ }
1049
+ }
1050
+
767
1051
  /**
768
1052
  * @param {Object} fullState
769
1053
  * @returns {undefined}
770
1054
  * @memberof LocusInfo
771
1055
  */
772
- updateFullState(fullState) {
1056
+ updateFullState(fullState: object) {
773
1057
  if (fullState && !isEqual(this.fullState, fullState)) {
774
1058
  const result = FullState.getFullState(this.fullState, fullState);
775
1059
 
@@ -813,7 +1097,7 @@ export default class LocusInfo extends EventsScope {
813
1097
  * @memberof LocusInfo
814
1098
  * emits internal event locus_info_update_host
815
1099
  */
816
- updateHostInfo(host) {
1100
+ updateHostInfo(host: object) {
817
1101
  if (host && !isEqual(this.host, host)) {
818
1102
  const parsedHosts = HostUtils.getHosts(this.host, host);
819
1103
 
@@ -834,8 +1118,7 @@ export default class LocusInfo extends EventsScope {
834
1118
  );
835
1119
  }
836
1120
  this.host = host;
837
- }
838
- else {
1121
+ } else {
839
1122
  this.compareAndUpdateFlags.compareSelfAndHost = false;
840
1123
  }
841
1124
  }
@@ -846,21 +1129,15 @@ export default class LocusInfo extends EventsScope {
846
1129
  * @returns {undefined}
847
1130
  * @memberof LocusInfo
848
1131
  */
849
- updateMeetingInfo(info, self) {
850
- if (info && !isEqual(this.info, info)) {
851
- const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
1132
+ updateMeetingInfo(info: object, self?: object) {
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
+ ) {
852
1138
  const isJoined = SelfUtils.isJoined(self || this.parsedLocus.self);
853
1139
  const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles, isJoined);
854
1140
 
855
- this.emitScoped(
856
- {
857
- file: 'locus-info',
858
- function: 'updateMeetingInfo',
859
- },
860
- LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,
861
- {info: parsedInfo.current, self}
862
- );
863
-
864
1141
  if (parsedInfo.updates.isLocked) {
865
1142
  this.emitScoped(
866
1143
  {
@@ -886,7 +1163,19 @@ export default class LocusInfo extends EventsScope {
886
1163
  this.parsedLocus.info = parsedInfo.current;
887
1164
  // Parses the info and adds necessary values
888
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
+ {
1174
+ isInitializing: !self, // if self is undefined, then the update is caused by locus init
1175
+ }
1176
+ );
889
1177
  }
1178
+ this.roles = roles;
890
1179
  }
891
1180
 
892
1181
  /**
@@ -894,7 +1183,7 @@ export default class LocusInfo extends EventsScope {
894
1183
  * @returns {undefined}
895
1184
  * @memberof LocusInfo
896
1185
  */
897
- updateEmbeddedApps(embeddedApps) {
1186
+ updateEmbeddedApps(embeddedApps: object) {
898
1187
  // don't do anything if the arrays of apps haven't changed significantly
899
1188
  if (EmbeddedAppsUtils.areSimilar(this.embeddedApps, embeddedApps)) {
900
1189
  return;
@@ -922,11 +1211,13 @@ export default class LocusInfo extends EventsScope {
922
1211
  * @memberof LocusInfo
923
1212
  * emits internal event locus_info_update_media_shares
924
1213
  */
925
- updateMediaShares(mediaShares) {
1214
+ updateMediaShares(mediaShares: object) {
926
1215
  if (mediaShares && !isEqual(this.mediaShares, mediaShares)) {
927
1216
  const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);
928
1217
 
929
1218
  this.updateMeeting(parsedMediaShares.current);
1219
+ this.parsedLocus.mediaShares = parsedMediaShares.current;
1220
+ this.mediaShares = mediaShares;
930
1221
  this.emitScoped(
931
1222
  {
932
1223
  file: 'locus-info',
@@ -938,8 +1229,6 @@ export default class LocusInfo extends EventsScope {
938
1229
  previous: parsedMediaShares.previous,
939
1230
  }
940
1231
  );
941
- this.parsedLocus.mediaShares = parsedMediaShares.current;
942
- this.mediaShares = mediaShares;
943
1232
  }
944
1233
  }
945
1234
 
@@ -948,7 +1237,7 @@ export default class LocusInfo extends EventsScope {
948
1237
  * @returns {undefined}
949
1238
  * @memberof LocusInfo
950
1239
  */
951
- updateParticipantsUrl(participantsUrl) {
1240
+ updateParticipantsUrl(participantsUrl: string) {
952
1241
  if (participantsUrl && !isEqual(this.participantsUrl, participantsUrl)) {
953
1242
  this.participantsUrl = participantsUrl;
954
1243
  }
@@ -959,7 +1248,7 @@ export default class LocusInfo extends EventsScope {
959
1248
  * @returns {undefined}
960
1249
  * @memberof LocusInfo
961
1250
  */
962
- updateReplace(replace) {
1251
+ updateReplace(replace: object) {
963
1252
  if (replace && !isEqual(this.replace, replace)) {
964
1253
  this.replace = replace;
965
1254
  }
@@ -973,8 +1262,10 @@ export default class LocusInfo extends EventsScope {
973
1262
  * @memberof LocusInfo
974
1263
  * emits internal events self_admitted_guest, self_unadmitted_guest, locus_info_update_self
975
1264
  */
976
- updateSelf(self, participants) {
1265
+ updateSelf(self: any, participants: Array<any>) {
1266
+ // @ts-ignore - check where this.self come from
977
1267
  if (self && !isEqual(this.self, self)) {
1268
+ // @ts-ignore
978
1269
  const parsedSelves = SelfUtils.getSelves(this.self, self, this.webex.internal.device.url);
979
1270
 
980
1271
  this.updateMeeting(parsedSelves.current);
@@ -1000,8 +1291,7 @@ export default class LocusInfo extends EventsScope {
1000
1291
 
1001
1292
  if (parsedSelves.updates.moderatorChanged) {
1002
1293
  this.compareAndUpdateFlags.compareHostAndSelf = true;
1003
- }
1004
- else {
1294
+ } else {
1005
1295
  this.compareAndUpdateFlags.compareHostAndSelf = false;
1006
1296
  }
1007
1297
 
@@ -1016,6 +1306,31 @@ export default class LocusInfo extends EventsScope {
1016
1306
  );
1017
1307
  }
1018
1308
 
1309
+ if (parsedSelves.updates.breakoutsChanged) {
1310
+ this.emitScoped(
1311
+ {
1312
+ file: 'locus-info',
1313
+ function: 'updateSelf',
1314
+ },
1315
+ LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED,
1316
+ {breakoutSessions: parsedSelves.current.breakoutSessions}
1317
+ );
1318
+ }
1319
+
1320
+ if (parsedSelves.updates.interpretationChanged) {
1321
+ this.emitScoped(
1322
+ {
1323
+ file: 'locus-info',
1324
+ function: 'updateSelf',
1325
+ },
1326
+ LOCUSINFO.EVENTS.SELF_MEETING_INTERPRETATION_CHANGED,
1327
+ {
1328
+ interpretation: parsedSelves.current.interpretation,
1329
+ selfParticipantId: parsedSelves.current.selfId,
1330
+ }
1331
+ );
1332
+ }
1333
+
1019
1334
  if (parsedSelves.updates.isMediaInactiveOrReleased) {
1020
1335
  this.emitScoped(
1021
1336
  {
@@ -1037,6 +1352,31 @@ export default class LocusInfo extends EventsScope {
1037
1352
  self
1038
1353
  );
1039
1354
  }
1355
+
1356
+ if (parsedSelves.updates.isRolesChanged) {
1357
+ this.emitScoped(
1358
+ {
1359
+ file: 'locus-info',
1360
+ function: 'updateSelf',
1361
+ },
1362
+ LOCUSINFO.EVENTS.SELF_ROLES_CHANGED,
1363
+ {oldRoles: parsedSelves.previous?.roles, newRoles: parsedSelves.current?.roles}
1364
+ );
1365
+ }
1366
+
1367
+ if (parsedSelves.updates.isVideoMutedByOthersChanged) {
1368
+ this.emitScoped(
1369
+ {
1370
+ file: 'locus-info',
1371
+ function: 'updateSelf',
1372
+ },
1373
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
1374
+ {
1375
+ muted: parsedSelves.current.remoteVideoMuted,
1376
+ // unmuteAllowed: not part of .self
1377
+ }
1378
+ );
1379
+ }
1040
1380
  if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {
1041
1381
  this.emitScoped(
1042
1382
  {
@@ -1100,6 +1440,7 @@ export default class LocusInfo extends EventsScope {
1100
1440
  file: 'locus-info',
1101
1441
  function: 'updateSelf',
1102
1442
  },
1443
+ // @ts-ignore
1103
1444
  LOCUSINFO.EVENTS.MEDIA_INACTIVITY,
1104
1445
  SelfUtils.getMediaStatus(self.mediaSessions)
1105
1446
  );
@@ -1168,9 +1509,9 @@ export default class LocusInfo extends EventsScope {
1168
1509
  }
1169
1510
  );
1170
1511
  this.parsedLocus.self = parsedSelves.current;
1512
+ // @ts-ignore
1171
1513
  this.self = self;
1172
- }
1173
- else {
1514
+ } else {
1174
1515
  this.compareAndUpdateFlags.compareHostAndSelf = false;
1175
1516
  }
1176
1517
  }
@@ -1181,7 +1522,7 @@ export default class LocusInfo extends EventsScope {
1181
1522
  * @returns {undefined}
1182
1523
  * emits internal event locus_info_update_url
1183
1524
  */
1184
- updateLocusUrl(url) {
1525
+ updateLocusUrl(url: string) {
1185
1526
  if (url && this.url !== url) {
1186
1527
  this.url = url;
1187
1528
  this.updateMeeting({locusUrl: url});
@@ -1201,7 +1542,7 @@ export default class LocusInfo extends EventsScope {
1201
1542
  * @returns {undefined}
1202
1543
  * @memberof LocusInfo
1203
1544
  */
1204
- updateAclUrl(aclUrl) {
1545
+ updateAclUrl(aclUrl: string) {
1205
1546
  if (aclUrl && !isEqual(this.aclUrl, aclUrl)) {
1206
1547
  this.aclUrl = aclUrl;
1207
1548
  }
@@ -1212,7 +1553,7 @@ export default class LocusInfo extends EventsScope {
1212
1553
  * @returns {undefined}
1213
1554
  * @memberof LocusInfo
1214
1555
  */
1215
- updateBasequence(baseSequence) {
1556
+ updateBasequence(baseSequence: number) {
1216
1557
  if (baseSequence && !isEqual(this.baseSequence, baseSequence)) {
1217
1558
  this.baseSequence = baseSequence;
1218
1559
  }
@@ -1223,7 +1564,7 @@ export default class LocusInfo extends EventsScope {
1223
1564
  * @returns {undefined}
1224
1565
  * @memberof LocusInfo
1225
1566
  */
1226
- updateSequence(sequence) {
1567
+ updateSequence(sequence: number) {
1227
1568
  if (sequence && !isEqual(this.sequence, sequence)) {
1228
1569
  this.sequence = sequence;
1229
1570
  }
@@ -1234,7 +1575,7 @@ export default class LocusInfo extends EventsScope {
1234
1575
  * @returns {undefined}
1235
1576
  * @memberof LocusInfo
1236
1577
  */
1237
- updateMemberShip(membership) {
1578
+ updateMemberShip(membership: object) {
1238
1579
  if (membership && !isEqual(this.membership, membership)) {
1239
1580
  this.membership = membership;
1240
1581
  }
@@ -1245,9 +1586,110 @@ export default class LocusInfo extends EventsScope {
1245
1586
  * @returns {undefined}
1246
1587
  * @memberof LocusInfo
1247
1588
  */
1248
- updateIdentifiers(identities) {
1589
+ updateIdentifiers(identities: Array<any>) {
1249
1590
  if (identities && !isEqual(this.identities, identities)) {
1250
1591
  this.identities = identities;
1251
1592
  }
1252
1593
  }
1594
+
1595
+ /**
1596
+ * check the locus is main session's one or not, if is main session's, update main session cache
1597
+ * @param {Object} locus
1598
+ * @returns {undefined}
1599
+ * @memberof LocusInfo
1600
+ */
1601
+ updateLocusCache(locus: any) {
1602
+ const isMainSessionDTO = ControlsUtils.isMainSessionDTO(locus);
1603
+ if (isMainSessionDTO) {
1604
+ this.updateMainSessionLocusCache(locus);
1605
+ }
1606
+ }
1607
+
1608
+ /**
1609
+ * if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)
1610
+ * if join breakout from main session, main session is not active for the attendee and remove main session locus cache
1611
+ * @param {Object} newLocus
1612
+ * @returns {Object}
1613
+ * @memberof LocusInfo
1614
+ */
1615
+ getTheLocusToUpdate(newLocus: any) {
1616
+ const switchStatus = ControlsUtils.getSessionSwitchStatus(this.controls, newLocus?.controls);
1617
+ if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {
1618
+ return cloneDeep(this.mainSessionLocusCache);
1619
+ }
1620
+ const isMainSessionDTO =
1621
+ this.mainSessionLocusCache && ControlsUtils.isMainSessionDTO(this.mainSessionLocusCache);
1622
+
1623
+ if (isMainSessionDTO) {
1624
+ const isActive =
1625
+ [LOCUS.STATE.ACTIVE, LOCUS.STATE.INITIALIZING, LOCUS.STATE.TERMINATING].includes(
1626
+ this.fullState?.state
1627
+ ) && !this.mainSessionLocusCache?.self?.removed;
1628
+
1629
+ if (!isActive) {
1630
+ this.clearMainSessionLocusCache();
1631
+ }
1632
+ }
1633
+
1634
+ return newLocus;
1635
+ }
1636
+
1637
+ /**
1638
+ * merge participants by participant id
1639
+ * @param {Array} participants
1640
+ * @param {Array} sourceParticipants
1641
+ * @returns {Array} merged participants
1642
+ * @memberof LocusInfo
1643
+ */
1644
+ // eslint-disable-next-line class-methods-use-this
1645
+ mergeParticipants(participants, sourceParticipants) {
1646
+ if (!sourceParticipants || !sourceParticipants.length) return participants;
1647
+ if (!participants || !participants.length) {
1648
+ return sourceParticipants;
1649
+ }
1650
+ sourceParticipants.forEach((participant) => {
1651
+ const existIndex = participants.findIndex((p) => p.id === participant.id);
1652
+ if (existIndex > -1) {
1653
+ participants.splice(existIndex, 1, participant);
1654
+ } else {
1655
+ participants.push(participant);
1656
+ }
1657
+ });
1658
+
1659
+ return participants;
1660
+ }
1661
+
1662
+ /**
1663
+ * need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout
1664
+ * @param {Object} mainLocus
1665
+ * @returns {undefined}
1666
+ * @memberof LocusInfo
1667
+ */
1668
+ updateMainSessionLocusCache(mainLocus: any) {
1669
+ if (!mainLocus) {
1670
+ return;
1671
+ }
1672
+ const locusClone = cloneDeep(mainLocus);
1673
+ if (this.mainSessionLocusCache) {
1674
+ // shallow merge and do special merge for participants
1675
+ assignWith(this.mainSessionLocusCache, locusClone, (objValue, srcValue, key) => {
1676
+ if (key === 'participants') {
1677
+ return this.mergeParticipants(objValue, srcValue);
1678
+ }
1679
+
1680
+ return srcValue || objValue;
1681
+ });
1682
+ } else {
1683
+ this.mainSessionLocusCache = locusClone;
1684
+ }
1685
+ }
1686
+
1687
+ /**
1688
+ * clear main session cache
1689
+ * @returns {undefined}
1690
+ * @memberof LocusInfo
1691
+ */
1692
+ clearMainSessionLocusCache() {
1693
+ this.mainSessionLocusCache = null;
1694
+ }
1253
1695
  }