@webex/plugin-meetings 3.0.0-beta.3 → 3.0.0-beta.300

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 (601) hide show
  1. package/README.md +46 -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 +9 -15
  75. package/dist/config.js.map +1 -1
  76. package/dist/constants.js +315 -68
  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 +114 -17
  89. package/dist/index.js.map +1 -1
  90. package/dist/interpretation/collection.js +23 -0
  91. package/dist/interpretation/collection.js.map +1 -0
  92. package/dist/interpretation/index.js +366 -0
  93. package/dist/interpretation/index.js.map +1 -0
  94. package/dist/interpretation/siLanguage.js +25 -0
  95. package/dist/interpretation/siLanguage.js.map +1 -0
  96. package/dist/locus-info/controlsUtils.js +101 -29
  97. package/dist/locus-info/controlsUtils.js.map +1 -1
  98. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  99. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  100. package/dist/locus-info/fullState.js +0 -15
  101. package/dist/locus-info/fullState.js.map +1 -1
  102. package/dist/locus-info/hostUtils.js +4 -12
  103. package/dist/locus-info/hostUtils.js.map +1 -1
  104. package/dist/locus-info/index.js +561 -246
  105. package/dist/locus-info/index.js.map +1 -1
  106. package/dist/locus-info/infoUtils.js +10 -38
  107. package/dist/locus-info/infoUtils.js.map +1 -1
  108. package/dist/locus-info/mediaSharesUtils.js +68 -38
  109. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  110. package/dist/locus-info/parser.js +314 -163
  111. package/dist/locus-info/parser.js.map +1 -1
  112. package/dist/locus-info/selfUtils.js +110 -92
  113. package/dist/locus-info/selfUtils.js.map +1 -1
  114. package/dist/media/index.js +103 -231
  115. package/dist/media/index.js.map +1 -1
  116. package/dist/media/properties.js +137 -222
  117. package/dist/media/properties.js.map +1 -1
  118. package/dist/media/util.js +2 -9
  119. package/dist/media/util.js.map +1 -1
  120. package/dist/mediaQualityMetrics/config.js +505 -495
  121. package/dist/mediaQualityMetrics/config.js.map +1 -1
  122. package/dist/meeting/in-meeting-actions.js +93 -14
  123. package/dist/meeting/in-meeting-actions.js.map +1 -1
  124. package/dist/meeting/index.js +4624 -3740
  125. package/dist/meeting/index.js.map +1 -1
  126. package/dist/meeting/locusMediaRequest.js +292 -0
  127. package/dist/meeting/locusMediaRequest.js.map +1 -0
  128. package/dist/meeting/muteState.js +249 -184
  129. package/dist/meeting/muteState.js.map +1 -1
  130. package/dist/meeting/request.js +400 -346
  131. package/dist/meeting/request.js.map +1 -1
  132. package/dist/meeting/request.type.js +7 -0
  133. package/dist/meeting/request.type.js.map +1 -0
  134. package/dist/meeting/state.js +21 -31
  135. package/dist/meeting/state.js.map +1 -1
  136. package/dist/meeting/util.js +598 -586
  137. package/dist/meeting/util.js.map +1 -1
  138. package/dist/meeting-info/collection.js +6 -25
  139. package/dist/meeting-info/collection.js.map +1 -1
  140. package/dist/meeting-info/index.js +87 -39
  141. package/dist/meeting-info/index.js.map +1 -1
  142. package/dist/meeting-info/meeting-info-v2.js +349 -283
  143. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  144. package/dist/meeting-info/request.js +3 -15
  145. package/dist/meeting-info/request.js.map +1 -1
  146. package/dist/meeting-info/util.js +98 -183
  147. package/dist/meeting-info/util.js.map +1 -1
  148. package/dist/meeting-info/utilv2.js +143 -234
  149. package/dist/meeting-info/utilv2.js.map +1 -1
  150. package/dist/meetings/collection.js +26 -19
  151. package/dist/meetings/collection.js.map +1 -1
  152. package/dist/meetings/index.js +813 -596
  153. package/dist/meetings/index.js.map +1 -1
  154. package/dist/meetings/meetings.types.js +7 -0
  155. package/dist/meetings/meetings.types.js.map +1 -0
  156. package/dist/meetings/request.js +26 -41
  157. package/dist/meetings/request.js.map +1 -1
  158. package/dist/meetings/util.js +183 -156
  159. package/dist/meetings/util.js.map +1 -1
  160. package/dist/member/index.js +135 -85
  161. package/dist/member/index.js.map +1 -1
  162. package/dist/member/types.js +25 -0
  163. package/dist/member/types.js.map +1 -0
  164. package/dist/member/util.js +158 -88
  165. package/dist/member/util.js.map +1 -1
  166. package/dist/members/collection.js +13 -12
  167. package/dist/members/collection.js.map +1 -1
  168. package/dist/members/index.js +194 -204
  169. package/dist/members/index.js.map +1 -1
  170. package/dist/members/request.js +113 -68
  171. package/dist/members/request.js.map +1 -1
  172. package/dist/members/types.js +15 -0
  173. package/dist/members/types.js.map +1 -0
  174. package/dist/members/util.js +324 -259
  175. package/dist/members/util.js.map +1 -1
  176. package/dist/metrics/constants.js +14 -7
  177. package/dist/metrics/constants.js.map +1 -1
  178. package/dist/metrics/index.js +11 -558
  179. package/dist/metrics/index.js.map +1 -1
  180. package/dist/multistream/mediaRequestManager.js +263 -50
  181. package/dist/multistream/mediaRequestManager.js.map +1 -1
  182. package/dist/multistream/receiveSlot.js +58 -65
  183. package/dist/multistream/receiveSlot.js.map +1 -1
  184. package/dist/multistream/receiveSlotManager.js +76 -95
  185. package/dist/multistream/receiveSlotManager.js.map +1 -1
  186. package/dist/multistream/remoteMedia.js +62 -76
  187. package/dist/multistream/remoteMedia.js.map +1 -1
  188. package/dist/multistream/remoteMediaGroup.js +66 -43
  189. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  190. package/dist/multistream/remoteMediaManager.js +536 -439
  191. package/dist/multistream/remoteMediaManager.js.map +1 -1
  192. package/dist/multistream/sendSlotManager.js +233 -0
  193. package/dist/multistream/sendSlotManager.js.map +1 -0
  194. package/dist/networkQualityMonitor/index.js +40 -59
  195. package/dist/networkQualityMonitor/index.js.map +1 -1
  196. package/dist/personal-meeting-room/index.js +21 -45
  197. package/dist/personal-meeting-room/index.js.map +1 -1
  198. package/dist/personal-meeting-room/request.js +1 -31
  199. package/dist/personal-meeting-room/request.js.map +1 -1
  200. package/dist/personal-meeting-room/util.js +0 -13
  201. package/dist/personal-meeting-room/util.js.map +1 -1
  202. package/dist/reachability/index.js +322 -200
  203. package/dist/reachability/index.js.map +1 -1
  204. package/dist/reachability/request.js +20 -26
  205. package/dist/reachability/request.js.map +1 -1
  206. package/dist/reactions/constants.js +13 -0
  207. package/dist/reactions/constants.js.map +1 -0
  208. package/dist/reactions/reactions.js +109 -0
  209. package/dist/reactions/reactions.js.map +1 -0
  210. package/dist/reactions/reactions.type.js +36 -0
  211. package/dist/reactions/reactions.type.js.map +1 -0
  212. package/dist/reconnection-manager/index.js +388 -476
  213. package/dist/reconnection-manager/index.js.map +1 -1
  214. package/dist/recording-controller/enums.js +17 -0
  215. package/dist/recording-controller/enums.js.map +1 -0
  216. package/dist/recording-controller/index.js +362 -0
  217. package/dist/recording-controller/index.js.map +1 -0
  218. package/dist/recording-controller/util.js +64 -0
  219. package/dist/recording-controller/util.js.map +1 -0
  220. package/dist/roap/index.js +99 -94
  221. package/dist/roap/index.js.map +1 -1
  222. package/dist/roap/request.js +131 -135
  223. package/dist/roap/request.js.map +1 -1
  224. package/dist/roap/turnDiscovery.js +151 -101
  225. package/dist/roap/turnDiscovery.js.map +1 -1
  226. package/dist/rtcMetrics/constants.js +12 -0
  227. package/dist/rtcMetrics/constants.js.map +1 -0
  228. package/dist/rtcMetrics/index.js +117 -0
  229. package/dist/rtcMetrics/index.js.map +1 -0
  230. package/dist/statsAnalyzer/global.js +1 -95
  231. package/dist/statsAnalyzer/global.js.map +1 -1
  232. package/dist/statsAnalyzer/index.js +416 -497
  233. package/dist/statsAnalyzer/index.js.map +1 -1
  234. package/dist/statsAnalyzer/mqaUtil.js +145 -88
  235. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  236. package/dist/transcription/index.js +22 -47
  237. package/dist/transcription/index.js.map +1 -1
  238. package/dist/types/annotation/annotation.types.d.ts +42 -0
  239. package/dist/types/annotation/constants.d.ts +31 -0
  240. package/dist/types/annotation/index.d.ts +117 -0
  241. package/dist/types/breakouts/breakout.d.ts +8 -0
  242. package/dist/types/breakouts/collection.d.ts +5 -0
  243. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  244. package/dist/types/breakouts/events.d.ts +8 -0
  245. package/dist/types/breakouts/index.d.ts +5 -0
  246. package/dist/types/breakouts/request.d.ts +22 -0
  247. package/dist/types/breakouts/utils.d.ts +15 -0
  248. package/dist/types/common/browser-detection.d.ts +9 -0
  249. package/dist/types/common/collection.d.ts +48 -0
  250. package/dist/types/common/config.d.ts +2 -0
  251. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  252. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  253. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  254. package/dist/types/common/errors/media.d.ts +15 -0
  255. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  256. package/dist/types/common/errors/parameter.d.ts +15 -0
  257. package/dist/types/common/errors/password-error.d.ts +15 -0
  258. package/dist/types/common/errors/permission.d.ts +14 -0
  259. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  260. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  261. package/dist/types/common/errors/reconnection.d.ts +15 -0
  262. package/dist/types/common/errors/stats.d.ts +15 -0
  263. package/dist/types/common/errors/webex-errors.d.ts +93 -0
  264. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  265. package/dist/types/common/events/events-scope.d.ts +17 -0
  266. package/dist/types/common/events/events.d.ts +12 -0
  267. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  268. package/dist/types/common/events/util.d.ts +2 -0
  269. package/dist/types/common/logs/logger-config.d.ts +2 -0
  270. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  271. package/dist/types/common/logs/request.d.ts +36 -0
  272. package/dist/types/common/queue.d.ts +34 -0
  273. package/dist/types/config.d.ts +71 -0
  274. package/dist/types/constants.d.ts +1066 -0
  275. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  276. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  277. package/dist/types/controls-options-manager/index.d.ts +136 -0
  278. package/dist/types/controls-options-manager/types.d.ts +43 -0
  279. package/dist/types/controls-options-manager/util.d.ts +1 -0
  280. package/dist/types/index.d.ts +7 -0
  281. package/dist/types/interpretation/collection.d.ts +5 -0
  282. package/dist/types/interpretation/index.d.ts +5 -0
  283. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  284. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  285. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  286. package/dist/types/locus-info/fullState.d.ts +2 -0
  287. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  288. package/dist/types/locus-info/index.d.ts +322 -0
  289. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  290. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  291. package/dist/types/locus-info/parser.d.ts +273 -0
  292. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  293. package/dist/types/media/index.d.ts +34 -0
  294. package/dist/types/media/properties.d.ts +93 -0
  295. package/dist/types/media/util.d.ts +2 -0
  296. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  297. package/dist/types/meeting/in-meeting-actions.d.ts +163 -0
  298. package/dist/types/meeting/index.d.ts +1676 -0
  299. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  300. package/dist/types/meeting/muteState.d.ts +184 -0
  301. package/dist/types/meeting/request.d.ts +290 -0
  302. package/dist/types/meeting/request.type.d.ts +11 -0
  303. package/dist/types/meeting/state.d.ts +9 -0
  304. package/dist/types/meeting/util.d.ts +102 -0
  305. package/dist/types/meeting-info/collection.d.ts +20 -0
  306. package/dist/types/meeting-info/index.d.ts +69 -0
  307. package/dist/types/meeting-info/meeting-info-v2.d.ts +123 -0
  308. package/dist/types/meeting-info/request.d.ts +22 -0
  309. package/dist/types/meeting-info/util.d.ts +2 -0
  310. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  311. package/dist/types/meetings/collection.d.ts +31 -0
  312. package/dist/types/meetings/index.d.ts +367 -0
  313. package/dist/types/meetings/meetings.types.d.ts +4 -0
  314. package/dist/types/meetings/request.d.ts +27 -0
  315. package/dist/types/meetings/util.d.ts +18 -0
  316. package/dist/types/member/index.d.ts +160 -0
  317. package/dist/types/member/types.d.ts +32 -0
  318. package/dist/types/member/util.d.ts +2 -0
  319. package/dist/types/members/collection.d.ts +29 -0
  320. package/dist/types/members/index.d.ts +353 -0
  321. package/dist/types/members/request.d.ts +114 -0
  322. package/dist/types/members/types.d.ts +25 -0
  323. package/dist/types/members/util.d.ts +215 -0
  324. package/dist/types/metrics/constants.d.ts +65 -0
  325. package/dist/types/metrics/index.d.ts +45 -0
  326. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  327. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  328. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  329. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  330. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  331. package/dist/types/multistream/remoteMediaManager.d.ts +285 -0
  332. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  333. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  334. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  335. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  336. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  337. package/dist/types/reachability/index.d.ts +194 -0
  338. package/dist/types/reachability/request.d.ts +39 -0
  339. package/dist/types/reactions/constants.d.ts +3 -0
  340. package/dist/types/reactions/reactions.d.ts +4 -0
  341. package/dist/types/reactions/reactions.type.d.ts +52 -0
  342. package/dist/types/reconnection-manager/index.d.ts +126 -0
  343. package/dist/types/recording-controller/enums.d.ts +7 -0
  344. package/dist/types/recording-controller/index.d.ts +207 -0
  345. package/dist/types/recording-controller/util.d.ts +14 -0
  346. package/dist/types/roap/index.d.ts +78 -0
  347. package/dist/types/roap/request.d.ts +39 -0
  348. package/dist/types/roap/turnDiscovery.d.ts +92 -0
  349. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  350. package/dist/types/rtcMetrics/index.d.ts +47 -0
  351. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  352. package/dist/types/statsAnalyzer/index.d.ts +201 -0
  353. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  354. package/dist/types/transcription/index.d.ts +64 -0
  355. package/dist/types/webinar/collection.d.ts +16 -0
  356. package/dist/types/webinar/index.d.ts +5 -0
  357. package/dist/webinar/collection.js +44 -0
  358. package/dist/webinar/collection.js.map +1 -0
  359. package/dist/webinar/index.js +69 -0
  360. package/dist/webinar/index.js.map +1 -0
  361. package/internal-README.md +7 -6
  362. package/package.json +29 -21
  363. package/src/annotation/annotation.types.ts +50 -0
  364. package/src/annotation/constants.ts +36 -0
  365. package/src/annotation/index.ts +328 -0
  366. package/src/breakouts/README.md +220 -0
  367. package/src/breakouts/breakout.ts +188 -0
  368. package/src/breakouts/collection.ts +19 -0
  369. package/src/breakouts/edit-lock-error.ts +25 -0
  370. package/src/breakouts/events.ts +56 -0
  371. package/src/breakouts/index.ts +925 -0
  372. package/src/breakouts/request.ts +55 -0
  373. package/src/breakouts/utils.ts +57 -0
  374. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  375. package/src/common/collection.ts +9 -7
  376. package/src/common/{config.js → config.ts} +1 -1
  377. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  378. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  379. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  380. package/src/common/errors/{media.js → media.ts} +11 -7
  381. package/src/common/errors/no-meeting-info.ts +24 -0
  382. package/src/common/errors/parameter.ts +11 -7
  383. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  384. package/src/common/errors/{permission.js → permission.ts} +10 -6
  385. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  386. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  387. package/src/common/errors/{stats.js → stats.ts} +11 -7
  388. package/src/common/errors/{webex-errors.js → webex-errors.ts} +51 -8
  389. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  390. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  391. package/src/common/events/{events.js → events.ts} +5 -1
  392. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  393. package/src/common/events/{util.js → util.ts} +2 -3
  394. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  395. package/src/common/logs/logger-proxy.ts +44 -0
  396. package/src/common/logs/{request.js → request.ts} +26 -9
  397. package/src/common/queue.ts +22 -9
  398. package/src/{config.js → config.ts} +18 -19
  399. package/src/constants.ts +260 -22
  400. package/src/controls-options-manager/constants.ts +5 -0
  401. package/src/controls-options-manager/enums.ts +18 -0
  402. package/src/controls-options-manager/index.ts +278 -0
  403. package/src/controls-options-manager/types.ts +59 -0
  404. package/src/controls-options-manager/util.ts +300 -0
  405. package/src/index.ts +40 -0
  406. package/src/interpretation/README.md +60 -0
  407. package/src/interpretation/collection.ts +19 -0
  408. package/src/interpretation/index.ts +332 -0
  409. package/src/interpretation/siLanguage.ts +18 -0
  410. package/src/locus-info/controlsUtils.ts +222 -0
  411. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  412. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  413. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  414. package/src/locus-info/{index.js → index.ts} +557 -119
  415. package/src/locus-info/{infoUtils.js → infoUtils.ts} +29 -10
  416. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +81 -17
  417. package/src/locus-info/{parser.js → parser.ts} +303 -104
  418. package/src/locus-info/{selfUtils.js → selfUtils.ts} +199 -68
  419. package/src/media/index.ts +458 -0
  420. package/src/media/properties.ts +283 -0
  421. package/src/media/{util.js → util.ts} +2 -2
  422. package/src/mediaQualityMetrics/config.ts +384 -0
  423. package/src/meeting/in-meeting-actions.ts +191 -3
  424. package/src/meeting/index.ts +7882 -0
  425. package/src/meeting/locusMediaRequest.ts +313 -0
  426. package/src/meeting/muteState.ts +451 -0
  427. package/src/meeting/{request.js → request.ts} +421 -220
  428. package/src/meeting/request.type.ts +13 -0
  429. package/src/meeting/{state.js → state.ts} +50 -35
  430. package/src/meeting/util.ts +697 -0
  431. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  432. package/src/meeting-info/index.ts +210 -0
  433. package/src/meeting-info/meeting-info-v2.ts +429 -0
  434. package/src/meeting-info/{request.js → request.ts} +14 -4
  435. package/src/meeting-info/{util.js → util.ts} +60 -51
  436. package/src/meeting-info/{utilv2.js → utilv2.ts} +78 -71
  437. package/src/meetings/{collection.js → collection.ts} +26 -3
  438. package/src/meetings/index.ts +1470 -0
  439. package/src/meetings/meetings.types.ts +12 -0
  440. package/src/meetings/{request.js → request.ts} +34 -25
  441. package/src/meetings/{util.js → util.ts} +132 -37
  442. package/src/member/{index.js → index.ts} +160 -56
  443. package/src/member/types.ts +38 -0
  444. package/src/member/util.ts +397 -0
  445. package/src/members/{collection.js → collection.ts} +10 -2
  446. package/src/members/{index.js → index.ts} +351 -146
  447. package/src/members/request.ts +255 -0
  448. package/src/members/types.ts +29 -0
  449. package/src/members/util.ts +353 -0
  450. package/src/metrics/{constants.js → constants.ts} +12 -6
  451. package/src/metrics/index.ts +73 -0
  452. package/src/multistream/mediaRequestManager.ts +337 -63
  453. package/src/multistream/receiveSlot.ts +69 -26
  454. package/src/multistream/receiveSlotManager.ts +66 -42
  455. package/src/multistream/remoteMedia.ts +40 -5
  456. package/src/multistream/remoteMediaGroup.ts +63 -3
  457. package/src/multistream/remoteMediaManager.ts +300 -66
  458. package/src/multistream/sendSlotManager.ts +170 -0
  459. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  460. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  461. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  462. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  463. package/src/reachability/index.ts +671 -0
  464. package/src/reachability/request.ts +50 -35
  465. package/src/reactions/constants.ts +4 -0
  466. package/src/reactions/reactions.ts +104 -0
  467. package/src/reactions/reactions.type.ts +62 -0
  468. package/src/reconnection-manager/{index.js → index.ts} +258 -138
  469. package/src/recording-controller/enums.ts +8 -0
  470. package/src/recording-controller/index.ts +332 -0
  471. package/src/recording-controller/util.ts +75 -0
  472. package/src/roap/{index.js → index.ts} +127 -79
  473. package/src/roap/request.ts +153 -0
  474. package/src/roap/turnDiscovery.ts +109 -47
  475. package/src/rtcMetrics/constants.ts +3 -0
  476. package/src/rtcMetrics/index.ts +100 -0
  477. package/src/statsAnalyzer/global.ts +37 -0
  478. package/src/statsAnalyzer/index.ts +1250 -0
  479. package/src/statsAnalyzer/mqaUtil.ts +292 -0
  480. package/src/transcription/{index.js → index.ts} +46 -39
  481. package/src/webinar/collection.ts +31 -0
  482. package/src/webinar/index.ts +62 -0
  483. package/test/integration/spec/converged-space-meetings.js +233 -0
  484. package/test/integration/spec/journey.js +790 -530
  485. package/test/integration/spec/space-meeting.js +391 -204
  486. package/test/integration/spec/transcription.js +7 -8
  487. package/test/unit/spec/annotation/index.ts +418 -0
  488. package/test/unit/spec/breakouts/breakout.ts +237 -0
  489. package/test/unit/spec/breakouts/collection.ts +15 -0
  490. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  491. package/test/unit/spec/breakouts/events.ts +89 -0
  492. package/test/unit/spec/breakouts/index.ts +1790 -0
  493. package/test/unit/spec/breakouts/request.ts +104 -0
  494. package/test/unit/spec/breakouts/utils.js +72 -0
  495. package/test/unit/spec/common/browser-detection.js +9 -28
  496. package/test/unit/spec/common/queue.js +31 -2
  497. package/test/unit/spec/controls-options-manager/index.js +287 -0
  498. package/test/unit/spec/controls-options-manager/util.js +582 -0
  499. package/test/unit/spec/fixture/locus.js +93 -90
  500. package/test/unit/spec/interpretation/collection.ts +15 -0
  501. package/test/unit/spec/interpretation/index.ts +589 -0
  502. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  503. package/test/unit/spec/locus-info/controlsUtils.js +325 -32
  504. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  505. package/test/unit/spec/locus-info/index.js +1390 -17
  506. package/test/unit/spec/locus-info/infoUtils.js +71 -40
  507. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  508. package/test/unit/spec/locus-info/lib/SeqCmp.json +529 -685
  509. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  510. package/test/unit/spec/locus-info/parser.js +119 -44
  511. package/test/unit/spec/locus-info/selfConstant.js +120 -103
  512. package/test/unit/spec/locus-info/selfUtils.js +296 -12
  513. package/test/unit/spec/media/index.ts +128 -77
  514. package/test/unit/spec/media/properties.ts +11 -11
  515. package/test/unit/spec/meeting/in-meeting-actions.ts +92 -3
  516. package/test/unit/spec/meeting/index.js +7433 -2752
  517. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  518. package/test/unit/spec/meeting/muteState.js +420 -211
  519. package/test/unit/spec/meeting/request.js +545 -79
  520. package/test/unit/spec/meeting/utils.js +722 -174
  521. package/test/unit/spec/meeting-info/index.js +300 -0
  522. package/test/unit/spec/meeting-info/meetinginfov2.js +624 -76
  523. package/test/unit/spec/meeting-info/request.js +7 -9
  524. package/test/unit/spec/meeting-info/util.js +11 -12
  525. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  526. package/test/unit/spec/meetings/collection.js +15 -1
  527. package/test/unit/spec/meetings/index.js +1365 -377
  528. package/test/unit/spec/meetings/utils.js +216 -14
  529. package/test/unit/spec/member/index.js +61 -7
  530. package/test/unit/spec/member/util.js +526 -26
  531. package/test/unit/spec/members/index.js +536 -55
  532. package/test/unit/spec/members/request.js +228 -40
  533. package/test/unit/spec/members/utils.js +217 -4
  534. package/test/unit/spec/metrics/index.js +12 -66
  535. package/test/unit/spec/multistream/mediaRequestManager.ts +1012 -109
  536. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  537. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  538. package/test/unit/spec/multistream/remoteMedia.ts +40 -2
  539. package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
  540. package/test/unit/spec/multistream/remoteMediaManager.ts +738 -65
  541. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  542. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  543. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  544. package/test/unit/spec/reachability/index.ts +598 -26
  545. package/test/unit/spec/reachability/request.js +68 -0
  546. package/test/unit/spec/reconnection-manager/index.js +181 -12
  547. package/test/unit/spec/recording-controller/index.js +307 -0
  548. package/test/unit/spec/recording-controller/util.js +229 -0
  549. package/test/unit/spec/roap/index.ts +179 -64
  550. package/test/unit/spec/roap/request.ts +232 -0
  551. package/test/unit/spec/roap/turnDiscovery.ts +123 -58
  552. package/test/unit/spec/rtcMetrics/index.ts +73 -0
  553. package/test/unit/spec/stats-analyzer/index.js +199 -60
  554. package/test/unit/spec/webinar/collection.ts +13 -0
  555. package/test/unit/spec/webinar/index.ts +60 -0
  556. package/test/utils/cmr.js +44 -42
  557. package/test/utils/constants.js +9 -0
  558. package/test/utils/integrationTestUtils.js +46 -0
  559. package/test/utils/testUtils.js +63 -99
  560. package/test/utils/webex-config.js +22 -18
  561. package/test/utils/webex-test-users.js +57 -50
  562. package/tsconfig.json +6 -0
  563. package/dist/media/internal-media-core-wrapper.js +0 -22
  564. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  565. package/dist/meeting/effectsState.js +0 -327
  566. package/dist/meeting/effectsState.js.map +0 -1
  567. package/dist/metrics/config.js +0 -301
  568. package/dist/metrics/config.js.map +0 -1
  569. package/dist/multistream/multistreamMedia.js +0 -116
  570. package/dist/multistream/multistreamMedia.js.map +0 -1
  571. package/dist/peer-connection-manager/util.js +0 -124
  572. package/dist/peer-connection-manager/util.js.map +0 -1
  573. package/src/common/logs/logger-proxy.js +0 -33
  574. package/src/index.js +0 -15
  575. package/src/locus-info/controlsUtils.js +0 -102
  576. package/src/media/index.js +0 -459
  577. package/src/media/internal-media-core-wrapper.ts +0 -9
  578. package/src/media/properties.js +0 -289
  579. package/src/mediaQualityMetrics/config.js +0 -382
  580. package/src/meeting/effectsState.js +0 -205
  581. package/src/meeting/index.js +0 -6284
  582. package/src/meeting/muteState.js +0 -318
  583. package/src/meeting/util.js +0 -506
  584. package/src/meeting-info/index.js +0 -131
  585. package/src/meeting-info/meeting-info-v2.js +0 -255
  586. package/src/meetings/index.js +0 -1015
  587. package/src/member/util.js +0 -254
  588. package/src/members/request.js +0 -131
  589. package/src/members/util.js +0 -258
  590. package/src/metrics/config.js +0 -324
  591. package/src/metrics/index.js +0 -530
  592. package/src/multistream/multistreamMedia.ts +0 -92
  593. package/src/peer-connection-manager/util.ts +0 -117
  594. package/src/reachability/index.js +0 -464
  595. package/src/roap/request.js +0 -127
  596. package/src/statsAnalyzer/global.js +0 -133
  597. package/src/statsAnalyzer/index.js +0 -1006
  598. package/src/statsAnalyzer/mqaUtil.js +0 -173
  599. package/test/unit/spec/meeting/effectsState.js +0 -291
  600. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  601. /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,16 @@ 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
