@webex/plugin-meetings 3.0.0-beta.10 → 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 (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 +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 +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 +173 -52
  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 +327 -211
  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 +59 -14
  112. package/dist/meeting/in-meeting-actions.js.map +1 -1
  113. package/dist/meeting/index.js +2396 -2388
  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 +318 -283
  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 +263 -282
  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 +80 -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 +90 -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 +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 +61 -161
  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 +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 +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 +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 +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 +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.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 +119 -6
  361. package/src/controls-options-manager/constants.ts +5 -0
  362. package/src/controls-options-manager/enums.ts +16 -0
  363. package/src/controls-options-manager/index.ts +278 -0
  364. package/src/controls-options-manager/types.ts +49 -0
  365. package/src/controls-options-manager/util.ts +229 -0
  366. package/src/index.ts +33 -0
  367. package/src/locus-info/controlsUtils.ts +91 -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 +270 -54
  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 +123 -3
  380. package/src/meeting/index.ts +2617 -1545
  381. package/src/meeting/muteState.ts +271 -68
  382. package/src/meeting/request.ts +251 -132
  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 +181 -109
  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 +86 -49
  397. package/src/member/types.ts +24 -0
  398. package/src/member/util.ts +92 -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 +256 -90
  405. package/src/metrics/constants.ts +1 -6
  406. package/src/metrics/index.ts +96 -96
  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 +104 -0
  421. package/src/reactions/reactions.type.ts +62 -0
  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 +666 -464
  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 +1504 -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 +403 -0
  448. package/test/unit/spec/fixture/locus.js +92 -90
  449. package/test/unit/spec/locus-info/controlsUtils.js +177 -32
  450. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  451. package/test/unit/spec/locus-info/index.js +493 -3
  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 +58 -3
  461. package/test/unit/spec/meeting/index.js +2649 -837
  462. package/test/unit/spec/meeting/muteState.js +368 -70
  463. package/test/unit/spec/meeting/request.js +217 -43
  464. package/test/unit/spec/meeting/utils.js +146 -165
  465. package/test/unit/spec/meeting-info/meetinginfov2.js +268 -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 +359 -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 +46 -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 = {
@@ -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,6 +698,8 @@ export default class LocusInfo extends EventsScope {
677
698
  hasMeetingContainerChanged,
678
699
  hasTranscribeChanged,
679
700
  hasEntryExitToneChanged,
701
+ hasBreakoutChanged,
702
+ hasVideoEnabledChanged,
680
703
  },
681
704
  current,
682
705
  } = ControlsUtils.getControls(this.controls, controls);
@@ -687,13 +710,11 @@ export default class LocusInfo extends EventsScope {
687
710
  if (hasRecordingPausedChanged) {
688
711
  if (current.record.paused) {
689
712
  state = RECORDING_STATE.PAUSED;
690
- }
691
- else {
713
+ } else {
692
714
  // state will be `IDLE` if the recording is not active, even when there is a `pause` status change.
693
715
  state = current.record.recording ? RECORDING_STATE.RESUMED : RECORDING_STATE.IDLE;
694
716
  }
695
- }
696
- else if (hasRecordingChanged) {
717
+ } else if (hasRecordingChanged) {
697
718
  state = current.record.recording ? RECORDING_STATE.RECORDING : RECORDING_STATE.IDLE;
698
719
  }
699
720
 
@@ -742,9 +763,29 @@ export default class LocusInfo extends EventsScope {
742
763
  );
743
764
  }
744
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
+
745
784
  if (hasEntryExitToneChanged) {
746
785
  const {entryExitTone} = current;
747
786
 
787
+ this.updateMeeting({entryExitTone});
788
+
748
789
  this.emitScoped(
749
790
  {
750
791
  file: 'locus-info',
@@ -752,11 +793,29 @@ export default class LocusInfo extends EventsScope {
752
793
  },
753
794
  LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED,
754
795
  {
755
- entryExitTone
796
+ entryExitTone,
756
797
  }
757
798
  );
799
+ }
758
800
 
759
- 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
+ );
760
819
  }
761
820
 
762
821
  this.controls = controls;
