@webex/plugin-meetings 3.0.0-beta.21 → 3.0.0-beta.211

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 (422) 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 +179 -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 +106 -1
  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 +359 -64
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/infoUtils.js +7 -1
  53. package/dist/locus-info/infoUtils.js.map +1 -1
  54. package/dist/locus-info/mediaSharesUtils.js +43 -1
  55. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  56. package/dist/locus-info/parser.js +219 -63
  57. package/dist/locus-info/parser.js.map +1 -1
  58. package/dist/locus-info/selfUtils.js +89 -14
  59. package/dist/locus-info/selfUtils.js.map +1 -1
  60. package/dist/media/index.js +48 -135
  61. package/dist/media/index.js.map +1 -1
  62. package/dist/media/properties.js +29 -90
  63. package/dist/media/properties.js.map +1 -1
  64. package/dist/mediaQualityMetrics/config.js +505 -493
  65. package/dist/mediaQualityMetrics/config.js.map +1 -1
  66. package/dist/meeting/in-meeting-actions.js +90 -2
  67. package/dist/meeting/in-meeting-actions.js.map +1 -1
  68. package/dist/meeting/index.js +2770 -2547
  69. package/dist/meeting/index.js.map +1 -1
  70. package/dist/meeting/locusMediaRequest.js +291 -0
  71. package/dist/meeting/locusMediaRequest.js.map +1 -0
  72. package/dist/meeting/muteState.js +229 -124
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +199 -193
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +532 -414
  77. package/dist/meeting/util.js.map +1 -1
  78. package/dist/meeting-info/index.js +48 -7
  79. package/dist/meeting-info/index.js.map +1 -1
  80. package/dist/meeting-info/meeting-info-v2.js +171 -51
  81. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  82. package/dist/meeting-info/utilv2.js +20 -5
  83. package/dist/meeting-info/utilv2.js.map +1 -1
  84. package/dist/meetings/collection.js +22 -0
  85. package/dist/meetings/collection.js.map +1 -1
  86. package/dist/meetings/index.js +357 -66
  87. package/dist/meetings/index.js.map +1 -1
  88. package/dist/meetings/meetings.types.js +7 -0
  89. package/dist/meetings/meetings.types.js.map +1 -0
  90. package/dist/meetings/request.js +2 -0
  91. package/dist/meetings/request.js.map +1 -1
  92. package/dist/meetings/util.js +88 -1
  93. package/dist/meetings/util.js.map +1 -1
  94. package/dist/member/index.js +49 -0
  95. package/dist/member/index.js.map +1 -1
  96. package/dist/member/types.js +25 -0
  97. package/dist/member/types.js.map +1 -0
  98. package/dist/member/util.js +121 -25
  99. package/dist/member/util.js.map +1 -1
  100. package/dist/members/collection.js +10 -0
  101. package/dist/members/collection.js.map +1 -1
  102. package/dist/members/index.js +86 -5
  103. package/dist/members/index.js.map +1 -1
  104. package/dist/members/request.js +106 -38
  105. package/dist/members/request.js.map +1 -1
  106. package/dist/members/types.js +15 -0
  107. package/dist/members/types.js.map +1 -0
  108. package/dist/members/util.js +316 -233
  109. package/dist/members/util.js.map +1 -1
  110. package/dist/metrics/constants.js +3 -5
  111. package/dist/metrics/constants.js.map +1 -1
  112. package/dist/metrics/index.js +1 -468
  113. package/dist/metrics/index.js.map +1 -1
  114. package/dist/multistream/mediaRequestManager.js +238 -49
  115. package/dist/multistream/mediaRequestManager.js.map +1 -1
  116. package/dist/multistream/receiveSlot.js +49 -16
  117. package/dist/multistream/receiveSlot.js.map +1 -1
  118. package/dist/multistream/receiveSlotManager.js +52 -34
  119. package/dist/multistream/receiveSlotManager.js.map +1 -1
  120. package/dist/multistream/remoteMedia.js +44 -18
  121. package/dist/multistream/remoteMedia.js.map +1 -1
  122. package/dist/multistream/remoteMediaGroup.js +60 -3
  123. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  124. package/dist/multistream/remoteMediaManager.js +173 -59
  125. package/dist/multistream/remoteMediaManager.js.map +1 -1
  126. package/dist/networkQualityMonitor/index.js +4 -2
  127. package/dist/networkQualityMonitor/index.js.map +1 -1
  128. package/dist/reachability/index.js +72 -27
  129. package/dist/reachability/index.js.map +1 -1
  130. package/dist/reachability/request.js +12 -5
  131. package/dist/reachability/request.js.map +1 -1
  132. package/dist/reconnection-manager/index.js +196 -155
  133. package/dist/reconnection-manager/index.js.map +1 -1
  134. package/dist/recording-controller/index.js +21 -2
  135. package/dist/recording-controller/index.js.map +1 -1
  136. package/dist/recording-controller/util.js +9 -8
  137. package/dist/recording-controller/util.js.map +1 -1
  138. package/dist/roap/index.js +21 -29
  139. package/dist/roap/index.js.map +1 -1
  140. package/dist/roap/request.js +110 -89
  141. package/dist/roap/request.js.map +1 -1
  142. package/dist/roap/turnDiscovery.js +93 -36
  143. package/dist/roap/turnDiscovery.js.map +1 -1
  144. package/dist/rtcMetrics/constants.js +12 -0
  145. package/dist/rtcMetrics/constants.js.map +1 -0
  146. package/dist/rtcMetrics/index.js +117 -0
  147. package/dist/rtcMetrics/index.js.map +1 -0
  148. package/dist/statsAnalyzer/global.js +1 -93
  149. package/dist/statsAnalyzer/global.js.map +1 -1
  150. package/dist/statsAnalyzer/index.js +326 -311
  151. package/dist/statsAnalyzer/index.js.map +1 -1
  152. package/dist/statsAnalyzer/mqaUtil.js +90 -53
  153. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  154. package/dist/types/annotation/annotation.types.d.ts +42 -0
  155. package/dist/types/annotation/constants.d.ts +31 -0
  156. package/dist/types/annotation/index.d.ts +117 -0
  157. package/dist/types/breakouts/breakout.d.ts +8 -0
  158. package/dist/types/breakouts/collection.d.ts +5 -0
  159. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  160. package/dist/types/breakouts/events.d.ts +8 -0
  161. package/dist/types/breakouts/index.d.ts +5 -0
  162. package/dist/types/breakouts/request.d.ts +22 -0
  163. package/dist/types/breakouts/utils.d.ts +15 -0
  164. package/dist/types/common/browser-detection.d.ts +9 -0
  165. package/dist/types/common/collection.d.ts +48 -0
  166. package/dist/types/common/config.d.ts +2 -0
  167. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  168. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  169. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  170. package/dist/types/common/errors/media.d.ts +15 -0
  171. package/dist/types/common/errors/parameter.d.ts +15 -0
  172. package/dist/types/common/errors/password-error.d.ts +15 -0
  173. package/dist/types/common/errors/permission.d.ts +14 -0
  174. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  175. package/dist/types/common/errors/reconnection.d.ts +15 -0
  176. package/dist/types/common/errors/stats.d.ts +15 -0
  177. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  178. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  179. package/dist/types/common/events/events-scope.d.ts +17 -0
  180. package/dist/types/common/events/events.d.ts +12 -0
  181. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  182. package/dist/types/common/events/util.d.ts +2 -0
  183. package/dist/types/common/logs/logger-config.d.ts +2 -0
  184. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  185. package/dist/types/common/logs/request.d.ts +34 -0
  186. package/dist/types/common/queue.d.ts +34 -0
  187. package/dist/types/config.d.ts +72 -0
  188. package/dist/types/constants.d.ts +1020 -0
  189. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  190. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  191. package/dist/types/controls-options-manager/index.d.ts +136 -0
  192. package/dist/types/controls-options-manager/types.d.ts +43 -0
  193. package/dist/types/controls-options-manager/util.d.ts +1 -0
  194. package/dist/types/index.d.ts +7 -0
  195. package/dist/types/interpretation/collection.d.ts +5 -0
  196. package/dist/types/interpretation/index.d.ts +5 -0
  197. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  198. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  199. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  200. package/dist/types/locus-info/fullState.d.ts +2 -0
  201. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  202. package/dist/types/locus-info/index.d.ts +322 -0
  203. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  204. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  205. package/dist/types/locus-info/parser.d.ts +271 -0
  206. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  207. package/dist/types/media/index.d.ts +34 -0
  208. package/dist/types/media/properties.d.ts +93 -0
  209. package/dist/types/media/util.d.ts +2 -0
  210. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  211. package/dist/types/meeting/in-meeting-actions.d.ts +163 -0
  212. package/dist/types/meeting/index.d.ts +1482 -0
  213. package/dist/types/meeting/locusMediaRequest.d.ts +72 -0
  214. package/dist/types/meeting/muteState.d.ts +184 -0
  215. package/dist/types/meeting/request.d.ts +257 -0
  216. package/dist/types/meeting/request.type.d.ts +11 -0
  217. package/dist/types/meeting/state.d.ts +9 -0
  218. package/dist/types/meeting/util.d.ts +79 -0
  219. package/dist/types/meeting-info/collection.d.ts +20 -0
  220. package/dist/types/meeting-info/index.d.ts +62 -0
  221. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  222. package/dist/types/meeting-info/request.d.ts +22 -0
  223. package/dist/types/meeting-info/util.d.ts +2 -0
  224. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  225. package/dist/types/meetings/collection.d.ts +31 -0
  226. package/dist/types/meetings/index.d.ts +367 -0
  227. package/dist/types/meetings/meetings.types.d.ts +4 -0
  228. package/dist/types/meetings/request.d.ts +27 -0
  229. package/dist/types/meetings/util.d.ts +18 -0
  230. package/dist/types/member/index.d.ts +159 -0
  231. package/dist/types/member/types.d.ts +32 -0
  232. package/dist/types/member/util.d.ts +2 -0
  233. package/dist/types/members/collection.d.ts +29 -0
  234. package/dist/types/members/index.d.ts +353 -0
  235. package/dist/types/members/request.d.ts +114 -0
  236. package/dist/types/members/types.d.ts +24 -0
  237. package/dist/types/members/util.d.ts +210 -0
  238. package/dist/types/metrics/constants.d.ts +55 -0
  239. package/dist/types/metrics/index.d.ts +45 -0
  240. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  241. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  242. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  243. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  244. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  245. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  246. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  247. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  248. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  249. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  250. package/dist/types/reachability/index.d.ts +152 -0
  251. package/dist/types/reachability/request.d.ts +37 -0
  252. package/dist/types/reactions/constants.d.ts +3 -0
  253. package/dist/types/reactions/reactions.d.ts +4 -0
  254. package/dist/types/reactions/reactions.type.d.ts +52 -0
  255. package/dist/types/reconnection-manager/index.d.ts +126 -0
  256. package/dist/types/recording-controller/enums.d.ts +7 -0
  257. package/dist/types/recording-controller/index.d.ts +207 -0
  258. package/dist/types/recording-controller/util.d.ts +14 -0
  259. package/dist/types/roap/index.d.ts +77 -0
  260. package/dist/types/roap/request.d.ts +36 -0
  261. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  262. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  263. package/dist/types/rtcMetrics/index.d.ts +46 -0
  264. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  265. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  266. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  267. package/dist/types/transcription/index.d.ts +64 -0
  268. package/package.json +23 -20
  269. package/src/annotation/annotation.types.ts +50 -0
  270. package/src/annotation/constants.ts +36 -0
  271. package/src/annotation/index.ts +328 -0
  272. package/src/breakouts/README.md +44 -14
  273. package/src/breakouts/breakout.ts +87 -9
  274. package/src/breakouts/edit-lock-error.ts +25 -0
  275. package/src/breakouts/events.ts +56 -0
  276. package/src/breakouts/index.ts +710 -10
  277. package/src/breakouts/request.ts +55 -0
  278. package/src/breakouts/utils.ts +57 -0
  279. package/src/common/errors/webex-errors.ts +6 -2
  280. package/src/common/logs/logger-proxy.ts +1 -1
  281. package/src/common/queue.ts +22 -8
  282. package/src/config.ts +2 -7
  283. package/src/constants.ts +165 -21
  284. package/src/controls-options-manager/constants.ts +5 -0
  285. package/src/controls-options-manager/enums.ts +18 -0
  286. package/src/controls-options-manager/index.ts +278 -0
  287. package/src/controls-options-manager/types.ts +59 -0
  288. package/src/controls-options-manager/util.ts +300 -0
  289. package/src/index.ts +39 -0
  290. package/src/interpretation/README.md +60 -0
  291. package/src/interpretation/collection.ts +19 -0
  292. package/src/interpretation/index.ts +332 -0
  293. package/src/interpretation/siLanguage.ts +18 -0
  294. package/src/locus-info/controlsUtils.ts +108 -0
  295. package/src/locus-info/index.ts +383 -61
  296. package/src/locus-info/infoUtils.ts +10 -2
  297. package/src/locus-info/mediaSharesUtils.ts +48 -0
  298. package/src/locus-info/parser.ts +224 -39
  299. package/src/locus-info/selfUtils.ts +81 -5
  300. package/src/media/index.ts +87 -140
  301. package/src/media/properties.ts +49 -90
  302. package/src/mediaQualityMetrics/config.ts +379 -377
  303. package/src/meeting/in-meeting-actions.ts +179 -3
  304. package/src/meeting/index.ts +2099 -2083
  305. package/src/meeting/locusMediaRequest.ts +311 -0
  306. package/src/meeting/muteState.ts +228 -132
  307. package/src/meeting/request.ts +105 -115
  308. package/src/meeting/util.ts +511 -397
  309. package/src/meeting-info/index.ts +54 -8
  310. package/src/meeting-info/meeting-info-v2.ts +148 -14
  311. package/src/meeting-info/utilv2.ts +13 -3
  312. package/src/meetings/collection.ts +20 -0
  313. package/src/meetings/index.ts +392 -84
  314. package/src/meetings/meetings.types.ts +12 -0
  315. package/src/meetings/request.ts +2 -0
  316. package/src/meetings/util.ts +103 -4
  317. package/src/member/index.ts +49 -0
  318. package/src/member/types.ts +38 -0
  319. package/src/member/util.ts +127 -25
  320. package/src/members/collection.ts +8 -0
  321. package/src/members/index.ts +107 -6
  322. package/src/members/request.ts +97 -17
  323. package/src/members/types.ts +28 -0
  324. package/src/members/util.ts +319 -240
  325. package/src/metrics/constants.ts +2 -4
  326. package/src/metrics/index.ts +1 -490
  327. package/src/multistream/mediaRequestManager.ts +289 -79
  328. package/src/multistream/receiveSlot.ts +55 -18
  329. package/src/multistream/receiveSlotManager.ts +46 -24
  330. package/src/multistream/remoteMedia.ts +27 -2
  331. package/src/multistream/remoteMediaGroup.ts +59 -0
  332. package/src/multistream/remoteMediaManager.ts +113 -32
  333. package/src/networkQualityMonitor/index.ts +6 -6
  334. package/src/reachability/index.ts +62 -15
  335. package/src/reachability/request.ts +10 -5
  336. package/src/reconnection-manager/index.ts +68 -43
  337. package/src/recording-controller/index.ts +20 -3
  338. package/src/recording-controller/util.ts +26 -9
  339. package/src/roap/index.ts +21 -30
  340. package/src/roap/request.ts +101 -95
  341. package/src/roap/turnDiscovery.ts +47 -25
  342. package/src/rtcMetrics/constants.ts +3 -0
  343. package/src/rtcMetrics/index.ts +100 -0
  344. package/src/statsAnalyzer/global.ts +1 -94
  345. package/src/statsAnalyzer/index.ts +376 -386
  346. package/src/statsAnalyzer/mqaUtil.ts +100 -99
  347. package/test/integration/spec/converged-space-meetings.js +233 -0
  348. package/test/integration/spec/journey.js +336 -259
  349. package/test/integration/spec/space-meeting.js +77 -4
  350. package/test/unit/spec/annotation/index.ts +418 -0
  351. package/test/unit/spec/breakouts/breakout.ts +142 -24
  352. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  353. package/test/unit/spec/breakouts/events.ts +89 -0
  354. package/test/unit/spec/breakouts/index.ts +1545 -48
  355. package/test/unit/spec/breakouts/request.ts +104 -0
  356. package/test/unit/spec/breakouts/utils.js +72 -0
  357. package/test/unit/spec/common/queue.js +31 -2
  358. package/test/unit/spec/controls-options-manager/index.js +287 -0
  359. package/test/unit/spec/controls-options-manager/util.js +582 -0
  360. package/test/unit/spec/fixture/locus.js +1 -0
  361. package/test/unit/spec/interpretation/collection.ts +15 -0
  362. package/test/unit/spec/interpretation/index.ts +589 -0
  363. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  364. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  365. package/test/unit/spec/locus-info/index.js +1169 -36
  366. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  367. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  368. package/test/unit/spec/locus-info/parser.js +62 -22
  369. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  370. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  371. package/test/unit/spec/media/index.ts +138 -28
  372. package/test/unit/spec/meeting/in-meeting-actions.ts +89 -3
  373. package/test/unit/spec/meeting/index.js +3573 -1663
  374. package/test/unit/spec/meeting/locusMediaRequest.ts +438 -0
  375. package/test/unit/spec/meeting/muteState.js +370 -208
  376. package/test/unit/spec/meeting/request.js +339 -44
  377. package/test/unit/spec/meeting/utils.js +456 -53
  378. package/test/unit/spec/meeting-info/index.js +181 -0
  379. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  380. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  381. package/test/unit/spec/meetings/collection.js +14 -0
  382. package/test/unit/spec/meetings/index.js +867 -125
  383. package/test/unit/spec/meetings/utils.js +206 -2
  384. package/test/unit/spec/member/index.js +58 -4
  385. package/test/unit/spec/member/util.js +479 -35
  386. package/test/unit/spec/members/index.js +319 -1
  387. package/test/unit/spec/members/request.js +206 -27
  388. package/test/unit/spec/members/utils.js +184 -0
  389. package/test/unit/spec/metrics/index.js +1 -50
  390. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  391. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  392. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  393. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  394. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  395. package/test/unit/spec/multistream/remoteMediaManager.ts +318 -0
  396. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  397. package/test/unit/spec/reachability/index.ts +125 -8
  398. package/test/unit/spec/reachability/request.js +66 -0
  399. package/test/unit/spec/reconnection-manager/index.js +59 -6
  400. package/test/unit/spec/recording-controller/index.js +294 -218
  401. package/test/unit/spec/recording-controller/util.js +223 -96
  402. package/test/unit/spec/roap/index.ts +26 -51
  403. package/test/unit/spec/roap/request.ts +196 -85
  404. package/test/unit/spec/roap/turnDiscovery.ts +30 -7
  405. package/test/unit/spec/rtcMetrics/index.ts +60 -0
  406. package/test/unit/spec/stats-analyzer/index.js +92 -41
  407. package/test/utils/constants.js +9 -0
  408. package/test/utils/integrationTestUtils.js +46 -0
  409. package/test/utils/testUtils.js +0 -45
  410. package/test/utils/webex-config.js +4 -0
  411. package/test/utils/webex-test-users.js +6 -3
  412. package/dist/meeting/effectsState.js +0 -262
  413. package/dist/meeting/effectsState.js.map +0 -1
  414. package/dist/metrics/config.js +0 -299
  415. package/dist/metrics/config.js.map +0 -1
  416. package/dist/multistream/multistreamMedia.js +0 -110
  417. package/dist/multistream/multistreamMedia.js.map +0 -1
  418. package/src/index.js +0 -16
  419. package/src/meeting/effectsState.ts +0 -211
  420. package/src/metrics/config.ts +0 -495
  421. package/src/multistream/multistreamMedia.ts +0 -97
  422. 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 {function} updateMeeting callback to update the meeting object from an object
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,20 +1098,14 @@ 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
 
