@webex/plugin-meetings 3.0.0-beta.1 → 3.0.0-beta.104

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 (548) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.js +48 -0
  6. package/dist/annotation/constants.js.map +1 -0
  7. package/dist/annotation/index.js +357 -0
  8. package/dist/annotation/index.js.map +1 -0
  9. package/dist/breakouts/breakout.js +176 -0
  10. package/dist/breakouts/breakout.js.map +1 -0
  11. package/dist/breakouts/collection.js +23 -0
  12. package/dist/breakouts/collection.js.map +1 -0
  13. package/dist/breakouts/edit-lock-error.js +52 -0
  14. package/dist/breakouts/edit-lock-error.js.map +1 -0
  15. package/dist/breakouts/events.js +43 -0
  16. package/dist/breakouts/events.js.map +1 -0
  17. package/dist/breakouts/index.js +919 -0
  18. package/dist/breakouts/index.js.map +1 -0
  19. package/dist/breakouts/request.js +78 -0
  20. package/dist/breakouts/request.js.map +1 -0
  21. package/dist/breakouts/utils.js +67 -0
  22. package/dist/breakouts/utils.js.map +1 -0
  23. package/dist/common/browser-detection.js +1 -20
  24. package/dist/common/browser-detection.js.map +1 -1
  25. package/dist/common/collection.js +5 -20
  26. package/dist/common/collection.js.map +1 -1
  27. package/dist/common/config.js +0 -7
  28. package/dist/common/config.js.map +1 -1
  29. package/dist/common/errors/captcha-error.js +10 -24
  30. package/dist/common/errors/captcha-error.js.map +1 -1
  31. package/dist/common/errors/intent-to-join.js +11 -24
  32. package/dist/common/errors/intent-to-join.js.map +1 -1
  33. package/dist/common/errors/join-meeting.js +12 -25
  34. package/dist/common/errors/join-meeting.js.map +1 -1
  35. package/dist/common/errors/media.js +10 -24
  36. package/dist/common/errors/media.js.map +1 -1
  37. package/dist/common/errors/parameter.js +5 -33
  38. package/dist/common/errors/parameter.js.map +1 -1
  39. package/dist/common/errors/password-error.js +10 -24
  40. package/dist/common/errors/password-error.js.map +1 -1
  41. package/dist/common/errors/permission.js +9 -23
  42. package/dist/common/errors/permission.js.map +1 -1
  43. package/dist/common/errors/reconnection-in-progress.js +0 -17
  44. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  45. package/dist/common/errors/reconnection.js +10 -24
  46. package/dist/common/errors/reconnection.js.map +1 -1
  47. package/dist/common/errors/stats.js +10 -24
  48. package/dist/common/errors/stats.js.map +1 -1
  49. package/dist/common/errors/webex-errors.js +10 -69
  50. package/dist/common/errors/webex-errors.js.map +1 -1
  51. package/dist/common/errors/webex-meetings-error.js +5 -25
  52. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  53. package/dist/common/events/events-scope.js +0 -22
  54. package/dist/common/events/events-scope.js.map +1 -1
  55. package/dist/common/events/events.js +0 -23
  56. package/dist/common/events/events.js.map +1 -1
  57. package/dist/common/events/trigger-proxy.js +0 -12
  58. package/dist/common/events/trigger-proxy.js.map +1 -1
  59. package/dist/common/events/util.js +0 -15
  60. package/dist/common/events/util.js.map +1 -1
  61. package/dist/common/logs/logger-config.js +0 -4
  62. package/dist/common/logs/logger-config.js.map +1 -1
  63. package/dist/common/logs/logger-proxy.js +1 -8
  64. package/dist/common/logs/logger-proxy.js.map +1 -1
  65. package/dist/common/logs/request.js +37 -60
  66. package/dist/common/logs/request.js.map +1 -1
  67. package/dist/common/queue.js +4 -14
  68. package/dist/common/queue.js.map +1 -1
  69. package/dist/config.js +7 -6
  70. package/dist/config.js.map +1 -1
  71. package/dist/constants.js +184 -122
  72. package/dist/constants.js.map +1 -1
  73. package/dist/controls-options-manager/constants.js +14 -0
  74. package/dist/controls-options-manager/constants.js.map +1 -0
  75. package/dist/controls-options-manager/enums.js +25 -0
  76. package/dist/controls-options-manager/enums.js.map +1 -0
  77. package/dist/controls-options-manager/index.js +297 -0
  78. package/dist/controls-options-manager/index.js.map +1 -0
  79. package/dist/controls-options-manager/types.js +7 -0
  80. package/dist/controls-options-manager/types.js.map +1 -0
  81. package/dist/controls-options-manager/util.js +250 -0
  82. package/dist/controls-options-manager/util.js.map +1 -0
  83. package/dist/index.js +72 -17
  84. package/dist/index.js.map +1 -1
  85. package/dist/locus-info/controlsUtils.js +56 -29
  86. package/dist/locus-info/controlsUtils.js.map +1 -1
  87. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  88. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  89. package/dist/locus-info/fullState.js +0 -15
  90. package/dist/locus-info/fullState.js.map +1 -1
  91. package/dist/locus-info/hostUtils.js +4 -12
  92. package/dist/locus-info/hostUtils.js.map +1 -1
  93. package/dist/locus-info/index.js +362 -208
  94. package/dist/locus-info/index.js.map +1 -1
  95. package/dist/locus-info/infoUtils.js +3 -37
  96. package/dist/locus-info/infoUtils.js.map +1 -1
  97. package/dist/locus-info/mediaSharesUtils.js +12 -38
  98. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  99. package/dist/locus-info/parser.js +92 -118
  100. package/dist/locus-info/parser.js.map +1 -1
  101. package/dist/locus-info/selfUtils.js +99 -91
  102. package/dist/locus-info/selfUtils.js.map +1 -1
  103. package/dist/media/index.js +113 -337
  104. package/dist/media/index.js.map +1 -1
  105. package/dist/media/properties.js +96 -135
  106. package/dist/media/properties.js.map +1 -1
  107. package/dist/media/util.js +1 -35
  108. package/dist/media/util.js.map +1 -1
  109. package/dist/mediaQualityMetrics/config.js +505 -495
  110. package/dist/mediaQualityMetrics/config.js.map +1 -1
  111. package/dist/meeting/in-meeting-actions.js +59 -14
  112. package/dist/meeting/in-meeting-actions.js.map +1 -1
  113. package/dist/meeting/index.js +2909 -2398
  114. package/dist/meeting/index.js.map +1 -1
  115. package/dist/meeting/muteState.js +257 -112
  116. package/dist/meeting/muteState.js.map +1 -1
  117. package/dist/meeting/request.js +330 -264
  118. package/dist/meeting/request.js.map +1 -1
  119. package/dist/meeting/request.type.js +7 -0
  120. package/dist/meeting/request.type.js.map +1 -0
  121. package/dist/meeting/state.js +21 -31
  122. package/dist/meeting/state.js.map +1 -1
  123. package/dist/meeting/util.js +63 -261
  124. package/dist/meeting/util.js.map +1 -1
  125. package/dist/meeting-info/collection.js +6 -25
  126. package/dist/meeting-info/collection.js.map +1 -1
  127. package/dist/meeting-info/index.js +14 -32
  128. package/dist/meeting-info/index.js.map +1 -1
  129. package/dist/meeting-info/meeting-info-v2.js +273 -280
  130. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  131. package/dist/meeting-info/request.js +3 -15
  132. package/dist/meeting-info/request.js.map +1 -1
  133. package/dist/meeting-info/util.js +98 -183
  134. package/dist/meeting-info/util.js.map +1 -1
  135. package/dist/meeting-info/utilv2.js +155 -232
  136. package/dist/meeting-info/utilv2.js.map +1 -1
  137. package/dist/meetings/collection.js +26 -19
  138. package/dist/meetings/collection.js.map +1 -1
  139. package/dist/meetings/index.js +741 -548
  140. package/dist/meetings/index.js.map +1 -1
  141. package/dist/meetings/request.js +26 -41
  142. package/dist/meetings/request.js.map +1 -1
  143. package/dist/meetings/util.js +194 -149
  144. package/dist/meetings/util.js.map +1 -1
  145. package/dist/member/index.js +100 -85
  146. package/dist/member/index.js.map +1 -1
  147. package/dist/member/types.js +15 -0
  148. package/dist/member/types.js.map +1 -0
  149. package/dist/member/util.js +90 -68
  150. package/dist/member/util.js.map +1 -1
  151. package/dist/members/collection.js +13 -12
  152. package/dist/members/collection.js.map +1 -1
  153. package/dist/members/index.js +227 -188
  154. package/dist/members/index.js.map +1 -1
  155. package/dist/members/request.js +54 -39
  156. package/dist/members/request.js.map +1 -1
  157. package/dist/members/types.js +15 -0
  158. package/dist/members/types.js.map +1 -0
  159. package/dist/members/util.js +107 -44
  160. package/dist/members/util.js.map +1 -1
  161. package/dist/metrics/config.js +5 -14
  162. package/dist/metrics/config.js.map +1 -1
  163. package/dist/metrics/constants.js +3 -7
  164. package/dist/metrics/constants.js.map +1 -1
  165. package/dist/metrics/index.js +67 -159
  166. package/dist/metrics/index.js.map +1 -1
  167. package/dist/multistream/mediaRequestManager.js +250 -0
  168. package/dist/multistream/mediaRequestManager.js.map +1 -0
  169. package/dist/multistream/receiveSlot.js +202 -0
  170. package/dist/multistream/receiveSlot.js.map +1 -0
  171. package/dist/multistream/receiveSlotManager.js +176 -0
  172. package/dist/multistream/receiveSlotManager.js.map +1 -0
  173. package/dist/multistream/remoteMedia.js +270 -0
  174. package/dist/multistream/remoteMedia.js.map +1 -0
  175. package/dist/multistream/remoteMediaGroup.js +209 -0
  176. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  177. package/dist/multistream/remoteMediaManager.js +1137 -0
  178. package/dist/multistream/remoteMediaManager.js.map +1 -0
  179. package/dist/networkQualityMonitor/index.js +40 -59
  180. package/dist/networkQualityMonitor/index.js.map +1 -1
  181. package/dist/personal-meeting-room/index.js +21 -45
  182. package/dist/personal-meeting-room/index.js.map +1 -1
  183. package/dist/personal-meeting-room/request.js +1 -31
  184. package/dist/personal-meeting-room/request.js.map +1 -1
  185. package/dist/personal-meeting-room/util.js +0 -13
  186. package/dist/personal-meeting-room/util.js.map +1 -1
  187. package/dist/reachability/index.js +192 -191
  188. package/dist/reachability/index.js.map +1 -1
  189. package/dist/reachability/request.js +15 -23
  190. package/dist/reachability/request.js.map +1 -1
  191. package/dist/reactions/constants.js +13 -0
  192. package/dist/reactions/constants.js.map +1 -0
  193. package/dist/reactions/reactions.js +109 -0
  194. package/dist/reactions/reactions.js.map +1 -0
  195. package/dist/reactions/reactions.type.js +36 -0
  196. package/dist/reactions/reactions.type.js.map +1 -0
  197. package/dist/reconnection-manager/index.js +386 -527
  198. package/dist/reconnection-manager/index.js.map +1 -1
  199. package/dist/recording-controller/enums.js +17 -0
  200. package/dist/recording-controller/enums.js.map +1 -0
  201. package/dist/recording-controller/index.js +343 -0
  202. package/dist/recording-controller/index.js.map +1 -0
  203. package/dist/recording-controller/util.js +63 -0
  204. package/dist/recording-controller/util.js.map +1 -0
  205. package/dist/roap/index.js +84 -286
  206. package/dist/roap/index.js.map +1 -1
  207. package/dist/roap/request.js +138 -238
  208. package/dist/roap/request.js.map +1 -1
  209. package/dist/roap/turnDiscovery.js +164 -102
  210. package/dist/roap/turnDiscovery.js.map +1 -1
  211. package/dist/statsAnalyzer/global.js +1 -93
  212. package/dist/statsAnalyzer/global.js.map +1 -1
  213. package/dist/statsAnalyzer/index.js +399 -470
  214. package/dist/statsAnalyzer/index.js.map +1 -1
  215. package/dist/statsAnalyzer/mqaUtil.js +143 -87
  216. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  217. package/dist/transcription/index.js +22 -47
  218. package/dist/transcription/index.js.map +1 -1
  219. package/dist/types/annotation/annotation.types.d.ts +34 -0
  220. package/dist/types/annotation/constants.d.ts +31 -0
  221. package/dist/types/annotation/index.d.ts +124 -0
  222. package/dist/types/breakouts/breakout.d.ts +8 -0
  223. package/dist/types/breakouts/collection.d.ts +5 -0
  224. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  225. package/dist/types/breakouts/events.d.ts +2 -0
  226. package/dist/types/breakouts/index.d.ts +5 -0
  227. package/dist/types/breakouts/request.d.ts +22 -0
  228. package/dist/types/breakouts/utils.d.ts +15 -0
  229. package/dist/types/common/browser-detection.d.ts +9 -0
  230. package/dist/types/common/collection.d.ts +48 -0
  231. package/dist/types/common/config.d.ts +2 -0
  232. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  233. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  234. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  235. package/dist/types/common/errors/media.d.ts +15 -0
  236. package/dist/types/common/errors/parameter.d.ts +15 -0
  237. package/dist/types/common/errors/password-error.d.ts +15 -0
  238. package/dist/types/common/errors/permission.d.ts +14 -0
  239. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  240. package/dist/types/common/errors/reconnection.d.ts +15 -0
  241. package/dist/types/common/errors/stats.d.ts +15 -0
  242. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  243. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  244. package/dist/types/common/events/events-scope.d.ts +17 -0
  245. package/dist/types/common/events/events.d.ts +12 -0
  246. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  247. package/dist/types/common/events/util.d.ts +2 -0
  248. package/dist/types/common/logs/logger-config.d.ts +2 -0
  249. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  250. package/dist/types/common/logs/request.d.ts +34 -0
  251. package/dist/types/common/queue.d.ts +32 -0
  252. package/dist/types/config.d.ts +78 -0
  253. package/dist/types/constants.d.ts +968 -0
  254. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  255. package/dist/types/controls-options-manager/enums.d.ts +13 -0
  256. package/dist/types/controls-options-manager/index.d.ts +136 -0
  257. package/dist/types/controls-options-manager/types.d.ts +37 -0
  258. package/dist/types/controls-options-manager/util.d.ts +1 -0
  259. package/dist/types/index.d.ts +7 -0
  260. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  261. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  262. package/dist/types/locus-info/fullState.d.ts +2 -0
  263. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  264. package/dist/types/locus-info/index.d.ts +315 -0
  265. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  266. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  267. package/dist/types/locus-info/parser.d.ts +212 -0
  268. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  269. package/dist/types/media/index.d.ts +34 -0
  270. package/dist/types/media/properties.d.ts +108 -0
  271. package/dist/types/media/util.d.ts +2 -0
  272. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  273. package/dist/types/meeting/in-meeting-actions.d.ts +129 -0
  274. package/dist/types/meeting/index.d.ts +1748 -0
  275. package/dist/types/meeting/muteState.d.ts +185 -0
  276. package/dist/types/meeting/request.d.ts +275 -0
  277. package/dist/types/meeting/request.type.d.ts +11 -0
  278. package/dist/types/meeting/state.d.ts +9 -0
  279. package/dist/types/meeting/util.d.ts +2 -0
  280. package/dist/types/meeting-info/collection.d.ts +20 -0
  281. package/dist/types/meeting-info/index.d.ts +57 -0
  282. package/dist/types/meeting-info/meeting-info-v2.d.ts +112 -0
  283. package/dist/types/meeting-info/request.d.ts +22 -0
  284. package/dist/types/meeting-info/util.d.ts +2 -0
  285. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  286. package/dist/types/meetings/collection.d.ts +31 -0
  287. package/dist/types/meetings/index.d.ts +345 -0
  288. package/dist/types/meetings/request.d.ts +27 -0
  289. package/dist/types/meetings/util.d.ts +18 -0
  290. package/dist/types/member/index.d.ts +156 -0
  291. package/dist/types/member/types.d.ts +21 -0
  292. package/dist/types/member/util.d.ts +2 -0
  293. package/dist/types/members/collection.d.ts +29 -0
  294. package/dist/types/members/index.d.ts +353 -0
  295. package/dist/types/members/request.d.ts +69 -0
  296. package/dist/types/members/types.d.ts +24 -0
  297. package/dist/types/members/util.d.ts +2 -0
  298. package/dist/types/metrics/config.d.ts +172 -0
  299. package/dist/types/metrics/constants.d.ts +54 -0
  300. package/dist/types/metrics/index.d.ts +152 -0
  301. package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
  302. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  303. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  304. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  305. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  306. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  307. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  308. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  309. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  310. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  311. package/dist/types/reachability/index.d.ts +152 -0
  312. package/dist/types/reachability/request.d.ts +37 -0
  313. package/dist/types/reactions/constants.d.ts +3 -0
  314. package/dist/types/reactions/reactions.d.ts +4 -0
  315. package/dist/types/reactions/reactions.type.d.ts +52 -0
  316. package/dist/types/reconnection-manager/index.d.ts +126 -0
  317. package/dist/types/recording-controller/enums.d.ts +7 -0
  318. package/dist/types/recording-controller/index.d.ts +193 -0
  319. package/dist/types/recording-controller/util.d.ts +13 -0
  320. package/dist/types/roap/index.d.ts +77 -0
  321. package/dist/types/roap/request.d.ts +38 -0
  322. package/dist/types/roap/turnDiscovery.d.ts +88 -0
  323. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  324. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  325. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  326. package/dist/types/transcription/index.d.ts +64 -0
  327. package/internal-README.md +7 -6
  328. package/package.json +29 -21
  329. package/src/annotation/annotation.types.ts +41 -0
  330. package/src/annotation/constants.ts +36 -0
  331. package/src/annotation/index.ts +339 -0
  332. package/src/breakouts/README.md +219 -0
  333. package/src/breakouts/breakout.ts +141 -0
  334. package/src/breakouts/collection.ts +19 -0
  335. package/src/breakouts/edit-lock-error.ts +25 -0
  336. package/src/breakouts/events.ts +37 -0
  337. package/src/breakouts/index.ts +823 -0
  338. package/src/breakouts/request.ts +55 -0
  339. package/src/breakouts/utils.ts +57 -0
  340. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  341. package/src/common/collection.ts +9 -7
  342. package/src/common/{config.js → config.ts} +1 -1
  343. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  344. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  345. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  346. package/src/common/errors/{media.js → media.ts} +11 -7
  347. package/src/common/errors/parameter.ts +11 -7
  348. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  349. package/src/common/errors/{permission.js → permission.ts} +10 -6
  350. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  351. package/src/common/errors/{stats.js → stats.ts} +11 -7
  352. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -25
  353. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  354. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  355. package/src/common/events/{events.js → events.ts} +5 -1
  356. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  357. package/src/common/events/{util.js → util.ts} +2 -3
  358. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  359. package/src/common/logs/logger-proxy.ts +44 -0
  360. package/src/common/logs/{request.js → request.ts} +22 -9
  361. package/src/common/queue.ts +1 -2
  362. package/src/{config.js → config.ts} +18 -12
  363. package/src/constants.ts +256 -183
  364. package/src/controls-options-manager/constants.ts +5 -0
  365. package/src/controls-options-manager/enums.ts +16 -0
  366. package/src/controls-options-manager/index.ts +278 -0
  367. package/src/controls-options-manager/types.ts +49 -0
  368. package/src/controls-options-manager/util.ts +229 -0
  369. package/src/index.ts +33 -0
  370. package/src/locus-info/controlsUtils.ts +169 -0
  371. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  372. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  373. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  374. package/src/locus-info/{index.js → index.ts} +331 -80
  375. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  376. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  377. package/src/locus-info/{parser.js → parser.ts} +67 -79
  378. package/src/locus-info/{selfUtils.js → selfUtils.ts} +196 -67
  379. package/src/media/index.ts +488 -0
  380. package/src/media/{properties.js → properties.ts} +67 -54
  381. package/src/media/util.ts +16 -0
  382. package/src/mediaQualityMetrics/config.ts +384 -0
  383. package/src/meeting/in-meeting-actions.ts +123 -3
  384. package/src/meeting/{index.js → index.ts} +3334 -1775
  385. package/src/meeting/muteState.ts +526 -0
  386. package/src/meeting/{request.js → request.ts} +350 -142
  387. package/src/meeting/request.type.ts +13 -0
  388. package/src/meeting/{state.js → state.ts} +50 -35
  389. package/src/meeting/{util.js → util.ts} +126 -159
  390. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  391. package/src/meeting-info/{index.js → index.ts} +42 -36
  392. package/src/meeting-info/meeting-info-v2.ts +345 -0
  393. package/src/meeting-info/{request.js → request.ts} +14 -4
  394. package/src/meeting-info/{util.js → util.ts} +60 -51
  395. package/src/meeting-info/{utilv2.js → utilv2.ts} +76 -60
  396. package/src/meetings/{collection.js → collection.ts} +26 -3
  397. package/src/meetings/index.ts +1394 -0
  398. package/src/meetings/{request.js → request.ts} +34 -25
  399. package/src/meetings/util.ts +288 -0
  400. package/src/member/{index.js → index.ts} +124 -56
  401. package/src/member/types.ts +24 -0
  402. package/src/member/{util.js → util.ts} +105 -25
  403. package/src/members/{collection.js → collection.ts} +10 -2
  404. package/src/members/{index.js → index.ts} +359 -139
  405. package/src/members/request.ts +215 -0
  406. package/src/members/types.ts +28 -0
  407. package/src/members/{util.js → util.ts} +145 -54
  408. package/src/metrics/{config.js → config.ts} +256 -92
  409. package/src/metrics/{constants.js → constants.ts} +1 -6
  410. package/src/metrics/{index.js → index.ts} +116 -97
  411. package/src/multistream/mediaRequestManager.ts +324 -0
  412. package/src/multistream/receiveSlot.ts +184 -0
  413. package/src/multistream/receiveSlotManager.ts +166 -0
  414. package/src/multistream/remoteMedia.ts +254 -0
  415. package/src/multistream/remoteMediaGroup.ts +225 -0
  416. package/src/multistream/remoteMediaManager.ts +1075 -0
  417. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  418. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  419. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  420. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  421. package/src/reachability/{index.js → index.ts} +157 -94
  422. package/src/reachability/request.ts +46 -35
  423. package/src/reactions/constants.ts +4 -0
  424. package/src/reactions/reactions.ts +104 -0
  425. package/src/reactions/reactions.type.ts +62 -0
  426. package/src/reconnection-manager/{index.js → index.ts} +261 -163
  427. package/src/recording-controller/enums.ts +8 -0
  428. package/src/recording-controller/index.ts +315 -0
  429. package/src/recording-controller/util.ts +58 -0
  430. package/src/roap/index.ts +241 -0
  431. package/src/roap/request.ts +172 -0
  432. package/src/roap/turnDiscovery.ts +127 -53
  433. package/src/statsAnalyzer/global.ts +37 -0
  434. package/src/statsAnalyzer/index.ts +1273 -0
  435. package/src/statsAnalyzer/mqaUtil.ts +291 -0
  436. package/src/transcription/{index.js → index.ts} +46 -39
  437. package/test/integration/spec/converged-space-meetings.js +177 -0
  438. package/test/integration/spec/journey.js +666 -464
  439. package/test/integration/spec/space-meeting.js +321 -206
  440. package/test/integration/spec/transcription.js +7 -8
  441. package/test/unit/spec/annotation/index.ts +435 -0
  442. package/test/unit/spec/breakouts/breakout.ts +184 -0
  443. package/test/unit/spec/breakouts/collection.ts +15 -0
  444. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  445. package/test/unit/spec/breakouts/events.ts +77 -0
  446. package/test/unit/spec/breakouts/index.ts +1504 -0
  447. package/test/unit/spec/breakouts/request.ts +104 -0
  448. package/test/unit/spec/breakouts/utils.js +72 -0
  449. package/test/unit/spec/common/browser-detection.js +9 -28
  450. package/test/unit/spec/controls-options-manager/index.js +287 -0
  451. package/test/unit/spec/controls-options-manager/util.js +403 -0
  452. package/test/unit/spec/fixture/locus.js +92 -90
  453. package/test/unit/spec/locus-info/controlsUtils.js +177 -32
  454. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  455. package/test/unit/spec/locus-info/index.js +493 -3
  456. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  457. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  458. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  459. package/test/unit/spec/locus-info/parser.js +3 -9
  460. package/test/unit/spec/locus-info/selfConstant.js +110 -103
  461. package/test/unit/spec/locus-info/selfUtils.js +236 -12
  462. package/test/unit/spec/media/index.ts +303 -0
  463. package/test/unit/spec/media/properties.ts +73 -82
  464. package/test/unit/spec/meeting/in-meeting-actions.ts +58 -3
  465. package/test/unit/spec/meeting/index.js +3127 -975
  466. package/test/unit/spec/meeting/muteState.js +375 -70
  467. package/test/unit/spec/meeting/request.js +217 -43
  468. package/test/unit/spec/meeting/utils.js +205 -163
  469. package/test/unit/spec/meeting-info/meetinginfov2.js +268 -74
  470. package/test/unit/spec/meeting-info/request.js +7 -9
  471. package/test/unit/spec/meeting-info/util.js +11 -12
  472. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  473. package/test/unit/spec/meetings/collection.js +15 -1
  474. package/test/unit/spec/meetings/index.js +1052 -333
  475. package/test/unit/spec/meetings/utils.js +163 -14
  476. package/test/unit/spec/member/index.js +24 -1
  477. package/test/unit/spec/member/util.js +359 -32
  478. package/test/unit/spec/members/index.js +547 -37
  479. package/test/unit/spec/members/request.js +76 -20
  480. package/test/unit/spec/members/utils.js +191 -4
  481. package/test/unit/spec/metrics/index.js +46 -20
  482. package/test/unit/spec/multistream/mediaRequestManager.ts +1060 -0
  483. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  484. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  485. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  486. package/test/unit/spec/multistream/remoteMediaGroup.ts +396 -0
  487. package/test/unit/spec/multistream/remoteMediaManager.ts +1793 -0
  488. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  489. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  490. package/test/unit/spec/reachability/index.ts +176 -27
  491. package/test/unit/spec/reachability/request.js +66 -0
  492. package/test/unit/spec/reconnection-manager/index.js +106 -9
  493. package/test/unit/spec/recording-controller/index.js +231 -0
  494. package/test/unit/spec/recording-controller/util.js +102 -0
  495. package/test/unit/spec/roap/index.ts +78 -45
  496. package/test/unit/spec/roap/request.ts +217 -0
  497. package/test/unit/spec/roap/turnDiscovery.ts +93 -49
  498. package/test/unit/spec/stats-analyzer/index.js +118 -65
  499. package/test/utils/cmr.js +44 -42
  500. package/test/utils/constants.js +9 -0
  501. package/test/utils/integrationTestUtils.js +64 -0
  502. package/test/utils/testUtils.js +63 -99
  503. package/test/utils/webex-config.js +22 -18
  504. package/test/utils/webex-test-users.js +57 -50
  505. package/tsconfig.json +6 -0
  506. package/dist/meeting/effectsState.js +0 -327
  507. package/dist/meeting/effectsState.js.map +0 -1
  508. package/dist/peer-connection-manager/index.js +0 -794
  509. package/dist/peer-connection-manager/index.js.map +0 -1
  510. package/dist/peer-connection-manager/util.js +0 -124
  511. package/dist/peer-connection-manager/util.js.map +0 -1
  512. package/dist/roap/collection.js +0 -73
  513. package/dist/roap/collection.js.map +0 -1
  514. package/dist/roap/handler.js +0 -337
  515. package/dist/roap/handler.js.map +0 -1
  516. package/dist/roap/state.js +0 -164
  517. package/dist/roap/state.js.map +0 -1
  518. package/dist/roap/util.js +0 -102
  519. package/dist/roap/util.js.map +0 -1
  520. package/src/common/logs/logger-proxy.js +0 -33
  521. package/src/index.js +0 -15
  522. package/src/locus-info/controlsUtils.js +0 -102
  523. package/src/media/index.js +0 -593
  524. package/src/media/util.js +0 -38
  525. package/src/mediaQualityMetrics/config.js +0 -382
  526. package/src/meeting/effectsState.js +0 -205
  527. package/src/meeting/muteState.js +0 -318
  528. package/src/meeting-info/meeting-info-v2.js +0 -255
  529. package/src/meetings/index.js +0 -986
  530. package/src/meetings/util.js +0 -176
  531. package/src/members/request.js +0 -131
  532. package/src/peer-connection-manager/index.js +0 -723
  533. package/src/peer-connection-manager/util.ts +0 -117
  534. package/src/roap/collection.js +0 -63
  535. package/src/roap/handler.js +0 -252
  536. package/src/roap/index.js +0 -380
  537. package/src/roap/request.js +0 -198
  538. package/src/roap/state.js +0 -149
  539. package/src/roap/util.js +0 -93
  540. package/src/statsAnalyzer/global.js +0 -131
  541. package/src/statsAnalyzer/index.js +0 -1020
  542. package/src/statsAnalyzer/mqaUtil.js +0 -173
  543. package/test/unit/spec/meeting/effectsState.js +0 -293
  544. package/test/unit/spec/peerconnection-manager/index.js +0 -188
  545. package/test/unit/spec/peerconnection-manager/utils.js +0 -48
  546. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  547. package/test/unit/spec/roap/util.js +0 -30
  548. /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 {isArray, isEqual, assignWith, cloneDeep} from 'lodash';
