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

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 +201 -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 +392 -212
  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 +99 -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 +2597 -2464
  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 +991 -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 +151 -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 +335 -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 +187 -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 +2789 -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 +598 -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 +236 -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 +3094 -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);
@@ -962,18 +1290,36 @@ describe('plugin-meetings', () => {
962
1290
  function: 'updateMeetingInfo',
963
1291
  },
964
1292
  LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,
965
- {info: locusInfo.parsedLocus.info, self},
1293
+ {info: locusInfo.parsedLocus.info, self},
966
1294
  ];
967
1295
 
968
1296
  if (expected) {
969
1297
  assert.calledWith(...expectedArgs);
1298
+ } else {
1299
+ assert.neverCalledWith(...expectedArgs);
970
1300
  }
971
- else {
1301
+ locusInfo.emitScoped.resetHistory();
1302
+ };
1303
+
1304
+ const checkMeetingInfoUpdatedCalledForRoles = (expected) => {
1305
+ const expectedArgs = [
1306
+ locusInfo.emitScoped,
1307
+ {
1308
+ file: 'locus-info',
1309
+ function: 'updateMeetingInfo',
1310
+ },
1311
+ LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,
1312
+ ];
1313
+
1314
+ if (expected) {
1315
+ assert.calledWith(...expectedArgs);
1316
+ } else {
972
1317
  assert.neverCalledWith(...expectedArgs);
973
1318
  }
974
1319
  locusInfo.emitScoped.resetHistory();
975
1320
  };
976
1321
 
