@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
@@ -15,12 +15,13 @@ var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/
15
15
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
16
16
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
17
17
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
18
+ var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty"));
19
+ var _cloneDeep2 = _interopRequireDefault(require("lodash/cloneDeep"));
20
+ var _assignWith2 = _interopRequireDefault(require("lodash/assignWith"));
18
21
  var _isEqual2 = _interopRequireDefault(require("lodash/isEqual"));
19
22
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
20
23
  var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
21
24
  var _constants = require("../constants");
22
- var _metrics = _interopRequireDefault(require("../metrics"));
23
- var _config = require("../metrics/config");
24
25
  var _infoUtils = _interopRequireDefault(require("./infoUtils"));
25
26
  var _fullState = _interopRequireDefault(require("./fullState"));
26
27
  var _selfUtils = _interopRequireDefault(require("./selfUtils"));
@@ -40,6 +41,13 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_R
40
41
  var LocusInfo = /*#__PURE__*/function (_EventsScope) {
41
42
  (0, _inherits2.default)(LocusInfo, _EventsScope);
42
43
  var _super = _createSuper(LocusInfo);
44
+ /**
45
+ * Constructor
46
+ * @param {function} updateMeeting callback to update the meeting object from an object
47
+ * @param {object} webex
48
+ * @param {string} meetingId
49
+ * @returns {undefined}
50
+ */
43
51
  function LocusInfo(updateMeeting, webex, meetingId) {
44
52
  var _this;
45
53
  (0, _classCallCheck2.default)(this, LocusInfo);
@@ -68,10 +76,12 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
68
76
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "fullState", void 0);
69
77
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "host", void 0);
70
78
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "info", void 0);
79
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "roles", void 0);
71
80
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mediaShares", void 0);
72
81
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "replace", void 0);
73
82
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "url", void 0);
74
83
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "services", void 0);
84
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mainSessionLocusCache", void 0);
75
85
  _this.parsedLocus = {
76
86
  states: []
77
87
  };
@@ -85,38 +95,71 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
85
95
  }
86
96
 
87
97
  /**
88
- * Apply locus delta data to meeting
89
- * @param {string} action Locus delta action
90
- * @param {Locus} locus
98
+ * 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.
99
+ *
91
100
  * @param {Meeting} meeting
92
101
  * @returns {undefined}
93
102
  */
