@webex/plugin-meetings 3.0.0-beta.15 → 3.0.0-beta.151

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 (480) hide show
  1. package/README.md +45 -1
  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 +359 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +193 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +23 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +52 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +43 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1046 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +78 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +67 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/browser-detection.js +1 -21
  23. package/dist/common/browser-detection.js.map +1 -1
  24. package/dist/common/collection.js +5 -20
  25. package/dist/common/collection.js.map +1 -1
  26. package/dist/common/config.js +0 -7
  27. package/dist/common/config.js.map +1 -1
  28. package/dist/common/errors/captcha-error.js +0 -21
  29. package/dist/common/errors/captcha-error.js.map +1 -1
  30. package/dist/common/errors/intent-to-join.js +0 -21
  31. package/dist/common/errors/intent-to-join.js.map +1 -1
  32. package/dist/common/errors/join-meeting.js +0 -21
  33. package/dist/common/errors/join-meeting.js.map +1 -1
  34. package/dist/common/errors/media.js +0 -21
  35. package/dist/common/errors/media.js.map +1 -1
  36. package/dist/common/errors/parameter.js +0 -28
  37. package/dist/common/errors/parameter.js.map +1 -1
  38. package/dist/common/errors/password-error.js +0 -21
  39. package/dist/common/errors/password-error.js.map +1 -1
  40. package/dist/common/errors/permission.js +0 -21
  41. package/dist/common/errors/permission.js.map +1 -1
  42. package/dist/common/errors/reconnection-in-progress.js +0 -17
  43. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  44. package/dist/common/errors/reconnection.js +0 -21
  45. package/dist/common/errors/reconnection.js.map +1 -1
  46. package/dist/common/errors/stats.js +0 -21
  47. package/dist/common/errors/stats.js.map +1 -1
  48. package/dist/common/errors/webex-errors.js +9 -43
  49. package/dist/common/errors/webex-errors.js.map +1 -1
  50. package/dist/common/errors/webex-meetings-error.js +1 -24
  51. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  52. package/dist/common/events/events-scope.js +0 -22
  53. package/dist/common/events/events-scope.js.map +1 -1
  54. package/dist/common/events/events.js +0 -23
  55. package/dist/common/events/events.js.map +1 -1
  56. package/dist/common/events/trigger-proxy.js +0 -12
  57. package/dist/common/events/trigger-proxy.js.map +1 -1
  58. package/dist/common/events/util.js +0 -15
  59. package/dist/common/events/util.js.map +1 -1
  60. package/dist/common/logs/logger-config.js +0 -4
  61. package/dist/common/logs/logger-config.js.map +1 -1
  62. package/dist/common/logs/logger-proxy.js +1 -8
  63. package/dist/common/logs/logger-proxy.js.map +1 -1
  64. package/dist/common/logs/request.js +35 -61
  65. package/dist/common/logs/request.js.map +1 -1
  66. package/dist/common/queue.js +4 -14
  67. package/dist/common/queue.js.map +1 -1
  68. package/dist/config.js +7 -13
  69. package/dist/config.js.map +1 -1
  70. package/dist/constants.js +208 -64
  71. package/dist/constants.js.map +1 -1
  72. package/dist/controls-options-manager/constants.js +14 -0
  73. package/dist/controls-options-manager/constants.js.map +1 -0
  74. package/dist/controls-options-manager/enums.js +27 -0
  75. package/dist/controls-options-manager/enums.js.map +1 -0
  76. package/dist/controls-options-manager/index.js +297 -0
  77. package/dist/controls-options-manager/index.js.map +1 -0
  78. package/dist/controls-options-manager/types.js +7 -0
  79. package/dist/controls-options-manager/types.js.map +1 -0
  80. package/dist/controls-options-manager/util.js +300 -0
  81. package/dist/controls-options-manager/util.js.map +1 -0
  82. package/dist/index.js +78 -17
  83. package/dist/index.js.map +1 -1
  84. package/dist/locus-info/controlsUtils.js +100 -29
  85. package/dist/locus-info/controlsUtils.js.map +1 -1
  86. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  87. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  88. package/dist/locus-info/fullState.js +0 -15
  89. package/dist/locus-info/fullState.js.map +1 -1
  90. package/dist/locus-info/hostUtils.js +4 -12
  91. package/dist/locus-info/hostUtils.js.map +1 -1
  92. package/dist/locus-info/index.js +387 -208
  93. package/dist/locus-info/index.js.map +1 -1
  94. package/dist/locus-info/infoUtils.js +0 -38
  95. package/dist/locus-info/infoUtils.js.map +1 -1
  96. package/dist/locus-info/mediaSharesUtils.js +54 -38
  97. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  98. package/dist/locus-info/parser.js +90 -126
  99. package/dist/locus-info/parser.js.map +1 -1
  100. package/dist/locus-info/selfUtils.js +93 -92
  101. package/dist/locus-info/selfUtils.js.map +1 -1
  102. package/dist/media/index.js +70 -219
  103. package/dist/media/index.js.map +1 -1
  104. package/dist/media/properties.js +74 -198
  105. package/dist/media/properties.js.map +1 -1
  106. package/dist/media/util.js +1 -8
  107. package/dist/media/util.js.map +1 -1
  108. package/dist/mediaQualityMetrics/config.js +505 -495
  109. package/dist/mediaQualityMetrics/config.js.map +1 -1
  110. package/dist/meeting/in-meeting-actions.js +79 -14
  111. package/dist/meeting/in-meeting-actions.js.map +1 -1
  112. package/dist/meeting/index.js +2685 -3324
  113. package/dist/meeting/index.js.map +1 -1
  114. package/dist/meeting/locusMediaRequest.js +291 -0
  115. package/dist/meeting/locusMediaRequest.js.map +1 -0
  116. package/dist/meeting/muteState.js +243 -185
  117. package/dist/meeting/muteState.js.map +1 -1
  118. package/dist/meeting/request.js +296 -342
  119. package/dist/meeting/request.js.map +1 -1
  120. package/dist/meeting/request.type.js +0 -1
  121. package/dist/meeting/request.type.js.map +1 -1
  122. package/dist/meeting/state.js +16 -26
  123. package/dist/meeting/state.js.map +1 -1
  124. package/dist/meeting/util.js +446 -585
  125. package/dist/meeting/util.js.map +1 -1
  126. package/dist/meeting-info/collection.js +3 -25
  127. package/dist/meeting-info/collection.js.map +1 -1
  128. package/dist/meeting-info/index.js +8 -31
  129. package/dist/meeting-info/index.js.map +1 -1
  130. package/dist/meeting-info/meeting-info-v2.js +261 -242
  131. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  132. package/dist/meeting-info/request.js +1 -16
  133. package/dist/meeting-info/request.js.map +1 -1
  134. package/dist/meeting-info/util.js +98 -183
  135. package/dist/meeting-info/util.js.map +1 -1
  136. package/dist/meeting-info/utilv2.js +156 -232
  137. package/dist/meeting-info/utilv2.js.map +1 -1
  138. package/dist/meetings/collection.js +24 -20
  139. package/dist/meetings/collection.js.map +1 -1
  140. package/dist/meetings/index.js +526 -372
  141. package/dist/meetings/index.js.map +1 -1
  142. package/dist/meetings/meetings.types.js +7 -0
  143. package/dist/meetings/meetings.types.js.map +1 -0
  144. package/dist/meetings/request.js +21 -40
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +172 -141
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.js +58 -57
  149. package/dist/member/index.js.map +1 -1
  150. package/dist/member/types.js +15 -0
  151. package/dist/member/types.js.map +1 -0
  152. package/dist/member/util.js +101 -69
  153. package/dist/member/util.js.map +1 -1
  154. package/dist/members/collection.js +12 -12
  155. package/dist/members/collection.js.map +1 -1
  156. package/dist/members/index.js +123 -162
  157. package/dist/members/index.js.map +1 -1
  158. package/dist/members/request.js +120 -85
  159. package/dist/members/request.js.map +1 -1
  160. package/dist/members/types.js +15 -0
  161. package/dist/members/types.js.map +1 -0
  162. package/dist/members/util.js +314 -260
  163. package/dist/members/util.js.map +1 -1
  164. package/dist/metrics/config.js +50 -16
  165. package/dist/metrics/config.js.map +1 -1
  166. package/dist/metrics/constants.js +4 -7
  167. package/dist/metrics/constants.js.map +1 -1
  168. package/dist/metrics/index.js +75 -147
  169. package/dist/metrics/index.js.map +1 -1
  170. package/dist/multistream/mediaRequestManager.js +170 -50
  171. package/dist/multistream/mediaRequestManager.js.map +1 -1
  172. package/dist/multistream/receiveSlot.js +58 -65
  173. package/dist/multistream/receiveSlot.js.map +1 -1
  174. package/dist/multistream/receiveSlotManager.js +73 -94
  175. package/dist/multistream/receiveSlotManager.js.map +1 -1
  176. package/dist/multistream/remoteMedia.js +55 -74
  177. package/dist/multistream/remoteMedia.js.map +1 -1
  178. package/dist/multistream/remoteMediaGroup.js +66 -43
  179. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  180. package/dist/multistream/remoteMediaManager.js +502 -442
  181. package/dist/multistream/remoteMediaManager.js.map +1 -1
  182. package/dist/networkQualityMonitor/index.js +24 -51
  183. package/dist/networkQualityMonitor/index.js.map +1 -1
  184. package/dist/personal-meeting-room/index.js +3 -38
  185. package/dist/personal-meeting-room/index.js.map +1 -1
  186. package/dist/personal-meeting-room/request.js +2 -33
  187. package/dist/personal-meeting-room/request.js.map +1 -1
  188. package/dist/personal-meeting-room/util.js +0 -13
  189. package/dist/personal-meeting-room/util.js.map +1 -1
  190. package/dist/reachability/index.js +190 -199
  191. package/dist/reachability/index.js.map +1 -1
  192. package/dist/reachability/request.js +14 -23
  193. package/dist/reachability/request.js.map +1 -1
  194. package/dist/reactions/constants.js +13 -0
  195. package/dist/reactions/constants.js.map +1 -0
  196. package/dist/reactions/reactions.js +2 -4
  197. package/dist/reactions/reactions.js.map +1 -1
  198. package/dist/reactions/reactions.type.js +18 -24
  199. package/dist/reactions/reactions.type.js.map +1 -1
  200. package/dist/reconnection-manager/index.js +356 -476
  201. package/dist/reconnection-manager/index.js.map +1 -1
  202. package/dist/recording-controller/enums.js +17 -0
  203. package/dist/recording-controller/enums.js.map +1 -0
  204. package/dist/recording-controller/index.js +343 -0
  205. package/dist/recording-controller/index.js.map +1 -0
  206. package/dist/recording-controller/util.js +63 -0
  207. package/dist/recording-controller/util.js.map +1 -0
  208. package/dist/roap/index.js +32 -75
  209. package/dist/roap/index.js.map +1 -1
  210. package/dist/roap/request.js +129 -136
  211. package/dist/roap/request.js.map +1 -1
  212. package/dist/roap/turnDiscovery.js +143 -103
  213. package/dist/roap/turnDiscovery.js.map +1 -1
  214. package/dist/statsAnalyzer/global.js +1 -95
  215. package/dist/statsAnalyzer/global.js.map +1 -1
  216. package/dist/statsAnalyzer/index.js +369 -462
  217. package/dist/statsAnalyzer/index.js.map +1 -1
  218. package/dist/statsAnalyzer/mqaUtil.js +144 -94
  219. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  220. package/dist/transcription/index.js +9 -44
  221. package/dist/transcription/index.js.map +1 -1
  222. package/dist/types/annotation/annotation.types.d.ts +43 -0
  223. package/dist/types/annotation/constants.d.ts +31 -0
  224. package/dist/types/annotation/index.d.ts +124 -0
  225. package/dist/types/breakouts/breakout.d.ts +8 -0
  226. package/dist/types/breakouts/collection.d.ts +5 -0
  227. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  228. package/dist/types/breakouts/events.d.ts +2 -0
  229. package/dist/types/breakouts/index.d.ts +5 -0
  230. package/dist/types/breakouts/request.d.ts +22 -0
  231. package/dist/types/breakouts/utils.d.ts +15 -0
  232. package/dist/types/common/browser-detection.d.ts +9 -0
  233. package/dist/types/common/collection.d.ts +48 -0
  234. package/dist/types/common/config.d.ts +2 -0
  235. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  236. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  237. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  238. package/dist/types/common/errors/media.d.ts +15 -0
  239. package/dist/types/common/errors/parameter.d.ts +15 -0
  240. package/dist/types/common/errors/password-error.d.ts +15 -0
  241. package/dist/types/common/errors/permission.d.ts +14 -0
  242. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  243. package/dist/types/common/errors/reconnection.d.ts +15 -0
  244. package/dist/types/common/errors/stats.d.ts +15 -0
  245. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  246. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  247. package/dist/types/common/events/events-scope.d.ts +17 -0
  248. package/dist/types/common/events/events.d.ts +12 -0
  249. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  250. package/dist/types/common/events/util.d.ts +2 -0
  251. package/dist/types/common/logs/logger-config.d.ts +2 -0
  252. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  253. package/dist/types/common/logs/request.d.ts +34 -0
  254. package/dist/types/common/queue.d.ts +32 -0
  255. package/dist/types/config.d.ts +72 -0
  256. package/dist/types/constants.d.ts +978 -0
  257. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  258. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  259. package/dist/types/controls-options-manager/index.d.ts +136 -0
  260. package/dist/types/controls-options-manager/types.d.ts +43 -0
  261. package/dist/types/controls-options-manager/util.d.ts +1 -0
  262. package/dist/types/index.d.ts +7 -0
  263. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  264. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  265. package/dist/types/locus-info/fullState.d.ts +2 -0
  266. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  267. package/dist/types/locus-info/index.d.ts +315 -0
  268. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  269. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  270. package/dist/types/locus-info/parser.d.ts +212 -0
  271. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  272. package/dist/types/media/index.d.ts +34 -0
  273. package/dist/types/media/properties.d.ts +86 -0
  274. package/dist/types/media/util.d.ts +2 -0
  275. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  276. package/dist/types/meeting/in-meeting-actions.d.ts +149 -0
  277. package/dist/types/meeting/index.d.ts +1509 -0
  278. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  279. package/dist/types/meeting/muteState.d.ts +184 -0
  280. package/dist/types/meeting/request.d.ts +270 -0
  281. package/dist/types/meeting/request.type.d.ts +11 -0
  282. package/dist/types/meeting/state.d.ts +9 -0
  283. package/dist/types/meeting/util.d.ts +75 -0
  284. package/dist/types/meeting-info/collection.d.ts +20 -0
  285. package/dist/types/meeting-info/index.d.ts +57 -0
  286. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  287. package/dist/types/meeting-info/request.d.ts +22 -0
  288. package/dist/types/meeting-info/util.d.ts +2 -0
  289. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  290. package/dist/types/meetings/collection.d.ts +31 -0
  291. package/dist/types/meetings/index.d.ts +364 -0
  292. package/dist/types/meetings/meetings.types.d.ts +4 -0
  293. package/dist/types/meetings/request.d.ts +27 -0
  294. package/dist/types/meetings/util.d.ts +18 -0
  295. package/dist/types/member/index.d.ts +157 -0
  296. package/dist/types/member/types.d.ts +21 -0
  297. package/dist/types/member/util.d.ts +2 -0
  298. package/dist/types/members/collection.d.ts +29 -0
  299. package/dist/types/members/index.d.ts +353 -0
  300. package/dist/types/members/request.d.ts +114 -0
  301. package/dist/types/members/types.d.ts +24 -0
  302. package/dist/types/members/util.d.ts +210 -0
  303. package/dist/types/metrics/config.d.ts +195 -0
  304. package/dist/types/metrics/constants.d.ts +55 -0
  305. package/dist/types/metrics/index.d.ts +169 -0
  306. package/dist/types/multistream/mediaRequestManager.d.ts +104 -0
  307. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  308. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  309. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  310. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  311. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  312. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  313. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  314. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  315. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  316. package/dist/types/reachability/index.d.ts +152 -0
  317. package/dist/types/reachability/request.d.ts +37 -0
  318. package/dist/types/reactions/constants.d.ts +3 -0
  319. package/dist/types/reactions/reactions.d.ts +4 -0
  320. package/dist/types/reactions/reactions.type.d.ts +52 -0
  321. package/dist/types/reconnection-manager/index.d.ts +126 -0
  322. package/dist/types/recording-controller/enums.d.ts +7 -0
  323. package/dist/types/recording-controller/index.d.ts +193 -0
  324. package/dist/types/recording-controller/util.d.ts +13 -0
  325. package/dist/types/roap/index.d.ts +77 -0
  326. package/dist/types/roap/request.d.ts +36 -0
  327. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  328. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  329. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  330. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  331. package/dist/types/transcription/index.d.ts +64 -0
  332. package/package.json +28 -21
  333. package/src/annotation/annotation.types.ts +52 -0
  334. package/src/annotation/constants.ts +36 -0
  335. package/src/annotation/index.ts +343 -0
  336. package/src/breakouts/README.md +220 -0
  337. package/src/breakouts/breakout.ts +163 -0
  338. package/src/breakouts/collection.ts +19 -0
  339. package/src/breakouts/edit-lock-error.ts +25 -0
  340. package/src/breakouts/events.ts +37 -0
  341. package/src/breakouts/index.ts +921 -0
  342. package/src/breakouts/request.ts +55 -0
  343. package/src/breakouts/utils.ts +57 -0
  344. package/src/common/errors/webex-errors.ts +6 -2
  345. package/src/common/logs/logger-proxy.ts +1 -1
  346. package/src/config.ts +5 -7
  347. package/src/constants.ts +155 -20
  348. package/src/controls-options-manager/constants.ts +5 -0
  349. package/src/controls-options-manager/enums.ts +18 -0
  350. package/src/controls-options-manager/index.ts +278 -0
  351. package/src/controls-options-manager/types.ts +59 -0
  352. package/src/controls-options-manager/util.ts +286 -0
  353. package/src/index.ts +34 -0
  354. package/src/locus-info/controlsUtils.ts +108 -0
  355. package/src/locus-info/index.ts +310 -21
  356. package/src/locus-info/mediaSharesUtils.ts +48 -0
  357. package/src/locus-info/parser.ts +2 -1
  358. package/src/locus-info/selfUtils.ts +71 -1
  359. package/src/media/index.ts +70 -142
  360. package/src/media/properties.ts +41 -104
  361. package/src/mediaQualityMetrics/config.ts +379 -377
  362. package/src/meeting/in-meeting-actions.ts +156 -0
  363. package/src/meeting/index.ts +1730 -1768
  364. package/src/meeting/locusMediaRequest.ts +309 -0
  365. package/src/meeting/muteState.ts +228 -132
  366. package/src/meeting/request.ts +100 -91
  367. package/src/meeting/request.type.ts +2 -0
  368. package/src/meeting/util.ts +421 -421
  369. package/src/meeting-info/meeting-info-v2.ts +134 -13
  370. package/src/meeting-info/utilv2.ts +13 -3
  371. package/src/meetings/collection.ts +20 -0
  372. package/src/meetings/index.ts +375 -83
  373. package/src/meetings/meetings.types.ts +9 -0
  374. package/src/meetings/request.ts +3 -1
  375. package/src/meetings/util.ts +103 -4
  376. package/src/member/index.ts +40 -0
  377. package/src/member/types.ts +24 -0
  378. package/src/member/util.ts +81 -1
  379. package/src/members/collection.ts +8 -0
  380. package/src/members/index.ts +108 -6
  381. package/src/members/request.ts +98 -17
  382. package/src/members/types.ts +28 -0
  383. package/src/members/util.ts +319 -240
  384. package/src/metrics/config.ts +49 -10
  385. package/src/metrics/constants.ts +2 -4
  386. package/src/metrics/index.ts +43 -27
  387. package/src/multistream/mediaRequestManager.ts +210 -45
  388. package/src/multistream/receiveSlot.ts +68 -26
  389. package/src/multistream/receiveSlotManager.ts +61 -38
  390. package/src/multistream/remoteMedia.ts +29 -3
  391. package/src/multistream/remoteMediaGroup.ts +61 -2
  392. package/src/multistream/remoteMediaManager.ts +260 -66
  393. package/src/networkQualityMonitor/index.ts +6 -6
  394. package/src/reachability/index.ts +75 -25
  395. package/src/reachability/request.ts +10 -5
  396. package/src/reactions/constants.ts +4 -0
  397. package/src/reactions/reactions.ts +4 -4
  398. package/src/reactions/reactions.type.ts +28 -3
  399. package/src/reconnection-manager/index.ts +53 -32
  400. package/src/recording-controller/enums.ts +8 -0
  401. package/src/recording-controller/index.ts +315 -0
  402. package/src/recording-controller/util.ts +58 -0
  403. package/src/roap/index.ts +21 -30
  404. package/src/roap/request.ts +51 -52
  405. package/src/roap/turnDiscovery.ts +51 -27
  406. package/src/statsAnalyzer/global.ts +1 -94
  407. package/src/statsAnalyzer/index.ts +380 -390
  408. package/src/statsAnalyzer/mqaUtil.ts +106 -99
  409. package/test/integration/spec/converged-space-meetings.js +233 -0
  410. package/test/integration/spec/journey.js +332 -255
  411. package/test/integration/spec/space-meeting.js +78 -5
  412. package/test/integration/spec/transcription.js +1 -1
  413. package/test/unit/spec/annotation/index.ts +436 -0
  414. package/test/unit/spec/breakouts/breakout.ts +203 -0
  415. package/test/unit/spec/breakouts/collection.ts +15 -0
  416. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  417. package/test/unit/spec/breakouts/events.ts +77 -0
  418. package/test/unit/spec/breakouts/index.ts +1790 -0
  419. package/test/unit/spec/breakouts/request.ts +104 -0
  420. package/test/unit/spec/breakouts/utils.js +72 -0
  421. package/test/unit/spec/controls-options-manager/index.js +287 -0
  422. package/test/unit/spec/controls-options-manager/util.js +518 -0
  423. package/test/unit/spec/fixture/locus.js +1 -0
  424. package/test/unit/spec/locus-info/controlsUtils.js +303 -30
  425. package/test/unit/spec/locus-info/index.js +615 -4
  426. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  427. package/test/unit/spec/locus-info/selfConstant.js +38 -0
  428. package/test/unit/spec/locus-info/selfUtils.js +200 -0
  429. package/test/unit/spec/media/index.ts +118 -22
  430. package/test/unit/spec/media/properties.ts +9 -9
  431. package/test/unit/spec/meeting/in-meeting-actions.ts +76 -0
  432. package/test/unit/spec/meeting/index.js +2394 -1381
  433. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  434. package/test/unit/spec/meeting/muteState.js +370 -208
  435. package/test/unit/spec/meeting/request.js +354 -42
  436. package/test/unit/spec/meeting/utils.js +268 -156
  437. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  438. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  439. package/test/unit/spec/meetings/collection.js +14 -0
  440. package/test/unit/spec/meetings/index.js +842 -128
  441. package/test/unit/spec/meetings/utils.js +206 -2
  442. package/test/unit/spec/member/index.js +24 -0
  443. package/test/unit/spec/member/util.js +384 -32
  444. package/test/unit/spec/members/index.js +320 -1
  445. package/test/unit/spec/members/request.js +206 -27
  446. package/test/unit/spec/members/utils.js +184 -0
  447. package/test/unit/spec/metrics/index.js +98 -0
  448. package/test/unit/spec/multistream/mediaRequestManager.ts +676 -105
  449. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  450. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  451. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  452. package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
  453. package/test/unit/spec/multistream/remoteMediaManager.ts +672 -65
  454. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  455. package/test/unit/spec/reachability/index.ts +176 -25
  456. package/test/unit/spec/reachability/request.js +66 -0
  457. package/test/unit/spec/reconnection-manager/index.js +46 -13
  458. package/test/unit/spec/recording-controller/index.js +231 -0
  459. package/test/unit/spec/recording-controller/util.js +102 -0
  460. package/test/unit/spec/roap/index.ts +21 -51
  461. package/test/unit/spec/roap/request.ts +187 -0
  462. package/test/unit/spec/roap/turnDiscovery.ts +73 -34
  463. package/test/unit/spec/stats-analyzer/index.js +94 -43
  464. package/test/utils/constants.js +9 -0
  465. package/test/utils/integrationTestUtils.js +46 -0
  466. package/test/utils/testUtils.js +0 -45
  467. package/test/utils/webex-config.js +4 -0
  468. package/test/utils/webex-test-users.js +7 -3
  469. package/tsconfig.json +6 -0
  470. package/dist/media/internal-media-core-wrapper.js +0 -22
  471. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  472. package/dist/meeting/effectsState.js +0 -334
  473. package/dist/meeting/effectsState.js.map +0 -1
  474. package/dist/multistream/multistreamMedia.js +0 -117
  475. package/dist/multistream/multistreamMedia.js.map +0 -1
  476. package/src/index.js +0 -15
  477. package/src/media/internal-media-core-wrapper.ts +0 -9
  478. package/src/meeting/effectsState.ts +0 -211
  479. package/src/multistream/multistreamMedia.ts +0 -93
  480. package/test/unit/spec/meeting/effectsState.js +0 -281