2
2
 
3
3
  import LoggerProxy from '../common/logs/logger-proxy';
4
4
  import EventsScope from '../common/events/events-scope';
@@ -19,14 +19,14 @@ import {
19
19
  } from '../constants';
20
20
  import Metrics from '../metrics';
21
21
  import {eventType} from '../metrics/config';
22
- import InfoUtils from '../locus-info/infoUtils';
23
- import FullState from '../locus-info/fullState';
24
- import SelfUtils from '../locus-info/selfUtils';
25
- import HostUtils from '../locus-info/hostUtils';
26
- import ControlsUtils from '../locus-info/controlsUtils';
27
- import EmbeddedAppsUtils from '../locus-info/embeddedAppsUtils';
28
- import MediaSharesUtils from '../locus-info/mediaSharesUtils';
29
- import LocusDeltaParser from '../locus-info/parser';
22
+ import InfoUtils from './infoUtils';
23
+ import FullState from './fullState';
24
+ import SelfUtils from './selfUtils';
25
+ import HostUtils from './hostUtils';
26
+ import ControlsUtils from './controlsUtils';
27
+ import EmbeddedAppsUtils from './embeddedAppsUtils';
28
+ import MediaSharesUtils from './mediaSharesUtils';
29
+ import LocusDeltaParser from './parser';
30
30
 
