@webex/plugin-meetings 3.0.0-beta.9 → 3.0.0-beta.90

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 (507) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.js +48 -0
  6. package/dist/annotation/constants.js.map +1 -0
  7. package/dist/annotation/index.js +325 -0
  8. package/dist/annotation/index.js.map +1 -0
  9. package/dist/breakouts/breakout.js +180 -0
  10. package/dist/breakouts/breakout.js.map +1 -0
  11. package/dist/breakouts/collection.js +23 -0
  12. package/dist/breakouts/collection.js.map +1 -0
  13. package/dist/breakouts/edit-lock-error.js +52 -0
  14. package/dist/breakouts/edit-lock-error.js.map +1 -0
  15. package/dist/breakouts/index.js +868 -0
  16. package/dist/breakouts/index.js.map +1 -0
  17. package/dist/breakouts/request.js +78 -0
  18. package/dist/breakouts/request.js.map +1 -0
  19. package/dist/breakouts/utils.js +67 -0
  20. package/dist/breakouts/utils.js.map +1 -0
  21. package/dist/common/browser-detection.js +1 -20
  22. package/dist/common/browser-detection.js.map +1 -1
  23. package/dist/common/collection.js +5 -20
  24. package/dist/common/collection.js.map +1 -1
  25. package/dist/common/config.js +0 -7
  26. package/dist/common/config.js.map +1 -1
  27. package/dist/common/errors/captcha-error.js +5 -26
  28. package/dist/common/errors/captcha-error.js.map +1 -1
  29. package/dist/common/errors/intent-to-join.js +5 -26
  30. package/dist/common/errors/intent-to-join.js.map +1 -1
  31. package/dist/common/errors/join-meeting.js +6 -27
  32. package/dist/common/errors/join-meeting.js.map +1 -1
  33. package/dist/common/errors/media.js +5 -26
  34. package/dist/common/errors/media.js.map +1 -1
  35. package/dist/common/errors/parameter.js +5 -33
  36. package/dist/common/errors/parameter.js.map +1 -1
  37. package/dist/common/errors/password-error.js +5 -26
  38. package/dist/common/errors/password-error.js.map +1 -1
  39. package/dist/common/errors/permission.js +4 -25
  40. package/dist/common/errors/permission.js.map +1 -1
  41. package/dist/common/errors/reconnection-in-progress.js +0 -17
  42. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  43. package/dist/common/errors/reconnection.js +5 -26
  44. package/dist/common/errors/reconnection.js.map +1 -1
  45. package/dist/common/errors/stats.js +5 -26
  46. package/dist/common/errors/stats.js.map +1 -1
  47. package/dist/common/errors/webex-errors.js +6 -41
  48. package/dist/common/errors/webex-errors.js.map +1 -1
  49. package/dist/common/errors/webex-meetings-error.js +1 -24
  50. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  51. package/dist/common/events/events-scope.js +0 -22
  52. package/dist/common/events/events-scope.js.map +1 -1
  53. package/dist/common/events/events.js +0 -23
  54. package/dist/common/events/events.js.map +1 -1
  55. package/dist/common/events/trigger-proxy.js +0 -12
  56. package/dist/common/events/trigger-proxy.js.map +1 -1
  57. package/dist/common/events/util.js +0 -15
  58. package/dist/common/events/util.js.map +1 -1
  59. package/dist/common/logs/logger-config.js +0 -4
  60. package/dist/common/logs/logger-config.js.map +1 -1
  61. package/dist/common/logs/logger-proxy.js +1 -8
  62. package/dist/common/logs/logger-proxy.js.map +1 -1
  63. package/dist/common/logs/request.js +35 -61
  64. package/dist/common/logs/request.js.map +1 -1
  65. package/dist/common/queue.js +4 -14
  66. package/dist/common/queue.js.map +1 -1
  67. package/dist/config.js +7 -6
  68. package/dist/config.js.map +1 -1
  69. package/dist/constants.js +167 -52
  70. package/dist/constants.js.map +1 -1
  71. package/dist/controls-options-manager/constants.js +14 -0
  72. package/dist/controls-options-manager/constants.js.map +1 -0
  73. package/dist/controls-options-manager/enums.js +25 -0
  74. package/dist/controls-options-manager/enums.js.map +1 -0
  75. package/dist/controls-options-manager/index.js +292 -0
  76. package/dist/controls-options-manager/index.js.map +1 -0
  77. package/dist/controls-options-manager/types.js +7 -0
  78. package/dist/controls-options-manager/types.js.map +1 -0
  79. package/dist/controls-options-manager/util.js +250 -0
  80. package/dist/controls-options-manager/util.js.map +1 -0
  81. package/dist/index.js +72 -17
  82. package/dist/index.js.map +1 -1
  83. package/dist/locus-info/controlsUtils.js +56 -29
  84. package/dist/locus-info/controlsUtils.js.map +1 -1
  85. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  86. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  87. package/dist/locus-info/fullState.js +0 -15
  88. package/dist/locus-info/fullState.js.map +1 -1
  89. package/dist/locus-info/hostUtils.js +4 -12
  90. package/dist/locus-info/hostUtils.js.map +1 -1
  91. package/dist/locus-info/index.js +325 -208
  92. package/dist/locus-info/index.js.map +1 -1
  93. package/dist/locus-info/infoUtils.js +3 -37
  94. package/dist/locus-info/infoUtils.js.map +1 -1
  95. package/dist/locus-info/mediaSharesUtils.js +12 -38
  96. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  97. package/dist/locus-info/parser.js +88 -123
  98. package/dist/locus-info/parser.js.map +1 -1
  99. package/dist/locus-info/selfUtils.js +87 -91
  100. package/dist/locus-info/selfUtils.js.map +1 -1
  101. package/dist/media/index.js +62 -147
  102. package/dist/media/index.js.map +1 -1
  103. package/dist/media/properties.js +71 -117
  104. package/dist/media/properties.js.map +1 -1
  105. package/dist/media/util.js +2 -9
  106. package/dist/media/util.js.map +1 -1
  107. package/dist/mediaQualityMetrics/config.js +505 -495
  108. package/dist/mediaQualityMetrics/config.js.map +1 -1
  109. package/dist/meeting/in-meeting-actions.js +35 -14
  110. package/dist/meeting/in-meeting-actions.js.map +1 -1
  111. package/dist/meeting/index.js +2249 -2269
  112. package/dist/meeting/index.js.map +1 -1
  113. package/dist/meeting/muteState.js +252 -113
  114. package/dist/meeting/muteState.js.map +1 -1
  115. package/dist/meeting/request.js +318 -283
  116. package/dist/meeting/request.js.map +1 -1
  117. package/dist/meeting/request.type.js +7 -0
  118. package/dist/meeting/request.type.js.map +1 -0
  119. package/dist/meeting/state.js +21 -31
  120. package/dist/meeting/state.js.map +1 -1
  121. package/dist/meeting/util.js +69 -217
  122. package/dist/meeting/util.js.map +1 -1
  123. package/dist/meeting-info/collection.js +3 -25
  124. package/dist/meeting-info/collection.js.map +1 -1
  125. package/dist/meeting-info/index.js +10 -33
  126. package/dist/meeting-info/index.js.map +1 -1
  127. package/dist/meeting-info/meeting-info-v2.js +258 -281
  128. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  129. package/dist/meeting-info/request.js +1 -16
  130. package/dist/meeting-info/request.js.map +1 -1
  131. package/dist/meeting-info/util.js +98 -183
  132. package/dist/meeting-info/util.js.map +1 -1
  133. package/dist/meeting-info/utilv2.js +154 -232
  134. package/dist/meeting-info/utilv2.js.map +1 -1
  135. package/dist/meetings/collection.js +24 -20
  136. package/dist/meetings/collection.js.map +1 -1
  137. package/dist/meetings/index.js +573 -587
  138. package/dist/meetings/index.js.map +1 -1
  139. package/dist/meetings/request.js +23 -42
  140. package/dist/meetings/request.js.map +1 -1
  141. package/dist/meetings/util.js +164 -155
  142. package/dist/meetings/util.js.map +1 -1
  143. package/dist/member/index.js +80 -88
  144. package/dist/member/index.js.map +1 -1
  145. package/dist/member/types.js +15 -0
  146. package/dist/member/types.js.map +1 -0
  147. package/dist/member/util.js +90 -69
  148. package/dist/member/util.js.map +1 -1
  149. package/dist/members/collection.js +12 -12
  150. package/dist/members/collection.js.map +1 -1
  151. package/dist/members/index.js +162 -204
  152. package/dist/members/index.js.map +1 -1
  153. package/dist/members/request.js +58 -53
  154. package/dist/members/request.js.map +1 -1
  155. package/dist/members/types.js +15 -0
  156. package/dist/members/types.js.map +1 -0
  157. package/dist/members/util.js +107 -44
  158. package/dist/members/util.js.map +1 -1
  159. package/dist/metrics/config.js +4 -14
  160. package/dist/metrics/config.js.map +1 -1
  161. package/dist/metrics/constants.js +3 -7
  162. package/dist/metrics/constants.js.map +1 -1
  163. package/dist/metrics/index.js +56 -159
  164. package/dist/metrics/index.js.map +1 -1
  165. package/dist/multistream/mediaRequestManager.js +167 -50
  166. package/dist/multistream/mediaRequestManager.js.map +1 -1
  167. package/dist/multistream/receiveSlot.js +58 -65
  168. package/dist/multistream/receiveSlot.js.map +1 -1
  169. package/dist/multistream/receiveSlotManager.js +74 -93
  170. package/dist/multistream/receiveSlotManager.js.map +1 -1
  171. package/dist/multistream/remoteMedia.js +55 -74
  172. package/dist/multistream/remoteMedia.js.map +1 -1
  173. package/dist/multistream/remoteMediaGroup.js +6 -40
  174. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  175. package/dist/multistream/remoteMediaManager.js +466 -442
  176. package/dist/multistream/remoteMediaManager.js.map +1 -1
  177. package/dist/networkQualityMonitor/index.js +32 -59
  178. package/dist/networkQualityMonitor/index.js.map +1 -1
  179. package/dist/personal-meeting-room/index.js +10 -45
  180. package/dist/personal-meeting-room/index.js.map +1 -1
  181. package/dist/personal-meeting-room/request.js +2 -33
  182. package/dist/personal-meeting-room/request.js.map +1 -1
  183. package/dist/personal-meeting-room/util.js +0 -13
  184. package/dist/personal-meeting-room/util.js.map +1 -1
  185. package/dist/reachability/index.js +190 -199
  186. package/dist/reachability/index.js.map +1 -1
  187. package/dist/reachability/request.js +14 -23
  188. package/dist/reachability/request.js.map +1 -1
  189. package/dist/reactions/constants.js +13 -0
  190. package/dist/reactions/constants.js.map +1 -0
  191. package/dist/reactions/reactions.js +109 -0
  192. package/dist/reactions/reactions.js.map +1 -0
  193. package/dist/reactions/reactions.type.js +36 -0
  194. package/dist/reactions/reactions.type.js.map +1 -0
  195. package/dist/reconnection-manager/index.js +326 -465
  196. package/dist/reconnection-manager/index.js.map +1 -1
  197. package/dist/recording-controller/enums.js +17 -0
  198. package/dist/recording-controller/enums.js.map +1 -0
  199. package/dist/recording-controller/index.js +343 -0
  200. package/dist/recording-controller/index.js.map +1 -0
  201. package/dist/recording-controller/util.js +63 -0
  202. package/dist/recording-controller/util.js.map +1 -0
  203. package/dist/roap/index.js +38 -67
  204. package/dist/roap/index.js.map +1 -1
  205. package/dist/roap/request.js +143 -134
  206. package/dist/roap/request.js.map +1 -1
  207. package/dist/roap/turnDiscovery.js +149 -101
  208. package/dist/roap/turnDiscovery.js.map +1 -1
  209. package/dist/statsAnalyzer/global.js +1 -95
  210. package/dist/statsAnalyzer/global.js.map +1 -1
  211. package/dist/statsAnalyzer/index.js +369 -461
  212. package/dist/statsAnalyzer/index.js.map +1 -1
  213. package/dist/statsAnalyzer/mqaUtil.js +144 -94
  214. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  215. package/dist/transcription/index.js +13 -45
  216. package/dist/transcription/index.js.map +1 -1
  217. package/dist/types/annotation/annotation.types.d.ts +33 -0
  218. package/dist/types/annotation/constants.d.ts +31 -0
  219. package/dist/types/annotation/index.d.ts +117 -0
  220. package/dist/types/breakouts/breakout.d.ts +8 -0
  221. package/dist/types/breakouts/collection.d.ts +5 -0
  222. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  223. package/dist/types/breakouts/index.d.ts +5 -0
  224. package/dist/types/breakouts/request.d.ts +22 -0
  225. package/dist/types/breakouts/utils.d.ts +15 -0
  226. package/dist/types/common/browser-detection.d.ts +9 -0
  227. package/dist/types/common/collection.d.ts +48 -0
  228. package/dist/types/common/config.d.ts +2 -0
  229. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  230. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  231. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  232. package/dist/types/common/errors/media.d.ts +15 -0
  233. package/dist/types/common/errors/parameter.d.ts +15 -0
  234. package/dist/types/common/errors/password-error.d.ts +15 -0
  235. package/dist/types/common/errors/permission.d.ts +14 -0
  236. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  237. package/dist/types/common/errors/reconnection.d.ts +15 -0
  238. package/dist/types/common/errors/stats.d.ts +15 -0
  239. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  240. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  241. package/dist/types/common/events/events-scope.d.ts +17 -0
  242. package/dist/types/common/events/events.d.ts +12 -0
  243. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  244. package/dist/types/common/events/util.d.ts +2 -0
  245. package/dist/types/common/logs/logger-config.d.ts +2 -0
  246. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  247. package/dist/types/common/logs/request.d.ts +34 -0
  248. package/dist/types/common/queue.d.ts +32 -0
  249. package/dist/types/config.d.ts +78 -0
  250. package/dist/types/constants.d.ts +963 -0
  251. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  252. package/dist/types/controls-options-manager/enums.d.ts +13 -0
  253. package/dist/types/controls-options-manager/index.d.ts +136 -0
  254. package/dist/types/controls-options-manager/types.d.ts +37 -0
  255. package/dist/types/controls-options-manager/util.d.ts +1 -0
  256. package/dist/types/index.d.ts +7 -0
  257. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  258. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  259. package/dist/types/locus-info/fullState.d.ts +2 -0
  260. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  261. package/dist/types/locus-info/index.d.ts +314 -0
  262. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  263. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  264. package/dist/types/locus-info/parser.d.ts +212 -0
  265. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  266. package/dist/types/media/index.d.ts +34 -0
  267. package/dist/types/media/properties.d.ts +108 -0
  268. package/dist/types/media/util.d.ts +2 -0
  269. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  270. package/dist/types/meeting/in-meeting-actions.d.ts +105 -0
  271. package/dist/types/meeting/index.d.ts +1727 -0
  272. package/dist/types/meeting/muteState.d.ts +185 -0
  273. package/dist/types/meeting/request.d.ts +275 -0
  274. package/dist/types/meeting/request.type.d.ts +11 -0
  275. package/dist/types/meeting/state.d.ts +9 -0
  276. package/dist/types/meeting/util.d.ts +2 -0
  277. package/dist/types/meeting-info/collection.d.ts +20 -0
  278. package/dist/types/meeting-info/index.d.ts +57 -0
  279. package/dist/types/meeting-info/meeting-info-v2.d.ts +111 -0
  280. package/dist/types/meeting-info/request.d.ts +22 -0
  281. package/dist/types/meeting-info/util.d.ts +2 -0
  282. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  283. package/dist/types/meetings/collection.d.ts +31 -0
  284. package/dist/types/meetings/index.d.ts +316 -0
  285. package/dist/types/meetings/request.d.ts +27 -0
  286. package/dist/types/meetings/util.d.ts +18 -0
  287. package/dist/types/member/index.d.ts +156 -0
  288. package/dist/types/member/types.d.ts +21 -0
  289. package/dist/types/member/util.d.ts +2 -0
  290. package/dist/types/members/collection.d.ts +29 -0
  291. package/dist/types/members/index.d.ts +353 -0
  292. package/dist/types/members/request.d.ts +69 -0
  293. package/dist/types/members/types.d.ts +24 -0
  294. package/dist/types/members/util.d.ts +2 -0
  295. package/dist/types/metrics/config.d.ts +171 -0
  296. package/dist/types/metrics/constants.d.ts +54 -0
  297. package/dist/types/metrics/index.d.ts +152 -0
  298. package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
  299. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  300. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  301. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  302. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  303. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  304. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  305. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  306. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  307. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  308. package/dist/types/reachability/index.d.ts +152 -0
  309. package/dist/types/reachability/request.d.ts +37 -0
  310. package/dist/types/reactions/constants.d.ts +3 -0
  311. package/dist/types/reactions/reactions.d.ts +4 -0
  312. package/dist/types/reactions/reactions.type.d.ts +52 -0
  313. package/dist/types/reconnection-manager/index.d.ts +126 -0
  314. package/dist/types/recording-controller/enums.d.ts +7 -0
  315. package/dist/types/recording-controller/index.d.ts +193 -0
  316. package/dist/types/recording-controller/util.d.ts +13 -0
  317. package/dist/types/roap/index.d.ts +77 -0
  318. package/dist/types/roap/request.d.ts +38 -0
  319. package/dist/types/roap/turnDiscovery.d.ts +88 -0
  320. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  321. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  322. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  323. package/dist/types/transcription/index.d.ts +64 -0
  324. package/internal-README.md +7 -6
  325. package/package.json +28 -20
  326. package/src/annotation/annotation.types.ts +37 -0
  327. package/src/annotation/constants.ts +36 -0
  328. package/src/annotation/index.ts +314 -0
  329. package/src/breakouts/README.md +219 -0
  330. package/src/breakouts/breakout.ts +154 -0
  331. package/src/breakouts/collection.ts +19 -0
  332. package/src/breakouts/edit-lock-error.ts +25 -0
  333. package/src/breakouts/index.ts +776 -0
  334. package/src/breakouts/request.ts +55 -0
  335. package/src/breakouts/utils.ts +57 -0
  336. package/src/common/browser-detection.ts +9 -6
  337. package/src/common/collection.ts +3 -1
  338. package/src/common/errors/captcha-error.ts +6 -6
  339. package/src/common/errors/intent-to-join.ts +6 -6
  340. package/src/common/errors/join-meeting.ts +12 -8
  341. package/src/common/errors/media.ts +6 -6
  342. package/src/common/errors/parameter.ts +9 -6
  343. package/src/common/errors/password-error.ts +6 -6
  344. package/src/common/errors/permission.ts +5 -5
  345. package/src/common/errors/reconnection.ts +6 -6
  346. package/src/common/errors/stats.ts +6 -6
  347. package/src/common/errors/webex-errors.ts +7 -5
  348. package/src/common/errors/webex-meetings-error.ts +1 -1
  349. package/src/common/events/events-scope.ts +5 -1
  350. package/src/common/events/events.ts +5 -1
  351. package/src/common/events/trigger-proxy.ts +8 -3
  352. package/src/common/events/util.ts +1 -2
  353. package/src/common/logs/logger-proxy.ts +21 -10
  354. package/src/common/logs/request.ts +11 -8
  355. package/src/config.ts +17 -12
  356. package/src/constants.ts +114 -6
  357. package/src/controls-options-manager/constants.ts +5 -0
  358. package/src/controls-options-manager/enums.ts +16 -0
  359. package/src/controls-options-manager/index.ts +275 -0
  360. package/src/controls-options-manager/types.ts +49 -0
  361. package/src/controls-options-manager/util.ts +229 -0
  362. package/src/index.ts +33 -0
  363. package/src/locus-info/controlsUtils.ts +91 -24
  364. package/src/locus-info/fullState.ts +15 -11
  365. package/src/locus-info/hostUtils.ts +4 -3
  366. package/src/locus-info/index.ts +265 -51
  367. package/src/locus-info/infoUtils.ts +16 -4
  368. package/src/locus-info/mediaSharesUtils.ts +4 -4
  369. package/src/locus-info/parser.ts +46 -68
  370. package/src/locus-info/selfUtils.ts +178 -57
  371. package/src/media/index.ts +142 -172
  372. package/src/media/properties.ts +43 -36
  373. package/src/media/util.ts +1 -1
  374. package/src/mediaQualityMetrics/config.ts +380 -378
  375. package/src/meeting/in-meeting-actions.ts +75 -3
  376. package/src/meeting/index.ts +2484 -1524
  377. package/src/meeting/muteState.ts +271 -68
  378. package/src/meeting/request.ts +251 -132
  379. package/src/meeting/request.type.ts +13 -0
  380. package/src/meeting/state.ts +45 -30
  381. package/src/meeting/util.ts +132 -111
  382. package/src/meeting-info/collection.ts +2 -1
  383. package/src/meeting-info/index.ts +32 -30
  384. package/src/meeting-info/meeting-info-v2.ts +178 -109
  385. package/src/meeting-info/request.ts +9 -3
  386. package/src/meeting-info/util.ts +54 -46
  387. package/src/meeting-info/utilv2.ts +69 -57
  388. package/src/meetings/collection.ts +21 -1
  389. package/src/meetings/index.ts +687 -467
  390. package/src/meetings/request.ts +29 -25
  391. package/src/meetings/util.ts +108 -33
  392. package/src/member/index.ts +86 -49
  393. package/src/member/types.ts +24 -0
  394. package/src/member/util.ts +92 -13
  395. package/src/members/collection.ts +8 -1
  396. package/src/members/index.ts +281 -129
  397. package/src/members/request.ts +87 -14
  398. package/src/members/types.ts +28 -0
  399. package/src/members/util.ts +140 -49
  400. package/src/metrics/config.ts +255 -90
  401. package/src/metrics/constants.ts +1 -6
  402. package/src/metrics/index.ts +91 -94
  403. package/src/multistream/mediaRequestManager.ts +201 -43
  404. package/src/multistream/receiveSlot.ts +69 -26
  405. package/src/multistream/receiveSlotManager.ts +62 -38
  406. package/src/multistream/remoteMedia.ts +30 -4
  407. package/src/multistream/remoteMediaGroup.ts +4 -3
  408. package/src/multistream/remoteMediaManager.ts +230 -66
  409. package/src/networkQualityMonitor/index.ts +24 -27
  410. package/src/personal-meeting-room/index.ts +12 -16
  411. package/src/personal-meeting-room/request.ts +10 -3
  412. package/src/personal-meeting-room/util.ts +3 -3
  413. package/src/reachability/index.ts +131 -79
  414. package/src/reachability/request.ts +43 -34
  415. package/src/reactions/constants.ts +4 -0
  416. package/src/reactions/reactions.ts +104 -0
  417. package/src/reactions/reactions.type.ts +62 -0
  418. package/src/reconnection-manager/index.ts +193 -111
  419. package/src/recording-controller/enums.ts +8 -0
  420. package/src/recording-controller/index.ts +315 -0
  421. package/src/recording-controller/util.ts +58 -0
  422. package/src/roap/index.ts +63 -51
  423. package/src/roap/request.ts +86 -53
  424. package/src/roap/turnDiscovery.ts +105 -46
  425. package/src/statsAnalyzer/global.ts +8 -104
  426. package/src/statsAnalyzer/index.ts +624 -376
  427. package/src/statsAnalyzer/mqaUtil.ts +203 -90
  428. package/src/transcription/index.ts +34 -32
  429. package/test/integration/spec/converged-space-meetings.js +177 -0
  430. package/test/integration/spec/journey.js +666 -464
  431. package/test/integration/spec/space-meeting.js +320 -204
  432. package/test/integration/spec/transcription.js +7 -8
  433. package/test/unit/spec/annotation/index.ts +420 -0
  434. package/test/unit/spec/breakouts/breakout.ts +178 -0
  435. package/test/unit/spec/breakouts/collection.ts +15 -0
  436. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  437. package/test/unit/spec/breakouts/index.ts +1416 -0
  438. package/test/unit/spec/breakouts/request.ts +104 -0
  439. package/test/unit/spec/breakouts/utils.js +72 -0
  440. package/test/unit/spec/common/browser-detection.js +9 -28
  441. package/test/unit/spec/controls-options-manager/index.js +280 -0
  442. package/test/unit/spec/controls-options-manager/util.js +403 -0
  443. package/test/unit/spec/fixture/locus.js +92 -90
  444. package/test/unit/spec/locus-info/controlsUtils.js +177 -32
  445. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  446. package/test/unit/spec/locus-info/index.js +484 -3
  447. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  448. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  449. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  450. package/test/unit/spec/locus-info/parser.js +3 -9
  451. package/test/unit/spec/locus-info/selfConstant.js +101 -103
  452. package/test/unit/spec/locus-info/selfUtils.js +191 -12
  453. package/test/unit/spec/media/index.ts +104 -8
  454. package/test/unit/spec/media/properties.ts +9 -9
  455. package/test/unit/spec/meeting/in-meeting-actions.ts +34 -3
  456. package/test/unit/spec/meeting/index.js +2651 -829
  457. package/test/unit/spec/meeting/muteState.js +368 -70
  458. package/test/unit/spec/meeting/request.js +217 -43
  459. package/test/unit/spec/meeting/utils.js +167 -163
  460. package/test/unit/spec/meeting-info/meetinginfov2.js +241 -74
  461. package/test/unit/spec/meeting-info/request.js +7 -9
  462. package/test/unit/spec/meeting-info/util.js +11 -12
  463. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  464. package/test/unit/spec/meetings/collection.js +15 -1
  465. package/test/unit/spec/meetings/index.js +701 -273
  466. package/test/unit/spec/meetings/utils.js +105 -14
  467. package/test/unit/spec/member/index.js +24 -1
  468. package/test/unit/spec/member/util.js +359 -32
  469. package/test/unit/spec/members/index.js +402 -54
  470. package/test/unit/spec/members/request.js +76 -20
  471. package/test/unit/spec/members/utils.js +191 -4
  472. package/test/unit/spec/metrics/index.js +46 -20
  473. package/test/unit/spec/multistream/mediaRequestManager.ts +650 -105
  474. package/test/unit/spec/multistream/receiveSlot.ts +76 -17
  475. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  476. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  477. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  478. package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
  479. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  480. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  481. package/test/unit/spec/reachability/index.ts +176 -27
  482. package/test/unit/spec/reachability/request.js +66 -0
  483. package/test/unit/spec/reconnection-manager/index.js +62 -31
  484. package/test/unit/spec/recording-controller/index.js +231 -0
  485. package/test/unit/spec/recording-controller/util.js +102 -0
  486. package/test/unit/spec/roap/index.ts +21 -16
  487. package/test/unit/spec/roap/request.ts +217 -0
  488. package/test/unit/spec/roap/turnDiscovery.ts +93 -49
  489. package/test/unit/spec/stats-analyzer/index.js +116 -60
  490. package/test/utils/cmr.js +44 -42
  491. package/test/utils/constants.js +9 -0
  492. package/test/utils/integrationTestUtils.js +64 -0
  493. package/test/utils/testUtils.js +63 -99
  494. package/test/utils/webex-config.js +22 -18
  495. package/test/utils/webex-test-users.js +57 -50
  496. package/tsconfig.json +6 -0
  497. package/dist/media/internal-media-core-wrapper.js +0 -22
  498. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  499. package/dist/meeting/effectsState.js +0 -334
  500. package/dist/meeting/effectsState.js.map +0 -1
  501. package/dist/multistream/multistreamMedia.js +0 -116
  502. package/dist/multistream/multistreamMedia.js.map +0 -1
  503. package/src/index.js +0 -15
  504. package/src/media/internal-media-core-wrapper.ts +0 -9
  505. package/src/meeting/effectsState.ts +0 -211
  506. package/src/multistream/multistreamMedia.ts +0 -92
  507. package/test/unit/spec/meeting/effectsState.js +0 -291