@@ -1,4 +1,5 @@
1
1
  import {isEqual} from 'lodash';
2
+ import {BREAKOUTS} from '../constants';
2
3
 
3
4
  const ControlsUtils: any = {};
4
5
 
@@ -48,6 +49,41 @@ ControlsUtils.parse = (controls: any) => {
48
49
  : null;
49
50
  }
50
51
 
52
+ if (controls && controls.video) {
53
+ parsedControls.videoEnabled = controls.video.enabled;
54
+ }
55
+
56
+ if (controls?.muteOnEntry) {
57
+ parsedControls.muteOnEntry = {enabled: controls.muteOnEntry.enabled};
58
+ }
59
+
60
+ if (controls?.shareControl) {
61
+ parsedControls.shareControl = {control: controls.shareControl.control};
62
+ }
63
+
64
+ if (controls?.disallowUnmute) {
65
+ parsedControls.disallowUnmute = {enabled: controls.disallowUnmute.enabled};
66
+ }
67
+
68
+ if (controls?.reactions) {
69
+ parsedControls.reactions = {
70
+ enabled: controls.reactions.enabled,
71
+ showDisplayNameWithReactions: controls.reactions.showDisplayNameWithReactions,
72
+ };
73
+ }
74
+
75
+ if (controls?.viewTheParticipantList) {
76
+ parsedControls.viewTheParticipantList = {enabled: controls.viewTheParticipantList.enabled};
77
+ }
78
+
79
+ if (controls?.raiseHand) {
80
+ parsedControls.raiseHand = {enabled: controls.raiseHand.enabled};
81
+ }
82
+
83
+ if (controls?.video) {
84
+ parsedControls.video = {enabled: controls.video.enabled};
85
+ }
86
+
51
87
  return parsedControls;