@@ -773,8 +832,7 @@ export default class LocusInfo extends EventsScope {
773
832
  if (conversationUrl && !isEqual(this.conversationUrl, conversationUrl)) {
774
833
  this.conversationUrl = conversationUrl;
775
834
  this.updateMeeting({conversationUrl});
776
- }
777
- else if (
835
+ } else if (
778
836
  info &&
779
837
  info.conversationUrl &&
780
838
  !isEqual(this.conversationUrl, info.conversationUrl)
@@ -795,6 +853,27 @@ export default class LocusInfo extends EventsScope {
795
853
  }
796
854
  }
797
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
+
798
877
  /**
799
878
  * @param {Object} fullState
800
879
  * @returns {undefined}
@@ -865,8 +944,7 @@ export default class LocusInfo extends EventsScope {
865
944
  );
866
945
  }
867
946
  this.host = host;
868
- }
869
- else {
947
+ } else {
870
948
  this.compareAndUpdateFlags.compareSelfAndHost = false;
871
949
  }
872
950
  }
@@ -878,8 +956,11 @@ export default class LocusInfo extends EventsScope {
878
956
  * @memberof LocusInfo
879
957
  */
880
958
  updateMeetingInfo(info: object, self?: object) {
881
- if (info && !isEqual(this.info, info)) {
882
- const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
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
+ ) {
883
964
  const isJoined = SelfUtils.isJoined(self || this.parsedLocus.self);
884
965
  const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles, isJoined);
885
966
 
@@ -918,6 +999,7 @@ export default class LocusInfo extends EventsScope {
918
999
  // Parses the info and adds necessary values
919
1000
  this.updateMeeting(parsedInfo.current);
920
1001
  }
1002
+ this.roles = roles;
921
1003
  }
922
1004
 
923
1005
  /**
@@ -958,6 +1040,8 @@ export default class LocusInfo extends EventsScope {
958
1040
  const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);
959
1041
 
960
1042
  this.updateMeeting(parsedMediaShares.current);
1043
+ this.parsedLocus.mediaShares = parsedMediaShares.current;
1044
+ this.mediaShares = mediaShares;
961
1045
  this.emitScoped(
962
1046
  {
963
1047
  file: 'locus-info',
@@ -969,8 +1053,6 @@ export default class LocusInfo extends EventsScope {
969
1053
  previous: parsedMediaShares.previous,
970
1054
  }
971
1055
  );
972
- this.parsedLocus.mediaShares = parsedMediaShares.current;
973
- this.mediaShares = mediaShares;
974
1056
  }
975
1057
  }
976
1058
 
@@ -1033,8 +1115,7 @@ export default class LocusInfo extends EventsScope {
1033
1115
 
1034
1116
  if (parsedSelves.updates.moderatorChanged) {
1035
1117
  this.compareAndUpdateFlags.compareHostAndSelf = true;
1036
- }
1037
- else {
1118
+ } else {
1038
1119
  this.compareAndUpdateFlags.compareHostAndSelf = false;
1039
1120
  }
1040
1121
 
@@ -1049,6 +1130,17 @@ export default class LocusInfo extends EventsScope {
1049
1130
  );
1050
1131
  }
1051
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
+
1052
1144
  if (parsedSelves.updates.isMediaInactiveOrReleased) {
1053
1145
  this.emitScoped(
1054
1146
  {
@@ -1070,6 +1162,31 @@ export default class LocusInfo extends EventsScope {
1070
1162
  self
1071
1163
  );
1072
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
+ }
1073
1190
  if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {
1074
1191
  this.emitScoped(
1075
1192
  {
@@ -1204,8 +1321,7 @@ export default class LocusInfo extends EventsScope {
1204
1321
  this.parsedLocus.self = parsedSelves.current;
1205
1322
  // @ts-ignore
1206
1323
  this.self = self;
1207
- }
1208
- else {
1324
+ } else {
1209
1325
  this.compareAndUpdateFlags.compareHostAndSelf = false;
1210
1326
  }
1211
1327
  }
@@ -1285,4 +1401,104 @@ export default class LocusInfo extends EventsScope {
1285
1401
  this.identities = identities;
1286
1402
  }
1287
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
+ }
1288
1504
  }
@@ -39,7 +39,12 @@ InfoUtils.parse = (info, roles, isJoined = true) => {
39
39
  InfoUtils.parseDisplayHintSection = (info, displayHintKey) => {
40
40
  const displayHints = {};
41
41
 
42
- if (info && info.displayHints && info.displayHints[displayHintKey] && info.displayHints[displayHintKey].length > 0) {
42
+ if (
43
+ info &&
44
+ info.displayHints &&
45
+ info.displayHints[displayHintKey] &&
46
+ info.displayHints[displayHintKey].length > 0
47
+ ) {
43
48
  info.displayHints[displayHintKey].forEach((key) => {
44
49
  displayHints[key] = true;
45
50
  });
@@ -79,10 +84,13 @@ InfoUtils.getInfos = (oldInfo, newInfo, roles, isJoined) => {
79
84
  current.isLocked = InfoUtils.isLocked(current.policy);
80
85
  current.isUnlocked = InfoUtils.isUnlocked(current.policy);
81
86
 
82
- if (previous && previous.isUnlocked && current.isLocked || !previous && current.isLocked) {
87
+ if ((previous && previous.isUnlocked && current.isLocked) || (!previous && current.isLocked)) {
83
88
  updates.isLocked = current.isLocked;
84
89
  }
85
- if (previous && previous.isLocked && current.isUnlocked || !previous && current.isUnlocked) {
90
+ if (
91
+ (previous && previous.isLocked && current.isUnlocked) ||
92
+ (!previous && current.isUnlocked)
93
+ ) {
86
94
  updates.isUnlocked = current.isUnlocked;
87
95
  }
88
96
  }
@@ -90,7 +98,7 @@ InfoUtils.getInfos = (oldInfo, newInfo, roles, isJoined) => {
90
98
  return {
91
99
  previous,
92
100
  current,
93
- updates
101
+ updates,
94
102
  };
95
103
  };
96
104
 
@@ -12,13 +12,13 @@ MediaSharesUtils.parse = (mediaShares: object) => {
12
12
  return {
13
13
  content: {
14
14
  beneficiaryId: MediaSharesUtils.getContentBeneficiaryId(mediaShares),
15
- disposition: MediaSharesUtils.getContentDisposition(mediaShares)
15
+ disposition: MediaSharesUtils.getContentDisposition(mediaShares),
16
16
  },
17
17
  whiteboard: {
18
18
  beneficiaryId: MediaSharesUtils.getWhiteboardBeneficiaryId(mediaShares),
19
19
  disposition: MediaSharesUtils.getWhiteboardDisposition(mediaShares),
20
- resourceUrl: MediaSharesUtils.getWhiteboardResourceUrl(mediaShares)
21
- }
20
+ resourceUrl: MediaSharesUtils.getWhiteboardResourceUrl(mediaShares),
21
+ },
22
22
  };
23
23
  }
24
24
 
@@ -38,7 +38,7 @@ MediaSharesUtils.getMediaShares = (oldShare: object, newShare: object) => {
38
38
 
39
39
  return {
40
40
  previous,
41
- current
41
+ current,
42
42
  };
43
43
  };
44
44