1322
+
977
1323
  it('emits MEETING_INFO_UPDATED if the info changes', () => {
978
1324
  const initialInfo = cloneDeep(meetingInfo);
979
1325
 
@@ -999,6 +1345,16 @@ describe('plugin-meetings', () => {
999
1345
 
1000
1346
  // since the info is the same it should not call trigger the event
1001
1347
  checkMeetingInfoUpdatedCalled(false);
1348
+
1349
+ // update it with the same info, but roles changed
1350
+ const updateSelf = cloneDeep(self);
1351
+ updateSelf?.controls?.role?.roles.push({
1352
+ type: 'COHOST',
1353
+ hasRole: true,
1354
+ });
1355
+ locusInfo.updateMeetingInfo(newInfo, updateSelf);
1356
+ // since the info is the same but roles changed, it should call trigger the event
1357
+ checkMeetingInfoUpdatedCalledForRoles(true);
1002
1358
  });
1003
1359
 
1004
1360
  it('gets roles from self if available', () => {
@@ -1104,6 +1460,7 @@ describe('plugin-meetings', () => {
1104
1460
  fakeLocus = {
1105
1461
  meeting: true,
1106
1462
  participants: true,
1463
+ url: 'newLocusUrl',
1107
1464
  };
1108
1465
  });
1109
1466
 
@@ -1148,6 +1505,55 @@ describe('plugin-meetings', () => {
1148
1505
  assert.isFunction(locusParser.onDeltaAction);
1149
1506
  });
1150
1507
 
1508
+ it('#updateLocusInfo ignores breakout LEFT message', () => {
1509
+ const newLocus = {
1510
+ self: {
1511
+ reason: 'MOVED',
1512
+ state: 'LEFT',
1513
+ },
1514
+ };
1515
+
1516
+ locusInfo.updateControls = sinon.stub();
1517
+ locusInfo.updateConversationUrl = sinon.stub();
1518
+ locusInfo.updateCreated = sinon.stub();
1519
+ locusInfo.updateFullState = sinon.stub();
1520
+ locusInfo.updateHostInfo = sinon.stub();
1521
+ locusInfo.updateMeetingInfo = sinon.stub();
1522
+ locusInfo.updateMediaShares = sinon.stub();
1523
+ locusInfo.updateParticipantsUrl = sinon.stub();
1524
+ locusInfo.updateReplace = sinon.stub();
1525
+ locusInfo.updateSelf = sinon.stub();
1526
+ locusInfo.updateLocusUrl = sinon.stub();
1527
+ locusInfo.updateAclUrl = sinon.stub();
1528
+ locusInfo.updateBasequence = sinon.stub();
1529
+ locusInfo.updateSequence = sinon.stub();
1530
+ locusInfo.updateMemberShip = sinon.stub();
1531
+ locusInfo.updateIdentifiers = sinon.stub();
1532
+ locusInfo.updateEmbeddedApps = sinon.stub();
1533
+ locusInfo.compareAndUpdate = sinon.stub();
1534
+
1535
+ locusInfo.updateLocusInfo(newLocus);
1536
+
1537
+ assert.notCalled(locusInfo.updateControls);
1538
+ assert.notCalled(locusInfo.updateConversationUrl);
1539
+ assert.notCalled(locusInfo.updateCreated);
1540
+ assert.notCalled(locusInfo.updateFullState);
1541
+ assert.notCalled(locusInfo.updateHostInfo);
1542
+ assert.notCalled(locusInfo.updateMeetingInfo);
1543
+ assert.notCalled(locusInfo.updateMediaShares);
1544
+ assert.notCalled(locusInfo.updateParticipantsUrl);
1545
+ assert.notCalled(locusInfo.updateReplace);
1546
+ assert.notCalled(locusInfo.updateSelf);
1547
+ assert.notCalled(locusInfo.updateLocusUrl);
1548
+ assert.notCalled(locusInfo.updateAclUrl);
1549
+ assert.notCalled(locusInfo.updateBasequence);
1550
+ assert.notCalled(locusInfo.updateSequence);
1551
+ assert.notCalled(locusInfo.updateMemberShip);
1552
+ assert.notCalled(locusInfo.updateIdentifiers);
1553
+ assert.notCalled(locusInfo.updateEmbeddedApps);
1554
+ assert.notCalled(locusInfo.compareAndUpdate);
1555
+ });
1556
+
1151
1557
  it('onFullLocus() updates the working-copy of locus parser', () => {
1152
1558
  const eventType = 'fakeEvent';
1153
1559
 
@@ -1197,12 +1603,18 @@ describe('plugin-meetings', () => {
1197
1603
  locusInfo: {
1198
1604
  onFullLocus: sandbox.stub(),
1199
1605
  },
1606
+ locusUrl: 'oldLocusUrl',
1200
1607
  };
1201
1608
 
1202
1609
  locusInfo.locusParser.resume = sandbox.stub();
1203
1610
  locusInfo.applyLocusDeltaData(DESYNC, fakeLocus, meeting);
1204
1611
 
1205
- assert.calledOnce(meeting.meetingRequest.getFullLocus);
1612
+ assert.calledOnceWithExactly(meeting.meetingRequest.getFullLocus,
1613
+ {
1614
+ desync: true,
1615
+ locusUrl: 'newLocusUrl',
1616
+ }
1617
+ );
1206
1618
  });
1207
1619
 
1208
1620
  it('getFullLocus handles DESYNC action correctly', () => {
@@ -1227,6 +1639,187 @@ describe('plugin-meetings', () => {
1227
1639
  assert.calledOnce(locusInfo.locusParser.resume);
1228
1640
  });
1229
1641
  });
1642
+
1643
+ it('onDeltaLocus handle delta data', () => {
1644
+ fakeLocus.participants = {};
1645
+ const fakeBreakout = {
1646
+ sessionId: 'sessionId',
1647
+ groupId: 'groupId',
1648
+ };
1649
+
1650
+ fakeLocus.controls = {
1651
+ breakout: fakeBreakout
1652
+ };
1653
+ locusInfo.controls = {
1654
+ breakout: {
1655
+ sessionId: 'sessionId',
1656
+ groupId: 'groupId',
1657
+ }
1658
+ }
1659
+ locusInfo.updateParticipants = sinon.stub();
1660
+ locusInfo.onDeltaLocus(fakeLocus);
1661
+ assert.calledWith(locusInfo.updateParticipants, {}, false);
1662
+
1663
+ fakeLocus.controls.breakout.sessionId = 'sessionId2';
1664
+ locusInfo.onDeltaLocus(fakeLocus);
1665
+ assert.calledWith(locusInfo.updateParticipants, {}, true);
1666
+ });
1667
+ });
1668
+
1669
+ describe('#updateLocusCache', () => {
1670
+ it('cache it if income locus is main session locus', () => {
1671
+ const locus = {url: 'url'};
1672
+ locusInfo.mainSessionLocusCache = null;
1673
+ locusInfo.updateLocusCache(locus);
1674
+
1675
+ assert.deepEqual(locusInfo.mainSessionLocusCache, locus);
1676
+ });
1677
+
1678
+ it('not cache it if income locus is breakout session locus', () => {
1679
+ const locus = {url: 'url', controls: {breakout: {sessionType: 'BREAKOUT'}}};
1680
+ locusInfo.mainSessionLocusCache = null;
1681
+ locusInfo.updateLocusCache(locus);
1682
+
1683
+ assert.isNull(locusInfo.mainSessionLocusCache);
1684
+ });
1685
+ });
1686
+
1687
+ describe('#getTheLocusToUpdate', () => {
1688
+ it('return the cache locus if return to main session', () => {
1689
+ locusInfo.mainSessionLocusCache = {url: 'url'};
1690
+ locusInfo.controls = {
1691
+ breakout: {
1692
+ sessionType: 'BREAKOUT'
1693
+ }
1694
+ }
1695
+ const newLocus = {
1696
+ controls: {
1697
+ breakout: {
1698
+ sessionType: 'MAIN',
1699
+ },
1700
+ },
1701
+ };
1702
+
1703
+ assert.deepEqual(locusInfo.getTheLocusToUpdate(newLocus), {url: 'url'});
1704
+ });
1705
+
1706
+ it('return the new locus if return to main session but no cache', () => {
1707
+ locusInfo.mainSessionLocusCache = null;
1708
+ locusInfo.controls = {
1709
+ breakout: {
1710
+ sessionType: 'BREAKOUT'
1711
+ }
1712
+ }
1713
+ const newLocus = {
1714
+ controls: {
1715
+ breakout: {
1716
+ sessionType: 'MAIN',
1717
+ },
1718
+ },
1719
+ };
1720
+
1721
+ assert.deepEqual(locusInfo.getTheLocusToUpdate(newLocus), newLocus);
1722
+ });
1723
+
1724
+ it('return the new locus if not return to main session', () => {
1725
+ locusInfo.mainSessionLocusCache = {url: 'url'};
1726
+ locusInfo.controls = {
1727
+ breakout: {
1728
+ sessionType: 'MAIN'
1729
+ }
1730
+ }
1731
+ const newLocus = {
1732
+ controls: {
1733
+ breakout: {
1734
+ sessionType: 'BREAKOUT',
1735
+ },
1736
+ },
1737
+ };
1738
+
1739
+ assert.deepEqual(locusInfo.getTheLocusToUpdate(newLocus), newLocus);
1740
+ });
1741
+ });
1742
+
1743
+ describe('#mergeParticipants', () => {
1744
+ let participants;
1745
+ let sourceParticipants;
1746
+ beforeEach(() => {
1747
+ participants = [{id: '111', status: 'JOINED'}, {id: '222'}];
1748
+ sourceParticipants = [{id: '111', status: 'LEFT'}, {id: '333'}];
1749
+ });
1750
+
1751
+ it('merge the participants, replace it by id if exist in old array', () => {
1752
+ const result = locusInfo.mergeParticipants(participants, sourceParticipants);
1753
+ assert.deepEqual(result, [{id: '111', status: 'LEFT'}, {id: '222'}, {id: '333'}]);
1754
+ });
1755
+
1756
+ it('return new participants if previous participants is empty', () => {
1757
+ const result = locusInfo.mergeParticipants([], sourceParticipants);
1758
+ assert.deepEqual(result, sourceParticipants);
1759
+ });
1760
+
1761
+ it('return new participants if previous participants is null/undefined', () => {
1762
+ let result = locusInfo.mergeParticipants(null, sourceParticipants);
1763
+ assert.deepEqual(result, sourceParticipants);
1764
+
1765
+ result = locusInfo.mergeParticipants(undefined, sourceParticipants);
1766
+ assert.deepEqual(result, sourceParticipants);
1767
+ });
1768
+
1769
+ it('return previous participants if new participants is empty', () => {
1770
+ const result = locusInfo.mergeParticipants(participants, []);
1771
+ assert.deepEqual(result, participants);
1772
+ });
1773
+
1774
+ it('return previous participants if new participants is null/undefined', () => {
1775
+ let result = locusInfo.mergeParticipants(participants, null);
1776
+ assert.deepEqual(result, participants);
1777
+
1778
+ result = locusInfo.mergeParticipants(participants, undefined);
1779
+ assert.deepEqual(result, participants);
1780
+ });
1781
+ });
1782
+
1783
+ describe('#updateMainSessionLocusCache', () => {
1784
+ let cachedLocus;
1785
+ let newLocus;
1786
+ beforeEach(() => {
1787
+ cachedLocus = {controls: {}, participants: [], info: {webExMeetingId: 'testId1', topic: 'test'}};
1788
+ newLocus = {self: {}, participants: [{id: '111'}], info: {testId: 'testId2', webExMeetingName: 'hello'}};
1789
+ });
1790
+ it('shallow merge new locus into cache', () => {
1791
+ locusInfo.mainSessionLocusCache = cachedLocus;
1792
+ locusInfo.updateMainSessionLocusCache(newLocus);
1793
+
1794
+ assert.deepEqual(locusInfo.mainSessionLocusCache, {
1795
+ controls: {},
1796
+ participants: [{id: '111'}],
1797
+ info: {testId: 'testId2', webExMeetingName: 'hello'},
1798
+ self: {},
1799
+ });
1800
+ });
1801
+
1802
+ it('cache new locus if no cache before', () => {
1803
+ locusInfo.mainSessionLocusCache = null;
1804
+ locusInfo.updateMainSessionLocusCache(newLocus);
1805
+
1806
+ assert.deepEqual(locusInfo.mainSessionLocusCache, newLocus);
1807
+ });
1808
+
1809
+ it('do nothing if new locus is null', () => {
1810
+ locusInfo.mainSessionLocusCache = cachedLocus;
1811
+ locusInfo.updateMainSessionLocusCache(null);
1812
+
1813
+ assert.deepEqual(locusInfo.mainSessionLocusCache, cachedLocus);
1814
+ });
1815
+ });
1816
+
1817
+ describe('#clearMainSessionLocusCache', () => {
1818
+ it('clear main session locus cache', () => {
1819
+ locusInfo.mainSessionLocusCache = {controls: {}};
1820
+ locusInfo.clearMainSessionLocusCache();
1821
+ assert.isNull(locusInfo.mainSessionLocusCache);
1822
+ })
1230
1823
  });
1231
1824
 
1232
1825
  describe('#handleOneonOneEvent', () => {