52
88
  };
53
89
 
@@ -65,6 +101,26 @@ ControlsUtils.getControls = (oldControls: any, newControls: any) => {
65
101
  previous,
66
102
  current,
67
103
  updates: {
104
+ hasMuteOnEntryChanged: current?.muteOnEntry?.enabled !== previous?.muteOnEntry?.enabled,
105
+
106
+ hasShareControlChanged: current?.shareControl?.control !== previous?.shareControl?.control,
107
+
108
+ hasDisallowUnmuteChanged:
109
+ current?.disallowUnmute?.enabled !== previous?.disallowUnmute?.enabled,
110
+
111
+ hasReactionsChanged: current?.reactions?.enabled !== previous?.reactions?.enabled,
112
+
113
+ hasReactionDisplayNamesChanged:
114
+ current?.reactions?.showDisplayNameWithReactions !==
115
+ previous?.reactions?.showDisplayNameWithReactions,
116
+
117
+ hasViewTheParticipantListChanged:
118
+ current?.viewTheParticipantList?.enabled !== previous?.viewTheParticipantList?.enabled,
119
+
120
+ hasRaiseHandChanged: current?.raiseHand?.enabled !== previous?.raiseHand?.enabled,
121
+
122
+ hasVideoChanged: current?.video?.enabled !== previous?.video?.enabled,
123
+
68
124
  hasRecordingPausedChanged:
69
125
  current?.record &&
70
126
  !isEqual(previous?.record?.paused, current.record.paused) &&
@@ -92,6 +148,12 @@ ControlsUtils.getControls = (oldControls: any, newControls: any) => {
92
148
  !isEqual(previous?.entryExitTone, current?.entryExitTone) &&
93
149
  (previous?.entryExitTone || current?.entryExitTone)
94
150
  ),
151
+
152
+ hasBreakoutChanged: !isEqual(previous?.breakout, current?.breakout),
153
+
154
+ hasVideoEnabledChanged:
155
+ newControls.video?.enabled !== undefined &&
156
+ !isEqual(previous?.videoEnabled, current?.videoEnabled),
95
157
  },
96
158
  };
