@webex/plugin-meetings 3.0.0-beta.20 → 3.0.0-beta.201

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 (424) hide show
  1. package/README.md +45 -7
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +114 -14
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +841 -19
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/request.js +78 -0
  17. package/dist/breakouts/request.js.map +1 -0
  18. package/dist/breakouts/utils.js +67 -0
  19. package/dist/breakouts/utils.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +3 -2
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/queue.js +24 -9
  25. package/dist/common/queue.js.map +1 -1
  26. package/dist/config.js +3 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +172 -30
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/constants.js +14 -0
  31. package/dist/controls-options-manager/constants.js.map +1 -0
  32. package/dist/controls-options-manager/enums.js +27 -0
  33. package/dist/controls-options-manager/enums.js.map +1 -0
  34. package/dist/controls-options-manager/index.js +297 -0
  35. package/dist/controls-options-manager/index.js.map +1 -0
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +319 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +107 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +366 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +91 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +355 -57
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/mediaSharesUtils.js +43 -1
  53. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  54. package/dist/locus-info/parser.js +219 -63
  55. package/dist/locus-info/parser.js.map +1 -1
  56. package/dist/locus-info/selfUtils.js +89 -14
  57. package/dist/locus-info/selfUtils.js.map +1 -1
  58. package/dist/media/index.js +48 -135
  59. package/dist/media/index.js.map +1 -1
  60. package/dist/media/properties.js +29 -90
  61. package/dist/media/properties.js.map +1 -1
  62. package/dist/mediaQualityMetrics/config.js +505 -493
  63. package/dist/mediaQualityMetrics/config.js.map +1 -1
  64. package/dist/meeting/in-meeting-actions.js +80 -2
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +2692 -2544
  67. package/dist/meeting/index.js.map +1 -1
  68. package/dist/meeting/locusMediaRequest.js +291 -0
  69. package/dist/meeting/locusMediaRequest.js.map +1 -0
  70. package/dist/meeting/muteState.js +229 -124
  71. package/dist/meeting/muteState.js.map +1 -1
  72. package/dist/meeting/request.js +196 -190
  73. package/dist/meeting/request.js.map +1 -1
  74. package/dist/meeting/util.js +529 -414
  75. package/dist/meeting/util.js.map +1 -1
  76. package/dist/meeting-info/index.js +48 -7
  77. package/dist/meeting-info/index.js.map +1 -1
  78. package/dist/meeting-info/meeting-info-v2.js +171 -51
  79. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  80. package/dist/meeting-info/utilv2.js +20 -5
  81. package/dist/meeting-info/utilv2.js.map +1 -1
  82. package/dist/meetings/collection.js +22 -0
  83. package/dist/meetings/collection.js.map +1 -1
  84. package/dist/meetings/index.js +357 -66
  85. package/dist/meetings/index.js.map +1 -1
  86. package/dist/meetings/meetings.types.js +7 -0
  87. package/dist/meetings/meetings.types.js.map +1 -0
  88. package/dist/meetings/request.js +2 -0
  89. package/dist/meetings/request.js.map +1 -1
  90. package/dist/meetings/util.js +88 -1
  91. package/dist/meetings/util.js.map +1 -1
  92. package/dist/member/index.js +49 -0
  93. package/dist/member/index.js.map +1 -1
  94. package/dist/member/types.js +25 -0
  95. package/dist/member/types.js.map +1 -0
  96. package/dist/member/util.js +121 -25
  97. package/dist/member/util.js.map +1 -1
  98. package/dist/members/collection.js +10 -0
  99. package/dist/members/collection.js.map +1 -1
  100. package/dist/members/index.js +86 -5
  101. package/dist/members/index.js.map +1 -1
  102. package/dist/members/request.js +106 -38
  103. package/dist/members/request.js.map +1 -1
  104. package/dist/members/types.js +15 -0
  105. package/dist/members/types.js.map +1 -0
  106. package/dist/members/util.js +316 -233
  107. package/dist/members/util.js.map +1 -1
  108. package/dist/metrics/constants.js +3 -5
  109. package/dist/metrics/constants.js.map +1 -1
  110. package/dist/metrics/index.js +1 -468
  111. package/dist/metrics/index.js.map +1 -1
  112. package/dist/multistream/mediaRequestManager.js +238 -49
  113. package/dist/multistream/mediaRequestManager.js.map +1 -1
  114. package/dist/multistream/receiveSlot.js +49 -16
  115. package/dist/multistream/receiveSlot.js.map +1 -1
  116. package/dist/multistream/receiveSlotManager.js +52 -34
  117. package/dist/multistream/receiveSlotManager.js.map +1 -1
  118. package/dist/multistream/remoteMedia.js +44 -18
  119. package/dist/multistream/remoteMedia.js.map +1 -1
  120. package/dist/multistream/remoteMediaGroup.js +60 -3
  121. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  122. package/dist/multistream/remoteMediaManager.js +173 -59
  123. package/dist/multistream/remoteMediaManager.js.map +1 -1
  124. package/dist/networkQualityMonitor/index.js +4 -2
  125. package/dist/networkQualityMonitor/index.js.map +1 -1
  126. package/dist/reachability/index.js +72 -27
  127. package/dist/reachability/index.js.map +1 -1
  128. package/dist/reachability/request.js +12 -5
  129. package/dist/reachability/request.js.map +1 -1
  130. package/dist/reactions/reactions.js +2 -2
  131. package/dist/reactions/reactions.js.map +1 -1
  132. package/dist/reactions/reactions.type.js +18 -18
  133. package/dist/reactions/reactions.type.js.map +1 -1
  134. package/dist/reconnection-manager/index.js +196 -155
  135. package/dist/reconnection-manager/index.js.map +1 -1
  136. package/dist/recording-controller/index.js +21 -1
  137. package/dist/recording-controller/index.js.map +1 -1
  138. package/dist/recording-controller/util.js +9 -8
  139. package/dist/recording-controller/util.js.map +1 -1
  140. package/dist/roap/index.js +21 -29
  141. package/dist/roap/index.js.map +1 -1
  142. package/dist/roap/request.js +110 -89
  143. package/dist/roap/request.js.map +1 -1
  144. package/dist/roap/turnDiscovery.js +93 -36
  145. package/dist/roap/turnDiscovery.js.map +1 -1
  146. package/dist/rtcMetrics/constants.js +12 -0
  147. package/dist/rtcMetrics/constants.js.map +1 -0
  148. package/dist/rtcMetrics/index.js +115 -0
  149. package/dist/rtcMetrics/index.js.map +1 -0
  150. package/dist/statsAnalyzer/global.js +1 -93
  151. package/dist/statsAnalyzer/global.js.map +1 -1
  152. package/dist/statsAnalyzer/index.js +326 -311
  153. package/dist/statsAnalyzer/index.js.map +1 -1
  154. package/dist/statsAnalyzer/mqaUtil.js +90 -53
  155. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  156. package/dist/types/annotation/annotation.types.d.ts +42 -0
  157. package/dist/types/annotation/constants.d.ts +31 -0
  158. package/dist/types/annotation/index.d.ts +117 -0
  159. package/dist/types/breakouts/breakout.d.ts +8 -0
  160. package/dist/types/breakouts/collection.d.ts +5 -0
  161. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  162. package/dist/types/breakouts/events.d.ts +8 -0
  163. package/dist/types/breakouts/index.d.ts +5 -0
  164. package/dist/types/breakouts/request.d.ts +22 -0
  165. package/dist/types/breakouts/utils.d.ts +15 -0
  166. package/dist/types/common/browser-detection.d.ts +9 -0
  167. package/dist/types/common/collection.d.ts +48 -0
  168. package/dist/types/common/config.d.ts +2 -0
  169. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  170. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  171. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  172. package/dist/types/common/errors/media.d.ts +15 -0
  173. package/dist/types/common/errors/parameter.d.ts +15 -0
  174. package/dist/types/common/errors/password-error.d.ts +15 -0
  175. package/dist/types/common/errors/permission.d.ts +14 -0
  176. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  177. package/dist/types/common/errors/reconnection.d.ts +15 -0
  178. package/dist/types/common/errors/stats.d.ts +15 -0
  179. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  180. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  181. package/dist/types/common/events/events-scope.d.ts +17 -0
  182. package/dist/types/common/events/events.d.ts +12 -0
  183. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  184. package/dist/types/common/events/util.d.ts +2 -0
  185. package/dist/types/common/logs/logger-config.d.ts +2 -0
  186. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  187. package/dist/types/common/logs/request.d.ts +34 -0
  188. package/dist/types/common/queue.d.ts +34 -0
  189. package/dist/types/config.d.ts +72 -0
  190. package/dist/types/constants.d.ts +1016 -0
  191. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  192. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  193. package/dist/types/controls-options-manager/index.d.ts +136 -0
  194. package/dist/types/controls-options-manager/types.d.ts +43 -0
  195. package/dist/types/controls-options-manager/util.d.ts +1 -0
  196. package/dist/types/index.d.ts +7 -0
  197. package/dist/types/interpretation/collection.d.ts +5 -0
  198. package/dist/types/interpretation/index.d.ts +5 -0
  199. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  200. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  201. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  202. package/dist/types/locus-info/fullState.d.ts +2 -0
  203. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  204. package/dist/types/locus-info/index.d.ts +322 -0
  205. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  206. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  207. package/dist/types/locus-info/parser.d.ts +271 -0
  208. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  209. package/dist/types/media/index.d.ts +34 -0
  210. package/dist/types/media/properties.d.ts +93 -0
  211. package/dist/types/media/util.d.ts +2 -0
  212. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  213. package/dist/types/meeting/in-meeting-actions.d.ts +153 -0
  214. package/dist/types/meeting/index.d.ts +1471 -0
  215. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  216. package/dist/types/meeting/muteState.d.ts +184 -0
  217. package/dist/types/meeting/request.d.ts +257 -0
  218. package/dist/types/meeting/request.type.d.ts +11 -0
  219. package/dist/types/meeting/state.d.ts +9 -0
  220. package/dist/types/meeting/util.d.ts +78 -0
  221. package/dist/types/meeting-info/collection.d.ts +20 -0
  222. package/dist/types/meeting-info/index.d.ts +62 -0
  223. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  224. package/dist/types/meeting-info/request.d.ts +22 -0
  225. package/dist/types/meeting-info/util.d.ts +2 -0
  226. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  227. package/dist/types/meetings/collection.d.ts +31 -0
  228. package/dist/types/meetings/index.d.ts +367 -0
  229. package/dist/types/meetings/meetings.types.d.ts +4 -0
  230. package/dist/types/meetings/request.d.ts +27 -0
  231. package/dist/types/meetings/util.d.ts +18 -0
  232. package/dist/types/member/index.d.ts +159 -0
  233. package/dist/types/member/types.d.ts +32 -0
  234. package/dist/types/member/util.d.ts +2 -0
  235. package/dist/types/members/collection.d.ts +29 -0
  236. package/dist/types/members/index.d.ts +353 -0
  237. package/dist/types/members/request.d.ts +114 -0
  238. package/dist/types/members/types.d.ts +24 -0
  239. package/dist/types/members/util.d.ts +210 -0
  240. package/dist/types/metrics/constants.d.ts +55 -0
  241. package/dist/types/metrics/index.d.ts +45 -0
  242. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  243. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  244. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  245. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  246. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  247. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  248. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  249. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  250. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  251. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  252. package/dist/types/reachability/index.d.ts +152 -0
  253. package/dist/types/reachability/request.d.ts +37 -0
  254. package/dist/types/reactions/constants.d.ts +3 -0
  255. package/dist/types/reactions/reactions.d.ts +4 -0
  256. package/dist/types/reactions/reactions.type.d.ts +52 -0
  257. package/dist/types/reconnection-manager/index.d.ts +126 -0
  258. package/dist/types/recording-controller/enums.d.ts +7 -0
  259. package/dist/types/recording-controller/index.d.ts +208 -0
  260. package/dist/types/recording-controller/util.d.ts +14 -0
  261. package/dist/types/roap/index.d.ts +77 -0
  262. package/dist/types/roap/request.d.ts +36 -0
  263. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  264. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  265. package/dist/types/rtcMetrics/index.d.ts +46 -0
  266. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  267. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  268. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  269. package/dist/types/transcription/index.d.ts +64 -0
  270. package/package.json +25 -22
  271. package/src/annotation/annotation.types.ts +50 -0
  272. package/src/annotation/constants.ts +36 -0
  273. package/src/annotation/index.ts +328 -0
  274. package/src/breakouts/README.md +44 -14
  275. package/src/breakouts/breakout.ts +87 -9
  276. package/src/breakouts/edit-lock-error.ts +25 -0
  277. package/src/breakouts/events.ts +56 -0
  278. package/src/breakouts/index.ts +710 -10
  279. package/src/breakouts/request.ts +55 -0
  280. package/src/breakouts/utils.ts +57 -0
  281. package/src/common/errors/webex-errors.ts +6 -2
  282. package/src/common/logs/logger-proxy.ts +1 -1
  283. package/src/common/queue.ts +22 -8
  284. package/src/config.ts +2 -7
  285. package/src/constants.ts +157 -21
  286. package/src/controls-options-manager/constants.ts +5 -0
  287. package/src/controls-options-manager/enums.ts +18 -0
  288. package/src/controls-options-manager/index.ts +278 -0
  289. package/src/controls-options-manager/types.ts +59 -0
  290. package/src/controls-options-manager/util.ts +300 -0
  291. package/src/index.ts +39 -0
  292. package/src/interpretation/README.md +60 -0
  293. package/src/interpretation/collection.ts +19 -0
  294. package/src/interpretation/index.ts +332 -0
  295. package/src/interpretation/siLanguage.ts +18 -0
  296. package/src/locus-info/controlsUtils.ts +108 -0
  297. package/src/locus-info/index.ts +375 -52
  298. package/src/locus-info/mediaSharesUtils.ts +48 -0
  299. package/src/locus-info/parser.ts +224 -39
  300. package/src/locus-info/selfUtils.ts +81 -5
  301. package/src/media/index.ts +87 -140
  302. package/src/media/properties.ts +49 -90
  303. package/src/mediaQualityMetrics/config.ts +379 -377
  304. package/src/meeting/in-meeting-actions.ts +159 -3
  305. package/src/meeting/index.ts +1980 -2030
  306. package/src/meeting/locusMediaRequest.ts +309 -0
  307. package/src/meeting/muteState.ts +228 -132
  308. package/src/meeting/request.ts +102 -112
  309. package/src/meeting/util.ts +509 -397
  310. package/src/meeting-info/index.ts +54 -8
  311. package/src/meeting-info/meeting-info-v2.ts +148 -14
  312. package/src/meeting-info/utilv2.ts +13 -3
  313. package/src/meetings/collection.ts +20 -0
  314. package/src/meetings/index.ts +392 -84
  315. package/src/meetings/meetings.types.ts +12 -0
  316. package/src/meetings/request.ts +2 -0
  317. package/src/meetings/util.ts +103 -4
  318. package/src/member/index.ts +49 -0
  319. package/src/member/types.ts +38 -0
  320. package/src/member/util.ts +127 -25
  321. package/src/members/collection.ts +8 -0
  322. package/src/members/index.ts +107 -6
  323. package/src/members/request.ts +97 -17
  324. package/src/members/types.ts +28 -0
  325. package/src/members/util.ts +319 -240
  326. package/src/metrics/constants.ts +2 -4
  327. package/src/metrics/index.ts +1 -490
  328. package/src/multistream/mediaRequestManager.ts +289 -79
  329. package/src/multistream/receiveSlot.ts +55 -18
  330. package/src/multistream/receiveSlotManager.ts +46 -24
  331. package/src/multistream/remoteMedia.ts +27 -2
  332. package/src/multistream/remoteMediaGroup.ts +59 -0
  333. package/src/multistream/remoteMediaManager.ts +113 -32
  334. package/src/networkQualityMonitor/index.ts +6 -6
  335. package/src/reachability/index.ts +62 -15
  336. package/src/reachability/request.ts +10 -5
  337. package/src/reactions/reactions.ts +4 -4
  338. package/src/reactions/reactions.type.ts +3 -3
  339. package/src/reconnection-manager/index.ts +68 -43
  340. package/src/recording-controller/index.ts +20 -2
  341. package/src/recording-controller/util.ts +26 -9
  342. package/src/roap/index.ts +21 -30
  343. package/src/roap/request.ts +101 -95
  344. package/src/roap/turnDiscovery.ts +47 -25
  345. package/src/rtcMetrics/constants.ts +3 -0
  346. package/src/rtcMetrics/index.ts +96 -0
  347. package/src/statsAnalyzer/global.ts +1 -94
  348. package/src/statsAnalyzer/index.ts +376 -386
  349. package/src/statsAnalyzer/mqaUtil.ts +100 -99
  350. package/test/integration/spec/converged-space-meetings.js +233 -0
  351. package/test/integration/spec/journey.js +336 -259
  352. package/test/integration/spec/space-meeting.js +77 -4
  353. package/test/unit/spec/annotation/index.ts +418 -0
  354. package/test/unit/spec/breakouts/breakout.ts +142 -24
  355. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  356. package/test/unit/spec/breakouts/events.ts +89 -0
  357. package/test/unit/spec/breakouts/index.ts +1545 -48
  358. package/test/unit/spec/breakouts/request.ts +104 -0
  359. package/test/unit/spec/breakouts/utils.js +72 -0
  360. package/test/unit/spec/common/queue.js +31 -2
  361. package/test/unit/spec/controls-options-manager/index.js +287 -0
  362. package/test/unit/spec/controls-options-manager/util.js +582 -0
  363. package/test/unit/spec/fixture/locus.js +1 -0
  364. package/test/unit/spec/interpretation/collection.ts +15 -0
  365. package/test/unit/spec/interpretation/index.ts +589 -0
  366. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  367. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  368. package/test/unit/spec/locus-info/index.js +1094 -38
  369. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  370. package/test/unit/spec/locus-info/parser.js +62 -22
  371. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  372. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  373. package/test/unit/spec/media/index.ts +138 -28
  374. package/test/unit/spec/meeting/in-meeting-actions.ts +79 -3
  375. package/test/unit/spec/meeting/index.js +3092 -1571
  376. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  377. package/test/unit/spec/meeting/muteState.js +370 -208
  378. package/test/unit/spec/meeting/request.js +338 -43
  379. package/test/unit/spec/meeting/utils.js +449 -53
  380. package/test/unit/spec/meeting-info/index.js +181 -0
  381. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  382. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  383. package/test/unit/spec/meetings/collection.js +14 -0
  384. package/test/unit/spec/meetings/index.js +866 -124
  385. package/test/unit/spec/meetings/utils.js +206 -2
  386. package/test/unit/spec/member/index.js +58 -4
  387. package/test/unit/spec/member/util.js +479 -35
  388. package/test/unit/spec/members/index.js +319 -1
  389. package/test/unit/spec/members/request.js +206 -27
  390. package/test/unit/spec/members/utils.js +184 -0
  391. package/test/unit/spec/metrics/index.js +1 -50
  392. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  393. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  394. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  395. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  396. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  397. package/test/unit/spec/multistream/remoteMediaManager.ts +318 -0
  398. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  399. package/test/unit/spec/reachability/index.ts +125 -8
  400. package/test/unit/spec/reachability/request.js +66 -0
  401. package/test/unit/spec/reconnection-manager/index.js +59 -6
  402. package/test/unit/spec/recording-controller/index.js +294 -218
  403. package/test/unit/spec/recording-controller/util.js +223 -96
  404. package/test/unit/spec/roap/index.ts +26 -51
  405. package/test/unit/spec/roap/request.ts +196 -85
  406. package/test/unit/spec/roap/turnDiscovery.ts +30 -7
  407. package/test/unit/spec/rtcMetrics/index.ts +60 -0
  408. package/test/unit/spec/stats-analyzer/index.js +92 -41
  409. package/test/utils/constants.js +9 -0
  410. package/test/utils/integrationTestUtils.js +46 -0
  411. package/test/utils/testUtils.js +0 -45
  412. package/test/utils/webex-config.js +4 -0
  413. package/test/utils/webex-test-users.js +6 -3
  414. package/dist/meeting/effectsState.js +0 -262
  415. package/dist/meeting/effectsState.js.map +0 -1
  416. package/dist/metrics/config.js +0 -299
  417. package/dist/metrics/config.js.map +0 -1
  418. package/dist/multistream/multistreamMedia.js +0 -110
  419. package/dist/multistream/multistreamMedia.js.map +0 -1
  420. package/src/index.js +0 -15
  421. package/src/meeting/effectsState.ts +0 -211
  422. package/src/metrics/config.ts +0 -495
  423. package/src/multistream/multistreamMedia.ts +0 -97
  424. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -1,4 +1,4 @@
