@webex/plugin-meetings 3.0.0-beta.11 → 3.0.0-beta.111

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