@webex/plugin-meetings 3.0.0-beta.13 → 3.0.0-beta.131

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 (519) hide show
  1. package/README.md +45 -1
  2. package/UPGRADING.md +9 -9
  3. package/browsers.js +19 -24
  4. package/dist/annotation/annotation.types.js +7 -0
  5. package/dist/annotation/annotation.types.js.map +1 -0
  6. package/dist/annotation/constants.js +48 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +355 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +193 -0
  11. package/dist/breakouts/breakout.js.map +1 -0
  12. package/dist/breakouts/collection.js +23 -0
  13. package/dist/breakouts/collection.js.map +1 -0
  14. package/dist/breakouts/edit-lock-error.js +52 -0
  15. package/dist/breakouts/edit-lock-error.js.map +1 -0
  16. package/dist/breakouts/events.js +43 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +994 -0
  19. package/dist/breakouts/index.js.map +1 -0
  20. package/dist/breakouts/request.js +78 -0
  21. package/dist/breakouts/request.js.map +1 -0
  22. package/dist/breakouts/utils.js +67 -0
  23. package/dist/breakouts/utils.js.map +1 -0
  24. package/dist/common/browser-detection.js +1 -20
  25. package/dist/common/browser-detection.js.map +1 -1
  26. package/dist/common/collection.js +5 -20
  27. package/dist/common/collection.js.map +1 -1
  28. package/dist/common/config.js +0 -7
  29. package/dist/common/config.js.map +1 -1
  30. package/dist/common/errors/captcha-error.js +5 -26
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +5 -26
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +6 -27
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +5 -26
  37. package/dist/common/errors/media.js.map +1 -1
  38. package/dist/common/errors/parameter.js +5 -33
  39. package/dist/common/errors/parameter.js.map +1 -1
  40. package/dist/common/errors/password-error.js +5 -26
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +4 -25
  43. package/dist/common/errors/permission.js.map +1 -1
  44. package/dist/common/errors/reconnection-in-progress.js +0 -17
  45. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  46. package/dist/common/errors/reconnection.js +5 -26
  47. package/dist/common/errors/reconnection.js.map +1 -1
  48. package/dist/common/errors/stats.js +5 -26
  49. package/dist/common/errors/stats.js.map +1 -1
  50. package/dist/common/errors/webex-errors.js +6 -41
  51. package/dist/common/errors/webex-errors.js.map +1 -1
  52. package/dist/common/errors/webex-meetings-error.js +1 -24
  53. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  54. package/dist/common/events/events-scope.js +0 -22
  55. package/dist/common/events/events-scope.js.map +1 -1
  56. package/dist/common/events/events.js +0 -23
  57. package/dist/common/events/events.js.map +1 -1
  58. package/dist/common/events/trigger-proxy.js +0 -12
  59. package/dist/common/events/trigger-proxy.js.map +1 -1
  60. package/dist/common/events/util.js +0 -15
  61. package/dist/common/events/util.js.map +1 -1
  62. package/dist/common/logs/logger-config.js +0 -4
  63. package/dist/common/logs/logger-config.js.map +1 -1
  64. package/dist/common/logs/logger-proxy.js +1 -8
  65. package/dist/common/logs/logger-proxy.js.map +1 -1
  66. package/dist/common/logs/request.js +35 -61
  67. package/dist/common/logs/request.js.map +1 -1
  68. package/dist/common/queue.js +4 -14
  69. package/dist/common/queue.js.map +1 -1
  70. package/dist/config.js +6 -6
  71. package/dist/config.js.map +1 -1
  72. package/dist/constants.js +203 -53
  73. package/dist/constants.js.map +1 -1
  74. package/dist/controls-options-manager/constants.js +14 -0
  75. package/dist/controls-options-manager/constants.js.map +1 -0
  76. package/dist/controls-options-manager/enums.js +27 -0
  77. package/dist/controls-options-manager/enums.js.map +1 -0
  78. package/dist/controls-options-manager/index.js +297 -0
  79. package/dist/controls-options-manager/index.js.map +1 -0
  80. package/dist/controls-options-manager/types.js +7 -0
  81. package/dist/controls-options-manager/types.js.map +1 -0
  82. package/dist/controls-options-manager/util.js +294 -0
  83. package/dist/controls-options-manager/util.js.map +1 -0
  84. package/dist/index.js +72 -17
  85. package/dist/index.js.map +1 -1
  86. package/dist/locus-info/controlsUtils.js +100 -29
  87. package/dist/locus-info/controlsUtils.js.map +1 -1
  88. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  89. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  90. package/dist/locus-info/fullState.js +0 -15
  91. package/dist/locus-info/fullState.js.map +1 -1
  92. package/dist/locus-info/hostUtils.js +4 -12
  93. package/dist/locus-info/hostUtils.js.map +1 -1
  94. package/dist/locus-info/index.js +406 -216
  95. package/dist/locus-info/index.js.map +1 -1
  96. package/dist/locus-info/infoUtils.js +0 -38
  97. package/dist/locus-info/infoUtils.js.map +1 -1
  98. package/dist/locus-info/mediaSharesUtils.js +54 -38
  99. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  100. package/dist/locus-info/parser.js +88 -123
  101. package/dist/locus-info/parser.js.map +1 -1
  102. package/dist/locus-info/selfUtils.js +105 -91
  103. package/dist/locus-info/selfUtils.js.map +1 -1
  104. package/dist/media/index.js +55 -165
  105. package/dist/media/index.js.map +1 -1
  106. package/dist/media/properties.js +71 -117
  107. package/dist/media/properties.js.map +1 -1
  108. package/dist/media/util.js +2 -9
  109. package/dist/media/util.js.map +1 -1
  110. package/dist/mediaQualityMetrics/config.js +505 -495
  111. package/dist/mediaQualityMetrics/config.js.map +1 -1
  112. package/dist/meeting/in-meeting-actions.js +77 -14
  113. package/dist/meeting/in-meeting-actions.js.map +1 -1
  114. package/dist/meeting/index.js +2603 -2462
  115. package/dist/meeting/index.js.map +1 -1
  116. package/dist/meeting/locusMediaRequest.js +291 -0
  117. package/dist/meeting/locusMediaRequest.js.map +1 -0
  118. package/dist/meeting/muteState.js +292 -138
  119. package/dist/meeting/muteState.js.map +1 -1
  120. package/dist/meeting/request.js +315 -336
  121. package/dist/meeting/request.js.map +1 -1
  122. package/dist/meeting/request.type.js +7 -0
  123. package/dist/meeting/request.type.js.map +1 -0
  124. package/dist/meeting/state.js +21 -31
  125. package/dist/meeting/state.js.map +1 -1
  126. package/dist/meeting/util.js +463 -583
  127. package/dist/meeting/util.js.map +1 -1
  128. package/dist/meeting-info/collection.js +3 -25
  129. package/dist/meeting-info/collection.js.map +1 -1
  130. package/dist/meeting-info/index.js +10 -33
  131. package/dist/meeting-info/index.js.map +1 -1
  132. package/dist/meeting-info/meeting-info-v2.js +305 -286
  133. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  134. package/dist/meeting-info/request.js +1 -16
  135. package/dist/meeting-info/request.js.map +1 -1
  136. package/dist/meeting-info/util.js +98 -183
  137. package/dist/meeting-info/util.js.map +1 -1
  138. package/dist/meeting-info/utilv2.js +156 -232
  139. package/dist/meeting-info/utilv2.js.map +1 -1
  140. package/dist/meetings/collection.js +24 -20
  141. package/dist/meetings/collection.js.map +1 -1
  142. package/dist/meetings/index.js +692 -593
  143. package/dist/meetings/index.js.map +1 -1
  144. package/dist/meetings/request.js +23 -42
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +186 -155
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.js +89 -88
  149. package/dist/member/index.js.map +1 -1
  150. package/dist/member/types.js +15 -0
  151. package/dist/member/types.js.map +1 -0
  152. package/dist/member/util.js +101 -69
  153. package/dist/member/util.js.map +1 -1
  154. package/dist/members/collection.js +12 -12
  155. package/dist/members/collection.js.map +1 -1
  156. package/dist/members/index.js +166 -205
  157. package/dist/members/index.js.map +1 -1
  158. package/dist/members/request.js +120 -85
  159. package/dist/members/request.js.map +1 -1
  160. package/dist/members/types.js +15 -0
  161. package/dist/members/types.js.map +1 -0
  162. package/dist/members/util.js +314 -260
  163. package/dist/members/util.js.map +1 -1
  164. package/dist/metrics/config.js +50 -16
  165. package/dist/metrics/config.js.map +1 -1
  166. package/dist/metrics/constants.js +4 -7
  167. package/dist/metrics/constants.js.map +1 -1
  168. package/dist/metrics/index.js +93 -162
  169. package/dist/metrics/index.js.map +1 -1
  170. package/dist/multistream/mediaRequestManager.js +167 -50
  171. package/dist/multistream/mediaRequestManager.js.map +1 -1
  172. package/dist/multistream/receiveSlot.js +58 -65
  173. package/dist/multistream/receiveSlot.js.map +1 -1
  174. package/dist/multistream/receiveSlotManager.js +74 -93
  175. package/dist/multistream/receiveSlotManager.js.map +1 -1
  176. package/dist/multistream/remoteMedia.js +55 -74
  177. package/dist/multistream/remoteMedia.js.map +1 -1
  178. package/dist/multistream/remoteMediaGroup.js +6 -40
  179. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  180. package/dist/multistream/remoteMediaManager.js +466 -442
  181. package/dist/multistream/remoteMediaManager.js.map +1 -1
  182. package/dist/networkQualityMonitor/index.js +32 -59
  183. package/dist/networkQualityMonitor/index.js.map +1 -1
  184. package/dist/personal-meeting-room/index.js +10 -45
  185. package/dist/personal-meeting-room/index.js.map +1 -1
  186. package/dist/personal-meeting-room/request.js +2 -33
  187. package/dist/personal-meeting-room/request.js.map +1 -1
  188. package/dist/personal-meeting-room/util.js +0 -13
  189. package/dist/personal-meeting-room/util.js.map +1 -1
  190. package/dist/reachability/index.js +190 -199
  191. package/dist/reachability/index.js.map +1 -1
  192. package/dist/reachability/request.js +14 -23
  193. package/dist/reachability/request.js.map +1 -1
  194. package/dist/reactions/constants.js +13 -0
  195. package/dist/reactions/constants.js.map +1 -0
  196. package/dist/reactions/reactions.js +2 -4
  197. package/dist/reactions/reactions.js.map +1 -1
  198. package/dist/reactions/reactions.type.js +19 -23
  199. package/dist/reactions/reactions.type.js.map +1 -1
  200. package/dist/reconnection-manager/index.js +326 -465
  201. package/dist/reconnection-manager/index.js.map +1 -1
  202. package/dist/recording-controller/enums.js +17 -0
  203. package/dist/recording-controller/enums.js.map +1 -0
  204. package/dist/recording-controller/index.js +343 -0
  205. package/dist/recording-controller/index.js.map +1 -0
  206. package/dist/recording-controller/util.js +63 -0
  207. package/dist/recording-controller/util.js.map +1 -0
  208. package/dist/roap/index.js +31 -75
  209. package/dist/roap/index.js.map +1 -1
  210. package/dist/roap/request.js +129 -136
  211. package/dist/roap/request.js.map +1 -1
  212. package/dist/roap/turnDiscovery.js +143 -103
  213. package/dist/roap/turnDiscovery.js.map +1 -1
  214. package/dist/statsAnalyzer/global.js +1 -95
  215. package/dist/statsAnalyzer/global.js.map +1 -1
  216. package/dist/statsAnalyzer/index.js +369 -461
  217. package/dist/statsAnalyzer/index.js.map +1 -1
  218. package/dist/statsAnalyzer/mqaUtil.js +144 -94
  219. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  220. package/dist/transcription/index.js +13 -45
  221. package/dist/transcription/index.js.map +1 -1
  222. package/dist/types/annotation/annotation.types.d.ts +35 -0
  223. package/dist/types/annotation/constants.d.ts +31 -0
  224. package/dist/types/annotation/index.d.ts +124 -0
  225. package/dist/types/breakouts/breakout.d.ts +8 -0
  226. package/dist/types/breakouts/collection.d.ts +5 -0
  227. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  228. package/dist/types/breakouts/events.d.ts +2 -0
  229. package/dist/types/breakouts/index.d.ts +5 -0
  230. package/dist/types/breakouts/request.d.ts +22 -0
  231. package/dist/types/breakouts/utils.d.ts +15 -0
  232. package/dist/types/common/browser-detection.d.ts +9 -0
  233. package/dist/types/common/collection.d.ts +48 -0
  234. package/dist/types/common/config.d.ts +2 -0
  235. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  236. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  237. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  238. package/dist/types/common/errors/media.d.ts +15 -0
  239. package/dist/types/common/errors/parameter.d.ts +15 -0
  240. package/dist/types/common/errors/password-error.d.ts +15 -0
  241. package/dist/types/common/errors/permission.d.ts +14 -0
  242. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  243. package/dist/types/common/errors/reconnection.d.ts +15 -0
  244. package/dist/types/common/errors/stats.d.ts +15 -0
  245. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  246. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  247. package/dist/types/common/events/events-scope.d.ts +17 -0
  248. package/dist/types/common/events/events.d.ts +12 -0
  249. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  250. package/dist/types/common/events/util.d.ts +2 -0
  251. package/dist/types/common/logs/logger-config.d.ts +2 -0
  252. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  253. package/dist/types/common/logs/request.d.ts +34 -0
  254. package/dist/types/common/queue.d.ts +32 -0
  255. package/dist/types/config.d.ts +78 -0
  256. package/dist/types/constants.d.ts +993 -0
  257. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  258. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  259. package/dist/types/controls-options-manager/index.d.ts +136 -0
  260. package/dist/types/controls-options-manager/types.d.ts +43 -0
  261. package/dist/types/controls-options-manager/util.d.ts +1 -0
  262. package/dist/types/index.d.ts +7 -0
  263. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  264. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  265. package/dist/types/locus-info/fullState.d.ts +2 -0
  266. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  267. package/dist/types/locus-info/index.d.ts +315 -0
  268. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  269. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  270. package/dist/types/locus-info/parser.d.ts +212 -0
  271. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  272. package/dist/types/media/index.d.ts +34 -0
  273. package/dist/types/media/properties.d.ts +108 -0
  274. package/dist/types/media/util.d.ts +2 -0
  275. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  276. package/dist/types/meeting/in-meeting-actions.d.ts +147 -0
  277. package/dist/types/meeting/index.d.ts +1762 -0
  278. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  279. package/dist/types/meeting/muteState.d.ts +186 -0
  280. package/dist/types/meeting/request.d.ts +269 -0
  281. package/dist/types/meeting/request.type.d.ts +11 -0
  282. package/dist/types/meeting/state.d.ts +9 -0
  283. package/dist/types/meeting/util.d.ts +76 -0
  284. package/dist/types/meeting-info/collection.d.ts +20 -0
  285. package/dist/types/meeting-info/index.d.ts +57 -0
  286. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  287. package/dist/types/meeting-info/request.d.ts +22 -0
  288. package/dist/types/meeting-info/util.d.ts +2 -0
  289. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  290. package/dist/types/meetings/collection.d.ts +31 -0
  291. package/dist/types/meetings/index.d.ts +345 -0
  292. package/dist/types/meetings/request.d.ts +27 -0
  293. package/dist/types/meetings/util.d.ts +18 -0
  294. package/dist/types/member/index.d.ts +157 -0
  295. package/dist/types/member/types.d.ts +21 -0
  296. package/dist/types/member/util.d.ts +2 -0
  297. package/dist/types/members/collection.d.ts +29 -0
  298. package/dist/types/members/index.d.ts +353 -0
  299. package/dist/types/members/request.d.ts +114 -0
  300. package/dist/types/members/types.d.ts +24 -0
  301. package/dist/types/members/util.d.ts +210 -0
  302. package/dist/types/metrics/config.d.ts +195 -0
  303. package/dist/types/metrics/constants.d.ts +55 -0
  304. package/dist/types/metrics/index.d.ts +169 -0
  305. package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
  306. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  307. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  308. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  309. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  310. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  311. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  312. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  313. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  314. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  315. package/dist/types/reachability/index.d.ts +152 -0
  316. package/dist/types/reachability/request.d.ts +37 -0
  317. package/dist/types/reactions/constants.d.ts +3 -0
  318. package/dist/types/reactions/reactions.d.ts +4 -0
  319. package/dist/types/reactions/reactions.type.d.ts +52 -0
  320. package/dist/types/reconnection-manager/index.d.ts +126 -0
  321. package/dist/types/recording-controller/enums.d.ts +7 -0
  322. package/dist/types/recording-controller/index.d.ts +193 -0
  323. package/dist/types/recording-controller/util.d.ts +13 -0
  324. package/dist/types/roap/index.d.ts +77 -0
  325. package/dist/types/roap/request.d.ts +36 -0
  326. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  327. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  328. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  329. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  330. package/dist/types/transcription/index.d.ts +64 -0
  331. package/internal-README.md +7 -6
  332. package/package.json +28 -21
  333. package/src/annotation/annotation.types.ts +42 -0
  334. package/src/annotation/constants.ts +36 -0
  335. package/src/annotation/index.ts +339 -0
  336. package/src/breakouts/README.md +220 -0
  337. package/src/breakouts/breakout.ts +163 -0
  338. package/src/breakouts/collection.ts +19 -0
  339. package/src/breakouts/edit-lock-error.ts +25 -0
  340. package/src/breakouts/events.ts +37 -0
  341. package/src/breakouts/index.ts +860 -0
  342. package/src/breakouts/request.ts +55 -0
  343. package/src/breakouts/utils.ts +57 -0
  344. package/src/common/browser-detection.ts +9 -6
  345. package/src/common/collection.ts +3 -1
  346. package/src/common/errors/captcha-error.ts +6 -6
  347. package/src/common/errors/intent-to-join.ts +6 -6
  348. package/src/common/errors/join-meeting.ts +12 -8
  349. package/src/common/errors/media.ts +6 -6
  350. package/src/common/errors/parameter.ts +9 -6
  351. package/src/common/errors/password-error.ts +6 -6
  352. package/src/common/errors/permission.ts +5 -5
  353. package/src/common/errors/reconnection.ts +6 -6
  354. package/src/common/errors/stats.ts +6 -6
  355. package/src/common/errors/webex-errors.ts +7 -5
  356. package/src/common/errors/webex-meetings-error.ts +1 -1
  357. package/src/common/events/events-scope.ts +5 -1
  358. package/src/common/events/events.ts +5 -1
  359. package/src/common/events/trigger-proxy.ts +8 -3
  360. package/src/common/events/util.ts +1 -2
  361. package/src/common/logs/logger-proxy.ts +21 -10
  362. package/src/common/logs/request.ts +11 -8
  363. package/src/config.ts +16 -12
  364. package/src/constants.ts +153 -7
  365. package/src/controls-options-manager/constants.ts +5 -0
  366. package/src/controls-options-manager/enums.ts +18 -0
  367. package/src/controls-options-manager/index.ts +278 -0
  368. package/src/controls-options-manager/types.ts +59 -0
  369. package/src/controls-options-manager/util.ts +281 -0
  370. package/src/index.ts +33 -0
  371. package/src/locus-info/controlsUtils.ts +142 -24
  372. package/src/locus-info/fullState.ts +15 -11
  373. package/src/locus-info/hostUtils.ts +4 -3
  374. package/src/locus-info/index.ts +346 -55
  375. package/src/locus-info/infoUtils.ts +12 -4
  376. package/src/locus-info/mediaSharesUtils.ts +52 -4
  377. package/src/locus-info/parser.ts +46 -68
  378. package/src/locus-info/selfUtils.ts +195 -56
  379. package/src/media/index.ts +139 -196
  380. package/src/media/properties.ts +43 -36
  381. package/src/media/util.ts +1 -1
  382. package/src/mediaQualityMetrics/config.ts +380 -378
  383. package/src/meeting/in-meeting-actions.ts +159 -3
  384. package/src/meeting/index.ts +2803 -1584
  385. package/src/meeting/locusMediaRequest.ts +309 -0
  386. package/src/meeting/muteState.ts +290 -72
  387. package/src/meeting/request.ts +247 -178
  388. package/src/meeting/request.type.ts +13 -0
  389. package/src/meeting/state.ts +45 -30
  390. package/src/meeting/util.ts +445 -395
  391. package/src/meeting-info/collection.ts +2 -1
  392. package/src/meeting-info/index.ts +32 -30
  393. package/src/meeting-info/meeting-info-v2.ts +235 -116
  394. package/src/meeting-info/request.ts +9 -3
  395. package/src/meeting-info/util.ts +54 -46
  396. package/src/meeting-info/utilv2.ts +71 -55
  397. package/src/meetings/collection.ts +21 -1
  398. package/src/meetings/index.ts +772 -437
  399. package/src/meetings/request.ts +29 -25
  400. package/src/meetings/util.ts +132 -33
  401. package/src/member/index.ts +95 -49
  402. package/src/member/types.ts +24 -0
  403. package/src/member/util.ts +106 -13
  404. package/src/members/collection.ts +8 -1
  405. package/src/members/index.ts +288 -130
  406. package/src/members/request.ts +144 -31
  407. package/src/members/types.ts +28 -0
  408. package/src/members/util.ts +316 -235
  409. package/src/metrics/config.ts +302 -90
  410. package/src/metrics/constants.ts +2 -6
  411. package/src/metrics/index.ts +124 -95
  412. package/src/multistream/mediaRequestManager.ts +203 -45
  413. package/src/multistream/receiveSlot.ts +69 -26
  414. package/src/multistream/receiveSlotManager.ts +62 -38
  415. package/src/multistream/remoteMedia.ts +30 -4
  416. package/src/multistream/remoteMediaGroup.ts +4 -3
  417. package/src/multistream/remoteMediaManager.ts +230 -66
  418. package/src/networkQualityMonitor/index.ts +24 -27
  419. package/src/personal-meeting-room/index.ts +12 -16
  420. package/src/personal-meeting-room/request.ts +10 -3
  421. package/src/personal-meeting-room/util.ts +3 -3
  422. package/src/reachability/index.ts +131 -79
  423. package/src/reachability/request.ts +43 -34
  424. package/src/reactions/constants.ts +4 -0
  425. package/src/reactions/reactions.ts +8 -8
  426. package/src/reactions/reactions.type.ts +31 -5
  427. package/src/reconnection-manager/index.ts +193 -111
  428. package/src/recording-controller/enums.ts +8 -0
  429. package/src/recording-controller/index.ts +315 -0
  430. package/src/recording-controller/util.ts +58 -0
  431. package/src/roap/index.ts +53 -53
  432. package/src/roap/request.ts +77 -64
  433. package/src/roap/turnDiscovery.ts +101 -48
  434. package/src/statsAnalyzer/global.ts +8 -104
  435. package/src/statsAnalyzer/index.ts +624 -376
  436. package/src/statsAnalyzer/mqaUtil.ts +203 -90
  437. package/src/transcription/index.ts +34 -32
  438. package/test/integration/spec/converged-space-meetings.js +177 -0
  439. package/test/integration/spec/journey.js +670 -466
  440. package/test/integration/spec/space-meeting.js +320 -204
  441. package/test/integration/spec/transcription.js +7 -8
  442. package/test/unit/spec/annotation/index.ts +433 -0
  443. package/test/unit/spec/breakouts/breakout.ts +203 -0
  444. package/test/unit/spec/breakouts/collection.ts +15 -0
  445. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  446. package/test/unit/spec/breakouts/events.ts +77 -0
  447. package/test/unit/spec/breakouts/index.ts +1609 -0
  448. package/test/unit/spec/breakouts/request.ts +104 -0
  449. package/test/unit/spec/breakouts/utils.js +72 -0
  450. package/test/unit/spec/common/browser-detection.js +9 -28
  451. package/test/unit/spec/controls-options-manager/index.js +287 -0
  452. package/test/unit/spec/controls-options-manager/util.js +504 -0
  453. package/test/unit/spec/fixture/locus.js +93 -90
  454. package/test/unit/spec/locus-info/controlsUtils.js +305 -32
  455. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  456. package/test/unit/spec/locus-info/index.js +636 -5
  457. package/test/unit/spec/locus-info/infoUtils.js +26 -33
  458. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  459. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  460. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  461. package/test/unit/spec/locus-info/parser.js +3 -9
  462. package/test/unit/spec/locus-info/selfConstant.js +110 -103
  463. package/test/unit/spec/locus-info/selfUtils.js +252 -12
  464. package/test/unit/spec/media/index.ts +104 -8
  465. package/test/unit/spec/media/properties.ts +9 -9
  466. package/test/unit/spec/meeting/in-meeting-actions.ts +76 -3
  467. package/test/unit/spec/meeting/index.js +3112 -921
  468. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  469. package/test/unit/spec/meeting/muteState.js +421 -94
  470. package/test/unit/spec/meeting/request.js +421 -79
  471. package/test/unit/spec/meeting/utils.js +326 -189
  472. package/test/unit/spec/meeting-info/meetinginfov2.js +481 -76
  473. package/test/unit/spec/meeting-info/request.js +7 -9
  474. package/test/unit/spec/meeting-info/util.js +11 -12
  475. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  476. package/test/unit/spec/meetings/collection.js +15 -1
  477. package/test/unit/spec/meetings/index.js +1126 -328
  478. package/test/unit/spec/meetings/utils.js +220 -14
  479. package/test/unit/spec/member/index.js +24 -1
  480. package/test/unit/spec/member/util.js +383 -32
  481. package/test/unit/spec/members/index.js +424 -55
  482. package/test/unit/spec/members/request.js +228 -40
  483. package/test/unit/spec/members/utils.js +191 -4
  484. package/test/unit/spec/metrics/index.js +113 -20
  485. package/test/unit/spec/multistream/mediaRequestManager.ts +650 -105
  486. package/test/unit/spec/multistream/receiveSlot.ts +76 -17
  487. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  488. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  489. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  490. package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
  491. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  492. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  493. package/test/unit/spec/reachability/index.ts +176 -27
  494. package/test/unit/spec/reachability/request.js +66 -0
  495. package/test/unit/spec/reconnection-manager/index.js +62 -31
  496. package/test/unit/spec/recording-controller/index.js +231 -0
  497. package/test/unit/spec/recording-controller/util.js +102 -0
  498. package/test/unit/spec/roap/index.ts +19 -49
  499. package/test/unit/spec/roap/request.ts +187 -0
  500. package/test/unit/spec/roap/turnDiscovery.ts +92 -50
  501. package/test/unit/spec/stats-analyzer/index.js +116 -60
  502. package/test/utils/cmr.js +44 -42
  503. package/test/utils/constants.js +9 -0
  504. package/test/utils/integrationTestUtils.js +64 -0
  505. package/test/utils/testUtils.js +63 -99
  506. package/test/utils/webex-config.js +22 -18
  507. package/test/utils/webex-test-users.js +57 -50
  508. package/tsconfig.json +6 -0
  509. package/dist/media/internal-media-core-wrapper.js +0 -22
  510. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  511. package/dist/meeting/effectsState.js +0 -334
  512. package/dist/meeting/effectsState.js.map +0 -1
  513. package/dist/multistream/multistreamMedia.js +0 -116
  514. package/dist/multistream/multistreamMedia.js.map +0 -1
  515. package/src/index.js +0 -15
  516. package/src/media/internal-media-core-wrapper.ts +0 -9
  517. package/src/meeting/effectsState.ts +0 -211
  518. package/src/multistream/multistreamMedia.ts +0 -92
  519. package/test/unit/spec/meeting/effectsState.js +0 -291