@@ -1,4 +1,4 @@
1
- import {isEqual} from 'lodash';
1
+ import {isArray, isEqual, mergeWith, cloneDeep} from 'lodash';
2
2
 
3
3
  import LoggerProxy from '../common/logs/logger-proxy';
4
4
  import EventsScope from '../common/events/events-scope';
@@ -19,14 +19,14 @@ import {
19
19
  } from '../constants';
20
20
  import Metrics from '../metrics';
21
21
  import {eventType} from '../metrics/config';
22
- import InfoUtils from '../locus-info/infoUtils';
23
- import FullState from '../locus-info/fullState';
24
- import SelfUtils from '../locus-info/selfUtils';
25
- import HostUtils from '../locus-info/hostUtils';
26
- import ControlsUtils from '../locus-info/controlsUtils';
27
- import EmbeddedAppsUtils from '../locus-info/embeddedAppsUtils';
28
- import MediaSharesUtils from '../locus-info/mediaSharesUtils';
29
- import LocusDeltaParser from '../locus-info/parser';
22
+ import InfoUtils from './infoUtils';
23
+ import FullState from './fullState';
24
+ import SelfUtils from './selfUtils';
25
+ import HostUtils from './hostUtils';
26
+ import ControlsUtils from './controlsUtils';
27
+ import EmbeddedAppsUtils from './embeddedAppsUtils';
28
+ import MediaSharesUtils from './mediaSharesUtils';
29
+ import LocusDeltaParser from './parser';
30
30
 