31
31
  /**
32
32
  * @description LocusInfo extends ChildEmitter to convert locusInfo info a private emitter to parent object
@@ -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 {boolean} updateMeeting true if the meeting should be updated
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 = {
@@ -55,7 +92,7 @@ export default class LocusInfo extends EventsScope {
55
92
  * @param {Meeting} meeting
56
93
  * @returns {undefined}
57
94
  */
58
- applyLocusDeltaData(action, locus, meeting) {
95
+ applyLocusDeltaData(action: string, locus: any, meeting: any) {
59
96
  const {DESYNC, USE_CURRENT, USE_INCOMING} = LocusDeltaParser.loci;
60
97
 
61
98
  switch (action) {
@@ -94,7 +131,7 @@ export default class LocusInfo extends EventsScope {
94
131
  * @param {Meeting} meeting
95
132
  * @returns {undefined}
96
133
  */
97
- handleLocusDelta(locus, meeting) {
134
+ handleLocusDelta(locus: any, meeting: any) {
98
135
  // register a function to process delta actions
99
136
  if (!this.locusParser.onDeltaAction) {
100
137
  // delta action, along with associated loci
@@ -112,7 +149,7 @@ export default class LocusInfo extends EventsScope {
112
149
  * @returns {undefined}
113
150
  * @memberof LocusInfo
114
151
  */
115
- init(locus = {}) {
152
+ init(locus: any = {}) {
116
153
  this.created = locus.created || null;
117
154
  this.scheduledMeeting = locus.meeting || null;
118
155
  this.participantsUrl = locus.participantsUrl || null;
@@ -143,12 +180,13 @@ export default class LocusInfo extends EventsScope {
143
180
  */
144
181
  this.deltaParticipants = [];
145
182
 
183
+ this.updateLocusCache(locus);
146
184
  // above section only updates the locusInfo object
147
185
  // The below section makes sure it updates the locusInfo as well as updates the meeting object
148
186
  this.updateParticipants(locus.participants);
149
187
  // For 1:1 space meeting the conversation Url does not exist in locus.conversation
150
188
  this.updateConversationUrl(locus.conversationUrl, locus.info);
151
- this.updateControls(locus.controls);
189
+ this.updateControls(locus.controls, locus.self);
152
190
  this.updateLocusUrl(locus.url);
153
191
  this.updateFullState(locus.fullState);
154
192
  this.updateMeetingInfo(locus.info);
@@ -157,6 +195,7 @@ export default class LocusInfo extends EventsScope {
157
195
  this.updateSelf(locus.self, locus.participants);
158
196
  this.updateHostInfo(locus.host);
159
197
  this.updateMediaShares(locus.mediaShares);
198
+ this.updateServices(locus.links?.services);
160
199
  }
161
200
 
162
201
  /**
@@ -164,7 +203,8 @@ export default class LocusInfo extends EventsScope {
164
203
  * @returns {undefined}
165
204
  * @memberof LocusInfo
166
205
  */
167
- initialSetup(locus) {
206
+ initialSetup(locus: object) {
207
+ this.updateLocusCache(locus);
168
208
  this.onFullLocus(locus);
169
209
 
170
210
  // Change it to true after it receives it first locus object
@@ -177,9 +217,10 @@ export default class LocusInfo extends EventsScope {
177
217
  * @returns {undefined}
178
218
  * @memberof LocusInfo
179
219
  */
180
- parse(meeting, data) {
220
+ parse(meeting: any, data: any) {
221
+ // eslint-disable-next-line @typescript-eslint/no-shadow
181
222
  const {eventType} = data;
182
-
223
+ const locus = this.getTheLocusToUpdate(data.locus);
183
224
  LoggerProxy.logger.info(`Locus-info:index#parse --> received locus data: ${eventType}`);
184
225
 
185
226
  switch (eventType) {
@@ -197,16 +238,16 @@ export default class LocusInfo extends EventsScope {
197
238
  case LOCUSEVENT.PARTICIPANT_DECLINED:
198
239
  case LOCUSEVENT.FLOOR_GRANTED:
199
240
  case LOCUSEVENT.FLOOR_RELEASED:
200
- this.onFullLocus(data.locus, eventType);
241
+ this.onFullLocus(locus, eventType);
201
242
  break;
202
243
  case LOCUSEVENT.DIFFERENCE:
203
- this.handleLocusDelta(data.locus, meeting);
244
+ this.handleLocusDelta(locus, meeting);
204
245
  break;
205
246
 
206
247
  default:
207
248
  // Why will there be a event with no eventType ????
208
249
  // we may not need this, we can get full locus
209
- this.handleLocusDelta(data.locus, meeting);
250
+ this.handleLocusDelta(locus, meeting);
210
251
  }
211
252
  }
212
253
 
@@ -217,18 +258,19 @@ export default class LocusInfo extends EventsScope {
217
258
  * @returns {undefined}
218
259
  * @memberof LocusInfo
219
260
  */
220
- emitScoped(scope, eventName, args) {
261
+ emitScoped(scope?: any, eventName?: string, args?: any) {
221
262
  return this.emit(scope, eventName, args);
222
263
  }
223
264
 
224
265
  /**
225
266
  * updates the locus with full locus object
226
267
  * @param {object} locus locus object
227
- * @param {sting} eventType particulat locus event
268
+ * @param {string} eventType particulat locus event
228
269
  * @returns {object} null
229
270
  * @memberof LocusInfo
230
271
  */
231
- onFullLocus(locus, eventType) {
272
+ // eslint-disable-next-line @typescript-eslint/no-shadow
273
+ onFullLocus(locus: any, eventType?: string) {
232
274
  if (!locus) {
233
275
  LoggerProxy.logger.error(
234
276
  'Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.'
@@ -237,8 +279,9 @@ export default class LocusInfo extends EventsScope {
237
279
  this.updateParticipantDeltas(locus.participants);
238
280
  this.scheduledMeeting = locus.meeting || null;
239
281
  this.participants = locus.participants;
282
+ const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);
240
283
  this.updateLocusInfo(locus);
241
- this.updateParticipants(locus.participants);
284
+ this.updateParticipants(locus.participants, isReplaceMembers);
242
285
  this.isMeetingActive();
243
286
  this.handleOneOnOneEvent(eventType);
244
287
  this.updateEmbeddedApps(locus.embeddedApps);
@@ -252,7 +295,8 @@ export default class LocusInfo extends EventsScope {
252
295
  * @returns {undefined}
253
296
  * @memberof LocusInfo
254
297
  */
255
- handleOneOnOneEvent(eventType) {
298
+ // eslint-disable-next-line @typescript-eslint/no-shadow
299
+ handleOneOnOneEvent(eventType: string) {
256
300
  if (
257
301
  this.parsedLocus.fullState.type === _CALL_ ||
258
302
  this.parsedLocus.fullState.type === _SIP_BRIDGE_
@@ -295,9 +339,10 @@ export default class LocusInfo extends EventsScope {
295
339
  * @returns {undefined}
296
340
  * @memberof LocusInfo
297
341
  */
298
- onDeltaLocus(locus) {
342
+ onDeltaLocus(locus: any) {
343
+ const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);
299
344
  this.updateLocusInfo(locus);
300
- this.updateParticipants(locus.participants);
345
+ this.updateParticipants(locus.participants, isReplaceMembers);
301
346
  this.isMeetingActive();
302
347
  }
303
348
 
@@ -307,7 +352,14 @@ export default class LocusInfo extends EventsScope {
307
352
  * @memberof LocusInfo
308
353
  */
309
354
  updateLocusInfo(locus) {
310
- this.updateControls(locus.controls);
355
+ if (locus.self?.reason === 'MOVED' && locus.self?.state === 'LEFT') {
356
+ // When moved to a breakout session locus sends a message for the previous locus
357
+ // indicating that we have been moved. It isn't helpful to continue parsing this
358
+ // as it gets interpreted as if we have left the call
359
+ return;
360
+ }
361
+
362
+ this.updateControls(locus.controls, locus.self);
311
363
  this.updateConversationUrl(locus.conversationUrl, locus.info);
312
364
  this.updateCreated(locus.created);
313
365
  this.updateFullState(locus.fullState);
@@ -324,6 +376,7 @@ export default class LocusInfo extends EventsScope {
324
376
  this.updateMemberShip(locus.membership);
325
377
  this.updateIdentifiers(locus.identities);
326
378
  this.updateEmbeddedApps(locus.embeddedApps);
379
+ this.updateServices(locus.links?.services);
327
380
  this.compareAndUpdate();
328
381
  // update which required to compare different objects from locus
329
382
  }
@@ -334,7 +387,7 @@ export default class LocusInfo extends EventsScope {
334
387
  * @returns {Array}
335
388
  * @memberof LocusInfo
336
389
  */
337
- getLocusPartner(participants, self) {
390
+ getLocusPartner(participants: Array<any>, self: any) {
338
391
  if (!participants || participants.length === 0) {
339
392
  return null;
340
393
  }
@@ -345,6 +398,7 @@ export default class LocusInfo extends EventsScope {
345
398
  self &&
346
399
  participant.identity !== self.identity &&
347
400
  (participants.length <= 2 || (participant.type === _USER_ && !participant.removed))
401
+ // @ts-ignore
348
402
  ) || this.partner
349
403
  );
350
404
  }
@@ -359,6 +413,7 @@ export default class LocusInfo extends EventsScope {
359
413
  this.parsedLocus.fullState.type === _CALL_ ||
360
414
  this.parsedLocus.fullState.type === _SIP_BRIDGE_
361
415
  ) {
416
+ // @ts-ignore
362
417
  const partner = this.getLocusPartner(this.participants, this.self);
363
418
 
364
419
  this.updateMeeting({partner});
@@ -390,8 +445,7 @@ export default class LocusInfo extends EventsScope {
390
445
  shouldLeave: false,
391
446
  }
392
447
  );
393
- }
394
- else if (
448
+ } else if (
395
449
  partner.state === MEETING_STATE.STATES.LEFT &&
396
450
  this.parsedLocus.self &&
397
451
  (this.parsedLocus.self.state === MEETING_STATE.STATES.DECLINED ||
@@ -414,8 +468,7 @@ export default class LocusInfo extends EventsScope {
414
468
  this.parsedLocus.self.joinedWith && this.parsedLocus.self.joinedWith.state !== _LEFT_,
415
469
  }
416
470
  );
417
- }
418
- else if (
471
+ } else if (
419
472
  this.parsedLocus.self &&
420
473
  this.parsedLocus.self.state === MEETING_STATE.STATES.LEFT &&
421
474
  (partner.state === MEETING_STATE.STATES.LEFT ||
@@ -439,11 +492,11 @@ export default class LocusInfo extends EventsScope {
439
492
  }
440
493
  );
441
494
  }
442
- }
443
- else if (this.parsedLocus.fullState.type === _MEETING_) {
495
+ } else if (this.parsedLocus.fullState.type === _MEETING_) {
444
496
  if (
445
497
  this.fullState &&
446
498
  (this.fullState.state === LOCUS.STATE.INACTIVE ||
499
+ // @ts-ignore
447
500
  this.fullState.state === LOCUS.STATE.TERMINATING)
448
501
  ) {
449
502
  LoggerProxy.logger.warn(
@@ -464,8 +517,7 @@ export default class LocusInfo extends EventsScope {
464
517
  shouldLeave: false,
465
518
  }
466
519
  );
467
- }
468
- else if (this.fullState && this.fullState.removed) {
520
+ } else if (this.fullState && this.fullState.removed) {
469
521
  // user has been dropped from a meeting
470
522
  Metrics.postEvent({
471
523
  event: eventType.REMOTE_ENDED,
@@ -499,8 +551,7 @@ export default class LocusInfo extends EventsScope {
499
551
  }
500
552
  );
501
553
  }
502
- }
503
- else {
554
+ } else {
504
555
  LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Meeting Type is unknown.');
505
556
  }
506
557
  }
@@ -543,8 +594,7 @@ export default class LocusInfo extends EventsScope {
543
594
  canAssignHost: true,
544
595
  }
545
596
  );
546
- }
547
- else {
597
+ } else {
548
598
  this.emitScoped(
549
599
  {
550
600
  file: 'locus-info',
@@ -565,13 +615,13 @@ export default class LocusInfo extends EventsScope {
565
615
  * @param {Array} [participants] - The participants to update against.
566
616
  * @returns {void}
567
617
  */
568
- updateParticipantDeltas(participants = []) {
618
+ updateParticipantDeltas(participants: Array<any> = []) {
569
619
  // Used to find a participant within a participants collection.
570
620
  const findParticipant = (participant, collection) =>
571
621
  collection.find((item) => item.person.id === participant.person.id);
572
622
 
573
623
  // Generates an object that indicates which state properties have changed.
574
- const generateDelta = (prevState = {}, newState = {}) => {
624
+ const generateDelta = (prevState: any = {}, newState: any = {}) => {
575
625
  // Setup deltas.
576
626
  const deltas = {
577
627
  audioStatus: prevState.audioStatus !== newState.audioStatus,
@@ -608,13 +658,13 @@ export default class LocusInfo extends EventsScope {
608
658
  }
609
659
 
610
660
  /**
611
- *
661
+ * update meeting's members
612
662
  * @param {Object} participants new participants object
613
- * @param {boolen} deltaParticpantFlag delta event
663
+ * @param {Boolean} isReplace is replace the whole members
614
664
  * @returns {Array} updatedParticipants
615
665
  * @memberof LocusInfo
616
666
  */
617
- updateParticipants(participants) {
667
+ updateParticipants(participants: object, isReplace?: boolean) {
618
668
  this.emitScoped(
619
669
  {
620
670
  file: 'locus-info',
@@ -627,16 +677,18 @@ export default class LocusInfo extends EventsScope {
627
677
  selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,
628
678
  selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,
629
679
  hostId: this.parsedLocus.host && this.parsedLocus.host.hostId,
680
+ isReplace,
630
681
  }
631
682
  );
632
683
  }
633
684
 
634
685
  /**
635
686
  * @param {Object} controls
687
+ * @param {Object} self
636
688
  * @returns {undefined}
637
689
  * @memberof LocusInfo
638
690
  */
639
- updateControls(controls) {
691
+ updateControls(controls: object, self: object) {
640
692
  if (controls && !isEqual(this.controls, controls)) {
641
693
  this.parsedLocus.controls = ControlsUtils.parse(controls);
642
694
  const {
@@ -646,6 +698,8 @@ export default class LocusInfo extends EventsScope {
646
698
  hasMeetingContainerChanged,
647
699
  hasTranscribeChanged,
648
700
  hasEntryExitToneChanged,
701
+ hasBreakoutChanged,
702
+ hasVideoEnabledChanged,
649
703
  },
650
704
  current,
651
705
  } = ControlsUtils.getControls(this.controls, controls);
@@ -656,13 +710,11 @@ export default class LocusInfo extends EventsScope {
656
710
  if (hasRecordingPausedChanged) {
657
711
  if (current.record.paused) {
658
712
  state = RECORDING_STATE.PAUSED;
659
- }
660
- else {
713
+ } else {
661
714
  // state will be `IDLE` if the recording is not active, even when there is a `pause` status change.
662
715
  state = current.record.recording ? RECORDING_STATE.RESUMED : RECORDING_STATE.IDLE;
663
716
  }
664
- }
665
- else if (hasRecordingChanged) {
717
+ } else if (hasRecordingChanged) {
666
718
  state = current.record.recording ? RECORDING_STATE.RECORDING : RECORDING_STATE.IDLE;
667
719
  }
668
720
 
@@ -711,9 +763,29 @@ export default class LocusInfo extends EventsScope {
711
763
  );
712
764
  }
713
765
 
766
+ if (hasBreakoutChanged) {
767
+ const {breakout} = current;
768
+ breakout.breakoutMoveId = SelfUtils.getReplacedBreakoutMoveId(
769
+ self,
770
+ this.webex.internal.device.url
771
+ );
772
+ this.emitScoped(
773
+ {
774
+ file: 'locus-info',
775
+ function: 'updateControls',
776
+ },
777
+ LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED,
778
+ {
779
+ breakout,
780
+ }
781
+ );
782
+ }
783
+
714
784
  if (hasEntryExitToneChanged) {
715
785
  const {entryExitTone} = current;
716
786
 
787
+ this.updateMeeting({entryExitTone});
788
+
717
789
  this.emitScoped(
718
790
  {
719
791
  file: 'locus-info',
@@ -721,11 +793,29 @@ export default class LocusInfo extends EventsScope {
721
793
  },
722
794
  LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED,
723
795
  {
724
- entryExitTone
796
+ entryExitTone,
725
797
  }
726
798
  );
799
+ }
727
800
 
728
- this.updateMeeting({entryExitTone});
801
+ // videoEnabled is handled differently than other controls,
802
+ // to fit with audio mute status logic
803
+ if (hasVideoEnabledChanged) {
804
+ const {videoEnabled} = current;
805
+
806
+ this.updateMeeting({unmuteVideoAllowed: videoEnabled});
807
+
808
+ this.emitScoped(
809
+ {
810
+ file: 'locus-info',
811
+ function: 'updateControls',
812
+ },
813
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
814
+ {
815
+ // muted: not part of locus.controls
816
+ unmuteAllowed: videoEnabled,
817
+ }
818
+ );
729
819
  }
730
820
 
731
821
  this.controls = controls;
@@ -738,12 +828,11 @@ export default class LocusInfo extends EventsScope {
738
828
  * @returns {undefined}
739
829
  * @memberof LocusInfo
740
830
  */
741
- updateConversationUrl(conversationUrl, info) {
831
+ updateConversationUrl(conversationUrl: string, info: any) {
742
832
  if (conversationUrl && !isEqual(this.conversationUrl, conversationUrl)) {
743
833
  this.conversationUrl = conversationUrl;
744
834
  this.updateMeeting({conversationUrl});
745
- }
746
- else if (
835
+ } else if (
747
836
  info &&
748
837
  info.conversationUrl &&
749
838
  !isEqual(this.conversationUrl, info.conversationUrl)
@@ -758,18 +847,39 @@ export default class LocusInfo extends EventsScope {
758
847
  * @returns {undefined}
759
848
  * @memberof LocusInfo
760
849
  */
761
- updateCreated(created) {
850
+ updateCreated(created: object) {
762
851
  if (created && !isEqual(this.created, created)) {
763
852
  this.created = created;
764
853
  }
765
854
  }
766
855
 
856
+ /**
857
+ * @param {Object} services
858
+ * @returns {undefined}
859
+ * @memberof LocusInfo
860
+ */
861
+ updateServices(services: Record<'breakout' | 'record', {url: string}>) {
862
+ if (services && !isEqual(this.services, services)) {
863
+ this.services = services;
864
+ this.emitScoped(
865
+ {
866
+ file: 'locus-info',
867
+ function: 'updateServices',
868
+ },
869
+ LOCUSINFO.EVENTS.LINKS_SERVICES,
870
+ {
871
+ services,
872
+ }
873
+ );
874
+ }
875
+ }
876
+
767
877
  /**
768
878
  * @param {Object} fullState
769
879
  * @returns {undefined}
770
880
  * @memberof LocusInfo
771
881
  */
772
- updateFullState(fullState) {
882
+ updateFullState(fullState: object) {
773
883
  if (fullState && !isEqual(this.fullState, fullState)) {
774
884
  const result = FullState.getFullState(this.fullState, fullState);
775
885
 
@@ -813,7 +923,7 @@ export default class LocusInfo extends EventsScope {
813
923
  * @memberof LocusInfo
814
924
  * emits internal event locus_info_update_host
815
925
  */
816
- updateHostInfo(host) {
926
+ updateHostInfo(host: object) {
817
927
  if (host && !isEqual(this.host, host)) {
818
928
  const parsedHosts = HostUtils.getHosts(this.host, host);
819
929
 
@@ -834,8 +944,7 @@ export default class LocusInfo extends EventsScope {
834
944
  );
835
945
  }
836
946
  this.host = host;
837
- }
838
- else {
947
+ } else {
839
948
  this.compareAndUpdateFlags.compareSelfAndHost = false;
840
949
  }
841
950
  }
@@ -846,9 +955,12 @@ export default class LocusInfo extends EventsScope {
846
955
  * @returns {undefined}
847
956
  * @memberof LocusInfo
848
957
  */
849
- updateMeetingInfo(info, self) {
850
- if (info && !isEqual(this.info, info)) {
851
- const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
958
+ updateMeetingInfo(info: object, self?: object) {
959
+ const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
960
+ if (
961
+ (info && !isEqual(this.info, info)) ||
962
+ (roles.length && !isEqual(this.roles, roles) && info)
963
+ ) {
852
964
  const isJoined = SelfUtils.isJoined(self || this.parsedLocus.self);
853
965
  const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles, isJoined);
854
966
 
@@ -887,6 +999,7 @@ export default class LocusInfo extends EventsScope {
887
999
  // Parses the info and adds necessary values
888
1000
  this.updateMeeting(parsedInfo.current);
889
1001
  }
1002
+ this.roles = roles;
890
1003
  }
891
1004
 
892
1005
  /**
@@ -894,7 +1007,7 @@ export default class LocusInfo extends EventsScope {
894
1007
  * @returns {undefined}
895
1008
  * @memberof LocusInfo
896
1009
  */
897
- updateEmbeddedApps(embeddedApps) {
1010
+ updateEmbeddedApps(embeddedApps: object) {
898
1011
  // don't do anything if the arrays of apps haven't changed significantly
899
1012
  if (EmbeddedAppsUtils.areSimilar(this.embeddedApps, embeddedApps)) {
900
1013
  return;
@@ -922,11 +1035,13 @@ export default class LocusInfo extends EventsScope {
922
1035
  * @memberof LocusInfo
923
1036
  * emits internal event locus_info_update_media_shares
924
1037
  */
925
- updateMediaShares(mediaShares) {
1038
+ updateMediaShares(mediaShares: object) {
926
1039
  if (mediaShares && !isEqual(this.mediaShares, mediaShares)) {
927
1040
  const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);
928
1041
 
929
1042
  this.updateMeeting(parsedMediaShares.current);
1043
+ this.parsedLocus.mediaShares = parsedMediaShares.current;
1044
+ this.mediaShares = mediaShares;
930
1045
  this.emitScoped(
931
1046
  {
932
1047
  file: 'locus-info',
@@ -938,8 +1053,6 @@ export default class LocusInfo extends EventsScope {
938
1053
  previous: parsedMediaShares.previous,
939
1054
  }
940
1055
  );
941
- this.parsedLocus.mediaShares = parsedMediaShares.current;
942
- this.mediaShares = mediaShares;
943
1056
  }
944
1057
  }
945
1058
 
@@ -948,7 +1061,7 @@ export default class LocusInfo extends EventsScope {
948
1061
  * @returns {undefined}
949
1062
  * @memberof LocusInfo
950
1063
  */
951
- updateParticipantsUrl(participantsUrl) {
1064
+ updateParticipantsUrl(participantsUrl: string) {
952
1065
  if (participantsUrl && !isEqual(this.participantsUrl, participantsUrl)) {
953
1066
  this.participantsUrl = participantsUrl;
954
1067
  }
@@ -959,7 +1072,7 @@ export default class LocusInfo extends EventsScope {
959
1072
  * @returns {undefined}
960
1073
  * @memberof LocusInfo
961
1074
  */
962
- updateReplace(replace) {
1075
+ updateReplace(replace: object) {
963
1076
  if (replace && !isEqual(this.replace, replace)) {
964
1077
  this.replace = replace;
965
1078
  }
@@ -973,8 +1086,10 @@ export default class LocusInfo extends EventsScope {
973
1086
  * @memberof LocusInfo
974
1087
  * emits internal events self_admitted_guest, self_unadmitted_guest, locus_info_update_self
975
1088
  */
976
- updateSelf(self, participants) {
1089
+ updateSelf(self: any, participants: Array<any>) {
1090
+ // @ts-ignore - check where this.self come from
977
1091
  if (self && !isEqual(this.self, self)) {
1092
+ // @ts-ignore
978
1093
  const parsedSelves = SelfUtils.getSelves(this.self, self, this.webex.internal.device.url);
979
1094
 
980
1095
  this.updateMeeting(parsedSelves.current);
@@ -1000,8 +1115,7 @@ export default class LocusInfo extends EventsScope {
1000
1115
 
1001
1116
  if (parsedSelves.updates.moderatorChanged) {
1002
1117
  this.compareAndUpdateFlags.compareHostAndSelf = true;
1003
- }
1004
- else {
1118
+ } else {
1005
1119
  this.compareAndUpdateFlags.compareHostAndSelf = false;
1006
1120
  }
1007
1121
 
@@ -1016,6 +1130,17 @@ export default class LocusInfo extends EventsScope {
1016
1130
  );
1017
1131
  }
1018
1132
 
1133
+ if (parsedSelves.updates.breakoutsChanged) {
1134
+ this.emitScoped(
1135
+ {
1136
+ file: 'locus-info',
1137
+ function: 'updateSelf',
1138
+ },
1139
+ LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED,
1140
+ {breakoutSessions: parsedSelves.current.breakoutSessions}
1141
+ );
1142
+ }
1143
+
1019
1144
  if (parsedSelves.updates.isMediaInactiveOrReleased) {
1020
1145
  this.emitScoped(
1021
1146
  {
@@ -1037,6 +1162,31 @@ export default class LocusInfo extends EventsScope {
1037
1162
  self
1038
1163
  );
1039
1164
  }
1165
+ // When the user upgrades to moderator or cohost
1166
+ if (parsedSelves.updates.isUpgradeToModeratorOrCohost) {
1167
+ this.emitScoped(
1168
+ {
1169
+ file: 'locus-info',
1170
+ function: 'updateSelf',
1171
+ },
1172
+ LOCUSINFO.EVENTS.SELF_MODERATOR_OR_COHOST_UPGRADE,
1173
+ self
1174
+ );
1175
+ }
1176
+ //
1177
+ if (parsedSelves.updates.isVideoMutedByOthersChanged) {
1178
+ this.emitScoped(
1179
+ {
1180
+ file: 'locus-info',
1181
+ function: 'updateSelf',
1182
+ },
1183
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
1184
+ {
1185
+ muted: parsedSelves.current.remoteVideoMuted,
1186
+ // unmuteAllowed: not part of .self
1187
+ }
1188
+ );
1189
+ }
1040
1190
  if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {
1041
1191
  this.emitScoped(
1042
1192
  {
@@ -1100,6 +1250,7 @@ export default class LocusInfo extends EventsScope {
1100
1250
  file: 'locus-info',
1101
1251
  function: 'updateSelf',
1102
1252
  },
1253
+ // @ts-ignore
1103
1254
  LOCUSINFO.EVENTS.MEDIA_INACTIVITY,
1104
1255
  SelfUtils.getMediaStatus(self.mediaSessions)
1105
1256
  );
@@ -1168,9 +1319,9 @@ export default class LocusInfo extends EventsScope {
1168
1319
  }
1169
1320
  );
1170
1321
  this.parsedLocus.self = parsedSelves.current;
1322
+ // @ts-ignore
1171
1323
  this.self = self;
1172
- }
1173
- else {
1324
+ } else {
1174
1325
  this.compareAndUpdateFlags.compareHostAndSelf = false;
1175
1326
  }
1176
1327
  }
@@ -1181,7 +1332,7 @@ export default class LocusInfo extends EventsScope {
1181
1332
  * @returns {undefined}
1182
1333
  * emits internal event locus_info_update_url
1183
1334
  */
1184
- updateLocusUrl(url) {
1335
+ updateLocusUrl(url: string) {
1185
1336
  if (url && this.url !== url) {
1186
1337
  this.url = url;
1187
1338
  this.updateMeeting({locusUrl: url});
@@ -1201,7 +1352,7 @@ export default class LocusInfo extends EventsScope {
1201
1352
  * @returns {undefined}
1202
1353
  * @memberof LocusInfo
1203
1354
  */
1204
- updateAclUrl(aclUrl) {
1355
+ updateAclUrl(aclUrl: string) {
1205
1356
  if (aclUrl && !isEqual(this.aclUrl, aclUrl)) {
1206
1357
  this.aclUrl = aclUrl;
1207
1358
  }
@@ -1212,7 +1363,7 @@ export default class LocusInfo extends EventsScope {
1212
1363
  * @returns {undefined}
1213
1364
  * @memberof LocusInfo
1214
1365
  */
1215
- updateBasequence(baseSequence) {
1366
+ updateBasequence(baseSequence: number) {
1216
1367
  if (baseSequence && !isEqual(this.baseSequence, baseSequence)) {
1217
1368
  this.baseSequence = baseSequence;
1218
1369
  }
@@ -1223,7 +1374,7 @@ export default class LocusInfo extends EventsScope {
1223
1374
  * @returns {undefined}
1224
1375
  * @memberof LocusInfo
1225
1376
  */
1226
- updateSequence(sequence) {
1377
+ updateSequence(sequence: number) {
1227
1378
  if (sequence && !isEqual(this.sequence, sequence)) {
1228
1379
  this.sequence = sequence;
1229
1380
  }
@@ -1234,7 +1385,7 @@ export default class LocusInfo extends EventsScope {
1234
1385
  * @returns {undefined}
1235
1386
  * @memberof LocusInfo
1236
1387
  */
1237
- updateMemberShip(membership) {
1388
+ updateMemberShip(membership: object) {
1238
1389
  if (membership && !isEqual(this.membership, membership)) {
1239
1390
  this.membership = membership;
1240
1391
  }
@@ -1245,9 +1396,109 @@ export default class LocusInfo extends EventsScope {
1245
1396
  * @returns {undefined}
1246
1397
  * @memberof LocusInfo
1247
1398
  */
1248
- updateIdentifiers(identities) {
1399
+ updateIdentifiers(identities: Array<any>) {
1249
1400
  if (identities && !isEqual(this.identities, identities)) {
1250
1401
  this.identities = identities;
1251
1402
  }
1252
1403
  }
1404
+
1405
+ /**
1406
+ * check the locus is main session's one or not, if is main session's, update main session cache
1407
+ * @param {Object} locus
1408
+ * @returns {undefined}
1409
+ * @memberof LocusInfo
1410
+ */
1411
+ updateLocusCache(locus: any) {
1412
+ const isMainSessionDTO = ControlsUtils.isMainSessionDTO(locus);
1413
+ if (isMainSessionDTO) {
1414
+ this.updateMainSessionLocusCache(locus);
1415
+ }
1416
+ }
1417
+
1418
+ /**
1419
+ * if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)
1420
+ * if join breakout from main session, need to query main locus url (if response with 403 means no privilege, need to clear the cache)
1421
+ * @param {Object} newLocus
1422
+ * @returns {Object}
1423
+ * @memberof LocusInfo
1424
+ */
1425
+ getTheLocusToUpdate(newLocus: any) {
1426
+ const switchStatus = ControlsUtils.getSessionSwitchStatus(this.controls, newLocus.controls);
1427
+ if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {
1428
+ return cloneDeep(this.mainSessionLocusCache);
1429
+ }
1430
+ if (switchStatus.isJoinToBreakout) {
1431
+ this.emitScoped(
1432
+ {
1433
+ file: 'locus-info',
1434
+ function: 'updateControls',
1435
+ },
1436
+ LOCUSINFO.EVENTS.CONTROLS_JOIN_BREAKOUT_FROM_MAIN,
1437
+ {
1438
+ mainLocusUrl: this.url,
1439
+ }
1440
+ );
1441
+ }
1442
+
1443
+ return newLocus;
1444
+ }
1445
+
1446
+ /**
1447
+ * merge participants by participant id
1448
+ * @param {Array} participants
1449
+ * @param {Array} sourceParticipants
1450
+ * @returns {Array} merged participants
1451
+ * @memberof LocusInfo
1452
+ */
1453
+ // eslint-disable-next-line class-methods-use-this
1454
+ mergeParticipants(participants, sourceParticipants) {
1455
+ if (!sourceParticipants || !sourceParticipants.length) return participants;
1456
+ if (!participants || !participants.length) {
1457
+ return sourceParticipants;
1458
+ }
1459
+ sourceParticipants.forEach((participant) => {
1460
+ const existIndex = participants.findIndex((p) => p.id === participant.id);
1461
+ if (existIndex > -1) {
1462
+ participants.splice(existIndex, 1, participant);
1463
+ } else {
1464
+ participants.push(participant);
1465
+ }
1466
+ });
1467
+
1468
+ return participants;
1469
+ }
1470
+
1471
+ /**
1472
+ * need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout
1473
+ * @param {Object} mainLocus
1474
+ * @returns {undefined}
1475
+ * @memberof LocusInfo
1476
+ */
1477
+ updateMainSessionLocusCache(mainLocus: any) {
1478
+ if (!mainLocus) {
1479
+ return;
1480
+ }
1481
+ const locusClone = cloneDeep(mainLocus);
1482
+ if (this.mainSessionLocusCache) {
1483
+ // shallow merge and do special merge for participants
1484
+ assignWith(this.mainSessionLocusCache, locusClone, (objValue, srcValue, key) => {
1485
+ if (key === 'participants') {
1486
+ return this.mergeParticipants(objValue, srcValue);
1487
+ }
1488
+
1489
+ return srcValue || objValue;
1490
+ });
1491
+ } else {
1492
+ this.mainSessionLocusCache = locusClone;
1493
+ }
1494
+ }
1495
+
1496
+ /**
1497
+ * clear main session cache
1498
+ * @returns {undefined}
1499
+ * @memberof LocusInfo
1500
+ */
1501
+ clearMainSessionLocusCache() {
1502
+ this.mainSessionLocusCache = null;
1503
+ }
1253
1504
  }