926
- this.emitScoped(
927
- {
928
- file: 'locus-info',
929
- function: 'updateMeetingInfo',
930
- },
931
- LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,
932
- {info: parsedInfo.current, self}
933
- );
934
-
935
1109
  if (parsedInfo.updates.isLocked) {
936
1110
  this.emitScoped(
937
1111
  {
@@ -957,7 +1131,16 @@ export default class LocusInfo extends EventsScope {
957
1131
  this.parsedLocus.info = parsedInfo.current;
958
1132
  // Parses the info and adds necessary values
959
1133
  this.updateMeeting(parsedInfo.current);
1134
+
1135
+ this.emitScoped(
1136
+ {
1137
+ file: 'locus-info',
1138
+ function: 'updateMeetingInfo',
1139
+ },
1140
+ LOCUSINFO.EVENTS.MEETING_INFO_UPDATED
1141
+ );
960
1142
  }
1143
+ this.roles = roles;
961
1144
  }
962
1145
 
963
1146
  /**
@@ -998,6 +1181,8 @@ export default class LocusInfo extends EventsScope {
998
1181
  const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);
999
1182
 
1000
1183
  this.updateMeeting(parsedMediaShares.current);
1184
+ this.parsedLocus.mediaShares = parsedMediaShares.current;
1185
+ this.mediaShares = mediaShares;
1001
1186
  this.emitScoped(
1002
1187
  {
1003
1188
  file: 'locus-info',
@@ -1009,8 +1194,6 @@ export default class LocusInfo extends EventsScope {
1009
1194
  previous: parsedMediaShares.previous,
1010
1195
  }
1011
1196
  );
1012
- this.parsedLocus.mediaShares = parsedMediaShares.current;
1013
- this.mediaShares = mediaShares;
1014
1197
  }
1015
1198
  }
1016
1199
 
@@ -1099,6 +1282,20 @@ export default class LocusInfo extends EventsScope {
1099
1282
  );
1100
1283
  }
1101
1284
 
1285
+ if (parsedSelves.updates.interpretationChanged) {
1286
+ this.emitScoped(
1287
+ {
1288
+ file: 'locus-info',
1289
+ function: 'updateSelf',
1290
+ },
1291
+ LOCUSINFO.EVENTS.SELF_MEETING_INTERPRETATION_CHANGED,
1292
+ {
1293
+ interpretation: parsedSelves.current.interpretation,
1294
+ selfParticipantId: parsedSelves.current.selfId,
1295
+ }
1296
+ );
1297
+ }
1298
+
1102
1299
  if (parsedSelves.updates.isMediaInactiveOrReleased) {
1103
1300
  this.emitScoped(
1104
1301
  {
@@ -1120,6 +1317,31 @@ export default class LocusInfo extends EventsScope {
1120
1317
  self
1121
1318
  );
1122
1319
  }
1320
+
1321
+ if (parsedSelves.updates.isRolesChanged) {
1322
+ this.emitScoped(
1323
+ {
1324
+ file: 'locus-info',
1325
+ function: 'updateSelf',
1326
+ },
1327
+ LOCUSINFO.EVENTS.SELF_ROLES_CHANGED,
1328
+ {oldRoles: parsedSelves.previous?.roles, newRoles: parsedSelves.current?.roles}
1329
+ );
1330
+ }
1331
+
1332
+ if (parsedSelves.updates.isVideoMutedByOthersChanged) {
1333
+ this.emitScoped(
1334
+ {
1335
+ file: 'locus-info',
1336
+ function: 'updateSelf',
1337
+ },
1338
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
1339
+ {
1340
+ muted: parsedSelves.current.remoteVideoMuted,
1341
+ // unmuteAllowed: not part of .self
1342
+ }
1343
+ );
1344
+ }
1123
1345
  if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {
1124
1346
  this.emitScoped(
1125
1347
  {
@@ -1334,4 +1556,104 @@ export default class LocusInfo extends EventsScope {
1334
1556
  this.identities = identities;
1335
1557
  }
1336
1558
  }
1559
+
1560
+ /**
1561
+ * check the locus is main session's one or not, if is main session's, update main session cache
1562
+ * @param {Object} locus
1563
+ * @returns {undefined}
1564
+ * @memberof LocusInfo
1565
+ */
1566
+ updateLocusCache(locus: any) {
1567
+ const isMainSessionDTO = ControlsUtils.isMainSessionDTO(locus);
1568
+ if (isMainSessionDTO) {
1569
+ this.updateMainSessionLocusCache(locus);
1570
+ }
1571
+ }
1572
+
1573
+ /**
1574
+ * if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)
1575
+ * if join breakout from main session, need to query main locus url (if response with 403 means no privilege, need to clear the cache)
1576
+ * @param {Object} newLocus
1577
+ * @returns {Object}
1578
+ * @memberof LocusInfo
1579
+ */
1580
+ getTheLocusToUpdate(newLocus: any) {
1581
+ const switchStatus = ControlsUtils.getSessionSwitchStatus(this.controls, newLocus?.controls);
1582
+ if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {
1583
+ return cloneDeep(this.mainSessionLocusCache);
1584
+ }
1585
+ if (switchStatus.isJoinToBreakout) {
1586
+ this.emitScoped(
1587
+ {
1588
+ file: 'locus-info',
1589
+ function: 'updateControls',
1590
+ },
1591
+ LOCUSINFO.EVENTS.CONTROLS_JOIN_BREAKOUT_FROM_MAIN,
1592
+ {
1593
+ mainLocusUrl: this.url,
1594
+ }
1595
+ );
1596
+ }
1597
+
1598
+ return newLocus;
1599
+ }
1600
+
1601
+ /**
1602
+ * merge participants by participant id
1603
+ * @param {Array} participants
1604
+ * @param {Array} sourceParticipants
1605
+ * @returns {Array} merged participants
1606
+ * @memberof LocusInfo
1607
+ */
1608
+ // eslint-disable-next-line class-methods-use-this
1609
+ mergeParticipants(participants, sourceParticipants) {
1610
+ if (!sourceParticipants || !sourceParticipants.length) return participants;
1611
+ if (!participants || !participants.length) {
1612
+ return sourceParticipants;
1613
+ }
1614
+ sourceParticipants.forEach((participant) => {
1615
+ const existIndex = participants.findIndex((p) => p.id === participant.id);
1616
+ if (existIndex > -1) {
1617
+ participants.splice(existIndex, 1, participant);
1618
+ } else {
1619
+ participants.push(participant);
1620
+ }
1621
+ });
1622
+
1623
+ return participants;
1624
+ }
1625
+
1626
+ /**
1627
+ * need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout
1628
+ * @param {Object} mainLocus
1629
+ * @returns {undefined}
1630
+ * @memberof LocusInfo
1631
+ */
1632
+ updateMainSessionLocusCache(mainLocus: any) {
1633
+ if (!mainLocus) {
1634
+ return;
1635
+ }
1636
+ const locusClone = cloneDeep(mainLocus);
1637
+ if (this.mainSessionLocusCache) {
1638
+ // shallow merge and do special merge for participants
1639
+ assignWith(this.mainSessionLocusCache, locusClone, (objValue, srcValue, key) => {
1640
+ if (key === 'participants') {
1641
+ return this.mergeParticipants(objValue, srcValue);
1642
+ }
1643
+
1644
+ return srcValue || objValue;
1645
+ });
1646
+ } else {
1647
+ this.mainSessionLocusCache = locusClone;
1648
+ }
1649
+ }
1650
+
1651
+ /**
1652
+ * clear main session cache
1653
+ * @returns {undefined}
1654
+ * @memberof LocusInfo
1655
+ */
1656
+ clearMainSessionLocusCache() {
1657
+ this.mainSessionLocusCache = null;
1658
+ }
1337
1659
  }