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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/README.md +45 -7
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +114 -14
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +841 -19
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/request.js +78 -0
  17. package/dist/breakouts/request.js.map +1 -0
  18. package/dist/breakouts/utils.js +67 -0
  19. package/dist/breakouts/utils.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +3 -2
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/queue.js +24 -9
  25. package/dist/common/queue.js.map +1 -1
  26. package/dist/config.js +3 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +172 -30
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/constants.js +14 -0
  31. package/dist/controls-options-manager/constants.js.map +1 -0
  32. package/dist/controls-options-manager/enums.js +27 -0
  33. package/dist/controls-options-manager/enums.js.map +1 -0
  34. package/dist/controls-options-manager/index.js +297 -0
  35. package/dist/controls-options-manager/index.js.map +1 -0
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +319 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +107 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +366 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +91 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +355 -57
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/mediaSharesUtils.js +43 -1
  53. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  54. package/dist/locus-info/parser.js +219 -63
  55. package/dist/locus-info/parser.js.map +1 -1
  56. package/dist/locus-info/selfUtils.js +89 -14
  57. package/dist/locus-info/selfUtils.js.map +1 -1
  58. package/dist/media/index.js +48 -135
  59. package/dist/media/index.js.map +1 -1
  60. package/dist/media/properties.js +29 -90
  61. package/dist/media/properties.js.map +1 -1
  62. package/dist/mediaQualityMetrics/config.js +505 -493
  63. package/dist/mediaQualityMetrics/config.js.map +1 -1
  64. package/dist/meeting/in-meeting-actions.js +80 -2
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +2692 -2544
  67. package/dist/meeting/index.js.map +1 -1
  68. package/dist/meeting/locusMediaRequest.js +291 -0
  69. package/dist/meeting/locusMediaRequest.js.map +1 -0
  70. package/dist/meeting/muteState.js +229 -124
  71. package/dist/meeting/muteState.js.map +1 -1
  72. package/dist/meeting/request.js +196 -190
  73. package/dist/meeting/request.js.map +1 -1
  74. package/dist/meeting/util.js +529 -414
  75. package/dist/meeting/util.js.map +1 -1
  76. package/dist/meeting-info/index.js +48 -7
  77. package/dist/meeting-info/index.js.map +1 -1
  78. package/dist/meeting-info/meeting-info-v2.js +171 -51
  79. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  80. package/dist/meeting-info/utilv2.js +20 -5
  81. package/dist/meeting-info/utilv2.js.map +1 -1
  82. package/dist/meetings/collection.js +22 -0
  83. package/dist/meetings/collection.js.map +1 -1
  84. package/dist/meetings/index.js +357 -66
  85. package/dist/meetings/index.js.map +1 -1
  86. package/dist/meetings/meetings.types.js +7 -0
  87. package/dist/meetings/meetings.types.js.map +1 -0
  88. package/dist/meetings/request.js +2 -0
  89. package/dist/meetings/request.js.map +1 -1
  90. package/dist/meetings/util.js +88 -1
  91. package/dist/meetings/util.js.map +1 -1
  92. package/dist/member/index.js +49 -0
  93. package/dist/member/index.js.map +1 -1
  94. package/dist/member/types.js +25 -0
  95. package/dist/member/types.js.map +1 -0
  96. package/dist/member/util.js +121 -25
  97. package/dist/member/util.js.map +1 -1
  98. package/dist/members/collection.js +10 -0
  99. package/dist/members/collection.js.map +1 -1
  100. package/dist/members/index.js +86 -5
  101. package/dist/members/index.js.map +1 -1
  102. package/dist/members/request.js +106 -38
  103. package/dist/members/request.js.map +1 -1
  104. package/dist/members/types.js +15 -0
  105. package/dist/members/types.js.map +1 -0
  106. package/dist/members/util.js +316 -233
  107. package/dist/members/util.js.map +1 -1
  108. package/dist/metrics/constants.js +3 -5
  109. package/dist/metrics/constants.js.map +1 -1
  110. package/dist/metrics/index.js +1 -468
  111. package/dist/metrics/index.js.map +1 -1
  112. package/dist/multistream/mediaRequestManager.js +238 -49
  113. package/dist/multistream/mediaRequestManager.js.map +1 -1
  114. package/dist/multistream/receiveSlot.js +49 -16
  115. package/dist/multistream/receiveSlot.js.map +1 -1
  116. package/dist/multistream/receiveSlotManager.js +52 -34
  117. package/dist/multistream/receiveSlotManager.js.map +1 -1
  118. package/dist/multistream/remoteMedia.js +44 -18
  119. package/dist/multistream/remoteMedia.js.map +1 -1
  120. package/dist/multistream/remoteMediaGroup.js +60 -3
  121. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  122. package/dist/multistream/remoteMediaManager.js +173 -59
  123. package/dist/multistream/remoteMediaManager.js.map +1 -1
  124. package/dist/networkQualityMonitor/index.js +4 -2
  125. package/dist/networkQualityMonitor/index.js.map +1 -1
  126. package/dist/reachability/index.js +72 -27
  127. package/dist/reachability/index.js.map +1 -1
  128. package/dist/reachability/request.js +12 -5
  129. package/dist/reachability/request.js.map +1 -1
  130. package/dist/reactions/reactions.js +2 -2
  131. package/dist/reactions/reactions.js.map +1 -1
  132. package/dist/reactions/reactions.type.js +18 -18
  133. package/dist/reactions/reactions.type.js.map +1 -1
  134. package/dist/reconnection-manager/index.js +196 -155
  135. package/dist/reconnection-manager/index.js.map +1 -1
  136. package/dist/recording-controller/index.js +21 -1
  137. package/dist/recording-controller/index.js.map +1 -1
  138. package/dist/recording-controller/util.js +9 -8
  139. package/dist/recording-controller/util.js.map +1 -1
  140. package/dist/roap/index.js +21 -29
  141. package/dist/roap/index.js.map +1 -1
  142. package/dist/roap/request.js +110 -89
  143. package/dist/roap/request.js.map +1 -1
  144. package/dist/roap/turnDiscovery.js +93 -36
  145. package/dist/roap/turnDiscovery.js.map +1 -1
  146. package/dist/rtcMetrics/constants.js +12 -0
  147. package/dist/rtcMetrics/constants.js.map +1 -0
  148. package/dist/rtcMetrics/index.js +115 -0
  149. package/dist/rtcMetrics/index.js.map +1 -0
  150. package/dist/statsAnalyzer/global.js +1 -93
  151. package/dist/statsAnalyzer/global.js.map +1 -1
  152. package/dist/statsAnalyzer/index.js +326 -311
  153. package/dist/statsAnalyzer/index.js.map +1 -1
  154. package/dist/statsAnalyzer/mqaUtil.js +90 -53
  155. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  156. package/dist/types/annotation/annotation.types.d.ts +42 -0
  157. package/dist/types/annotation/constants.d.ts +31 -0
  158. package/dist/types/annotation/index.d.ts +117 -0
  159. package/dist/types/breakouts/breakout.d.ts +8 -0
  160. package/dist/types/breakouts/collection.d.ts +5 -0
  161. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  162. package/dist/types/breakouts/events.d.ts +8 -0
  163. package/dist/types/breakouts/index.d.ts +5 -0
  164. package/dist/types/breakouts/request.d.ts +22 -0
  165. package/dist/types/breakouts/utils.d.ts +15 -0
  166. package/dist/types/common/browser-detection.d.ts +9 -0
  167. package/dist/types/common/collection.d.ts +48 -0
  168. package/dist/types/common/config.d.ts +2 -0
  169. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  170. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  171. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  172. package/dist/types/common/errors/media.d.ts +15 -0
  173. package/dist/types/common/errors/parameter.d.ts +15 -0
  174. package/dist/types/common/errors/password-error.d.ts +15 -0
  175. package/dist/types/common/errors/permission.d.ts +14 -0
  176. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  177. package/dist/types/common/errors/reconnection.d.ts +15 -0
  178. package/dist/types/common/errors/stats.d.ts +15 -0
  179. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  180. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  181. package/dist/types/common/events/events-scope.d.ts +17 -0
  182. package/dist/types/common/events/events.d.ts +12 -0
  183. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  184. package/dist/types/common/events/util.d.ts +2 -0
  185. package/dist/types/common/logs/logger-config.d.ts +2 -0
  186. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  187. package/dist/types/common/logs/request.d.ts +34 -0
  188. package/dist/types/common/queue.d.ts +34 -0
  189. package/dist/types/config.d.ts +72 -0
  190. package/dist/types/constants.d.ts +1016 -0
  191. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  192. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  193. package/dist/types/controls-options-manager/index.d.ts +136 -0
  194. package/dist/types/controls-options-manager/types.d.ts +43 -0
  195. package/dist/types/controls-options-manager/util.d.ts +1 -0
  196. package/dist/types/index.d.ts +7 -0
  197. package/dist/types/interpretation/collection.d.ts +5 -0
  198. package/dist/types/interpretation/index.d.ts +5 -0
  199. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  200. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  201. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  202. package/dist/types/locus-info/fullState.d.ts +2 -0
  203. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  204. package/dist/types/locus-info/index.d.ts +322 -0
  205. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  206. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  207. package/dist/types/locus-info/parser.d.ts +271 -0
  208. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  209. package/dist/types/media/index.d.ts +34 -0
  210. package/dist/types/media/properties.d.ts +93 -0
  211. package/dist/types/media/util.d.ts +2 -0
  212. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  213. package/dist/types/meeting/in-meeting-actions.d.ts +153 -0
  214. package/dist/types/meeting/index.d.ts +1471 -0
  215. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  216. package/dist/types/meeting/muteState.d.ts +184 -0
  217. package/dist/types/meeting/request.d.ts +257 -0
  218. package/dist/types/meeting/request.type.d.ts +11 -0
  219. package/dist/types/meeting/state.d.ts +9 -0
  220. package/dist/types/meeting/util.d.ts +78 -0
  221. package/dist/types/meeting-info/collection.d.ts +20 -0
  222. package/dist/types/meeting-info/index.d.ts +62 -0
  223. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  224. package/dist/types/meeting-info/request.d.ts +22 -0
  225. package/dist/types/meeting-info/util.d.ts +2 -0
  226. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  227. package/dist/types/meetings/collection.d.ts +31 -0
  228. package/dist/types/meetings/index.d.ts +367 -0
  229. package/dist/types/meetings/meetings.types.d.ts +4 -0
  230. package/dist/types/meetings/request.d.ts +27 -0
  231. package/dist/types/meetings/util.d.ts +18 -0
  232. package/dist/types/member/index.d.ts +159 -0
  233. package/dist/types/member/types.d.ts +32 -0
  234. package/dist/types/member/util.d.ts +2 -0
  235. package/dist/types/members/collection.d.ts +29 -0
  236. package/dist/types/members/index.d.ts +353 -0
  237. package/dist/types/members/request.d.ts +114 -0
  238. package/dist/types/members/types.d.ts +24 -0
  239. package/dist/types/members/util.d.ts +210 -0
  240. package/dist/types/metrics/constants.d.ts +55 -0
  241. package/dist/types/metrics/index.d.ts +45 -0
  242. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  243. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  244. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  245. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  246. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  247. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  248. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  249. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  250. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  251. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  252. package/dist/types/reachability/index.d.ts +152 -0
  253. package/dist/types/reachability/request.d.ts +37 -0
  254. package/dist/types/reactions/constants.d.ts +3 -0
  255. package/dist/types/reactions/reactions.d.ts +4 -0
  256. package/dist/types/reactions/reactions.type.d.ts +52 -0
  257. package/dist/types/reconnection-manager/index.d.ts +126 -0
  258. package/dist/types/recording-controller/enums.d.ts +7 -0
  259. package/dist/types/recording-controller/index.d.ts +208 -0
  260. package/dist/types/recording-controller/util.d.ts +14 -0
  261. package/dist/types/roap/index.d.ts +77 -0
  262. package/dist/types/roap/request.d.ts +36 -0
  263. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  264. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  265. package/dist/types/rtcMetrics/index.d.ts +46 -0
  266. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  267. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  268. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  269. package/dist/types/transcription/index.d.ts +64 -0
  270. package/package.json +25 -22
  271. package/src/annotation/annotation.types.ts +50 -0
  272. package/src/annotation/constants.ts +36 -0
  273. package/src/annotation/index.ts +328 -0
  274. package/src/breakouts/README.md +44 -14
  275. package/src/breakouts/breakout.ts +87 -9
  276. package/src/breakouts/edit-lock-error.ts +25 -0
  277. package/src/breakouts/events.ts +56 -0
  278. package/src/breakouts/index.ts +710 -10
  279. package/src/breakouts/request.ts +55 -0
  280. package/src/breakouts/utils.ts +57 -0
  281. package/src/common/errors/webex-errors.ts +6 -2
  282. package/src/common/logs/logger-proxy.ts +1 -1
  283. package/src/common/queue.ts +22 -8
  284. package/src/config.ts +2 -7
  285. package/src/constants.ts +157 -21
  286. package/src/controls-options-manager/constants.ts +5 -0
  287. package/src/controls-options-manager/enums.ts +18 -0
  288. package/src/controls-options-manager/index.ts +278 -0
  289. package/src/controls-options-manager/types.ts +59 -0
  290. package/src/controls-options-manager/util.ts +300 -0
  291. package/src/index.ts +39 -0
  292. package/src/interpretation/README.md +60 -0
  293. package/src/interpretation/collection.ts +19 -0
  294. package/src/interpretation/index.ts +332 -0
  295. package/src/interpretation/siLanguage.ts +18 -0
  296. package/src/locus-info/controlsUtils.ts +108 -0
  297. package/src/locus-info/index.ts +375 -52
  298. package/src/locus-info/mediaSharesUtils.ts +48 -0
  299. package/src/locus-info/parser.ts +224 -39
  300. package/src/locus-info/selfUtils.ts +81 -5
  301. package/src/media/index.ts +87 -140
  302. package/src/media/properties.ts +49 -90
  303. package/src/mediaQualityMetrics/config.ts +379 -377
  304. package/src/meeting/in-meeting-actions.ts +159 -3
  305. package/src/meeting/index.ts +1980 -2030
  306. package/src/meeting/locusMediaRequest.ts +309 -0
  307. package/src/meeting/muteState.ts +228 -132
  308. package/src/meeting/request.ts +102 -112
  309. package/src/meeting/util.ts +509 -397
  310. package/src/meeting-info/index.ts +54 -8
  311. package/src/meeting-info/meeting-info-v2.ts +148 -14
  312. package/src/meeting-info/utilv2.ts +13 -3
  313. package/src/meetings/collection.ts +20 -0
  314. package/src/meetings/index.ts +392 -84
  315. package/src/meetings/meetings.types.ts +12 -0
  316. package/src/meetings/request.ts +2 -0
  317. package/src/meetings/util.ts +103 -4
  318. package/src/member/index.ts +49 -0
  319. package/src/member/types.ts +38 -0
  320. package/src/member/util.ts +127 -25
  321. package/src/members/collection.ts +8 -0
  322. package/src/members/index.ts +107 -6
  323. package/src/members/request.ts +97 -17
  324. package/src/members/types.ts +28 -0
  325. package/src/members/util.ts +319 -240
  326. package/src/metrics/constants.ts +2 -4
  327. package/src/metrics/index.ts +1 -490
  328. package/src/multistream/mediaRequestManager.ts +289 -79
  329. package/src/multistream/receiveSlot.ts +55 -18
  330. package/src/multistream/receiveSlotManager.ts +46 -24
  331. package/src/multistream/remoteMedia.ts +27 -2
  332. package/src/multistream/remoteMediaGroup.ts +59 -0
  333. package/src/multistream/remoteMediaManager.ts +113 -32
  334. package/src/networkQualityMonitor/index.ts +6 -6
  335. package/src/reachability/index.ts +62 -15
  336. package/src/reachability/request.ts +10 -5
  337. package/src/reactions/reactions.ts +4 -4
  338. package/src/reactions/reactions.type.ts +3 -3
  339. package/src/reconnection-manager/index.ts +68 -43
  340. package/src/recording-controller/index.ts +20 -2
  341. package/src/recording-controller/util.ts +26 -9
  342. package/src/roap/index.ts +21 -30
  343. package/src/roap/request.ts +101 -95
  344. package/src/roap/turnDiscovery.ts +47 -25
  345. package/src/rtcMetrics/constants.ts +3 -0
  346. package/src/rtcMetrics/index.ts +96 -0
  347. package/src/statsAnalyzer/global.ts +1 -94
  348. package/src/statsAnalyzer/index.ts +376 -386
  349. package/src/statsAnalyzer/mqaUtil.ts +100 -99
  350. package/test/integration/spec/converged-space-meetings.js +233 -0
  351. package/test/integration/spec/journey.js +336 -259
  352. package/test/integration/spec/space-meeting.js +77 -4
  353. package/test/unit/spec/annotation/index.ts +418 -0
  354. package/test/unit/spec/breakouts/breakout.ts +142 -24
  355. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  356. package/test/unit/spec/breakouts/events.ts +89 -0
  357. package/test/unit/spec/breakouts/index.ts +1545 -48
  358. package/test/unit/spec/breakouts/request.ts +104 -0
  359. package/test/unit/spec/breakouts/utils.js +72 -0
  360. package/test/unit/spec/common/queue.js +31 -2
  361. package/test/unit/spec/controls-options-manager/index.js +287 -0
  362. package/test/unit/spec/controls-options-manager/util.js +582 -0
  363. package/test/unit/spec/fixture/locus.js +1 -0
  364. package/test/unit/spec/interpretation/collection.ts +15 -0
  365. package/test/unit/spec/interpretation/index.ts +589 -0
  366. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  367. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  368. package/test/unit/spec/locus-info/index.js +1094 -38
  369. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  370. package/test/unit/spec/locus-info/parser.js +62 -22
  371. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  372. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  373. package/test/unit/spec/media/index.ts +138 -28
  374. package/test/unit/spec/meeting/in-meeting-actions.ts +79 -3
  375. package/test/unit/spec/meeting/index.js +3092 -1571
  376. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  377. package/test/unit/spec/meeting/muteState.js +370 -208
  378. package/test/unit/spec/meeting/request.js +338 -43
  379. package/test/unit/spec/meeting/utils.js +449 -53
  380. package/test/unit/spec/meeting-info/index.js +181 -0
  381. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  382. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  383. package/test/unit/spec/meetings/collection.js +14 -0
  384. package/test/unit/spec/meetings/index.js +866 -124
  385. package/test/unit/spec/meetings/utils.js +206 -2
  386. package/test/unit/spec/member/index.js +58 -4
  387. package/test/unit/spec/member/util.js +479 -35
  388. package/test/unit/spec/members/index.js +319 -1
  389. package/test/unit/spec/members/request.js +206 -27
  390. package/test/unit/spec/members/utils.js +184 -0
  391. package/test/unit/spec/metrics/index.js +1 -50
  392. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  393. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  394. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  395. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  396. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  397. package/test/unit/spec/multistream/remoteMediaManager.ts +318 -0
  398. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  399. package/test/unit/spec/reachability/index.ts +125 -8
  400. package/test/unit/spec/reachability/request.js +66 -0
  401. package/test/unit/spec/reconnection-manager/index.js +59 -6
  402. package/test/unit/spec/recording-controller/index.js +294 -218
  403. package/test/unit/spec/recording-controller/util.js +223 -96
  404. package/test/unit/spec/roap/index.ts +26 -51
  405. package/test/unit/spec/roap/request.ts +196 -85
  406. package/test/unit/spec/roap/turnDiscovery.ts +30 -7
  407. package/test/unit/spec/rtcMetrics/index.ts +60 -0
  408. package/test/unit/spec/stats-analyzer/index.js +92 -41
  409. package/test/utils/constants.js +9 -0
  410. package/test/utils/integrationTestUtils.js +46 -0
  411. package/test/utils/testUtils.js +0 -45
  412. package/test/utils/webex-config.js +4 -0
  413. package/test/utils/webex-test-users.js +6 -3
  414. package/dist/meeting/effectsState.js +0 -262
  415. package/dist/meeting/effectsState.js.map +0 -1
  416. package/dist/metrics/config.js +0 -299
  417. package/dist/metrics/config.js.map +0 -1
  418. package/dist/multistream/multistreamMedia.js +0 -110
  419. package/dist/multistream/multistreamMedia.js.map +0 -1
  420. package/src/index.js +0 -15
  421. package/src/meeting/effectsState.ts +0 -211
  422. package/src/metrics/config.ts +0 -495
  423. package/src/multistream/multistreamMedia.ts +0 -97
  424. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -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 {boolean} updateMeeting true if the meeting should be updated
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,9 +1002,9 @@ 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
1010
  this.emitScoped({
@@ -869,6 +1031,7 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
869
1031
  // Parses the info and adds necessary values
870
1032
  this.updateMeeting(parsedInfo.current);
871
1033
  }
1034
+ this.roles = roles;
872
1035
  }