@@ -18,7 +18,8 @@ import {
18
18
  DISPLAY_HINTS,
19
19
  } from '../../../../src/constants';
20
20
 
21
- import {self, selfWithInactivity} from './selfConstant';
21
+ import { self, selfWithInactivity } from "./selfConstant";
22
+ import uuid from "uuid";
22
23
 
23
24
  describe('plugin-meetings', () => {
24
25
  describe('LocusInfo index', () => {
@@ -66,8 +67,12 @@ describe('plugin-meetings', () => {
66
67
 
67
68
  beforeEach('setup new controls', () => {
68
69
  newControls = {
70
+ disallowUnmute: {enabled: true},
69
71
  lock: {},
70
72
  meetingFull: {},
73
+ muteOnEntry: {enabled: true},
74
+ raiseHand: {enabled: true},
75
+ reactions: {enabled: true, showDisplayNameWithReactions: true},
71
76
  record: {
72
77
  recording: false,
73
78
  paused: false,
@@ -76,12 +81,14 @@ describe('plugin-meetings', () => {
76
81
  modifiedBy: 'George Kittle',
77
82
  },
78
83
  },
79
- shareControl: {},
84
+ shareControl: {control: 'example-value'},
80
85
  transcribe: {},
86
+ viewTheParticipantList: {enabled: true},
81
87
  meetingContainer: {
82
88
  meetingContainerUrl: 'http://new-url.com',
83
89
  },
84
90
  entryExitTone: {enabled: true, mode: 'foo'},
91
+ video: {enabled: true},
85
92
  };
86
93
  });
87
94
 
@@ -95,6 +102,97 @@ describe('plugin-meetings', () => {
95
102
  assert.equal(locusInfo.controls, newControls);
96
103
  });
97
104
 
105
+ it('should trigger the CONTROLS_MUTE_ON_ENTRY_CHANGED event when necessary', () => {
106
+ locusInfo.controls = {};
107
+ locusInfo.emitScoped = sinon.stub();
108
+ locusInfo.updateControls(newControls);
109
+
110
+ assert.calledWith(
111
+ locusInfo.emitScoped,
112
+ {file: 'locus-info', function: 'updateControls'},
113
+ LOCUSINFO.EVENTS.CONTROLS_MUTE_ON_ENTRY_CHANGED,
114
+ {state: newControls.muteOnEntry},
115
+ );
116
+ });
117
+
118
+ it('should trigger the CONTROLS_SHARE_CONTROL_CHANGED event when necessary', () => {
119
+ locusInfo.controls = {};
120
+ locusInfo.emitScoped = sinon.stub();
121
+ locusInfo.updateControls(newControls);
122
+
123
+ assert.calledWith(
124
+ locusInfo.emitScoped,
125
+ {file: 'locus-info', function: 'updateControls'},
126
+ LOCUSINFO.EVENTS.CONTROLS_SHARE_CONTROL_CHANGED,
127
+ {state: newControls.shareControl},
128
+ );
129
+ });
130
+
131
+ it('should trigger the CONTROLS_DISALLOW_UNMUTE_CHANGED event when necessary', () => {
132
+ locusInfo.controls = {};
133
+ locusInfo.emitScoped = sinon.stub();
134
+ locusInfo.updateControls(newControls);
135
+
136
+ assert.calledWith(
137
+ locusInfo.emitScoped,
138
+ {file: 'locus-info', function: 'updateControls'},
139
+ LOCUSINFO.EVENTS.CONTROLS_DISALLOW_UNMUTE_CHANGED,
140
+ {state: newControls.disallowUnmute},
141
+ );
142
+ });
143
+
144
+ it('should trigger the CONTROLS_REACTIONS_CHANGED event when necessary', () => {
145
+ locusInfo.controls = {};
146
+ locusInfo.emitScoped = sinon.stub();
147
+ locusInfo.updateControls(newControls);
148
+
149
+ assert.calledWith(
150
+ locusInfo.emitScoped,
151
+ {file: 'locus-info', function: 'updateControls'},
152
+ LOCUSINFO.EVENTS.CONTROLS_REACTIONS_CHANGED,
153
+ {state: newControls.reactions},
154
+ );
155
+ });
156
+
157
+ it('should trigger the CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED event when necessary', () => {
158
+ locusInfo.controls = {};
159
+ locusInfo.emitScoped = sinon.stub();
160
+ locusInfo.updateControls(newControls);
161
+
162
+ assert.calledWith(
163
+ locusInfo.emitScoped,
164
+ {file: 'locus-info', function: 'updateControls'},
165
+ LOCUSINFO.EVENTS.CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED,
166
+ {state: newControls.viewTheParticipantList},
167
+ );
168
+ });
169
+
170
+ it('should trigger the CONTROLS_RAISE_HAND_CHANGED event when necessary', () => {
171
+ locusInfo.controls = {};
172
+ locusInfo.emitScoped = sinon.stub();
173
+ locusInfo.updateControls(newControls);
174
+
175
+ assert.calledWith(
176
+ locusInfo.emitScoped,
177
+ {file: 'locus-info', function: 'updateControls'},
178
+ LOCUSINFO.EVENTS.CONTROLS_RAISE_HAND_CHANGED,
179
+ {state: newControls.raiseHand},
180
+ );
181
+ });
182
+
183
+ it('should trigger the CONTROLS_VIDEO_CHANGED event when necessary', () => {
184
+ locusInfo.controls = {};
185
+ locusInfo.emitScoped = sinon.stub();
186
+ locusInfo.updateControls(newControls);
187
+
188
+ assert.calledWith(
189
+ locusInfo.emitScoped,
190
+ {file: 'locus-info', function: 'updateControls'},
191
+ LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED,
192
+ {state: newControls.video},
193
+ );
194
+ });
195
+
98
196
  it('should not trigger the CONTROLS_RECORDING_UPDATED event', () => {
99
197
  locusInfo.controls = {};
100
198
  locusInfo.emitScoped = sinon.stub();
@@ -277,6 +375,28 @@ describe('plugin-meetings', () => {
277
375
  );
278
376
  });
279
377
 
378
+ it('should update the breakout state', () => {
379
+ locusInfo.emitScoped = sinon.stub();
380
+ let tmpStub = sinon.stub(SelfUtils, 'getReplacedBreakoutMoveId').returns('breakoutMoveId');
381
+ newControls.breakout = { 'breakout': {} };
382
+ let selfInfo = {};
383
+
384
+ locusInfo.updateControls(newControls, selfInfo);
385
+
386
+ assert.calledWith(
387
+ locusInfo.emitScoped,
388
+ {
389
+ file: 'locus-info',
390
+ function: 'updateControls',
391
+ },
392
+ LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED,
393
+ {
394
+ breakout: newControls.breakout,
395
+ }
396
+ );
397
+ tmpStub.restore();
398
+ });
399
+
280
400
  it('should update the transcript state', () => {
281
401
  locusInfo.emitScoped = sinon.stub();
282
402
  locusInfo.controls = {
@@ -398,6 +518,39 @@ describe('plugin-meetings', () => {
398
518
  assert.notEqual(x.args[1], LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED);
399
519
  });
400
520
  });
521
+
522
+ it('should update videoEnabled when changed', () => {
523
+ locusInfo.controls = {};
524
+
525
+ locusInfo.emitScoped = sinon.stub();
526
+ locusInfo.updateControls(newControls);
527
+
528
+ assert.calledWith(
529
+ locusInfo.emitScoped,
530
+ {
531
+ file: 'locus-info',
532
+ function: 'updateControls',
533
+ },
534
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
535
+ {unmuteAllowed: true}
536
+ );
537
+
538
+ assert.equal(mockMeeting.unmuteVideoAllowed, true);
539
+ });
540
+
541
+ it('should not update videoEnabled when unchanged', () => {
542
+ locusInfo.controls = {videoEnabled: true};
543
+
544
+ locusInfo.emitScoped = sinon.stub();
545
+ locusInfo.updateControls(newControls);
546
+
547
+ locusInfo.emitScoped.getCalls().forEach((x) => {
548
+ // check that no calls in emitScoped are for SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED
549
+ assert.notEqual(x.args[1], LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED);
550
+ });
551
+
552
+ assert.equal(mockMeeting.unmuteVideoAllowed, undefined);
553
+ });
401
554
  });
402
555
 
403
556
  describe('#updateParticipants()', () => {
@@ -451,6 +604,7 @@ describe('plugin-meetings', () => {
451
604
  selfIdentity: '123',
452
605
  selfId: '2',
453
606
  hostId: '3',
607
+ isReplace: undefined,
454
608
  }
455
609
  );
456
610
  // note: in a real use case, recordingId, selfId, and hostId would all be the same
@@ -458,6 +612,43 @@ describe('plugin-meetings', () => {
458
612
  // are being correctly grabbed from locusInfo.parsedLocus within updateParticipants
459
613
  });
460
614
 
615
+ it('should call with breakout control info', () => {
616
+ locusInfo.parsedLocus = {
617
+ controls: {
618
+ record: {
619
+ modifiedBy: '1',
620
+ },
621
+ },
622
+ self: {
623
+ selfIdentity: '123',
624
+ selfId: '2',
625
+ },
626
+ host: {
627
+ hostId: '3',
628
+ },
629
+ };
630
+
631
+ locusInfo.emitScoped = sinon.stub();
632
+ locusInfo.updateParticipants({}, true);
633
+
634
+ assert.calledWith(
635
+ locusInfo.emitScoped,
636
+ {
637
+ file: 'locus-info',
638
+ function: 'updateParticipants',
639
+ },
640
+ EVENTS.LOCUS_INFO_UPDATE_PARTICIPANTS,
641
+ {
642
+ participants: {},
643
+ recordingId: '1',
644
+ selfIdentity: '123',
645
+ selfId: '2',
646
+ hostId: '3',
647
+ isReplace: true,
648
+ }
649
+ );
650
+ });
651
+
461
652
  it('should update the deltaParticipants object', () => {
462
653
  const prev = locusInfo.deltaParticipants;
463
654
 
@@ -664,6 +855,143 @@ describe('plugin-meetings', () => {
664
855
  );
665
856
  });
666
857
 
858
+ describe('SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED', () => {
859
+ it('should emit event when video muted on entry', () => {
860
+ // usually "previous self" is just undefined when we get first self from locus
861
+ locusInfo.self = undefined;
862
+ const selfWithMutedByOthers = cloneDeep(self);
863
+
864
+ // remoteVideoMuted
865
+ selfWithMutedByOthers.controls.video.muted = true;
866
+
867
+ locusInfo.webex.internal.device.url = self.deviceUrl;
868
+ locusInfo.emitScoped = sinon.stub();
869
+ locusInfo.updateSelf(selfWithMutedByOthers, []);
870
+
871
+ assert.calledWith(
872
+ locusInfo.emitScoped,
873
+ {
874
+ file: 'locus-info',
875
+ function: 'updateSelf',
876
+ },
877
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
878
+ {muted: true}
879
+ );
880
+
881
+ // but sometimes "previous self" is defined, but without controls.audio.muted, so we test this here:
882
+ locusInfo.self = cloneDeep(self);
883
+ locusInfo.self.controls.video = {};
884
+
885
+ locusInfo.updateSelf(selfWithMutedByOthers, []);
886
+ assert.calledWith(
887
+ locusInfo.emitScoped,
888
+ {
889
+ file: 'locus-info',
890
+ function: 'updateSelf',
891
+ },
892
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
893
+ {muted: true}
894
+ );
895
+ });
896
+
897
+ it('should not emit event when not muted on entry', () => {
898
+ locusInfo.self = undefined;
899
+ const selfWithMutedByOthersFalse = cloneDeep(self);
900
+
901
+ selfWithMutedByOthersFalse.controls.video.muted = false;
902
+
903
+ locusInfo.webex.internal.device.url = self.deviceUrl;
904
+ locusInfo.emitScoped = sinon.stub();
905
+ locusInfo.updateSelf(selfWithMutedByOthersFalse, []);
906
+
907
+ // we might get some calls to emitScoped, but we need to check that none of them are for SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED
908
+ locusInfo.emitScoped.getCalls().forEach((x) => {
909
+ assert.notEqual(x.args[1], LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED);
910
+ });
911
+ });
912
+
913
+ it('should emit event when remoteVideoMuted changed', () => {
914
+ locusInfo.self = self;
915
+ const selfWithMutedByOthers = cloneDeep(self);
916
+
917
+ selfWithMutedByOthers.controls.video.muted = true;
918
+
919
+ locusInfo.webex.internal.device.url = self.deviceUrl;
920
+ locusInfo.emitScoped = sinon.stub();
921
+ locusInfo.updateSelf(selfWithMutedByOthers, []);
922
+
923
+ assert.calledWith(
924
+ locusInfo.emitScoped,
925
+ {
926
+ file: 'locus-info',
927
+ function: 'updateSelf',
928
+ },
929
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
930
+ {muted: true}
931
+ );
932
+ });
933
+ });
934
+
935
+ it('should trigger SELF_MEETING_BREAKOUTS_CHANGED when breakouts changed', () => {
936
+ locusInfo.self = self;
937
+ const selfWithBreakoutsChanged = cloneDeep(self);
938
+
939
+ selfWithBreakoutsChanged.controls.breakout.sessions.active[0].name = 'new name';
940
+
941
+ locusInfo.emitScoped = sinon.stub();
942
+ locusInfo.updateSelf(selfWithBreakoutsChanged, []);
943
+
944
+ assert.calledWith(
945
+ locusInfo.emitScoped,
946
+ {
947
+ file: 'locus-info',
948
+ function: 'updateSelf',
949
+ },
950
+ LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED,
951
+ {
952
+ breakoutSessions: {
953
+ active: [
954
+ {
955
+ name: 'new name',
956
+ groupId: '0e73abb8-5584-49d8-be8d-806d2a8247ca',
957
+ sessionId: '1cf41ab1-2e57-4d95-b7e9-5613acddfb0f',
958
+ sessionType: 'BREAKOUT',
959
+ },
960
+ ],
961
+ allowed: [
962
+ {
963
+ name: 'Breakout session 2',
964
+ groupId: '0e73abb8-5584-49d8-be8d-806d2a8247ca',
965
+ sessionId: '1cf41ab1-2e57-4d95-b7e9-5613acddfb0f',
966
+ sessionType: 'BREAKOUT',
967
+ },
968
+ ],
969
+ },
970
+ }
971
+ );
972
+ });
973
+
974
+ it('should trigger upgradeToModeratorOrCohost for breakouts', () => {
975
+
976
+ locusInfo.self = self;
977
+ const upgradeToModeratorOrCohost = cloneDeep(self);
978
+ upgradeToModeratorOrCohost.roles = ['ATTENDEE','COHOST'];
979
+
980
+ locusInfo.webex.internal.device.url = self.deviceUrl;
981
+ locusInfo.emitScoped = sinon.stub();
982
+ locusInfo.updateSelf(upgradeToModeratorOrCohost, []);
983
+
984
+ assert.neverCalledWith(
985
+ locusInfo.emitScoped,
986
+ {
987
+ file: 'locus-info',
988
+ function: 'updateSelf',
989
+ },
990
+ LOCUSINFO.EVENTS.SELF_MODERATOR_OR_COHOST_UPGRADE,
991
+ self
992
+ );
993
+ });
994
+
667
995
  it('should trigger SELF_REMOTE_MUTE_STATUS_UPDATED if muted and disallowUnmute changed', () => {
668
996
  locusInfo.self = self;
669
997
  const selfWithMutedByOthersAndDissalowUnmute = cloneDeep(self);
@@ -889,6 +1217,44 @@ describe('plugin-meetings', () => {
889
1217
  {isSharingBlocked: true}
890
1218
  );
891
1219
  });
1220
+
1221
+ it('should trigger SELF_ROLES_CHANGED if self roles changed', () => {
1222
+ locusInfo.self = self;
1223
+ locusInfo.emitScoped = sinon.stub();
1224
+ const sampleNewSelf = cloneDeep(self);
1225
+ sampleNewSelf.controls.role.roles = [{type: 'COHOST', hasRole: true}];
1226
+
1227
+ locusInfo.updateSelf(sampleNewSelf, []);
1228
+
1229
+ assert.calledWith(
1230
+ locusInfo.emitScoped,
1231
+ {
1232
+ file: 'locus-info',
1233
+ function: 'updateSelf',
1234
+ },
1235
+ LOCUSINFO.EVENTS.SELF_ROLES_CHANGED,
1236
+ {oldRoles: ['PRESENTER'], newRoles: ['COHOST']}
1237
+ );
1238
+ });
1239
+
1240
+ it('should not trigger SELF_ROLES_CHANGED if self roles not changed', () => {
1241
+ locusInfo.self = self;
1242
+ locusInfo.emitScoped = sinon.stub();
1243
+ const sampleNewSelf = cloneDeep(self);
1244
+ sampleNewSelf.controls.role.roles = [{type: 'PRESENTER', hasRole: true}];
1245
+
1246
+ locusInfo.updateSelf(sampleNewSelf, []);
1247
+
1248
+ assert.neverCalledWith(
1249
+ locusInfo.emitScoped,
1250
+ {
1251
+ file: 'locus-info',
1252
+ function: 'updateSelf',
1253
+ },
1254
+ LOCUSINFO.EVENTS.SELF_ROLES_CHANGED,
1255
+ {oldRoles: ['PRESENTER'], newRoles: ['PRESENTER']}
1256
+ );
1257
+ });
892
1258
  });
893
1259
 
894
1260
  describe('#updateMeetingInfo', () => {
@@ -962,18 +1328,36 @@ describe('plugin-meetings', () => {
962
1328
  function: 'updateMeetingInfo',
963
1329
  },
964
1330
  LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,
965
- {info: locusInfo.parsedLocus.info, self},
1331
+ {info: locusInfo.parsedLocus.info, self},
966
1332
  ];
967
1333
 
968
1334
  if (expected) {
969
1335
  assert.calledWith(...expectedArgs);
1336
+ } else {
1337
+ assert.neverCalledWith(...expectedArgs);
970
1338
  }
971
- else {
1339
+ locusInfo.emitScoped.resetHistory();
1340
+ };
1341
+
1342
+ const checkMeetingInfoUpdatedCalledForRoles = (expected) => {
1343
+ const expectedArgs = [
1344
+ locusInfo.emitScoped,
1345
+ {
1346
+ file: 'locus-info',
1347
+ function: 'updateMeetingInfo',
1348
+ },
1349
+ LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,
1350
+ ];
1351
+
1352
+ if (expected) {
1353
+ assert.calledWith(...expectedArgs);
1354
+ } else {
972
1355
  assert.neverCalledWith(...expectedArgs);
973
1356
  }
974
1357
  locusInfo.emitScoped.resetHistory();
975
1358
  };
976
1359
 
1360
+
977
1361
  it('emits MEETING_INFO_UPDATED if the info changes', () => {
978
1362
  const initialInfo = cloneDeep(meetingInfo);
979
1363
 
@@ -999,6 +1383,16 @@ describe('plugin-meetings', () => {
999
1383
 
1000
1384
  // since the info is the same it should not call trigger the event
1001
1385
  checkMeetingInfoUpdatedCalled(false);
1386
+
1387
+ // update it with the same info, but roles changed
1388
+ const updateSelf = cloneDeep(self);
1389
+ updateSelf?.controls?.role?.roles.push({
1390
+ type: 'COHOST',
1391
+ hasRole: true,
1392
+ });
1393
+ locusInfo.updateMeetingInfo(newInfo, updateSelf);
1394
+ // since the info is the same but roles changed, it should call trigger the event
1395
+ checkMeetingInfoUpdatedCalledForRoles(true);
1002
1396
  });
1003
1397
 
1004
1398
  it('gets roles from self if available', () => {
@@ -1104,6 +1498,7 @@ describe('plugin-meetings', () => {
1104
1498
  fakeLocus = {
1105
1499
  meeting: true,
1106
1500
  participants: true,
1501
+ url: 'newLocusUrl',
1107
1502
  };
1108
1503
  });
1109
1504
 
@@ -1148,6 +1543,55 @@ describe('plugin-meetings', () => {
1148
1543
  assert.isFunction(locusParser.onDeltaAction);
1149
1544
  });
1150
1545
 
1546
+ it('#updateLocusInfo ignores breakout LEFT message', () => {
1547
+ const newLocus = {
1548
+ self: {
1549
+ reason: 'MOVED',
1550
+ state: 'LEFT',
1551
+ },
1552
+ };
1553
+
1554
+ locusInfo.updateControls = sinon.stub();
1555
+ locusInfo.updateConversationUrl = sinon.stub();
1556
+ locusInfo.updateCreated = sinon.stub();
1557
+ locusInfo.updateFullState = sinon.stub();
1558
+ locusInfo.updateHostInfo = sinon.stub();
1559
+ locusInfo.updateMeetingInfo = sinon.stub();
1560
+ locusInfo.updateMediaShares = sinon.stub();
1561
+ locusInfo.updateParticipantsUrl = sinon.stub();
1562
+ locusInfo.updateReplace = sinon.stub();
1563
+ locusInfo.updateSelf = sinon.stub();
1564
+ locusInfo.updateLocusUrl = sinon.stub();
1565
+ locusInfo.updateAclUrl = sinon.stub();
1566
+ locusInfo.updateBasequence = sinon.stub();
1567
+ locusInfo.updateSequence = sinon.stub();
1568
+ locusInfo.updateMemberShip = sinon.stub();
1569
+ locusInfo.updateIdentifiers = sinon.stub();
1570
+ locusInfo.updateEmbeddedApps = sinon.stub();
1571
+ locusInfo.compareAndUpdate = sinon.stub();
1572
+
1573
+ locusInfo.updateLocusInfo(newLocus);
1574
+
1575
+ assert.notCalled(locusInfo.updateControls);
1576
+ assert.notCalled(locusInfo.updateConversationUrl);
1577
+ assert.notCalled(locusInfo.updateCreated);
1578
+ assert.notCalled(locusInfo.updateFullState);
1579
+ assert.notCalled(locusInfo.updateHostInfo);
1580
+ assert.notCalled(locusInfo.updateMeetingInfo);
1581
+ assert.notCalled(locusInfo.updateMediaShares);
1582
+ assert.notCalled(locusInfo.updateParticipantsUrl);
1583
+ assert.notCalled(locusInfo.updateReplace);
1584
+ assert.notCalled(locusInfo.updateSelf);
1585
+ assert.notCalled(locusInfo.updateLocusUrl);
1586
+ assert.notCalled(locusInfo.updateAclUrl);
1587
+ assert.notCalled(locusInfo.updateBasequence);
1588
+ assert.notCalled(locusInfo.updateSequence);
1589
+ assert.notCalled(locusInfo.updateMemberShip);
1590
+ assert.notCalled(locusInfo.updateIdentifiers);
1591
+ assert.notCalled(locusInfo.updateEmbeddedApps);
1592
+ assert.notCalled(locusInfo.compareAndUpdate);
1593
+ });
1594
+
1151
1595
  it('onFullLocus() updates the working-copy of locus parser', () => {
1152
1596
  const eventType = 'fakeEvent';
1153
1597
 
@@ -1197,12 +1641,18 @@ describe('plugin-meetings', () => {
1197
1641
  locusInfo: {
1198
1642
  onFullLocus: sandbox.stub(),
1199
1643
  },
1644
+ locusUrl: 'oldLocusUrl',
1200
1645
  };
1201
1646
 
1202
1647
  locusInfo.locusParser.resume = sandbox.stub();
1203
1648
  locusInfo.applyLocusDeltaData(DESYNC, fakeLocus, meeting);
1204
1649
 
1205
- assert.calledOnce(meeting.meetingRequest.getFullLocus);
1650
+ assert.calledOnceWithExactly(meeting.meetingRequest.getFullLocus,
1651
+ {
1652
+ desync: true,
1653
+ locusUrl: 'newLocusUrl',
1654
+ }
1655
+ );
1206
1656
  });
1207
1657
 
1208
1658
  it('getFullLocus handles DESYNC action correctly', () => {
@@ -1227,6 +1677,187 @@ describe('plugin-meetings', () => {
1227
1677
  assert.calledOnce(locusInfo.locusParser.resume);
1228
1678
  });
1229
1679
  });
1680
+
1681
+ it('onDeltaLocus handle delta data', () => {
1682
+ fakeLocus.participants = {};
1683
+ const fakeBreakout = {
1684
+ sessionId: 'sessionId',
1685
+ groupId: 'groupId',
1686
+ };
1687
+
1688
+ fakeLocus.controls = {
1689
+ breakout: fakeBreakout
1690
+ };
1691
+ locusInfo.controls = {
1692
+ breakout: {
1693
+ sessionId: 'sessionId',
1694
+ groupId: 'groupId',
1695
+ }
1696
+ }
1697
+ locusInfo.updateParticipants = sinon.stub();
1698
+ locusInfo.onDeltaLocus(fakeLocus);
1699
+ assert.calledWith(locusInfo.updateParticipants, {}, false);
1700
+
1701
+ fakeLocus.controls.breakout.sessionId = 'sessionId2';
1702
+ locusInfo.onDeltaLocus(fakeLocus);
1703
+ assert.calledWith(locusInfo.updateParticipants, {}, true);
1704
+ });
1705
+ });
1706
+
1707
+ describe('#updateLocusCache', () => {
1708
+ it('cache it if income locus is main session locus', () => {
1709
+ const locus = {url: 'url'};
1710
+ locusInfo.mainSessionLocusCache = null;
1711
+ locusInfo.updateLocusCache(locus);
1712
+
1713
+ assert.deepEqual(locusInfo.mainSessionLocusCache, locus);
1714
+ });
1715
+
1716
+ it('not cache it if income locus is breakout session locus', () => {
1717
+ const locus = {url: 'url', controls: {breakout: {sessionType: 'BREAKOUT'}}};
1718
+ locusInfo.mainSessionLocusCache = null;
1719
+ locusInfo.updateLocusCache(locus);
1720
+
1721
+ assert.isNull(locusInfo.mainSessionLocusCache);
1722
+ });
1723
+ });
1724
+
1725
+ describe('#getTheLocusToUpdate', () => {
1726
+ it('return the cache locus if return to main session', () => {
1727
+ locusInfo.mainSessionLocusCache = {url: 'url'};
1728
+ locusInfo.controls = {
1729
+ breakout: {
1730
+ sessionType: 'BREAKOUT'
1731
+ }
1732
+ }
1733
+ const newLocus = {
1734
+ controls: {
1735
+ breakout: {
1736
+ sessionType: 'MAIN',
1737
+ },
1738
+ },
1739
+ };
1740
+
1741
+ assert.deepEqual(locusInfo.getTheLocusToUpdate(newLocus), {url: 'url'});
1742
+ });
1743
+
1744
+ it('return the new locus if return to main session but no cache', () => {
1745
+ locusInfo.mainSessionLocusCache = null;
1746
+ locusInfo.controls = {
1747
+ breakout: {
1748
+ sessionType: 'BREAKOUT'
1749
+ }
1750
+ }
1751
+ const newLocus = {
1752
+ controls: {
1753
+ breakout: {
1754
+ sessionType: 'MAIN',
1755
+ },
1756
+ },
1757
+ };
1758
+
1759
+ assert.deepEqual(locusInfo.getTheLocusToUpdate(newLocus), newLocus);
1760
+ });
1761
+
1762
+ it('return the new locus if not return to main session', () => {
1763
+ locusInfo.mainSessionLocusCache = {url: 'url'};
1764
+ locusInfo.controls = {
1765
+ breakout: {
1766
+ sessionType: 'MAIN'
1767
+ }
1768
+ }
1769
+ const newLocus = {
1770
+ controls: {
1771
+ breakout: {
1772
+ sessionType: 'BREAKOUT',
1773
+ },
1774
+ },
1775
+ };
1776
+
1777
+ assert.deepEqual(locusInfo.getTheLocusToUpdate(newLocus), newLocus);
1778
+ });
1779
+ });
1780
+
1781
+ describe('#mergeParticipants', () => {
1782
+ let participants;
1783
+ let sourceParticipants;
1784
+ beforeEach(() => {
1785
+ participants = [{id: '111', status: 'JOINED'}, {id: '222'}];
1786
+ sourceParticipants = [{id: '111', status: 'LEFT'}, {id: '333'}];
1787
+ });
1788
+
1789
+ it('merge the participants, replace it by id if exist in old array', () => {
1790
+ const result = locusInfo.mergeParticipants(participants, sourceParticipants);
1791
+ assert.deepEqual(result, [{id: '111', status: 'LEFT'}, {id: '222'}, {id: '333'}]);
1792
+ });
1793
+
1794
+ it('return new participants if previous participants is empty', () => {
1795
+ const result = locusInfo.mergeParticipants([], sourceParticipants);
1796
+ assert.deepEqual(result, sourceParticipants);
1797
+ });
1798
+
1799
+ it('return new participants if previous participants is null/undefined', () => {
1800
+ let result = locusInfo.mergeParticipants(null, sourceParticipants);
1801
+ assert.deepEqual(result, sourceParticipants);
1802
+
1803
+ result = locusInfo.mergeParticipants(undefined, sourceParticipants);
1804
+ assert.deepEqual(result, sourceParticipants);
1805
+ });
1806
+
1807
+ it('return previous participants if new participants is empty', () => {
1808
+ const result = locusInfo.mergeParticipants(participants, []);
1809
+ assert.deepEqual(result, participants);
1810
+ });
1811
+
1812
+ it('return previous participants if new participants is null/undefined', () => {
1813
+ let result = locusInfo.mergeParticipants(participants, null);
1814
+ assert.deepEqual(result, participants);
1815
+
1816
+ result = locusInfo.mergeParticipants(participants, undefined);
1817
+ assert.deepEqual(result, participants);
1818
+ });
1819
+ });
1820
+
1821
+ describe('#updateMainSessionLocusCache', () => {
1822
+ let cachedLocus;
1823
+ let newLocus;
1824
+ beforeEach(() => {
1825
+ cachedLocus = {controls: {}, participants: [], info: {webExMeetingId: 'testId1', topic: 'test'}};
1826
+ newLocus = {self: {}, participants: [{id: '111'}], info: {testId: 'testId2', webExMeetingName: 'hello'}};
1827
+ });
1828
+ it('shallow merge new locus into cache', () => {
1829
+ locusInfo.mainSessionLocusCache = cachedLocus;
1830
+ locusInfo.updateMainSessionLocusCache(newLocus);
1831
+
1832
+ assert.deepEqual(locusInfo.mainSessionLocusCache, {
1833
+ controls: {},
1834
+ participants: [{id: '111'}],
1835
+ info: {testId: 'testId2', webExMeetingName: 'hello'},
1836
+ self: {},
1837
+ });
1838
+ });
1839
+
1840
+ it('cache new locus if no cache before', () => {
1841
+ locusInfo.mainSessionLocusCache = null;
1842
+ locusInfo.updateMainSessionLocusCache(newLocus);
1843
+
1844
+ assert.deepEqual(locusInfo.mainSessionLocusCache, newLocus);
1845
+ });
1846
+
1847
+ it('do nothing if new locus is null', () => {
1848
+ locusInfo.mainSessionLocusCache = cachedLocus;
1849
+ locusInfo.updateMainSessionLocusCache(null);
1850
+
1851
+ assert.deepEqual(locusInfo.mainSessionLocusCache, cachedLocus);
1852
+ });
1853
+ });
1854
+
1855
+ describe('#clearMainSessionLocusCache', () => {
1856
+ it('clear main session locus cache', () => {
1857
+ locusInfo.mainSessionLocusCache = {controls: {}};
1858
+ locusInfo.clearMainSessionLocusCache();
1859
+ assert.isNull(locusInfo.mainSessionLocusCache);
1860
+ })
1230
1861
  });
1231
1862
 
1232
1863
  describe('#handleOneonOneEvent', () => {