1
- import {isEqual} from 'lodash';
1
+ import {isEqual, assignWith, cloneDeep, isEmpty} from 'lodash';
2
2
 
3
3
  import LoggerProxy from '../common/logs/logger-proxy';
4
4
  import EventsScope from '../common/events/events-scope';
@@ -17,8 +17,6 @@ import {
17
17
  CALL_REMOVED_REASON,
18
18
  RECORDING_STATE,
19
19
  } from '../constants';
20
- import Metrics from '../metrics';
21
- import {eventType} from '../metrics/config';
22
20
  import InfoUtils from './infoUtils';
23
21
  import FullState from './fullState';
24
22
  import SelfUtils from './selfUtils';
@@ -59,11 +57,19 @@ export default class LocusInfo extends EventsScope {
59
57
  fullState: any;
60
58
  host: any;
61
59
  info: any;
60
+ roles: any;
62
61
  mediaShares: any;
63
62
  replace: any;
64
63
  url: any;
65
64
  services: any;
66
-
65
+ mainSessionLocusCache: any;
66
+ /**
67
+ * Constructor
68
+ * @param {boolean} updateMeeting true if the meeting should be updated
69
+ * @param {object} webex
70
+ * @param {string} meetingId
71
+ * @returns {undefined}
72
+ */
67
73
  constructor(updateMeeting, webex, meetingId) {
68
74
  super();
69
75
  this.parsedLocus = {
@@ -77,6 +83,53 @@ export default class LocusInfo extends EventsScope {
77
83
  this.locusParser = new LocusDeltaParser();
78
84
  }
79
85
 
86
+ /**
87
+ * Does a Locus sync. It tries to get the latest delta DTO or if it can't, it falls back to getting the full Locus DTO.
88
+ *
89
+ * @param {Meeting} meeting
90
+ * @returns {undefined}
91
+ */
92
+ private doLocusSync(meeting: any) {
93
+ let isDelta;
94
+ let url;
95
+
96
+ if (this.locusParser.workingCopy.syncUrl) {
97
+ url = this.locusParser.workingCopy.syncUrl;
98
+ isDelta = true;
99
+ } else {
100
+ url = meeting.locusUrl;
101
+ isDelta = false;
102
+ }
103
+
104
+ LoggerProxy.logger.info(
105
+ `Locus-info:index#doLocusSync --> doing Locus sync (getting ${
106
+ isDelta ? 'delta' : 'full'
107
+ } DTO)`
108
+ );
109
+
110
+ // return value ignored on purpose
111
+ meeting.meetingRequest
112
+ .getLocusDTO({url})
113
+ .then((res) => {
114
+ if (isDelta) {
115
+ if (!isEmpty(res.body)) {
116
+ meeting.locusInfo.handleLocusDelta(res.body, meeting);
117
+ } else {
118
+ LoggerProxy.logger.info(
119
+ 'Locus-info:index#doLocusSync --> received empty body from syncUrl, so we already have latest Locus DTO'
120
+ );
121
+ }
122
+ } else {
123
+ meeting.locusInfo.onFullLocus(res.body);
124
+ }
125
+ })
126
+ .finally(() => {
127
+ // Notify parser to resume processing delta events.
128
+ // Any deltas in the queue that have now been superseded by this sync will simply be ignored
129
+ this.locusParser.resume();
130
+ });
131
+ }
132
+
80
133
  /**
81
134
  * Apply locus delta data to meeting
82
135
  * @param {string} action Locus delta action
@@ -85,28 +138,18 @@ export default class LocusInfo extends EventsScope {
85
138
  * @returns {undefined}
86
139
  */
87
140
  applyLocusDeltaData(action: string, locus: any, meeting: any) {
88
- const {DESYNC, USE_CURRENT, USE_INCOMING} = LocusDeltaParser.loci;
141
+ const {DESYNC, USE_CURRENT, USE_INCOMING, WAIT} = LocusDeltaParser.loci;
89
142
 
90
143
  switch (action) {
91
144
  case USE_INCOMING:
92
145
  meeting.locusInfo.onDeltaLocus(locus);
93
146
  break;
94
147
  case USE_CURRENT:
95
- meeting.locusDesync = false;
96
- meeting.needToGetFullLocus = false;
148
+ case WAIT:
149
+ // do nothing
97
150
  break;
98
151
  case DESYNC:
99
- meeting.meetingRequest
100
- .getFullLocus({
101
- desync: true,
102
- locusUrl: meeting.locusUrl,
103
- })
104
- .then((res) => {
105
- meeting.locusInfo.onFullLocus(res.body);
106
- // Notify parser to resume processing delta events
107
- // now that we have full locus from DESYNC.
108
- this.locusParser.resume();
109
- });
152
+ this.doLocusSync(meeting);
110
153
  break;
111
154
  default:
112
155
  LoggerProxy.logger.info(
@@ -172,12 +215,13 @@ export default class LocusInfo extends EventsScope {
172
215
  */
173
216
  this.deltaParticipants = [];
174
217
 
218
+ this.updateLocusCache(locus);
175
219
  // above section only updates the locusInfo object
176
220
  // The below section makes sure it updates the locusInfo as well as updates the meeting object
177
221
  this.updateParticipants(locus.participants);
178
222
  // For 1:1 space meeting the conversation Url does not exist in locus.conversation
179
223
  this.updateConversationUrl(locus.conversationUrl, locus.info);
180
- this.updateControls(locus.controls);
224
+ this.updateControls(locus.controls, locus.self);
181
225
  this.updateLocusUrl(locus.url);
182
226
  this.updateFullState(locus.fullState);
183
227
  this.updateMeetingInfo(locus.info);
@@ -195,6 +239,7 @@ export default class LocusInfo extends EventsScope {
195
239
  * @memberof LocusInfo
196
240
  */
197
241
  initialSetup(locus: object) {
242
+ this.updateLocusCache(locus);
198
243
  this.onFullLocus(locus);
199
244
 
200
245
  // Change it to true after it receives it first locus object
@@ -210,7 +255,7 @@ export default class LocusInfo extends EventsScope {
210
255
  parse(meeting: any, data: any) {
211
256
  // eslint-disable-next-line @typescript-eslint/no-shadow
212
257
  const {eventType} = data;
213
-
258
+ const locus = this.getTheLocusToUpdate(data.locus);
214
259
  LoggerProxy.logger.info(`Locus-info:index#parse --> received locus data: ${eventType}`);
215
260
 
216
261
  switch (eventType) {
@@ -228,16 +273,16 @@ export default class LocusInfo extends EventsScope {
228
273
  case LOCUSEVENT.PARTICIPANT_DECLINED:
229
274
  case LOCUSEVENT.FLOOR_GRANTED:
230
275
  case LOCUSEVENT.FLOOR_RELEASED:
231
- this.onFullLocus(data.locus, eventType);
276
+ this.onFullLocus(locus, eventType);
232
277
  break;
233
278
  case LOCUSEVENT.DIFFERENCE:
234
- this.handleLocusDelta(data.locus, meeting);
279
+ this.handleLocusDelta(locus, meeting);
235
280
  break;
236
281
 
237
282
  default:
238
283
  // Why will there be a event with no eventType ????
239
284
  // we may not need this, we can get full locus
240
- this.handleLocusDelta(data.locus, meeting);
285
+ this.handleLocusDelta(locus, meeting);
241
286
  }
242
287
  }
243
288
 
@@ -259,18 +304,27 @@ export default class LocusInfo extends EventsScope {
259
304
  * @returns {object} null
260
305
  * @memberof LocusInfo
261
306
  */
262
- // eslint-disable-next-line @typescript-eslint/no-shadow
263
307
  onFullLocus(locus: any, eventType?: string) {
264
308
  if (!locus) {
265
309
  LoggerProxy.logger.error(
266
310
  'Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.'
267
311
  );
268
312
  }
313
+
314
+ if (!this.locusParser.isNewFullLocus(locus)) {
315
+ LoggerProxy.logger.info(
316
+ `Locus-info:index#onFullLocus --> ignoring old full locus DTO, eventType=${eventType}`
317
+ );
318
+
319
+ return;
320
+ }
321
+
269
322
  this.updateParticipantDeltas(locus.participants);
270
323
  this.scheduledMeeting = locus.meeting || null;
271
324
  this.participants = locus.participants;
325
+ const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);
272
326
  this.updateLocusInfo(locus);
273
- this.updateParticipants(locus.participants);
327
+ this.updateParticipants(locus.participants, isReplaceMembers);
274
328
  this.isMeetingActive();
275
329
  this.handleOneOnOneEvent(eventType);
276
330
  this.updateEmbeddedApps(locus.embeddedApps);
@@ -329,8 +383,9 @@ export default class LocusInfo extends EventsScope {
329
383
  * @memberof LocusInfo
330
384
  */
331
385
  onDeltaLocus(locus: any) {
386
+ const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);
332
387
  this.updateLocusInfo(locus);
333
- this.updateParticipants(locus.participants);
388
+ this.updateParticipants(locus.participants, isReplaceMembers);
334
389
  this.isMeetingActive();
335
390
  }
336
391
 
@@ -347,7 +402,7 @@ export default class LocusInfo extends EventsScope {
347
402
  return;
348
403
  }
349
404
 
350
- this.updateControls(locus.controls);
405
+ this.updateControls(locus.controls, locus.self);
351
406
  this.updateConversationUrl(locus.conversationUrl, locus.info);
352
407
  this.updateCreated(locus.created);
353
408
  this.updateFullState(locus.fullState);
@@ -418,10 +473,15 @@ export default class LocusInfo extends EventsScope {
418
473
  LoggerProxy.logger.warn(
419
474
  'Locus-info:index#isMeetingActive --> Call Ended, locus state is inactive.'
420
475
  );
421
- Metrics.postEvent({
422
- event: eventType.REMOTE_ENDED,
423
- meetingId: this.meetingId,
476
+
477
+ // @ts-ignore
478
+ this.webex.internal.newMetrics.submitClientEvent({
479
+ name: 'client.call.remote-ended',
480
+ options: {
481
+ meetingId: this.meetingId,
482
+ },
424
483
  });
484
+
425
485
  this.emitScoped(
426
486
  {
427
487
  file: 'locus-info',
@@ -440,9 +500,12 @@ export default class LocusInfo extends EventsScope {
440
500
  this.parsedLocus.self.state === MEETING_STATE.STATES.NOTIFIED ||
441
501
  this.parsedLocus.self.state === MEETING_STATE.STATES.JOINED)
442
502
  ) {
443
- Metrics.postEvent({
444
- event: eventType.REMOTE_ENDED,
445
- meetingId: this.meetingId,
503
+ // @ts-ignore
504
+ this.webex.internal.newMetrics.submitClientEvent({
505
+ name: 'client.call.remote-ended',
506
+ options: {
507
+ meetingId: this.meetingId,
508
+ },
446
509
  });
447
510
  this.emitScoped(
448
511
  {
@@ -464,10 +527,14 @@ export default class LocusInfo extends EventsScope {
464
527
  partner.state === MEETING_STATE.STATES.NOTIFIED ||
465
528
  partner.state === MEETING_STATE.STATES.IDLE) // Happens when user just joins and adds no Media
466
529
  ) {
467
- Metrics.postEvent({
468
- event: eventType.REMOTE_ENDED,
469
- meetingId: this.meetingId,
530
+ // @ts-ignore
531
+ this.webex.internal.newMetrics.submitClientEvent({
532
+ name: 'client.call.remote-ended',
533
+ options: {
534
+ meetingId: this.meetingId,
535
+ },
470
536
  });
537
+
471
538
  this.emitScoped(
472
539
  {
473
540
  file: 'locus-info',
@@ -490,9 +557,13 @@ export default class LocusInfo extends EventsScope {
490
557
  LoggerProxy.logger.warn(
491
558
  'Locus-info:index#isMeetingActive --> Meeting is ending due to inactive or terminating'
492
559
  );
493
- Metrics.postEvent({
494
- event: eventType.REMOTE_ENDED,
495
- meetingId: this.meetingId,
560
+
561
+ // @ts-ignore
562
+ this.webex.internal.newMetrics.submitClientEvent({
563
+ name: 'client.call.remote-ended',
564
+ options: {
565
+ meetingId: this.meetingId,
566
+ },
496
567
  });
497
568
  this.emitScoped(
498
569
  {
@@ -507,9 +578,13 @@ export default class LocusInfo extends EventsScope {
507
578
  );
508
579
  } else if (this.fullState && this.fullState.removed) {
509
580
  // user has been dropped from a meeting
510
- Metrics.postEvent({
511
- event: eventType.REMOTE_ENDED,
512
- meetingId: this.meetingId,
581
+
582
+ // @ts-ignore
583
+ this.webex.internal.newMetrics.submitClientEvent({
584
+ name: 'client.call.remote-ended',
585
+ options: {
586
+ meetingId: this.meetingId,
587
+ },
513
588
  });
514
589
  this.emitScoped(
515
590
  {
@@ -646,13 +721,13 @@ export default class LocusInfo extends EventsScope {
646
721
  }
647
722
 
648
723
  /**
649
- *
724
+ * update meeting's members
650
725
  * @param {Object} participants new participants object
651
- * @param {boolen} deltaParticpantFlag delta event
726
+ * @param {Boolean} isReplace is replace the whole members
652
727
  * @returns {Array} updatedParticipants
653
728
  * @memberof LocusInfo
654
729
  */
655
- updateParticipants(participants: object) {
730
+ updateParticipants(participants: object, isReplace?: boolean) {
656
731
  this.emitScoped(
657
732
  {
658
733
  file: 'locus-info',
@@ -665,16 +740,18 @@ export default class LocusInfo extends EventsScope {
665
740
  selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,
666
741
  selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,
667
742
  hostId: this.parsedLocus.host && this.parsedLocus.host.hostId,
743
+ isReplace,
668
744
  }
669
745
  );
670
746
  }
671
747
 
672
748
  /**
673
749
  * @param {Object} controls
750
+ * @param {Object} self
674
751
  * @returns {undefined}
675
752
  * @memberof LocusInfo
676
753
  */
677
- updateControls(controls: object) {
754
+ updateControls(controls: object, self: object) {
678
755
  if (controls && !isEqual(this.controls, controls)) {
679
756
  this.parsedLocus.controls = ControlsUtils.parse(controls);
680
757
  const {
@@ -685,10 +762,76 @@ export default class LocusInfo extends EventsScope {
685
762
  hasTranscribeChanged,
686
763
  hasEntryExitToneChanged,
687
764
  hasBreakoutChanged,
765
+ hasVideoEnabledChanged,
766
+ hasMuteOnEntryChanged,
767
+ hasShareControlChanged,
768
+ hasDisallowUnmuteChanged,
769
+ hasReactionsChanged,
770
+ hasReactionDisplayNamesChanged,
771
+ hasViewTheParticipantListChanged,
772
+ hasRaiseHandChanged,
773
+ hasVideoChanged,
774
+ hasInterpretationChanged,
688
775
  },
689
776
  current,
690
777
  } = ControlsUtils.getControls(this.controls, controls);
691
778
 
779
+ if (hasMuteOnEntryChanged) {
780
+ this.emitScoped(
781
+ {file: 'locus-info', function: 'updateControls'},
782
+ LOCUSINFO.EVENTS.CONTROLS_MUTE_ON_ENTRY_CHANGED,
783
+ {state: current.muteOnEntry}
784
+ );
785
+ }
786
+
787
+ if (hasShareControlChanged) {
788
+ this.emitScoped(
789
+ {file: 'locus-info', function: 'updateControls'},
790
+ LOCUSINFO.EVENTS.CONTROLS_SHARE_CONTROL_CHANGED,
791
+ {state: current.shareControl}
792
+ );
793
+ }
794
+
795
+ if (hasDisallowUnmuteChanged) {
796
+ this.emitScoped(
797
+ {file: 'locus-info', function: 'updateControls'},
798
+ LOCUSINFO.EVENTS.CONTROLS_DISALLOW_UNMUTE_CHANGED,
799
+ {state: current.disallowUnmute}
800
+ );
801
+ }
802
+
803
+ if (hasReactionsChanged || hasReactionDisplayNamesChanged) {
804
+ this.emitScoped(
805
+ {file: 'locus-info', function: 'updateControls'},
806
+ LOCUSINFO.EVENTS.CONTROLS_REACTIONS_CHANGED,
807
+ {state: current.reactions}
808
+ );
809
+ }
810
+
811
+ if (hasViewTheParticipantListChanged) {
812
+ this.emitScoped(
813
+ {file: 'locus-info', function: 'updateControls'},
814
+ LOCUSINFO.EVENTS.CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED,
815
+ {state: current.viewTheParticipantList}
816
+ );
817
+ }
818
+
819
+ if (hasRaiseHandChanged) {
820
+ this.emitScoped(
821
+ {file: 'locus-info', function: 'updateControls'},
822
+ LOCUSINFO.EVENTS.CONTROLS_RAISE_HAND_CHANGED,
823
+ {state: current.raiseHand}
824
+ );
825
+ }
826
+
827
+ if (hasVideoChanged) {
828
+ this.emitScoped(
829
+ {file: 'locus-info', function: 'updateControls'},
830
+ LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED,
831
+ {state: current.video}
832
+ );
833
+ }
834
+
692
835
  if (hasRecordingChanged || hasRecordingPausedChanged) {
693
836
  let state = null;
694
837
 
@@ -750,7 +893,10 @@ export default class LocusInfo extends EventsScope {
750
893
 
751
894
  if (hasBreakoutChanged) {
752
895
  const {breakout} = current;
753
-
896
+ breakout.breakoutMoveId = SelfUtils.getReplacedBreakoutMoveId(
897
+ self,
898
+ this.webex.internal.device.url
899
+ );
754
900
  this.emitScoped(
755
901
  {
756
902
  file: 'locus-info',
@@ -763,9 +909,25 @@ export default class LocusInfo extends EventsScope {
763
909
  );
764
910
  }
765
911
 
912
+ if (hasInterpretationChanged) {
913
+ const {interpretation} = current;
914
+ this.emitScoped(
915
+ {
916
+ file: 'locus-info',
917
+ function: 'updateControls',
918
+ },
919
+ LOCUSINFO.EVENTS.CONTROLS_MEETING_INTERPRETATION_UPDATED,
920
+ {
921
+ interpretation,
922
+ }
923
+ );
924
+ }
925
+
766
926
  if (hasEntryExitToneChanged) {
767
927
  const {entryExitTone} = current;
768
928
 
929
+ this.updateMeeting({entryExitTone});
930
+
769
931
  this.emitScoped(
770
932
  {
771
933
  file: 'locus-info',
@@ -776,8 +938,26 @@ export default class LocusInfo extends EventsScope {
776
938
  entryExitTone,
777
939
  }
778
940
  );
941
+ }
779
942
 
780
- this.updateMeeting({entryExitTone});
943
+ // videoEnabled is handled differently than other controls,
944
+ // to fit with audio mute status logic
945
+ if (hasVideoEnabledChanged) {
946
+ const {videoEnabled} = current;
947
+
948
+ this.updateMeeting({unmuteVideoAllowed: videoEnabled});
949
+
950
+ this.emitScoped(
951
+ {
952
+ file: 'locus-info',
953
+ function: 'updateControls',
954
+ },
955
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
956
+ {
957
+ // muted: not part of locus.controls
958
+ unmuteAllowed: videoEnabled,
959
+ }
960
+ );
781
961
  }
782
962
 
783
963
  this.controls = controls;
@@ -918,8 +1098,11 @@ export default class LocusInfo extends EventsScope {
918
1098
  * @memberof LocusInfo
919
1099
  */
920
1100
  updateMeetingInfo(info: object, self?: object) {
921
- if (info && !isEqual(this.info, info)) {
922
- const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
1101
+ const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
1102
+ if (
1103
+ (info && !isEqual(this.info, info)) ||
1104
+ (roles.length && !isEqual(this.roles, roles) && info)
1105
+ ) {
923
1106
  const isJoined = SelfUtils.isJoined(self || this.parsedLocus.self);
924
1107
  const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles, isJoined);
925
1108
 
@@ -958,6 +1141,7 @@ export default class LocusInfo extends EventsScope {
958
1141
  // Parses the info and adds necessary values
959
1142
  this.updateMeeting(parsedInfo.current);
960
1143
  }
1144
+ this.roles = roles;
961
1145
  }
962
1146
 
963
1147
  /**
@@ -998,6 +1182,8 @@ export default class LocusInfo extends EventsScope {
998
1182
  const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);
999
1183
 
1000
1184
  this.updateMeeting(parsedMediaShares.current);
1185
+ this.parsedLocus.mediaShares = parsedMediaShares.current;
1186
+ this.mediaShares = mediaShares;
1001
1187
  this.emitScoped(
1002
1188
  {
1003
1189
  file: 'locus-info',
@@ -1009,8 +1195,6 @@ export default class LocusInfo extends EventsScope {
1009
1195
  previous: parsedMediaShares.previous,
1010
1196
  }
1011
1197
  );
1012
- this.parsedLocus.mediaShares = parsedMediaShares.current;
1013
- this.mediaShares = mediaShares;
1014
1198
  }
1015
1199
  }
1016
1200
 
@@ -1099,6 +1283,20 @@ export default class LocusInfo extends EventsScope {
1099
1283
  );
1100
1284
  }
1101
1285
 
1286
+ if (parsedSelves.updates.interpretationChanged) {
1287
+ this.emitScoped(
1288
+ {
1289
+ file: 'locus-info',
1290
+ function: 'updateSelf',
1291
+ },
1292
+ LOCUSINFO.EVENTS.SELF_MEETING_INTERPRETATION_CHANGED,
1293
+ {
1294
+ interpretation: parsedSelves.current.interpretation,
1295
+ selfParticipantId: parsedSelves.current.selfId,
1296
+ }
1297
+ );
1298
+ }
1299
+
1102
1300
  if (parsedSelves.updates.isMediaInactiveOrReleased) {
1103
1301
  this.emitScoped(
1104
1302
  {
@@ -1120,6 +1318,31 @@ export default class LocusInfo extends EventsScope {
1120
1318
  self
1121
1319
  );
1122
1320
  }
1321
+
1322
+ if (parsedSelves.updates.isRolesChanged) {
1323
+ this.emitScoped(
1324
+ {
1325
+ file: 'locus-info',
1326
+ function: 'updateSelf',
1327
+ },
1328
+ LOCUSINFO.EVENTS.SELF_ROLES_CHANGED,
1329
+ {oldRoles: parsedSelves.previous?.roles, newRoles: parsedSelves.current?.roles}
1330
+ );
1331
+ }
1332
+
1333
+ if (parsedSelves.updates.isVideoMutedByOthersChanged) {
1334
+ this.emitScoped(
1335
+ {
1336
+ file: 'locus-info',
1337
+ function: 'updateSelf',
1338
+ },
1339
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
1340
+ {
1341
+ muted: parsedSelves.current.remoteVideoMuted,
1342
+ // unmuteAllowed: not part of .self
1343
+ }
1344
+ );
1345
+ }
1123
1346
  if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {
1124
1347
  this.emitScoped(
1125
1348
  {
@@ -1334,4 +1557,104 @@ export default class LocusInfo extends EventsScope {
1334
1557
  this.identities = identities;
1335
1558
  }
1336
1559
  }
1560
+
1561
+ /**
1562
+ * check the locus is main session's one or not, if is main session's, update main session cache
1563
+ * @param {Object} locus
1564
+ * @returns {undefined}
1565
+ * @memberof LocusInfo
1566
+ */
1567
+ updateLocusCache(locus: any) {
1568
+ const isMainSessionDTO = ControlsUtils.isMainSessionDTO(locus);
1569
+ if (isMainSessionDTO) {
1570
+ this.updateMainSessionLocusCache(locus);
1571
+ }
1572
+ }
1573
+
1574
+ /**
1575
+ * if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)
1576
+ * if join breakout from main session, need to query main locus url (if response with 403 means no privilege, need to clear the cache)
1577
+ * @param {Object} newLocus
1578
+ * @returns {Object}
1579
+ * @memberof LocusInfo
1580
+ */
1581
+ getTheLocusToUpdate(newLocus: any) {
1582
+ const switchStatus = ControlsUtils.getSessionSwitchStatus(this.controls, newLocus?.controls);
1583
+ if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {
1584
+ return cloneDeep(this.mainSessionLocusCache);
1585
+ }
1586
+ if (switchStatus.isJoinToBreakout) {
1587
+ this.emitScoped(
1588
+ {
1589
+ file: 'locus-info',
1590
+ function: 'updateControls',
1591
+ },
1592
+ LOCUSINFO.EVENTS.CONTROLS_JOIN_BREAKOUT_FROM_MAIN,
1593
+ {
1594
+ mainLocusUrl: this.url,
1595
+ }
1596
+ );
1597
+ }
1598
+
1599
+ return newLocus;
1600
+ }
1601
+
1602
+ /**
1603
+ * merge participants by participant id
1604
+ * @param {Array} participants
1605
+ * @param {Array} sourceParticipants
1606
+ * @returns {Array} merged participants
1607
+ * @memberof LocusInfo
1608
+ */
1609
+ // eslint-disable-next-line class-methods-use-this
1610
+ mergeParticipants(participants, sourceParticipants) {
1611
+ if (!sourceParticipants || !sourceParticipants.length) return participants;
1612
+ if (!participants || !participants.length) {
1613
+ return sourceParticipants;
1614
+ }
1615
+ sourceParticipants.forEach((participant) => {
1616
+ const existIndex = participants.findIndex((p) => p.id === participant.id);
1617
+ if (existIndex > -1) {
1618
+ participants.splice(existIndex, 1, participant);
1619
+ } else {
1620
+ participants.push(participant);
1621
+ }
1622
+ });
1623
+
1624
+ return participants;
1625
+ }
1626
+
1627
+ /**
1628
+ * need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout
1629
+ * @param {Object} mainLocus
1630
+ * @returns {undefined}
1631
+ * @memberof LocusInfo
1632
+ */
1633
+ updateMainSessionLocusCache(mainLocus: any) {
1634
+ if (!mainLocus) {
1635
+ return;
1636
+ }
1637
+ const locusClone = cloneDeep(mainLocus);
1638
+ if (this.mainSessionLocusCache) {
1639
+ // shallow merge and do special merge for participants
1640
+ assignWith(this.mainSessionLocusCache, locusClone, (objValue, srcValue, key) => {
1641
+ if (key === 'participants') {
1642
+ return this.mergeParticipants(objValue, srcValue);
1643
+ }
1644
+
1645
+ return srcValue || objValue;
1646
+ });
1647
+ } else {
1648
+ this.mainSessionLocusCache = locusClone;
1649
+ }
1650
+ }
1651
+
1652
+ /**
1653
+ * clear main session cache
1654
+ * @returns {undefined}
1655
+ * @memberof LocusInfo
1656
+ */
1657
+ clearMainSessionLocusCache() {
1658
+ this.mainSessionLocusCache = null;
1659
+ }
1337
1660
  }