+ );
889
1174
  }
1175
+ this.roles = roles;
890
1176
  }
891
1177
 
892
1178
  /**
@@ -894,7 +1180,7 @@ export default class LocusInfo extends EventsScope {
894
1180
  * @returns {undefined}
895
1181
  * @memberof LocusInfo
896
1182
  */
897
- updateEmbeddedApps(embeddedApps) {
1183
+ updateEmbeddedApps(embeddedApps: object) {
898
1184
  // don't do anything if the arrays of apps haven't changed significantly
899
1185
  if (EmbeddedAppsUtils.areSimilar(this.embeddedApps, embeddedApps)) {
900
1186
  return;
@@ -922,11 +1208,13 @@ export default class LocusInfo extends EventsScope {
922
1208
  * @memberof LocusInfo
923
1209
  * emits internal event locus_info_update_media_shares
924
1210
  */
925
- updateMediaShares(mediaShares) {
1211
+ updateMediaShares(mediaShares: object) {
926
1212
  if (mediaShares && !isEqual(this.mediaShares, mediaShares)) {
927
1213
  const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);
928
1214
 
929
1215
  this.updateMeeting(parsedMediaShares.current);
1216
+ this.parsedLocus.mediaShares = parsedMediaShares.current;
1217
+ this.mediaShares = mediaShares;
930
1218
  this.emitScoped(
931
1219
  {
932
1220
  file: 'locus-info',
@@ -938,8 +1226,6 @@ export default class LocusInfo extends EventsScope {
938
1226
  previous: parsedMediaShares.previous,
939
1227
  }
940
1228
  );
941
- this.parsedLocus.mediaShares = parsedMediaShares.current;
942
- this.mediaShares = mediaShares;
943
1229
  }
944
1230
  }
945
1231
 
@@ -948,7 +1234,7 @@ export default class LocusInfo extends EventsScope {
948
1234
  * @returns {undefined}
949
1235
  * @memberof LocusInfo
950
1236
  */
951
- updateParticipantsUrl(participantsUrl) {
1237
+ updateParticipantsUrl(participantsUrl: string) {
952
1238
  if (participantsUrl && !isEqual(this.participantsUrl, participantsUrl)) {
953
1239
  this.participantsUrl = participantsUrl;
954
1240
  }
@@ -959,7 +1245,7 @@ export default class LocusInfo extends EventsScope {
959
1245
  * @returns {undefined}
960
1246
  * @memberof LocusInfo
961
1247
  */
962
- updateReplace(replace) {
1248
+ updateReplace(replace: object) {
963
1249
  if (replace && !isEqual(this.replace, replace)) {
964
1250
  this.replace = replace;
965
1251
  }
@@ -973,8 +1259,10 @@ export default class LocusInfo extends EventsScope {
973
1259
  * @memberof LocusInfo
974
1260
  * emits internal events self_admitted_guest, self_unadmitted_guest, locus_info_update_self
975
1261
  */
976
- updateSelf(self, participants) {
1262
+ updateSelf(self: any, participants: Array<any>) {
1263
+ // @ts-ignore - check where this.self come from
977
1264
  if (self && !isEqual(this.self, self)) {
1265
+ // @ts-ignore
978
1266
  const parsedSelves = SelfUtils.getSelves(this.self, self, this.webex.internal.device.url);
979
1267
 
980
1268
  this.updateMeeting(parsedSelves.current);
@@ -1000,8 +1288,7 @@ export default class LocusInfo extends EventsScope {
1000
1288
 
1001
1289
  if (parsedSelves.updates.moderatorChanged) {
1002
1290
  this.compareAndUpdateFlags.compareHostAndSelf = true;
1003
- }
1004
- else {
1291
+ } else {
1005
1292
  this.compareAndUpdateFlags.compareHostAndSelf = false;
1006
1293
  }
1007
1294
 
@@ -1016,6 +1303,31 @@ export default class LocusInfo extends EventsScope {
1016
1303
  );
1017
1304
  }
1018
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
+
1019
1331
  if (parsedSelves.updates.isMediaInactiveOrReleased) {
1020
1332
  this.emitScoped(
1021
1333
  {
@@ -1037,6 +1349,31 @@ export default class LocusInfo extends EventsScope {
1037
1349
  self
1038
1350
  );
1039
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
+ }
1040
1377
  if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {
1041
1378
  this.emitScoped(
1042
1379
  {
@@ -1100,6 +1437,7 @@ export default class LocusInfo extends EventsScope {
1100
1437
  file: 'locus-info',
1101
1438
  function: 'updateSelf',
1102
1439
  },
1440
+ // @ts-ignore
1103
1441
  LOCUSINFO.EVENTS.MEDIA_INACTIVITY,
1104
1442
  SelfUtils.getMediaStatus(self.mediaSessions)
1105
1443
  );
@@ -1168,9 +1506,9 @@ export default class LocusInfo extends EventsScope {
1168
1506
  }
1169
1507
  );
1170
1508
  this.parsedLocus.self = parsedSelves.current;
1509
+ // @ts-ignore
1171
1510
  this.self = self;
1172
- }
1173
- else {
1511
+ } else {
1174
1512
  this.compareAndUpdateFlags.compareHostAndSelf = false;
1175
1513
  }
1176
1514
  }
@@ -1181,7 +1519,7 @@ export default class LocusInfo extends EventsScope {
1181
1519
  * @returns {undefined}
1182
1520
  * emits internal event locus_info_update_url
1183
1521
  */
1184
- updateLocusUrl(url) {
1522
+ updateLocusUrl(url: string) {
1185
1523
  if (url && this.url !== url) {
1186
1524
  this.url = url;
1187
1525
  this.updateMeeting({locusUrl: url});
@@ -1201,7 +1539,7 @@ export default class LocusInfo extends EventsScope {
1201
1539
  * @returns {undefined}
1202
1540
  * @memberof LocusInfo
1203
1541
  */
1204
- updateAclUrl(aclUrl) {
1542
+ updateAclUrl(aclUrl: string) {
1205
1543
  if (aclUrl && !isEqual(this.aclUrl, aclUrl)) {
1206
1544
  this.aclUrl = aclUrl;
1207
1545
  }
@@ -1212,7 +1550,7 @@ export default class LocusInfo extends EventsScope {
1212
1550
  * @returns {undefined}
1213
1551
  * @memberof LocusInfo
1214
1552
  */
1215
- updateBasequence(baseSequence) {
1553
+ updateBasequence(baseSequence: number) {
1216
1554
  if (baseSequence && !isEqual(this.baseSequence, baseSequence)) {
1217
1555
  this.baseSequence = baseSequence;
1218
1556
  }
@@ -1223,7 +1561,7 @@ export default class LocusInfo extends EventsScope {
1223
1561
  * @returns {undefined}
1224
1562
  * @memberof LocusInfo
1225
1563
  */
1226
- updateSequence(sequence) {
1564
+ updateSequence(sequence: number) {
1227
1565
  if (sequence && !isEqual(this.sequence, sequence)) {
1228
1566
  this.sequence = sequence;
1229
1567
  }
@@ -1234,7 +1572,7 @@ export default class LocusInfo extends EventsScope {
1234
1572
  * @returns {undefined}
1235
1573
  * @memberof LocusInfo
1236
1574
  */
1237
- updateMemberShip(membership) {
1575
+ updateMemberShip(membership: object) {
1238
1576
  if (membership && !isEqual(this.membership, membership)) {
1239
1577
  this.membership = membership;
1240
1578
  }
@@ -1245,9 +1583,109 @@ export default class LocusInfo extends EventsScope {
1245
1583
  * @returns {undefined}
1246
1584
  * @memberof LocusInfo
1247
1585
  */
1248
- updateIdentifiers(identities) {
1586
+ updateIdentifiers(identities: Array<any>) {
1249
1587
  if (identities && !isEqual(this.identities, identities)) {
1250
1588
  this.identities = identities;
1251
1589
  }
1252
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
+ }
1253
1691
  }