97
159
  };
@@ -109,4 +171,50 @@ ControlsUtils.getId = (controls: any) => {
109
171
  return null;
110
172
  };
111
173
 
174
+ /**
175
+ * check whether to replace the meeting's members or not.
176
+ * For case joined breakout session, need replace meeting's members
177
+ * @param {LocusControls} oldControls
178
+ * @param {LocusControls} controls
179
+ * @returns {Boolean}
180
+ */
181
+ ControlsUtils.isNeedReplaceMembers = (oldControls: any, controls: any) => {
182
+ // no breakout case
183
+ if (!oldControls?.breakout || !controls?.breakout) {
184
+ return false;
185
+ }
186
+
187
+ return (
188
+ oldControls.breakout.groupId !== controls.breakout.groupId ||
189
+ oldControls.breakout.sessionId !== controls.breakout.sessionId
190
+ );
191
+ };
192
+
193
+ /**
194
+ * determine the switch status between breakout session and main session.
195
+ * @param {LocusControls} oldControls
196
+ * @param {LocusControls} controls
197
+ * @returns {Object}
198
+ */
199
+ ControlsUtils.getSessionSwitchStatus = (oldControls: any, controls: any) => {
200
+ const status = {isReturnToMain: false, isJoinToBreakout: false};
201
+ // no breakout case
202
+ if (!oldControls?.breakout || !controls?.breakout) {
203
+ return status;
204
+ }
205
+
206
+ status.isReturnToMain =
207
+ oldControls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.BREAKOUT &&
208
+ controls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.MAIN;
209
+ status.isJoinToBreakout =
210
+ oldControls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.MAIN &&
211
+ controls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.BREAKOUT;
212
+
213
+ return status;
214
+ };
215
+
216
+ ControlsUtils.isMainSessionDTO = (locus: any) => {
217
+ return locus?.controls?.breakout?.sessionType !== BREAKOUTS.SESSION_TYPES.BREAKOUT;
218
+ };
219
+
112
220
  export default ControlsUtils;