94
103
  (0, _createClass2.default)(LocusInfo, [{
104
+ key: "doLocusSync",
105
+ value: function doLocusSync(meeting) {
106
+ var _this2 = this;
107
+ var isDelta;
108
+ var url;
109
+ if (this.locusParser.workingCopy.syncUrl) {
110
+ url = this.locusParser.workingCopy.syncUrl;
111
+ isDelta = true;
112
+ } else {
113
+ url = meeting.locusUrl;
114
+ isDelta = false;
115
+ }
116
+ _loggerProxy.default.logger.info("Locus-info:index#doLocusSync --> doing Locus sync (getting ".concat(isDelta ? 'delta' : 'full', " DTO)"));
117
+
118
+ // return value ignored on purpose
119
+ meeting.meetingRequest.getLocusDTO({
120
+ url: url
121
+ }).then(function (res) {
122
+ if (isDelta) {
123
+ if (!(0, _isEmpty2.default)(res.body)) {
124
+ meeting.locusInfo.handleLocusDelta(res.body, meeting);
125
+ } else {
126
+ _loggerProxy.default.logger.info('Locus-info:index#doLocusSync --> received empty body from syncUrl, so we already have latest Locus DTO');
127
+ }
128
+ } else {
129
+ meeting.locusInfo.onFullLocus(res.body);
130
+ }
131
+ }).finally(function () {
132
+ // Notify parser to resume processing delta events.
133
+ // Any deltas in the queue that have now been superseded by this sync will simply be ignored
134
+ _this2.locusParser.resume();
135
+ });
136
+ }
137
+
138
+ /**
139
+ * Apply locus delta data to meeting
140
+ * @param {string} action Locus delta action
141
+ * @param {Locus} locus
142
+ * @param {Meeting} meeting
143
+ * @returns {undefined}
144
+ */
145
+ }, {
95
146
  key: "applyLocusDeltaData",
96
147
  value: function applyLocusDeltaData(action, locus, meeting) {
97
- var _this2 = this;
98
148
  var _LocusDeltaParser$loc = _parser.default.loci,
99
149
  DESYNC = _LocusDeltaParser$loc.DESYNC,
100
150
  USE_CURRENT = _LocusDeltaParser$loc.USE_CURRENT,
101
- USE_INCOMING = _LocusDeltaParser$loc.USE_INCOMING;
151
+ USE_INCOMING = _LocusDeltaParser$loc.USE_INCOMING,
152
+ WAIT = _LocusDeltaParser$loc.WAIT;
102
153
  switch (action) {
103
154
  case USE_INCOMING:
104
155
  meeting.locusInfo.onDeltaLocus(locus);
105
156
  break;
106
157
  case USE_CURRENT:
107
- meeting.locusDesync = false;
108
- meeting.needToGetFullLocus = false;
158
+ case WAIT:
159
+ // do nothing
109
160
  break;
110
161
  case DESYNC:
111
- meeting.meetingRequest.getFullLocus({
112
- desync: true,
113
- locusUrl: meeting.locusUrl
114
- }).then(function (res) {
115
- meeting.locusInfo.onFullLocus(res.body);
116
- // Notify parser to resume processing delta events
117
- // now that we have full locus from DESYNC.
118
- _this2.locusParser.resume();
119
- });
162
+ this.doLocusSync(meeting);
120
163
  break;
121
164
  default:
122
165
  _loggerProxy.default.logger.info("Locus-info:index#applyLocusDeltaData --> Unknown locus delta action: ".concat(action));
@@ -186,13 +229,13 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
186
229
  * @member LocusInfo
187
230
  */
188
231
  this.deltaParticipants = [];
189
-
232
+ this.updateLocusCache(locus);
190
233
  // above section only updates the locusInfo object
191
234
  // The below section makes sure it updates the locusInfo as well as updates the meeting object
192
235
  this.updateParticipants(locus.participants);
193
236
  // For 1:1 space meeting the conversation Url does not exist in locus.conversation
194
237
  this.updateConversationUrl(locus.conversationUrl, locus.info);
195
- this.updateControls(locus.controls);
238
+ this.updateControls(locus.controls, locus.self);
196
239
  this.updateLocusUrl(locus.url);
197
240
  this.updateFullState(locus.fullState);
198
241
  this.updateMeetingInfo(locus.info);
@@ -212,6 +255,7 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
212
255
  }, {
213
256
  key: "initialSetup",
214
257
  value: function initialSetup(locus) {
258
+ this.updateLocusCache(locus);
215
259
  this.onFullLocus(locus);
216
260
 
217
261
  // Change it to true after it receives it first locus object
@@ -229,6 +273,7 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
229
273
  value: function parse(meeting, data) {
230
274
  // eslint-disable-next-line @typescript-eslint/no-shadow
231
275
  var eventType = data.eventType;
276
+ var locus = this.getTheLocusToUpdate(data.locus);
232
277
  _loggerProxy.default.logger.info("Locus-info:index#parse --> received locus data: ".concat(eventType));
233
278
  switch (eventType) {
234
279
  case _constants.LOCUSEVENT.PARTICIPANT_JOIN:
@@ -245,15 +290,15 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
245
290
  case _constants.LOCUSEVENT.PARTICIPANT_DECLINED:
246
291
  case _constants.LOCUSEVENT.FLOOR_GRANTED:
247
292
  case _constants.LOCUSEVENT.FLOOR_RELEASED:
248
- this.onFullLocus(data.locus, eventType);
293
+ this.onFullLocus(locus, eventType);
249
294
  break;
250
295
  case _constants.LOCUSEVENT.DIFFERENCE:
251
- this.handleLocusDelta(data.locus, meeting);
296
+ this.handleLocusDelta(locus, meeting);
252
297
  break;
253
298
  default:
254
299
  // Why will there be a event with no eventType ????
255
300
  // we may not need this, we can get full locus
256
- this.handleLocusDelta(data.locus, meeting);
301
+ this.handleLocusDelta(locus, meeting);
257
302
  }
258
303
  }
259
304
 
@@ -277,18 +322,22 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
277
322
  * @returns {object} null
278
323
  * @memberof LocusInfo
279
324
  */
280
- // eslint-disable-next-line @typescript-eslint/no-shadow
281
325
  }, {
282
326
  key: "onFullLocus",
283
327
  value: function onFullLocus(locus, eventType) {
284
328
  if (!locus) {
285
329
  _loggerProxy.default.logger.error('Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.');
286
330
  }
331
+ if (!this.locusParser.isNewFullLocus(locus)) {
332
+ _loggerProxy.default.logger.info("Locus-info:index#onFullLocus --> ignoring old full locus DTO, eventType=".concat(eventType));
333
+ return;
334
+ }
287
335
  this.updateParticipantDeltas(locus.participants);
288
336
  this.scheduledMeeting = locus.meeting || null;
289
337
  this.participants = locus.participants;
338
+ var isReplaceMembers = _controlsUtils.default.isNeedReplaceMembers(this.controls, locus.controls);
290
339
  this.updateLocusInfo(locus);
291
- this.updateParticipants(locus.participants);
340
+ this.updateParticipants(locus.participants, isReplaceMembers);
292
341
  this.isMeetingActive();
293
342
  this.handleOneOnOneEvent(eventType);
294
343
  this.updateEmbeddedApps(locus.embeddedApps);
@@ -340,8 +389,9 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
340
389
  }, {
341
390
  key: "onDeltaLocus",
342
391
  value: function onDeltaLocus(locus) {
392
+ var isReplaceMembers = _controlsUtils.default.isNeedReplaceMembers(this.controls, locus.controls);
343
393
  this.updateLocusInfo(locus);
344
- this.updateParticipants(locus.participants);
394
+ this.updateParticipants(locus.participants, isReplaceMembers);
345
395
  this.isMeetingActive();
346
396
  }
347
397
 
@@ -360,7 +410,7 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
360
410
  // as it gets interpreted as if we have left the call
361
411
  return;
362
412
  }
363
- this.updateControls(locus.controls);
413
+ this.updateControls(locus.controls, locus.self);
364
414
  this.updateConversationUrl(locus.conversationUrl, locus.info);
365
415
  this.updateCreated(locus.created);
366
416
  this.updateFullState(locus.fullState);
@@ -426,9 +476,13 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
426
476
  if (this.fullState && this.fullState.state === _constants.LOCUS.STATE.INACTIVE) {
427
477
  // TODO: update the meeting state
428
478
  _loggerProxy.default.logger.warn('Locus-info:index#isMeetingActive --> Call Ended, locus state is inactive.');
429
- _metrics.default.postEvent({
430
- event: _config.eventType.REMOTE_ENDED,
431
- meetingId: this.meetingId
479
+
480
+ // @ts-ignore
481
+ this.webex.internal.newMetrics.submitClientEvent({
482
+ name: 'client.call.remote-ended',
483
+ options: {
484
+ meetingId: this.meetingId
485
+ }
432
486
  });
433
487
  this.emitScoped({
434
488
  file: 'locus-info',
@@ -438,9 +492,12 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
438
492
  shouldLeave: false
439
493
  });
440
494
  } else if (partner.state === _constants.MEETING_STATE.STATES.LEFT && this.parsedLocus.self && (this.parsedLocus.self.state === _constants.MEETING_STATE.STATES.DECLINED || this.parsedLocus.self.state === _constants.MEETING_STATE.STATES.NOTIFIED || this.parsedLocus.self.state === _constants.MEETING_STATE.STATES.JOINED)) {
441
- _metrics.default.postEvent({
442
- event: _config.eventType.REMOTE_ENDED,
443
- meetingId: this.meetingId
495
+ // @ts-ignore
496
+ this.webex.internal.newMetrics.submitClientEvent({
497
+ name: 'client.call.remote-ended',
498
+ options: {
499
+ meetingId: this.meetingId
500
+ }
444
501
  });
445
502
  this.emitScoped({
446
503
  file: 'locus-info',
@@ -451,9 +508,12 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
451
508
  });
452
509
  } else if (this.parsedLocus.self && this.parsedLocus.self.state === _constants.MEETING_STATE.STATES.LEFT && (partner.state === _constants.MEETING_STATE.STATES.LEFT || partner.state === _constants.MEETING_STATE.STATES.DECLINED || partner.state === _constants.MEETING_STATE.STATES.NOTIFIED || partner.state === _constants.MEETING_STATE.STATES.IDLE) // Happens when user just joins and adds no Media
453
510
  ) {
454
- _metrics.default.postEvent({
455
- event: _config.eventType.REMOTE_ENDED,
456
- meetingId: this.meetingId
511
+ // @ts-ignore
512
+ this.webex.internal.newMetrics.submitClientEvent({
513
+ name: 'client.call.remote-ended',
514
+ options: {
515
+ meetingId: this.meetingId
516
+ }
457
517
  });
458
518
  this.emitScoped({
459
519
  file: 'locus-info',
@@ -468,9 +528,13 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
468
528
  // @ts-ignore
469
529
  this.fullState.state === _constants.LOCUS.STATE.TERMINATING)) {
470
530
  _loggerProxy.default.logger.warn('Locus-info:index#isMeetingActive --> Meeting is ending due to inactive or terminating');
471
- _metrics.default.postEvent({
472
- event: _config.eventType.REMOTE_ENDED,
473
- meetingId: this.meetingId
531
+
532
+ // @ts-ignore
533
+ this.webex.internal.newMetrics.submitClientEvent({
534
+ name: 'client.call.remote-ended',
535
+ options: {
536
+ meetingId: this.meetingId
537
+ }
474
538
  });
475
539
  this.emitScoped({
476
540
  file: 'locus-info',
@@ -481,9 +545,13 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
481
545
  });
482
546
  } else if (this.fullState && this.fullState.removed) {
483
547
  // user has been dropped from a meeting
484
- _metrics.default.postEvent({
485
- event: _config.eventType.REMOTE_ENDED,
486
- meetingId: this.meetingId
548
+
549
+ // @ts-ignore
550
+ this.webex.internal.newMetrics.submitClientEvent({
551
+ name: 'client.call.remote-ended',
552
+ options: {
553
+ meetingId: this.meetingId
554
+ }
487
555
  });
488
556
  this.emitScoped({
489
557
  file: 'locus-info',
@@ -606,15 +674,15 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
606
674
  }
607
675
 
608
676
  /**
609
- *
677
+ * update meeting's members
610
678
  * @param {Object} participants new participants object
611
- * @param {boolen} deltaParticpantFlag delta event
679
+ * @param {Boolean} isReplace is replace the whole members
612
680
  * @returns {Array} updatedParticipants
613
681
  * @memberof LocusInfo
614
682
  */
615
683
  }, {
616
684
  key: "updateParticipants",
617
- value: function updateParticipants(participants) {
685
+ value: function updateParticipants(participants, isReplace) {
618
686
  var _this$parsedLocus$con;
619
687
  this.emitScoped({
620
688
  file: 'locus-info',
@@ -624,18 +692,20 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
624
692
  recordingId: this.parsedLocus.controls && ((_this$parsedLocus$con = this.parsedLocus.controls.record) === null || _this$parsedLocus$con === void 0 ? void 0 : _this$parsedLocus$con.modifiedBy),
625
693
  selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,
626
694
  selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,
627
- hostId: this.parsedLocus.host && this.parsedLocus.host.hostId
695
+ hostId: this.parsedLocus.host && this.parsedLocus.host.hostId,
696
+ isReplace: isReplace
628
697
  });
629
698
  }
630
699
 
631
700
  /**
632
701
  * @param {Object} controls
702
+ * @param {Object} self
633
703
  * @returns {undefined}
634
704
  * @memberof LocusInfo
635
705
  */
636
706
  }, {
637
707
  key: "updateControls",
638
- value: function updateControls(controls) {
708
+ value: function updateControls(controls, self) {
639
709
  if (controls && !(0, _isEqual2.default)(this.controls, controls)) {
640
710
  this.parsedLocus.controls = _controlsUtils.default.parse(controls);
641
711
  var _ControlsUtils$getCon = _controlsUtils.default.getControls(this.controls, controls),
@@ -646,7 +716,73 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
646
716
  hasTranscribeChanged = _ControlsUtils$getCon2.hasTranscribeChanged,
647
717
  hasEntryExitToneChanged = _ControlsUtils$getCon2.hasEntryExitToneChanged,
648
718
  hasBreakoutChanged = _ControlsUtils$getCon2.hasBreakoutChanged,
719
+ hasVideoEnabledChanged = _ControlsUtils$getCon2.hasVideoEnabledChanged,
720
+ hasMuteOnEntryChanged = _ControlsUtils$getCon2.hasMuteOnEntryChanged,
721
+ hasShareControlChanged = _ControlsUtils$getCon2.hasShareControlChanged,
722
+ hasDisallowUnmuteChanged = _ControlsUtils$getCon2.hasDisallowUnmuteChanged,
723
+ hasReactionsChanged = _ControlsUtils$getCon2.hasReactionsChanged,
724
+ hasReactionDisplayNamesChanged = _ControlsUtils$getCon2.hasReactionDisplayNamesChanged,
725
+ hasViewTheParticipantListChanged = _ControlsUtils$getCon2.hasViewTheParticipantListChanged,
726
+ hasRaiseHandChanged = _ControlsUtils$getCon2.hasRaiseHandChanged,
727
+ hasVideoChanged = _ControlsUtils$getCon2.hasVideoChanged,
728
+ hasInterpretationChanged = _ControlsUtils$getCon2.hasInterpretationChanged,
649
729
  current = _ControlsUtils$getCon.current;
730
+ if (hasMuteOnEntryChanged) {
731
+ this.emitScoped({
732
+ file: 'locus-info',
733
+ function: 'updateControls'
734
+ }, _constants.LOCUSINFO.EVENTS.CONTROLS_MUTE_ON_ENTRY_CHANGED, {
735
+ state: current.muteOnEntry
736
+ });
737
+ }
738
+ if (hasShareControlChanged) {
739
+ this.emitScoped({
740
+ file: 'locus-info',
741
+ function: 'updateControls'
742
+ }, _constants.LOCUSINFO.EVENTS.CONTROLS_SHARE_CONTROL_CHANGED, {
743
+ state: current.shareControl
744
+ });
745
+ }
746
+ if (hasDisallowUnmuteChanged) {
747
+ this.emitScoped({
748
+ file: 'locus-info',
749
+ function: 'updateControls'
750
+ }, _constants.LOCUSINFO.EVENTS.CONTROLS_DISALLOW_UNMUTE_CHANGED, {
751
+ state: current.disallowUnmute
752
+ });
753
+ }
754
+ if (hasReactionsChanged || hasReactionDisplayNamesChanged) {
755
+ this.emitScoped({
756
+ file: 'locus-info',
757
+ function: 'updateControls'
758
+ }, _constants.LOCUSINFO.EVENTS.CONTROLS_REACTIONS_CHANGED, {
759
+ state: current.reactions
760
+ });
761
+ }
762
+ if (hasViewTheParticipantListChanged) {
763
+ this.emitScoped({
764
+ file: 'locus-info',
765
+ function: 'updateControls'
766
+ }, _constants.LOCUSINFO.EVENTS.CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED, {
767
+ state: current.viewTheParticipantList
768
+ });
769
+ }
770
+ if (hasRaiseHandChanged) {
771
+ this.emitScoped({
772
+ file: 'locus-info',
773
+ function: 'updateControls'
774
+ }, _constants.LOCUSINFO.EVENTS.CONTROLS_RAISE_HAND_CHANGED, {
775
+ state: current.raiseHand
776
+ });
777
+ }
778
+ if (hasVideoChanged) {
779
+ this.emitScoped({
780
+ file: 'locus-info',
781
+ function: 'updateControls'
782
+ }, _constants.LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED, {
783
+ state: current.video
784
+ });
785
+ }
650
786
  if (hasRecordingChanged || hasRecordingPausedChanged) {
651
787
  var state = null;
652
788
  if (hasRecordingPausedChanged) {
@@ -691,6 +827,7 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
691
827
  }
692
828
  if (hasBreakoutChanged) {
693
829
  var breakout = current.breakout;
830
+ breakout.breakoutMoveId = _selfUtils.default.getReplacedBreakoutMoveId(self, this.webex.internal.device.url);
694
831
  this.emitScoped({
695
832
  file: 'locus-info',
696
833
  function: 'updateControls'
@@ -698,16 +835,41 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
698
835
  breakout: breakout
699
836
  });
700
837
  }
838
+ if (hasInterpretationChanged) {
839
+ var interpretation = current.interpretation;
840
+ this.emitScoped({
841
+ file: 'locus-info',
842
+ function: 'updateControls'
843
+ }, _constants.LOCUSINFO.EVENTS.CONTROLS_MEETING_INTERPRETATION_UPDATED, {
844
+ interpretation: interpretation
845
+ });
846
+ }
701
847
  if (hasEntryExitToneChanged) {
702
848
  var entryExitTone = current.entryExitTone;
849
+ this.updateMeeting({
850
+ entryExitTone: entryExitTone
851
+ });
703
852
  this.emitScoped({
704
853
  file: 'locus-info',
705
854
  function: 'updateControls'
706
855
  }, _constants.LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED, {
707
856
  entryExitTone: entryExitTone
708
857
  });
858
+ }
859
+
860
+ // videoEnabled is handled differently than other controls,
861
+ // to fit with audio mute status logic
862
+ if (hasVideoEnabledChanged) {
863
+ var videoEnabled = current.videoEnabled;
709
864
  this.updateMeeting({
710
- entryExitTone: entryExitTone
865
+ unmuteVideoAllowed: videoEnabled
866
+ });
867
+ this.emitScoped({
868
+ file: 'locus-info',
869
+ function: 'updateControls'
870
+ }, _constants.LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED, {
871
+ // muted: not part of locus.controls
872
+ unmuteAllowed: videoEnabled
711
873
  });
712
874
  }
713
875
  this.controls = controls;
@@ -840,18 +1002,11 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
840
1002
  }, {
841
1003
  key: "updateMeetingInfo",
842
1004
  value: function updateMeetingInfo(info, self) {
843
- if (info && !(0, _isEqual2.default)(this.info, info)) {
844
- var _this$parsedLocus$sel;
845
- var roles = self ? _selfUtils.default.getRoles(self) : ((_this$parsedLocus$sel = this.parsedLocus.self) === null || _this$parsedLocus$sel === void 0 ? void 0 : _this$parsedLocus$sel.roles) || [];
1005
+ var _this$parsedLocus$sel;
1006
+ var roles = self ? _selfUtils.default.getRoles(self) : ((_this$parsedLocus$sel = this.parsedLocus.self) === null || _this$parsedLocus$sel === void 0 ? void 0 : _this$parsedLocus$sel.roles) || [];
1007
+ if (info && !(0, _isEqual2.default)(this.info, info) || roles.length && !(0, _isEqual2.default)(this.roles, roles) && info) {
846
1008
  var isJoined = _selfUtils.default.isJoined(self || this.parsedLocus.self);
847
1009
  var parsedInfo = _infoUtils.default.getInfos(this.parsedLocus.info, info, roles, isJoined);
848
- this.emitScoped({
849
- file: 'locus-info',
850
- function: 'updateMeetingInfo'
851
- }, _constants.LOCUSINFO.EVENTS.MEETING_INFO_UPDATED, {
852
- info: parsedInfo.current,
853
- self: self
854
- });
855
1010
  if (parsedInfo.updates.isLocked) {
856
1011
  this.emitScoped({
857
1012
  file: 'locus-info',
@@ -868,7 +1023,12 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
868
1023
  this.parsedLocus.info = parsedInfo.current;
869
1024
  // Parses the info and adds necessary values
870
1025
  this.updateMeeting(parsedInfo.current);
1026
+ this.emitScoped({
1027
+ file: 'locus-info',
1028
+ function: 'updateMeetingInfo'
1029
+ }, _constants.LOCUSINFO.EVENTS.MEETING_INFO_UPDATED);
871
1030
  }
1031
+ this.roles = roles;
872
1032
  }
873
1033
 
874
1034
  /**
@@ -907,6 +1067,8 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
907
1067
  if (mediaShares && !(0, _isEqual2.default)(this.mediaShares, mediaShares)) {
908
1068
  var parsedMediaShares = _mediaSharesUtils.default.getMediaShares(this.mediaShares, mediaShares);
909
1069
  this.updateMeeting(parsedMediaShares.current);
1070
+ this.parsedLocus.mediaShares = parsedMediaShares.current;
1071
+ this.mediaShares = mediaShares;
910
1072
  this.emitScoped({
911
1073
  file: 'locus-info',
912
1074
  function: 'updateMediaShares'
@@ -914,8 +1076,6 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
914
1076
  current: parsedMediaShares.current,
915
1077
  previous: parsedMediaShares.previous
916
1078
  });
917
- this.parsedLocus.mediaShares = parsedMediaShares.current;
918
- this.mediaShares = mediaShares;
919
1079
  }
920
1080
  }
921
1081
 
@@ -994,6 +1154,15 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
994
1154
  breakoutSessions: parsedSelves.current.breakoutSessions
995
1155
  });
996
1156
  }
1157
+ if (parsedSelves.updates.interpretationChanged) {
1158
+ this.emitScoped({
1159
+ file: 'locus-info',
1160
+ function: 'updateSelf'
1161
+ }, _constants.LOCUSINFO.EVENTS.SELF_MEETING_INTERPRETATION_CHANGED, {
1162
+ interpretation: parsedSelves.current.interpretation,
1163
+ selfParticipantId: parsedSelves.current.selfId
1164
+ });
1165
+ }
997
1166
  if (parsedSelves.updates.isMediaInactiveOrReleased) {
998
1167
  this.emitScoped({
999
1168
  file: 'locus-info',
@@ -1008,6 +1177,26 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
1008
1177
  function: 'updateSelf'
1009
1178
  }, _constants.LOCUSINFO.EVENTS.SELF_MODERATOR_CHANGED, self);
1010
1179
  }
1180
+ if (parsedSelves.updates.isRolesChanged) {
1181
+ var _parsedSelves$previou, _parsedSelves$current;
1182
+ this.emitScoped({
1183
+ file: 'locus-info',
1184
+ function: 'updateSelf'
1185
+ }, _constants.LOCUSINFO.EVENTS.SELF_ROLES_CHANGED, {
1186
+ oldRoles: (_parsedSelves$previou = parsedSelves.previous) === null || _parsedSelves$previou === void 0 ? void 0 : _parsedSelves$previou.roles,
1187
+ newRoles: (_parsedSelves$current = parsedSelves.current) === null || _parsedSelves$current === void 0 ? void 0 : _parsedSelves$current.roles
1188
+ });
1189
+ }
1190
+ if (parsedSelves.updates.isVideoMutedByOthersChanged) {
1191
+ this.emitScoped({
1192
+ file: 'locus-info',
1193
+ function: 'updateSelf'
1194
+ }, _constants.LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED, {
1195
+ muted: parsedSelves.current.remoteVideoMuted
1196
+ // unmuteAllowed: not part of .self
1197
+ });
1198
+ }
1199
+
1011
1200
  if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {
1012
1201
  this.emitScoped({
1013
1202
  file: 'locus-info',
@@ -1053,14 +1242,14 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
1053
1242
  _constants.LOCUSINFO.EVENTS.MEDIA_INACTIVITY, _selfUtils.default.getMediaStatus(self.mediaSessions));
1054
1243
  }
1055
1244
  if (parsedSelves.updates.audioStateChange || parsedSelves.updates.videoStateChange || parsedSelves.updates.shareStateChange) {
1056
- var _parsedSelves$current, _parsedSelves$current2, _parsedSelves$current3;
1245
+ var _parsedSelves$current2, _parsedSelves$current3, _parsedSelves$current4;
1057
1246
  this.emitScoped({
1058
1247
  file: 'locus-info',
1059
1248
  function: 'updateSelf'
1060
1249
  }, _constants.LOCUSINFO.EVENTS.MEDIA_STATUS_CHANGE, {
1061
- audioStatus: (_parsedSelves$current = parsedSelves.current.currentMediaStatus) === null || _parsedSelves$current === void 0 ? void 0 : _parsedSelves$current.audio,
1062
- videoStatus: (_parsedSelves$current2 = parsedSelves.current.currentMediaStatus) === null || _parsedSelves$current2 === void 0 ? void 0 : _parsedSelves$current2.video,
1063
- shareStatus: (_parsedSelves$current3 = parsedSelves.current.currentMediaStatus) === null || _parsedSelves$current3 === void 0 ? void 0 : _parsedSelves$current3.share
1250
+ audioStatus: (_parsedSelves$current2 = parsedSelves.current.currentMediaStatus) === null || _parsedSelves$current2 === void 0 ? void 0 : _parsedSelves$current2.audio,
1251
+ videoStatus: (_parsedSelves$current3 = parsedSelves.current.currentMediaStatus) === null || _parsedSelves$current3 === void 0 ? void 0 : _parsedSelves$current3.video,
1252
+ shareStatus: (_parsedSelves$current4 = parsedSelves.current.currentMediaStatus) === null || _parsedSelves$current4 === void 0 ? void 0 : _parsedSelves$current4.share
1064
1253
  });
1065
1254
  }
1066
1255
  if (parsedSelves.updates.isUserObserving) {
@@ -1185,6 +1374,112 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
1185
1374
  this.identities = identities;
1186
1375
  }
1187
1376
  }
1377
+
1378
+ /**
1379
+ * check the locus is main session's one or not, if is main session's, update main session cache
1380
+ * @param {Object} locus
1381
+ * @returns {undefined}
1382
+ * @memberof LocusInfo
1383
+ */
1384
+ }, {
1385
+ key: "updateLocusCache",
1386
+ value: function updateLocusCache(locus) {
1387
+ var isMainSessionDTO = _controlsUtils.default.isMainSessionDTO(locus);
1388
+ if (isMainSessionDTO) {
1389
+ this.updateMainSessionLocusCache(locus);
1390
+ }
1391
+ }
1392
+
1393
+ /**
1394
+ * if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)
1395
+ * if join breakout from main session, need to query main locus url (if response with 403 means no privilege, need to clear the cache)
1396
+ * @param {Object} newLocus
1397
+ * @returns {Object}
1398
+ * @memberof LocusInfo
1399
+ */
1400
+ }, {
1401
+ key: "getTheLocusToUpdate",
1402
+ value: function getTheLocusToUpdate(newLocus) {
1403
+ var switchStatus = _controlsUtils.default.getSessionSwitchStatus(this.controls, newLocus === null || newLocus === void 0 ? void 0 : newLocus.controls);
1404
+ if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {
1405
+ return (0, _cloneDeep2.default)(this.mainSessionLocusCache);
1406
+ }
1407
+ if (switchStatus.isJoinToBreakout) {
1408
+ this.emitScoped({
1409
+ file: 'locus-info',
1410
+ function: 'updateControls'
1411
+ }, _constants.LOCUSINFO.EVENTS.CONTROLS_JOIN_BREAKOUT_FROM_MAIN, {
1412
+ mainLocusUrl: this.url
1413
+ });
1414
+ }
1415
+ return newLocus;
1416
+ }
1417
+
1418
+ /**
1419
+ * merge participants by participant id
1420
+ * @param {Array} participants
1421
+ * @param {Array} sourceParticipants
1422
+ * @returns {Array} merged participants
1423
+ * @memberof LocusInfo
1424
+ */
1425
+ // eslint-disable-next-line class-methods-use-this
1426
+ }, {
1427
+ key: "mergeParticipants",
1428
+ value: function mergeParticipants(participants, sourceParticipants) {
1429
+ if (!sourceParticipants || !sourceParticipants.length) return participants;
1430
+ if (!participants || !participants.length) {
1431
+ return sourceParticipants;
1432
+ }
1433
+ sourceParticipants.forEach(function (participant) {
1434
+ var existIndex = participants.findIndex(function (p) {
1435
+ return p.id === participant.id;
1436
+ });
1437
+ if (existIndex > -1) {
1438
+ participants.splice(existIndex, 1, participant);
1439
+ } else {
1440
+ participants.push(participant);
1441
+ }
1442
+ });
1443
+ return participants;
1444
+ }
1445
+
1446
+ /**
1447
+ * need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout
1448
+ * @param {Object} mainLocus
1449
+ * @returns {undefined}
1450
+ * @memberof LocusInfo
1451
+ */
1452
+ }, {
1453
+ key: "updateMainSessionLocusCache",
1454
+ value: function updateMainSessionLocusCache(mainLocus) {
1455
+ var _this5 = this;
1456
+ if (!mainLocus) {
1457
+ return;
1458
+ }
1459
+ var locusClone = (0, _cloneDeep2.default)(mainLocus);
1460
+ if (this.mainSessionLocusCache) {
1461
+ // shallow merge and do special merge for participants
1462
+ (0, _assignWith2.default)(this.mainSessionLocusCache, locusClone, function (objValue, srcValue, key) {
1463
+ if (key === 'participants') {
1464
+ return _this5.mergeParticipants(objValue, srcValue);
1465
+ }
1466
+ return srcValue || objValue;
1467
+ });
1468
+ } else {
1469
+ this.mainSessionLocusCache = locusClone;
1470
+ }
1471
+ }
1472
+
1473
+ /**
1474
+ * clear main session cache
1475
+ * @returns {undefined}
1476
+ * @memberof LocusInfo
1477
+ */
1478
+ }, {
1479
+ key: "clearMainSessionLocusCache",
1480
+ value: function clearMainSessionLocusCache() {
1481
+ this.mainSessionLocusCache = null;
1482
+ }
1188
1483
  }]);
1189
1484
  return LocusInfo;
1190
1485
  }(_eventsScope.default);