31
31
  /**
32
32
  * @description LocusInfo extends ChildEmitter to convert locusInfo info a private emitter to parent object
@@ -59,10 +59,19 @@ export default class LocusInfo extends EventsScope {
59
59
  fullState: any;
60
60
  host: any;
61
61
  info: any;
62
+ roles: any;
62
63
  mediaShares: any;
63
64
  replace: any;
64
65
  url: any;
65
-
66
+ services: any;
67
+ mainSessionLocusCache: any;
68
+ /**
69
+ * Constructor
70
+ * @param {boolean} updateMeeting true if the meeting should be updated
71
+ * @param {object} webex
72
+ * @param {string} meetingId
73
+ * @returns {undefined}
74
+ */
66
75
  constructor(updateMeeting, webex, meetingId) {
67
76
  super();
68
77
  this.parsedLocus = {
@@ -171,6 +180,7 @@ export default class LocusInfo extends EventsScope {
171
180
  */
172
181
  this.deltaParticipants = [];
173
182
 
183
+ this.updateLocusCache(locus);
174
184
  // above section only updates the locusInfo object
175
185
  // The below section makes sure it updates the locusInfo as well as updates the meeting object
176
186
  this.updateParticipants(locus.participants);
@@ -185,6 +195,7 @@ export default class LocusInfo extends EventsScope {
185
195
  this.updateSelf(locus.self, locus.participants);
186
196
  this.updateHostInfo(locus.host);
187
197
  this.updateMediaShares(locus.mediaShares);
198
+ this.updateServices(locus.links?.services);
188
199
  }
189
200
 
190
201
  /**
@@ -193,6 +204,7 @@ export default class LocusInfo extends EventsScope {
193
204
  * @memberof LocusInfo
194
205
  */
195
206
  initialSetup(locus: object) {
207
+ this.updateLocusCache(locus);
196
208
  this.onFullLocus(locus);
197
209
 
198
210
  // Change it to true after it receives it first locus object
@@ -206,8 +218,9 @@ export default class LocusInfo extends EventsScope {
206
218
  * @memberof LocusInfo
207
219
  */
208
220
  parse(meeting: any, data: any) {
221
+ // eslint-disable-next-line @typescript-eslint/no-shadow
209
222
  const {eventType} = data;
210
-
223
+ const locus = this.getTheLocusToUpdate(data.locus);
211
224
  LoggerProxy.logger.info(`Locus-info:index#parse --> received locus data: ${eventType}`);
212
225
 
213
226
  switch (eventType) {
@@ -225,16 +238,16 @@ export default class LocusInfo extends EventsScope {
225
238
  case LOCUSEVENT.PARTICIPANT_DECLINED:
226
239
  case LOCUSEVENT.FLOOR_GRANTED:
227
240
  case LOCUSEVENT.FLOOR_RELEASED:
228
- this.onFullLocus(data.locus, eventType);
241
+ this.onFullLocus(locus, eventType);
229
242
  break;
230
243
  case LOCUSEVENT.DIFFERENCE:
231
- this.handleLocusDelta(data.locus, meeting);
244
+ this.handleLocusDelta(locus, meeting);
232
245
  break;
233
246
 
234
247
  default:
235
248
  // Why will there be a event with no eventType ????
236
249
  // we may not need this, we can get full locus
237
- this.handleLocusDelta(data.locus, meeting);
250
+ this.handleLocusDelta(locus, meeting);
238
251
  }
239
252
  }
240
253
 
@@ -256,6 +269,7 @@ export default class LocusInfo extends EventsScope {
256
269
  * @returns {object} null
257
270
  * @memberof LocusInfo
258
271
  */
272
+ // eslint-disable-next-line @typescript-eslint/no-shadow
259
273
  onFullLocus(locus: any, eventType?: string) {
260
274
  if (!locus) {
261
275
  LoggerProxy.logger.error(
@@ -265,8 +279,9 @@ export default class LocusInfo extends EventsScope {
265
279
  this.updateParticipantDeltas(locus.participants);
266
280
  this.scheduledMeeting = locus.meeting || null;
267
281
  this.participants = locus.participants;
282
+ const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);
268
283
  this.updateLocusInfo(locus);
269
- this.updateParticipants(locus.participants);
284
+ this.updateParticipants(locus.participants, isReplaceMembers);
270
285
  this.isMeetingActive();
271
286
  this.handleOneOnOneEvent(eventType);
272
287
  this.updateEmbeddedApps(locus.embeddedApps);
@@ -280,6 +295,7 @@ export default class LocusInfo extends EventsScope {
280
295
  * @returns {undefined}
281
296
  * @memberof LocusInfo
282
297
  */
298
+ // eslint-disable-next-line @typescript-eslint/no-shadow
283
299
  handleOneOnOneEvent(eventType: string) {
284
300
  if (
285
301
  this.parsedLocus.fullState.type === _CALL_ ||
@@ -324,8 +340,9 @@ export default class LocusInfo extends EventsScope {
324
340
  * @memberof LocusInfo
325
341
  */
326
342
  onDeltaLocus(locus: any) {
343
+ const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);
327
344
  this.updateLocusInfo(locus);
328
- this.updateParticipants(locus.participants);
345
+ this.updateParticipants(locus.participants, isReplaceMembers);
329
346
  this.isMeetingActive();
330
347
  }
331
348
 
@@ -334,7 +351,14 @@ export default class LocusInfo extends EventsScope {
334
351
  * @returns {undefined}
335
352
  * @memberof LocusInfo
336
353
  */
337
- updateLocusInfo(locus: any) {
354
+ updateLocusInfo(locus) {
355
+ if (locus.self?.reason === 'MOVED' && locus.self?.state === 'LEFT') {
356
+ // When moved to a breakout session locus sends a message for the previous locus
357
+ // indicating that we have been moved. It isn't helpful to continue parsing this
358
+ // as it gets interpreted as if we have left the call
359
+ return;
360
+ }
361
+
338
362
  this.updateControls(locus.controls);
339
363
  this.updateConversationUrl(locus.conversationUrl, locus.info);
340
364
  this.updateCreated(locus.created);
@@ -352,6 +376,7 @@ export default class LocusInfo extends EventsScope {
352
376
  this.updateMemberShip(locus.membership);
353
377
  this.updateIdentifiers(locus.identities);
354
378
  this.updateEmbeddedApps(locus.embeddedApps);
379
+ this.updateServices(locus.links?.services);
355
380
  this.compareAndUpdate();
356
381
  // update which required to compare different objects from locus
357
382
  }
@@ -373,7 +398,7 @@ export default class LocusInfo extends EventsScope {
373
398
  self &&
374
399
  participant.identity !== self.identity &&
375
400
  (participants.length <= 2 || (participant.type === _USER_ && !participant.removed))
376
- // @ts-ignore
401
+ // @ts-ignore
377
402
  ) || this.partner
378
403
  );
379
404
  }
@@ -420,8 +445,7 @@ export default class LocusInfo extends EventsScope {
420
445
  shouldLeave: false,
421
446
  }
422
447
  );
423
- }
424
- else if (
448
+ } else if (
425
449
  partner.state === MEETING_STATE.STATES.LEFT &&
426
450
  this.parsedLocus.self &&
427
451
  (this.parsedLocus.self.state === MEETING_STATE.STATES.DECLINED ||
@@ -444,8 +468,7 @@ export default class LocusInfo extends EventsScope {
444
468
  this.parsedLocus.self.joinedWith && this.parsedLocus.self.joinedWith.state !== _LEFT_,
445
469
  }
446
470
  );
447
- }
448
- else if (
471
+ } else if (
449
472
  this.parsedLocus.self &&
450
473
  this.parsedLocus.self.state === MEETING_STATE.STATES.LEFT &&
451
474
  (partner.state === MEETING_STATE.STATES.LEFT ||
@@ -469,8 +492,7 @@ export default class LocusInfo extends EventsScope {
469
492
  }
470
493
  );
471
494
  }
472
- }
473
- else if (this.parsedLocus.fullState.type === _MEETING_) {
495
+ } else if (this.parsedLocus.fullState.type === _MEETING_) {
474
496
  if (
475
497
  this.fullState &&
476
498
  (this.fullState.state === LOCUS.STATE.INACTIVE ||
@@ -495,8 +517,7 @@ export default class LocusInfo extends EventsScope {
495
517
  shouldLeave: false,
496
518
  }
497
519
  );
498
- }
499
- else if (this.fullState && this.fullState.removed) {
520
+ } else if (this.fullState && this.fullState.removed) {
500
521
  // user has been dropped from a meeting
501
522
  Metrics.postEvent({
502
523
  event: eventType.REMOTE_ENDED,
@@ -530,8 +551,7 @@ export default class LocusInfo extends EventsScope {
530
551
  }
531
552
  );
532
553
  }
533
- }
534
- else {
554
+ } else {
535
555
  LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Meeting Type is unknown.');
536
556
  }
537
557
  }
@@ -574,8 +594,7 @@ export default class LocusInfo extends EventsScope {
574
594
  canAssignHost: true,
575
595
  }
576
596
  );
577
- }
578
- else {
597
+ } else {
579
598
  this.emitScoped(
580
599
  {
581
600
  file: 'locus-info',
@@ -639,13 +658,13 @@ export default class LocusInfo extends EventsScope {
639
658
  }
640
659
 
641
660
  /**
642
- *
661
+ * update meeting's members
643
662
  * @param {Object} participants new participants object
644
- * @param {boolen} deltaParticpantFlag delta event
663
+ * @param {Boolean} isReplace is replace the whole members
645
664
  * @returns {Array} updatedParticipants
646
665
  * @memberof LocusInfo
647
666
  */
648
- updateParticipants(participants: object) {
667
+ updateParticipants(participants: object, isReplace?: boolean) {
649
668
  this.emitScoped(
650
669
  {
651
670
  file: 'locus-info',
@@ -658,6 +677,7 @@ export default class LocusInfo extends EventsScope {
658
677
  selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,
659
678
  selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,
660
679
  hostId: this.parsedLocus.host && this.parsedLocus.host.hostId,
680
+ isReplace,
661
681
  }
662
682
  );
663
683
  }
@@ -677,6 +697,8 @@ export default class LocusInfo extends EventsScope {
677
697
  hasMeetingContainerChanged,
678
698
  hasTranscribeChanged,
679
699
  hasEntryExitToneChanged,
700
+ hasBreakoutChanged,
701
+ hasVideoEnabledChanged,
680
702
  },
681
703
  current,
682
704
  } = ControlsUtils.getControls(this.controls, controls);
@@ -687,13 +709,11 @@ export default class LocusInfo extends EventsScope {
687
709
  if (hasRecordingPausedChanged) {
688
710
  if (current.record.paused) {
689
711
  state = RECORDING_STATE.PAUSED;
690
- }
691
- else {
712
+ } else {
692
713
  // state will be `IDLE` if the recording is not active, even when there is a `pause` status change.
693
714
  state = current.record.recording ? RECORDING_STATE.RESUMED : RECORDING_STATE.IDLE;
694
715
  }
695
- }
696
- else if (hasRecordingChanged) {
716
+ } else if (hasRecordingChanged) {
697
717
  state = current.record.recording ? RECORDING_STATE.RECORDING : RECORDING_STATE.IDLE;
698
718
  }
699
719
 
@@ -742,9 +762,26 @@ export default class LocusInfo extends EventsScope {
742
762
  );
743
763
  }
744
764
 
765
+ if (hasBreakoutChanged) {
766
+ const {breakout} = current;
767
+
768
+ this.emitScoped(
769
+ {
770
+ file: 'locus-info',
771
+ function: 'updateControls',
772
+ },
773
+ LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED,
774
+ {
775
+ breakout,
776
+ }
777
+ );
778
+ }
779
+
745
780
  if (hasEntryExitToneChanged) {
746
781
  const {entryExitTone} = current;
747
782
 
783
+ this.updateMeeting({entryExitTone});
784
+
748
785
  this.emitScoped(
749
786
  {
750
787
  file: 'locus-info',
@@ -752,11 +789,29 @@ export default class LocusInfo extends EventsScope {
752
789
  },
753
790
  LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED,
754
791
  {
755
- entryExitTone
792
+ entryExitTone,
756
793
  }
757
794
  );
795
+ }
758
796
 
759
- this.updateMeeting({entryExitTone});
797
+ // videoEnabled is handled differently than other controls,
798
+ // to fit with audio mute status logic
799
+ if (hasVideoEnabledChanged) {
800
+ const {videoEnabled} = current;
801
+
802
+ this.updateMeeting({unmuteVideoAllowed: videoEnabled});
803
+
804
+ this.emitScoped(
805
+ {
806
+ file: 'locus-info',
807
+ function: 'updateControls',
808
+ },
809
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
810
+ {
811
+ // muted: not part of locus.controls
812
+ unmuteAllowed: videoEnabled,
813
+ }
814
+ );
760
815
  }
761
816
 
762
817
  this.controls = controls;
@@ -773,8 +828,7 @@ export default class LocusInfo extends EventsScope {
773
828
  if (conversationUrl && !isEqual(this.conversationUrl, conversationUrl)) {
774
829
  this.conversationUrl = conversationUrl;
775
830
  this.updateMeeting({conversationUrl});
776
- }
777
- else if (
831
+ } else if (
778
832
  info &&
779
833
  info.conversationUrl &&
780
834
  !isEqual(this.conversationUrl, info.conversationUrl)
@@ -795,6 +849,27 @@ export default class LocusInfo extends EventsScope {
795
849
  }
796
850
  }
797
851
 
852
+ /**
853
+ * @param {Object} services
854
+ * @returns {undefined}
855
+ * @memberof LocusInfo
856
+ */
857
+ updateServices(services: Record<'breakout' | 'record', {url: string}>) {
858
+ if (services && !isEqual(this.services, services)) {
859
+ this.services = services;
860
+ this.emitScoped(
861
+ {
862
+ file: 'locus-info',
863
+ function: 'updateServices',
864
+ },
865
+ LOCUSINFO.EVENTS.LINKS_SERVICES,
866
+ {
867
+ services,
868
+ }
869
+ );
870
+ }
871
+ }
872
+
798
873
  /**
799
874
  * @param {Object} fullState
800
875
  * @returns {undefined}
@@ -865,8 +940,7 @@ export default class LocusInfo extends EventsScope {
865
940
  );
866
941
  }
867
942
  this.host = host;
868
- }
869
- else {
943
+ } else {
870
944
  this.compareAndUpdateFlags.compareSelfAndHost = false;
871
945
  }
872
946
  }
@@ -878,8 +952,11 @@ export default class LocusInfo extends EventsScope {
878
952
  * @memberof LocusInfo
879
953
  */
880
954
  updateMeetingInfo(info: object, self?: object) {
881
- if (info && !isEqual(this.info, info)) {
882
- const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
955
+ const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
956
+ if (
957
+ (info && !isEqual(this.info, info)) ||
958
+ (roles.length && !isEqual(this.roles, roles) && info)
959
+ ) {
883
960
  const isJoined = SelfUtils.isJoined(self || this.parsedLocus.self);
884
961
  const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles, isJoined);
885
962
 
@@ -918,6 +995,7 @@ export default class LocusInfo extends EventsScope {
918
995
  // Parses the info and adds necessary values
919
996
  this.updateMeeting(parsedInfo.current);
920
997
  }
998
+ this.roles = roles;
921
999
  }
922
1000
 
923
1001
  /**
@@ -958,6 +1036,8 @@ export default class LocusInfo extends EventsScope {
958
1036
  const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);
959
1037
 
960
1038
  this.updateMeeting(parsedMediaShares.current);
1039
+ this.parsedLocus.mediaShares = parsedMediaShares.current;
1040
+ this.mediaShares = mediaShares;
961
1041
  this.emitScoped(
962
1042
  {
963
1043
  file: 'locus-info',
@@ -969,8 +1049,6 @@ export default class LocusInfo extends EventsScope {
969
1049
  previous: parsedMediaShares.previous,
970
1050
  }
971
1051
  );
972
- this.parsedLocus.mediaShares = parsedMediaShares.current;
973
- this.mediaShares = mediaShares;
974
1052
  }
975
1053
  }
976
1054
 
@@ -1033,8 +1111,7 @@ export default class LocusInfo extends EventsScope {
1033
1111
 
1034
1112
  if (parsedSelves.updates.moderatorChanged) {
1035
1113
  this.compareAndUpdateFlags.compareHostAndSelf = true;
1036
- }
1037
- else {
1114
+ } else {
1038
1115
  this.compareAndUpdateFlags.compareHostAndSelf = false;
1039
1116
  }
1040
1117
 
@@ -1049,6 +1126,17 @@ export default class LocusInfo extends EventsScope {
1049
1126
  );
1050
1127
  }
1051
1128
 
1129
+ if (parsedSelves.updates.breakoutsChanged) {
1130
+ this.emitScoped(
1131
+ {
1132
+ file: 'locus-info',
1133
+ function: 'updateSelf',
1134
+ },
1135
+ LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED,
1136
+ {breakoutSessions: parsedSelves.current.breakoutSessions}
1137
+ );
1138
+ }
1139
+
1052
1140
  if (parsedSelves.updates.isMediaInactiveOrReleased) {
1053
1141
  this.emitScoped(
1054
1142
  {
@@ -1070,6 +1158,31 @@ export default class LocusInfo extends EventsScope {
1070
1158
  self
1071
1159
  );
1072
1160
  }
1161
+ // When the user upgrades to moderator or cohost
1162
+ if (parsedSelves.updates.isUpgradeToModeratorOrCohost) {
1163
+ this.emitScoped(
1164
+ {
1165
+ file: 'locus-info',
1166
+ function: 'updateSelf',
1167
+ },
1168
+ LOCUSINFO.EVENTS.SELF_MODERATOR_OR_COHOST_UPGRADE,
1169
+ self
1170
+ );
1171
+ }
1172
+ //
1173
+ if (parsedSelves.updates.isVideoMutedByOthersChanged) {
1174
+ this.emitScoped(
1175
+ {
1176
+ file: 'locus-info',
1177
+ function: 'updateSelf',
1178
+ },
1179
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
1180
+ {
1181
+ muted: parsedSelves.current.remoteVideoMuted,
1182
+ // unmuteAllowed: not part of .self
1183
+ }
1184
+ );
1185
+ }
1073
1186
  if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {
1074
1187
  this.emitScoped(
1075
1188
  {
@@ -1204,8 +1317,7 @@ export default class LocusInfo extends EventsScope {
1204
1317
  this.parsedLocus.self = parsedSelves.current;
1205
1318
  // @ts-ignore
1206
1319
  this.self = self;
1207
- }
1208
- else {
1320
+ } else {
1209
1321
  this.compareAndUpdateFlags.compareHostAndSelf = false;
1210
1322
  }
1211
1323
  }
@@ -1285,4 +1397,106 @@ export default class LocusInfo extends EventsScope {
1285
1397
  this.identities = identities;
1286
1398
  }
1287
1399
  }
1400
+
1401
+ /**
1402
+ * check the locus is main session's one or not, if is main session's, update main session cache
1403
+ * @param {Object} locus
1404
+ * @returns {undefined}
1405
+ * @memberof LocusInfo
1406
+ */
1407
+ updateLocusCache(locus: any) {
1408
+ const isMainSessionDTO = ControlsUtils.isMainSessionDTO(locus);
1409
+ if (isMainSessionDTO) {
1410
+ this.updateMainSessionLocusCache(locus);
1411
+ }
1412
+ }
1413
+
1414
+ /**
1415
+ * if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)
1416
+ * if join breakout from main session, need to query main locus url (if response with 403 means no privilege, need to clear the cache)
1417
+ * @param {Object} newLocus
1418
+ * @returns {Object}
1419
+ * @memberof LocusInfo
1420
+ */
1421
+ getTheLocusToUpdate(newLocus: any) {
1422
+ const switchStatus = ControlsUtils.getSessionSwitchStatus(this.controls, newLocus.controls);
1423
+ if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {
1424
+ return cloneDeep(this.mainSessionLocusCache);
1425
+ }
1426
+ if (switchStatus.isJoinToBreakout) {
1427
+ this.emitScoped(
1428
+ {
1429
+ file: 'locus-info',
1430
+ function: 'updateControls',
1431
+ },
1432
+ LOCUSINFO.EVENTS.CONTROLS_JOIN_BREAKOUT_FROM_MAIN,
1433
+ {
1434
+ mainLocusUrl: this.url,
1435
+ }
1436
+ );
1437
+ }
1438
+
1439
+ return newLocus;
1440
+ }
1441
+
1442
+ /**
1443
+ * merge participants by participant id
1444
+ * @param {Array} participants
1445
+ * @param {Array} sourceParticipants
1446
+ * @returns {Array} merged participants
1447
+ * @memberof LocusInfo
1448
+ */
1449
+ // eslint-disable-next-line class-methods-use-this
1450
+ mergeParticipants(participants, sourceParticipants) {
1451
+ if (!sourceParticipants || !sourceParticipants.length) return participants;
1452
+ if (!participants || !participants.length) {
1453
+ return sourceParticipants;
1454
+ }
1455
+ sourceParticipants.forEach((participant) => {
1456
+ const existIndex = participants.findIndex((p) => p.id === participant.id);
1457
+ if (existIndex > -1) {
1458
+ participants.splice(existIndex, 1, participant);
1459
+ } else {
1460
+ participants.push(participant);
1461
+ }
1462
+ });
1463
+
1464
+ return participants;
1465
+ }
1466
+
1467
+ /**
1468
+ * need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout
1469
+ * @param {Object} mainLocus
1470
+ * @returns {undefined}
1471
+ * @memberof LocusInfo
1472
+ */
1473
+ updateMainSessionLocusCache(mainLocus: any) {
1474
+ if (!mainLocus) {
1475
+ return;
1476
+ }
1477
+ const locusClone = cloneDeep(mainLocus);
1478
+ if (this.mainSessionLocusCache) {
1479
+ // eslint-disable-next-line consistent-return
1480
+ mergeWith(this.mainSessionLocusCache, locusClone, (objValue, srcValue, key) => {
1481
+ if (isArray(objValue)) {
1482
+ if (key === 'participants') {
1483
+ return this.mergeParticipants(objValue, srcValue);
1484
+ }
1485
+
1486
+ return srcValue; // just replace the old ones
1487
+ }
1488
+ });
1489
+ } else {
1490
+ this.mainSessionLocusCache = locusClone;
1491
+ }
1492
+ }
1493
+
1494
+ /**
1495
+ * clear main session cache
1496
+ * @returns {undefined}
1497
+ * @memberof LocusInfo
1498
+ */
1499
+ clearMainSessionLocusCache() {
1500
+ this.mainSessionLocusCache = null;
1501
+ }
1288
1502
  }
@@ -29,13 +29,22 @@ InfoUtils.parse = (info, roles, isJoined = true) => {
29
29
  parsed.meetingNumber = info.meetingId;
30
30
  }
31
31
 
32
+ if (info.datachannelUrl) {
33
+ parsed.datachannelUrl = info.datachannelUrl;
34
+ }
35
+
32
36
  return parsed;
33
37
  };
34
38
 
35
39
  InfoUtils.parseDisplayHintSection = (info, displayHintKey) => {
36
40
  const displayHints = {};
37
41
 
38
- if (info && info.displayHints && info.displayHints[displayHintKey] && info.displayHints[displayHintKey].length > 0) {
42
+ if (
43
+ info &&
44
+ info.displayHints &&
45
+ info.displayHints[displayHintKey] &&
46
+ info.displayHints[displayHintKey].length > 0
47
+ ) {
39
48
  info.displayHints[displayHintKey].forEach((key) => {
40
49
  displayHints[key] = true;
41
50
  });
@@ -75,10 +84,13 @@ InfoUtils.getInfos = (oldInfo, newInfo, roles, isJoined) => {
75
84
  current.isLocked = InfoUtils.isLocked(current.policy);
76
85
  current.isUnlocked = InfoUtils.isUnlocked(current.policy);
77
86
 
78
- if (previous && previous.isUnlocked && current.isLocked || !previous && current.isLocked) {
87
+ if ((previous && previous.isUnlocked && current.isLocked) || (!previous && current.isLocked)) {
79
88
  updates.isLocked = current.isLocked;
80
89
  }
81
- if (previous && previous.isLocked && current.isUnlocked || !previous && current.isUnlocked) {
90
+ if (
91
+ (previous && previous.isLocked && current.isUnlocked) ||
92
+ (!previous && current.isUnlocked)
93
+ ) {
82
94
  updates.isUnlocked = current.isUnlocked;
83
95
  }
84
96
  }
@@ -86,7 +98,7 @@ InfoUtils.getInfos = (oldInfo, newInfo, roles, isJoined) => {
86
98
  return {
87
99
  previous,
88
100
  current,
89
- updates
101
+ updates,
90
102
  };
91
103
  };
92
104
 
@@ -12,13 +12,13 @@ MediaSharesUtils.parse = (mediaShares: object) => {
12
12
  return {
13
13
  content: {
14
14
  beneficiaryId: MediaSharesUtils.getContentBeneficiaryId(mediaShares),
15
- disposition: MediaSharesUtils.getContentDisposition(mediaShares)
15
+ disposition: MediaSharesUtils.getContentDisposition(mediaShares),
16
16
  },
17
17
  whiteboard: {
18
18
  beneficiaryId: MediaSharesUtils.getWhiteboardBeneficiaryId(mediaShares),
19
19
  disposition: MediaSharesUtils.getWhiteboardDisposition(mediaShares),
20
- resourceUrl: MediaSharesUtils.getWhiteboardResourceUrl(mediaShares)
21
- }
20
+ resourceUrl: MediaSharesUtils.getWhiteboardResourceUrl(mediaShares),
21
+ },
22
22
  };
23
23
  }
24
24
 
@@ -38,7 +38,7 @@ MediaSharesUtils.getMediaShares = (oldShare: object, newShare: object) => {
38
38
 
39
39
  return {
40
40
  previous,
41
- current
41
+ current,
42
42
  };
43
43
  };
44
44