@@ -1,4 +1,4 @@
1
- import {isEqual} from 'lodash';
1
+ import {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';
@@ -59,10 +59,19 @@ export default class LocusInfo extends EventsScope {
59
59
  fullState: any;
60
60
  host: any;
61
61
  info: any;
62
+ roles: any;
62
63
  mediaShares: any;
63
64
  replace: any;
64
65
  url: any;
65
-
66
+ services: any;
67
+ mainSessionLocusCache: any;
68
+ /**
69
+ * Constructor
70
+ * @param {boolean} updateMeeting true if the meeting should be updated
71
+ * @param {object} webex
72
+ * @param {string} meetingId
73
+ * @returns {undefined}
74
+ */
66
75
  constructor(updateMeeting, webex, meetingId) {
67
76
  super();
68
77
  this.parsedLocus = {
@@ -98,7 +107,7 @@ export default class LocusInfo extends EventsScope {
98
107
  meeting.meetingRequest
99
108
  .getFullLocus({
100
109
  desync: true,
101
- locusUrl: meeting.locusUrl,
110
+ locusUrl: locus.url ? locus.url : meeting.locusUrl,
102
111
  })
103
112
  .then((res) => {
104
113
  meeting.locusInfo.onFullLocus(res.body);
@@ -171,12 +180,13 @@ export default class LocusInfo extends EventsScope {
171
180
  */
172
181
  this.deltaParticipants = [];
173
182
 
183
+ this.updateLocusCache(locus);
174
184
  // above section only updates the locusInfo object
175
185
  // The below section makes sure it updates the locusInfo as well as updates the meeting object
176
186
  this.updateParticipants(locus.participants);
177
187
  // For 1:1 space meeting the conversation Url does not exist in locus.conversation
178
188
  this.updateConversationUrl(locus.conversationUrl, locus.info);
179
- this.updateControls(locus.controls);
189
+ this.updateControls(locus.controls, locus.self);
180
190
  this.updateLocusUrl(locus.url);
181
191
  this.updateFullState(locus.fullState);
182
192
  this.updateMeetingInfo(locus.info);
@@ -185,6 +195,7 @@ export default class LocusInfo extends EventsScope {
185
195
  this.updateSelf(locus.self, locus.participants);
186
196
  this.updateHostInfo(locus.host);
187
197
  this.updateMediaShares(locus.mediaShares);
198
+ this.updateServices(locus.links?.services);
188
199
  }
189
200
 
190
201
  /**
@@ -193,6 +204,7 @@ export default class LocusInfo extends EventsScope {
193
204
  * @memberof LocusInfo
194
205
  */
195
206
  initialSetup(locus: object) {
207
+ this.updateLocusCache(locus);
196
208
  this.onFullLocus(locus);
197
209
 
198
210
  // Change it to true after it receives it first locus object
@@ -208,7 +220,7 @@ export default class LocusInfo extends EventsScope {
208
220
  parse(meeting: any, data: any) {
209
221
  // eslint-disable-next-line @typescript-eslint/no-shadow
210
222
  const {eventType} = data;
211
-
223
+ const locus = this.getTheLocusToUpdate(data.locus);
212
224
  LoggerProxy.logger.info(`Locus-info:index#parse --> received locus data: ${eventType}`);
213
225
 
214
226
  switch (eventType) {
@@ -226,16 +238,16 @@ export default class LocusInfo extends EventsScope {
226
238
  case LOCUSEVENT.PARTICIPANT_DECLINED:
227
239
  case LOCUSEVENT.FLOOR_GRANTED:
228
240
  case LOCUSEVENT.FLOOR_RELEASED:
229
- this.onFullLocus(data.locus, eventType);
241
+ this.onFullLocus(locus, eventType);
230
242
  break;
231
243
  case LOCUSEVENT.DIFFERENCE:
232
- this.handleLocusDelta(data.locus, meeting);
244
+ this.handleLocusDelta(locus, meeting);
233
245
  break;
234
246
 
235
247
  default:
236
248
  // Why will there be a event with no eventType ????
237
249
  // we may not need this, we can get full locus
238
- this.handleLocusDelta(data.locus, meeting);
250
+ this.handleLocusDelta(locus, meeting);
239
251
  }
240
252
  }
241
253
 
@@ -267,8 +279,9 @@ export default class LocusInfo extends EventsScope {
267
279
  this.updateParticipantDeltas(locus.participants);
268
280
  this.scheduledMeeting = locus.meeting || null;
269
281
  this.participants = locus.participants;
282
+ const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);
270
283
  this.updateLocusInfo(locus);
271
- this.updateParticipants(locus.participants);
284
+ this.updateParticipants(locus.participants, isReplaceMembers);
272
285
  this.isMeetingActive();
273
286
  this.handleOneOnOneEvent(eventType);
274
287
  this.updateEmbeddedApps(locus.embeddedApps);
@@ -327,8 +340,9 @@ export default class LocusInfo extends EventsScope {
327
340
  * @memberof LocusInfo
328
341
  */
329
342
  onDeltaLocus(locus: any) {
343
+ const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);
330
344
  this.updateLocusInfo(locus);
331
- this.updateParticipants(locus.participants);
345
+ this.updateParticipants(locus.participants, isReplaceMembers);
332
346
  this.isMeetingActive();
333
347
  }
334
348
 
@@ -337,8 +351,15 @@ export default class LocusInfo extends EventsScope {
337
351
  * @returns {undefined}
338
352
  * @memberof LocusInfo
339
353
  */
340
- updateLocusInfo(locus: any) {
341
- 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);
342
363
  this.updateConversationUrl(locus.conversationUrl, locus.info);
343
364
  this.updateCreated(locus.created);
344
365
  this.updateFullState(locus.fullState);
@@ -355,6 +376,7 @@ export default class LocusInfo extends EventsScope {
355
376
  this.updateMemberShip(locus.membership);
356
377
  this.updateIdentifiers(locus.identities);
357
378
  this.updateEmbeddedApps(locus.embeddedApps);
379
+ this.updateServices(locus.links?.services);
358
380
  this.compareAndUpdate();
359
381
  // update which required to compare different objects from locus
360
382
  }
@@ -636,13 +658,13 @@ export default class LocusInfo extends EventsScope {
636
658
  }
637
659
 
638
660
  /**
639
- *
661
+ * update meeting's members
640
662
  * @param {Object} participants new participants object
641
- * @param {boolen} deltaParticpantFlag delta event
663
+ * @param {Boolean} isReplace is replace the whole members
642
664
  * @returns {Array} updatedParticipants
643
665
  * @memberof LocusInfo
644
666
  */
645
- updateParticipants(participants: object) {
667
+ updateParticipants(participants: object, isReplace?: boolean) {
646
668
  this.emitScoped(
647
669
  {
648
670
  file: 'locus-info',
@@ -655,16 +677,18 @@ export default class LocusInfo extends EventsScope {
655
677
  selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,
656
678
  selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,
657
679
  hostId: this.parsedLocus.host && this.parsedLocus.host.hostId,
680
+ isReplace,
658
681
  }
659
682
  );
660
683
  }
661
684
 
662
685
  /**
663
686
  * @param {Object} controls
687
+ * @param {Object} self
664
688
  * @returns {undefined}
665
689
  * @memberof LocusInfo
666
690
  */
667
- updateControls(controls: object) {
691
+ updateControls(controls: object, self: object) {
668
692
  if (controls && !isEqual(this.controls, controls)) {
669
693
  this.parsedLocus.controls = ControlsUtils.parse(controls);
670
694
  const {
@@ -674,10 +698,76 @@ export default class LocusInfo extends EventsScope {
674
698
  hasMeetingContainerChanged,
675
699
  hasTranscribeChanged,
676
700
  hasEntryExitToneChanged,
701
+ hasBreakoutChanged,
702
+ hasVideoEnabledChanged,
703
+ hasMuteOnEntryChanged,
704
+ hasShareControlChanged,
705
+ hasDisallowUnmuteChanged,
706
+ hasReactionsChanged,
707
+ hasReactionDisplayNamesChanged,
708
+ hasViewTheParticipantListChanged,
709
+ hasRaiseHandChanged,
710
+ hasVideoChanged,
677
711
  },
678
712
  current,
679
713
  } = ControlsUtils.getControls(this.controls, controls);
680
714
 
715
+ if (hasMuteOnEntryChanged) {
716
+ this.emitScoped(
717
+ {file: 'locus-info', function: 'updateControls'},
718
+ LOCUSINFO.EVENTS.CONTROLS_MUTE_ON_ENTRY_CHANGED,
719
+ {state: current.muteOnEntry}
720
+ );
721
+ }
722
+
723
+ if (hasShareControlChanged) {
724
+ this.emitScoped(
725
+ {file: 'locus-info', function: 'updateControls'},
726
+ LOCUSINFO.EVENTS.CONTROLS_SHARE_CONTROL_CHANGED,
727
+ {state: current.shareControl}
728
+ );
729
+ }
730
+
731
+ if (hasDisallowUnmuteChanged) {
732
+ this.emitScoped(
733
+ {file: 'locus-info', function: 'updateControls'},
734
+ LOCUSINFO.EVENTS.CONTROLS_DISALLOW_UNMUTE_CHANGED,
735
+ {state: current.disallowUnmute}
736
+ );
737
+ }
738
+
739
+ if (hasReactionsChanged || hasReactionDisplayNamesChanged) {
740
+ this.emitScoped(
741
+ {file: 'locus-info', function: 'updateControls'},
742
+ LOCUSINFO.EVENTS.CONTROLS_REACTIONS_CHANGED,
743
+ {state: current.reactions}
744
+ );
745
+ }
746
+
747
+ if (hasViewTheParticipantListChanged) {
748
+ this.emitScoped(
749
+ {file: 'locus-info', function: 'updateControls'},
750
+ LOCUSINFO.EVENTS.CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED,
751
+ {state: current.viewTheParticipantList}
752
+ );
753
+ }
754
+
755
+ if (hasRaiseHandChanged) {
756
+ this.emitScoped(
757
+ {file: 'locus-info', function: 'updateControls'},
758
+ LOCUSINFO.EVENTS.CONTROLS_RAISE_HAND_CHANGED,
759
+ {state: current.raiseHand}
760
+ );
761
+ }
762
+
763
+ if (hasVideoChanged) {
764
+ this.emitScoped(
765
+ {file: 'locus-info', function: 'updateControls'},
766
+ LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED,
767
+ {state: current.video}
768
+ );
769
+ }
770
+
681
771
  if (hasRecordingChanged || hasRecordingPausedChanged) {
682
772
  let state = null;
683
773
 
@@ -737,9 +827,29 @@ export default class LocusInfo extends EventsScope {
737
827
  );
738
828
  }
739
829
 
830
+ if (hasBreakoutChanged) {
831
+ const {breakout} = current;
832
+ breakout.breakoutMoveId = SelfUtils.getReplacedBreakoutMoveId(
833
+ self,
834
+ this.webex.internal.device.url
835
+ );
836
+ this.emitScoped(
837
+ {
838
+ file: 'locus-info',
839
+ function: 'updateControls',
840
+ },
841
+ LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED,
842
+ {
843
+ breakout,
844
+ }
845
+ );
846
+ }
847
+
740
848
  if (hasEntryExitToneChanged) {
741
849
  const {entryExitTone} = current;
742
850
 
851
+ this.updateMeeting({entryExitTone});
852
+
743
853
  this.emitScoped(
744
854
  {
745
855
  file: 'locus-info',
@@ -750,8 +860,26 @@ export default class LocusInfo extends EventsScope {
750
860
  entryExitTone,
751
861
  }
752
862
  );
863
+ }
753
864
 
754
- this.updateMeeting({entryExitTone});
865
+ // videoEnabled is handled differently than other controls,
866
+ // to fit with audio mute status logic
867
+ if (hasVideoEnabledChanged) {
868
+ const {videoEnabled} = current;
869
+
870
+ this.updateMeeting({unmuteVideoAllowed: videoEnabled});
871
+
872
+ this.emitScoped(
873
+ {
874
+ file: 'locus-info',
875
+ function: 'updateControls',
876
+ },
877
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
878
+ {
879
+ // muted: not part of locus.controls
880
+ unmuteAllowed: videoEnabled,
881
+ }
882
+ );
755
883
  }
756
884
 
757
885
  this.controls = controls;
@@ -789,6 +917,27 @@ export default class LocusInfo extends EventsScope {
789
917
  }
790
918
  }
791
919
 
920
+ /**
921
+ * @param {Object} services
922
+ * @returns {undefined}
923
+ * @memberof LocusInfo
924
+ */
925
+ updateServices(services: Record<'breakout' | 'record', {url: string}>) {
926
+ if (services && !isEqual(this.services, services)) {
927
+ this.services = services;
928
+ this.emitScoped(
929
+ {
930
+ file: 'locus-info',
931
+ function: 'updateServices',
932
+ },
933
+ LOCUSINFO.EVENTS.LINKS_SERVICES,
934
+ {
935
+ services,
936
+ }
937
+ );
938
+ }
939
+ }
940
+
792
941
  /**
793
942
  * @param {Object} fullState
794
943
  * @returns {undefined}
@@ -871,8 +1020,11 @@ export default class LocusInfo extends EventsScope {
871
1020
  * @memberof LocusInfo
872
1021
  */
873
1022
  updateMeetingInfo(info: object, self?: object) {
874
- if (info && !isEqual(this.info, info)) {
875
- const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
1023
+ const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
1024
+ if (
1025
+ (info && !isEqual(this.info, info)) ||
1026
+ (roles.length && !isEqual(this.roles, roles) && info)
1027
+ ) {
876
1028
  const isJoined = SelfUtils.isJoined(self || this.parsedLocus.self);
877
1029
  const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles, isJoined);
878
1030
 
@@ -911,6 +1063,7 @@ export default class LocusInfo extends EventsScope {
911
1063
  // Parses the info and adds necessary values
912
1064
  this.updateMeeting(parsedInfo.current);
913
1065
  }
1066
+ this.roles = roles;
914
1067
  }
915
1068
 
916
1069
  /**
@@ -951,6 +1104,8 @@ export default class LocusInfo extends EventsScope {
951
1104
  const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);
952
1105
 
953
1106
  this.updateMeeting(parsedMediaShares.current);
1107
+ this.parsedLocus.mediaShares = parsedMediaShares.current;
1108
+ this.mediaShares = mediaShares;
954
1109
  this.emitScoped(
955
1110
  {
956
1111
  file: 'locus-info',
@@ -962,8 +1117,6 @@ export default class LocusInfo extends EventsScope {
962
1117
  previous: parsedMediaShares.previous,
963
1118
  }
964
1119
  );
965
- this.parsedLocus.mediaShares = parsedMediaShares.current;
966
- this.mediaShares = mediaShares;
967
1120
  }
968
1121
  }
969
1122
 
@@ -1041,6 +1194,17 @@ export default class LocusInfo extends EventsScope {
1041
1194
  );
1042
1195
  }
1043
1196
 
1197
+ if (parsedSelves.updates.breakoutsChanged) {
1198
+ this.emitScoped(
1199
+ {
1200
+ file: 'locus-info',
1201
+ function: 'updateSelf',
1202
+ },
1203
+ LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED,
1204
+ {breakoutSessions: parsedSelves.current.breakoutSessions}
1205
+ );
1206
+ }
1207
+
1044
1208
  if (parsedSelves.updates.isMediaInactiveOrReleased) {
1045
1209
  this.emitScoped(
1046
1210
  {
@@ -1062,6 +1226,31 @@ export default class LocusInfo extends EventsScope {
1062
1226
  self
1063
1227
  );
1064
1228
  }
1229
+
1230
+ if (parsedSelves.updates.isRolesChanged) {
1231
+ this.emitScoped(
1232
+ {
1233
+ file: 'locus-info',
1234
+ function: 'updateSelf',
1235
+ },
1236
+ LOCUSINFO.EVENTS.SELF_ROLES_CHANGED,
1237
+ {oldRoles: parsedSelves.previous?.roles, newRoles: parsedSelves.current?.roles}
1238
+ );
1239
+ }
1240
+
1241
+ if (parsedSelves.updates.isVideoMutedByOthersChanged) {
1242
+ this.emitScoped(
1243
+ {
1244
+ file: 'locus-info',
1245
+ function: 'updateSelf',
1246
+ },
1247
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
1248
+ {
1249
+ muted: parsedSelves.current.remoteVideoMuted,
1250
+ // unmuteAllowed: not part of .self
1251
+ }
1252
+ );
1253
+ }
1065
1254
  if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {
1066
1255
  this.emitScoped(
1067
1256
  {
@@ -1276,4 +1465,104 @@ export default class LocusInfo extends EventsScope {
1276
1465
  this.identities = identities;
1277
1466
  }
1278
1467
  }
1468
+
1469
+ /**
1470
+ * check the locus is main session's one or not, if is main session's, update main session cache
1471
+ * @param {Object} locus
1472
+ * @returns {undefined}
1473
+ * @memberof LocusInfo
1474
+ */
1475
+ updateLocusCache(locus: any) {
1476
+ const isMainSessionDTO = ControlsUtils.isMainSessionDTO(locus);
1477
+ if (isMainSessionDTO) {
1478
+ this.updateMainSessionLocusCache(locus);
1479
+ }
1480
+ }
1481
+
1482
+ /**
1483
+ * if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)
1484
+ * if join breakout from main session, need to query main locus url (if response with 403 means no privilege, need to clear the cache)
1485
+ * @param {Object} newLocus
1486
+ * @returns {Object}
1487
+ * @memberof LocusInfo
1488
+ */
1489
+ getTheLocusToUpdate(newLocus: any) {
1490
+ const switchStatus = ControlsUtils.getSessionSwitchStatus(this.controls, newLocus.controls);
1491
+ if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {
1492
+ return cloneDeep(this.mainSessionLocusCache);
1493
+ }
1494
+ if (switchStatus.isJoinToBreakout) {
1495
+ this.emitScoped(
1496
+ {
1497
+ file: 'locus-info',
1498
+ function: 'updateControls',
1499
+ },
1500
+ LOCUSINFO.EVENTS.CONTROLS_JOIN_BREAKOUT_FROM_MAIN,
1501
+ {
1502
+ mainLocusUrl: this.url,
1503
+ }
1504
+ );
1505
+ }
1506
+
1507
+ return newLocus;
1508
+ }
1509
+
1510
+ /**
1511
+ * merge participants by participant id
1512
+ * @param {Array} participants
1513
+ * @param {Array} sourceParticipants
1514
+ * @returns {Array} merged participants
1515
+ * @memberof LocusInfo
1516
+ */
1517
+ // eslint-disable-next-line class-methods-use-this
1518
+ mergeParticipants(participants, sourceParticipants) {
1519
+ if (!sourceParticipants || !sourceParticipants.length) return participants;
1520
+ if (!participants || !participants.length) {
1521
+ return sourceParticipants;
1522
+ }
1523
+ sourceParticipants.forEach((participant) => {
1524
+ const existIndex = participants.findIndex((p) => p.id === participant.id);
1525
+ if (existIndex > -1) {
1526
+ participants.splice(existIndex, 1, participant);
1527
+ } else {
1528
+ participants.push(participant);
1529
+ }
1530
+ });
1531
+
1532
+ return participants;
1533
+ }
1534
+
1535
+ /**
1536
+ * need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout
1537
+ * @param {Object} mainLocus
1538
+ * @returns {undefined}
1539
+ * @memberof LocusInfo
1540
+ */
1541
+ updateMainSessionLocusCache(mainLocus: any) {
1542
+ if (!mainLocus) {
1543
+ return;
1544
+ }
1545
+ const locusClone = cloneDeep(mainLocus);
1546
+ if (this.mainSessionLocusCache) {
1547
+ // shallow merge and do special merge for participants
1548
+ assignWith(this.mainSessionLocusCache, locusClone, (objValue, srcValue, key) => {
1549
+ if (key === 'participants') {
1550
+ return this.mergeParticipants(objValue, srcValue);
1551
+ }
1552
+
1553
+ return srcValue || objValue;
1554
+ });
1555
+ } else {
1556
+ this.mainSessionLocusCache = locusClone;
1557
+ }
1558
+ }
1559
+
1560
+ /**
1561
+ * clear main session cache
1562
+ * @returns {undefined}
1563
+ * @memberof LocusInfo
1564
+ */
1565
+ clearMainSessionLocusCache() {
1566
+ this.mainSessionLocusCache = null;
1567
+ }
1279
1568
  }