873
1036
 
874
1037
  /**
@@ -907,6 +1070,8 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
907
1070
  if (mediaShares && !(0, _isEqual2.default)(this.mediaShares, mediaShares)) {
908
1071
  var parsedMediaShares = _mediaSharesUtils.default.getMediaShares(this.mediaShares, mediaShares);
909
1072
  this.updateMeeting(parsedMediaShares.current);
1073
+ this.parsedLocus.mediaShares = parsedMediaShares.current;
1074
+ this.mediaShares = mediaShares;
910
1075
  this.emitScoped({
911
1076
  file: 'locus-info',
912
1077
  function: 'updateMediaShares'
@@ -914,8 +1079,6 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
914
1079
  current: parsedMediaShares.current,
915
1080
  previous: parsedMediaShares.previous
916
1081
  });
917
- this.parsedLocus.mediaShares = parsedMediaShares.current;
918
- this.mediaShares = mediaShares;
919
1082
  }
920
1083
  }
921
1084
 
@@ -994,6 +1157,15 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
994
1157
  breakoutSessions: parsedSelves.current.breakoutSessions
995
1158
  });
996
1159
  }
1160
+ if (parsedSelves.updates.interpretationChanged) {
1161
+ this.emitScoped({
1162
+ file: 'locus-info',
1163
+ function: 'updateSelf'
1164
+ }, _constants.LOCUSINFO.EVENTS.SELF_MEETING_INTERPRETATION_CHANGED, {
1165
+ interpretation: parsedSelves.current.interpretation,
1166
+ selfParticipantId: parsedSelves.current.selfId
1167
+ });
1168
+ }
997
1169
  if (parsedSelves.updates.isMediaInactiveOrReleased) {
998
1170
  this.emitScoped({
999
1171
  file: 'locus-info',
@@ -1008,6 +1180,26 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
1008
1180
  function: 'updateSelf'
1009
1181
  }, _constants.LOCUSINFO.EVENTS.SELF_MODERATOR_CHANGED, self);
1010
1182
  }
1183
+ if (parsedSelves.updates.isRolesChanged) {
1184
+ var _parsedSelves$previou, _parsedSelves$current;
1185
+ this.emitScoped({
1186
+ file: 'locus-info',
1187
+ function: 'updateSelf'
1188
+ }, _constants.LOCUSINFO.EVENTS.SELF_ROLES_CHANGED, {
1189
+ oldRoles: (_parsedSelves$previou = parsedSelves.previous) === null || _parsedSelves$previou === void 0 ? void 0 : _parsedSelves$previou.roles,
1190
+ newRoles: (_parsedSelves$current = parsedSelves.current) === null || _parsedSelves$current === void 0 ? void 0 : _parsedSelves$current.roles
1191
+ });
1192
+ }
1193
+ if (parsedSelves.updates.isVideoMutedByOthersChanged) {
1194
+ this.emitScoped({
1195
+ file: 'locus-info',
1196
+ function: 'updateSelf'
1197
+ }, _constants.LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED, {
1198
+ muted: parsedSelves.current.remoteVideoMuted
1199
+ // unmuteAllowed: not part of .self
1200
+ });
1201
+ }
1202
+
1011
1203
  if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {
1012
1204
  this.emitScoped({
1013
1205
  file: 'locus-info',
@@ -1053,14 +1245,14 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
1053
1245
  _constants.LOCUSINFO.EVENTS.MEDIA_INACTIVITY, _selfUtils.default.getMediaStatus(self.mediaSessions));
1054
1246
  }
1055
1247
  if (parsedSelves.updates.audioStateChange || parsedSelves.updates.videoStateChange || parsedSelves.updates.shareStateChange) {
1056
- var _parsedSelves$current, _parsedSelves$current2, _parsedSelves$current3;
1248
+ var _parsedSelves$current2, _parsedSelves$current3, _parsedSelves$current4;
1057
1249
  this.emitScoped({
1058
1250
  file: 'locus-info',
1059
1251
  function: 'updateSelf'
1060
1252
  }, _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
1253
+ audioStatus: (_parsedSelves$current2 = parsedSelves.current.currentMediaStatus) === null || _parsedSelves$current2 === void 0 ? void 0 : _parsedSelves$current2.audio,
1254
+ videoStatus: (_parsedSelves$current3 = parsedSelves.current.currentMediaStatus) === null || _parsedSelves$current3 === void 0 ? void 0 : _parsedSelves$current3.video,
1255
+ shareStatus: (_parsedSelves$current4 = parsedSelves.current.currentMediaStatus) === null || _parsedSelves$current4 === void 0 ? void 0 : _parsedSelves$current4.share
1064
1256
  });
1065
1257
  }
1066
1258
  if (parsedSelves.updates.isUserObserving) {
@@ -1185,6 +1377,112 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
1185
1377
  this.identities = identities;
1186
1378
  }
1187
1379
  }
1380
+
1381
+ /**
1382
+ * check the locus is main session's one or not, if is main session's, update main session cache
1383
+ * @param {Object} locus
1384
+ * @returns {undefined}
1385
+ * @memberof LocusInfo
1386
+ */
1387
+ }, {
1388
+ key: "updateLocusCache",
1389
+ value: function updateLocusCache(locus) {
1390
+ var isMainSessionDTO = _controlsUtils.default.isMainSessionDTO(locus);
1391
+ if (isMainSessionDTO) {
1392
+ this.updateMainSessionLocusCache(locus);
1393
+ }
1394
+ }
1395
+
1396
+ /**
1397
+ * if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)
1398
+ * if join breakout from main session, need to query main locus url (if response with 403 means no privilege, need to clear the cache)
1399
+ * @param {Object} newLocus
1400
+ * @returns {Object}
1401
+ * @memberof LocusInfo
1402
+ */
1403
+ }, {
1404
+ key: "getTheLocusToUpdate",
1405
+ value: function getTheLocusToUpdate(newLocus) {
1406
+ var switchStatus = _controlsUtils.default.getSessionSwitchStatus(this.controls, newLocus === null || newLocus === void 0 ? void 0 : newLocus.controls);
1407
+ if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {
1408
+ return (0, _cloneDeep2.default)(this.mainSessionLocusCache);
1409
+ }
1410
+ if (switchStatus.isJoinToBreakout) {
1411
+ this.emitScoped({
1412
+ file: 'locus-info',
1413
+ function: 'updateControls'
1414
+ }, _constants.LOCUSINFO.EVENTS.CONTROLS_JOIN_BREAKOUT_FROM_MAIN, {
1415
+ mainLocusUrl: this.url
1416
+ });
1417
+ }
1418
+ return newLocus;
1419
+ }
1420
+
1421
+ /**
1422
+ * merge participants by participant id
1423
+ * @param {Array} participants
1424
+ * @param {Array} sourceParticipants
1425
+ * @returns {Array} merged participants
1426
+ * @memberof LocusInfo
1427
+ */
1428
+ // eslint-disable-next-line class-methods-use-this
1429
+ }, {
1430
+ key: "mergeParticipants",
1431
+ value: function mergeParticipants(participants, sourceParticipants) {
1432
+ if (!sourceParticipants || !sourceParticipants.length) return participants;
1433
+ if (!participants || !participants.length) {
1434
+ return sourceParticipants;
1435
+ }
1436
+ sourceParticipants.forEach(function (participant) {
1437
+ var existIndex = participants.findIndex(function (p) {
1438
+ return p.id === participant.id;
1439
+ });
1440
+ if (existIndex > -1) {
1441
+ participants.splice(existIndex, 1, participant);
1442
+ } else {
1443
+ participants.push(participant);
1444
+ }
1445
+ });
1446
+ return participants;
1447
+ }
1448
+
1449
+ /**
1450
+ * need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout
1451
+ * @param {Object} mainLocus
1452
+ * @returns {undefined}
1453
+ * @memberof LocusInfo
1454
+ */
1455
+ }, {
1456
+ key: "updateMainSessionLocusCache",
1457
+ value: function updateMainSessionLocusCache(mainLocus) {
1458
+ var _this5 = this;
1459
+ if (!mainLocus) {
1460
+ return;
1461
+ }
1462
+ var locusClone = (0, _cloneDeep2.default)(mainLocus);
1463
+ if (this.mainSessionLocusCache) {
1464
+ // shallow merge and do special merge for participants
1465
+ (0, _assignWith2.default)(this.mainSessionLocusCache, locusClone, function (objValue, srcValue, key) {
1466
+ if (key === 'participants') {
1467
+ return _this5.mergeParticipants(objValue, srcValue);
1468
+ }
1469
+ return srcValue || objValue;
1470
+ });
1471
+ } else {
1472
+ this.mainSessionLocusCache = locusClone;
1473
+ }
1474
+ }
1475
+
1476
+ /**
1477
+ * clear main session cache
1478
+ * @returns {undefined}
1479
+ * @memberof LocusInfo
1480
+ */
1481
+ }, {
1482
+ key: "clearMainSessionLocusCache",
1483
+ value: function clearMainSessionLocusCache() {
1484
+ this.mainSessionLocusCache = null;
1485
+ }
1188
1486
  }]);
1189
1487
  return LocusInfo;
1190
1488
  }(_eventsScope.default);