@webex/plugin-meetings 3.0.0-beta.15 → 3.0.0-beta.151

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 (480) hide show
  1. package/README.md +45 -1
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +359 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +193 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +23 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +52 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +43 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1046 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +78 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +67 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/browser-detection.js +1 -21
  23. package/dist/common/browser-detection.js.map +1 -1
  24. package/dist/common/collection.js +5 -20
  25. package/dist/common/collection.js.map +1 -1
  26. package/dist/common/config.js +0 -7
  27. package/dist/common/config.js.map +1 -1
  28. package/dist/common/errors/captcha-error.js +0 -21
  29. package/dist/common/errors/captcha-error.js.map +1 -1
  30. package/dist/common/errors/intent-to-join.js +0 -21
  31. package/dist/common/errors/intent-to-join.js.map +1 -1
  32. package/dist/common/errors/join-meeting.js +0 -21
  33. package/dist/common/errors/join-meeting.js.map +1 -1
  34. package/dist/common/errors/media.js +0 -21
  35. package/dist/common/errors/media.js.map +1 -1
  36. package/dist/common/errors/parameter.js +0 -28
  37. package/dist/common/errors/parameter.js.map +1 -1
  38. package/dist/common/errors/password-error.js +0 -21
  39. package/dist/common/errors/password-error.js.map +1 -1
  40. package/dist/common/errors/permission.js +0 -21
  41. package/dist/common/errors/permission.js.map +1 -1
  42. package/dist/common/errors/reconnection-in-progress.js +0 -17
  43. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  44. package/dist/common/errors/reconnection.js +0 -21
  45. package/dist/common/errors/reconnection.js.map +1 -1
  46. package/dist/common/errors/stats.js +0 -21
  47. package/dist/common/errors/stats.js.map +1 -1
  48. package/dist/common/errors/webex-errors.js +9 -43
  49. package/dist/common/errors/webex-errors.js.map +1 -1
  50. package/dist/common/errors/webex-meetings-error.js +1 -24
  51. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  52. package/dist/common/events/events-scope.js +0 -22
  53. package/dist/common/events/events-scope.js.map +1 -1
  54. package/dist/common/events/events.js +0 -23
  55. package/dist/common/events/events.js.map +1 -1
  56. package/dist/common/events/trigger-proxy.js +0 -12
  57. package/dist/common/events/trigger-proxy.js.map +1 -1
  58. package/dist/common/events/util.js +0 -15
  59. package/dist/common/events/util.js.map +1 -1
  60. package/dist/common/logs/logger-config.js +0 -4
  61. package/dist/common/logs/logger-config.js.map +1 -1
  62. package/dist/common/logs/logger-proxy.js +1 -8
  63. package/dist/common/logs/logger-proxy.js.map +1 -1
  64. package/dist/common/logs/request.js +35 -61
  65. package/dist/common/logs/request.js.map +1 -1
  66. package/dist/common/queue.js +4 -14
  67. package/dist/common/queue.js.map +1 -1
  68. package/dist/config.js +7 -13
  69. package/dist/config.js.map +1 -1
  70. package/dist/constants.js +208 -64
  71. package/dist/constants.js.map +1 -1
  72. package/dist/controls-options-manager/constants.js +14 -0
  73. package/dist/controls-options-manager/constants.js.map +1 -0
  74. package/dist/controls-options-manager/enums.js +27 -0
  75. package/dist/controls-options-manager/enums.js.map +1 -0
  76. package/dist/controls-options-manager/index.js +297 -0
  77. package/dist/controls-options-manager/index.js.map +1 -0
  78. package/dist/controls-options-manager/types.js +7 -0
  79. package/dist/controls-options-manager/types.js.map +1 -0
  80. package/dist/controls-options-manager/util.js +300 -0
  81. package/dist/controls-options-manager/util.js.map +1 -0
  82. package/dist/index.js +78 -17
  83. package/dist/index.js.map +1 -1
  84. package/dist/locus-info/controlsUtils.js +100 -29
  85. package/dist/locus-info/controlsUtils.js.map +1 -1
  86. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  87. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  88. package/dist/locus-info/fullState.js +0 -15
  89. package/dist/locus-info/fullState.js.map +1 -1
  90. package/dist/locus-info/hostUtils.js +4 -12
  91. package/dist/locus-info/hostUtils.js.map +1 -1
  92. package/dist/locus-info/index.js +387 -208
  93. package/dist/locus-info/index.js.map +1 -1
  94. package/dist/locus-info/infoUtils.js +0 -38
  95. package/dist/locus-info/infoUtils.js.map +1 -1
  96. package/dist/locus-info/mediaSharesUtils.js +54 -38
  97. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  98. package/dist/locus-info/parser.js +90 -126
  99. package/dist/locus-info/parser.js.map +1 -1
  100. package/dist/locus-info/selfUtils.js +93 -92
  101. package/dist/locus-info/selfUtils.js.map +1 -1
  102. package/dist/media/index.js +70 -219
  103. package/dist/media/index.js.map +1 -1
  104. package/dist/media/properties.js +74 -198
  105. package/dist/media/properties.js.map +1 -1
  106. package/dist/media/util.js +1 -8
  107. package/dist/media/util.js.map +1 -1
  108. package/dist/mediaQualityMetrics/config.js +505 -495
  109. package/dist/mediaQualityMetrics/config.js.map +1 -1
  110. package/dist/meeting/in-meeting-actions.js +79 -14
  111. package/dist/meeting/in-meeting-actions.js.map +1 -1
  112. package/dist/meeting/index.js +2685 -3324
  113. package/dist/meeting/index.js.map +1 -1
  114. package/dist/meeting/locusMediaRequest.js +291 -0
  115. package/dist/meeting/locusMediaRequest.js.map +1 -0
  116. package/dist/meeting/muteState.js +243 -185
  117. package/dist/meeting/muteState.js.map +1 -1
  118. package/dist/meeting/request.js +296 -342
  119. package/dist/meeting/request.js.map +1 -1
  120. package/dist/meeting/request.type.js +0 -1
  121. package/dist/meeting/request.type.js.map +1 -1
  122. package/dist/meeting/state.js +16 -26
  123. package/dist/meeting/state.js.map +1 -1
  124. package/dist/meeting/util.js +446 -585
  125. package/dist/meeting/util.js.map +1 -1
  126. package/dist/meeting-info/collection.js +3 -25
  127. package/dist/meeting-info/collection.js.map +1 -1
  128. package/dist/meeting-info/index.js +8 -31
  129. package/dist/meeting-info/index.js.map +1 -1
  130. package/dist/meeting-info/meeting-info-v2.js +261 -242
  131. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  132. package/dist/meeting-info/request.js +1 -16
  133. package/dist/meeting-info/request.js.map +1 -1
  134. package/dist/meeting-info/util.js +98 -183
  135. package/dist/meeting-info/util.js.map +1 -1
  136. package/dist/meeting-info/utilv2.js +156 -232
  137. package/dist/meeting-info/utilv2.js.map +1 -1
  138. package/dist/meetings/collection.js +24 -20
  139. package/dist/meetings/collection.js.map +1 -1
  140. package/dist/meetings/index.js +526 -372
  141. package/dist/meetings/index.js.map +1 -1
  142. package/dist/meetings/meetings.types.js +7 -0
  143. package/dist/meetings/meetings.types.js.map +1 -0
  144. package/dist/meetings/request.js +21 -40
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +172 -141
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.js +58 -57
  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 +123 -162
  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 +75 -147
  169. package/dist/metrics/index.js.map +1 -1
  170. package/dist/multistream/mediaRequestManager.js +170 -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 +73 -94
  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 +66 -43
  179. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  180. package/dist/multistream/remoteMediaManager.js +502 -442
  181. package/dist/multistream/remoteMediaManager.js.map +1 -1
  182. package/dist/networkQualityMonitor/index.js +24 -51
  183. package/dist/networkQualityMonitor/index.js.map +1 -1
  184. package/dist/personal-meeting-room/index.js +3 -38
  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 +18 -24
  199. package/dist/reactions/reactions.type.js.map +1 -1
  200. package/dist/reconnection-manager/index.js +356 -476
  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 +32 -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 -462
  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 +9 -44
  221. package/dist/transcription/index.js.map +1 -1
  222. package/dist/types/annotation/annotation.types.d.ts +43 -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 +72 -0
  256. package/dist/types/constants.d.ts +978 -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 +86 -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 +149 -0
  277. package/dist/types/meeting/index.d.ts +1509 -0
  278. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  279. package/dist/types/meeting/muteState.d.ts +184 -0
  280. package/dist/types/meeting/request.d.ts +270 -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 +75 -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 +364 -0
  292. package/dist/types/meetings/meetings.types.d.ts +4 -0
  293. package/dist/types/meetings/request.d.ts +27 -0
  294. package/dist/types/meetings/util.d.ts +18 -0
  295. package/dist/types/member/index.d.ts +157 -0
  296. package/dist/types/member/types.d.ts +21 -0
  297. package/dist/types/member/util.d.ts +2 -0
  298. package/dist/types/members/collection.d.ts +29 -0
  299. package/dist/types/members/index.d.ts +353 -0
  300. package/dist/types/members/request.d.ts +114 -0
  301. package/dist/types/members/types.d.ts +24 -0
  302. package/dist/types/members/util.d.ts +210 -0
  303. package/dist/types/metrics/config.d.ts +195 -0
  304. package/dist/types/metrics/constants.d.ts +55 -0
  305. package/dist/types/metrics/index.d.ts +169 -0
  306. package/dist/types/multistream/mediaRequestManager.d.ts +104 -0
  307. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  308. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  309. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  310. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  311. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  312. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  313. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  314. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  315. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  316. package/dist/types/reachability/index.d.ts +152 -0
  317. package/dist/types/reachability/request.d.ts +37 -0
  318. package/dist/types/reactions/constants.d.ts +3 -0
  319. package/dist/types/reactions/reactions.d.ts +4 -0
  320. package/dist/types/reactions/reactions.type.d.ts +52 -0
  321. package/dist/types/reconnection-manager/index.d.ts +126 -0
  322. package/dist/types/recording-controller/enums.d.ts +7 -0
  323. package/dist/types/recording-controller/index.d.ts +193 -0
  324. package/dist/types/recording-controller/util.d.ts +13 -0
  325. package/dist/types/roap/index.d.ts +77 -0
  326. package/dist/types/roap/request.d.ts +36 -0
  327. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  328. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  329. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  330. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  331. package/dist/types/transcription/index.d.ts +64 -0
  332. package/package.json +28 -21
  333. package/src/annotation/annotation.types.ts +52 -0
  334. package/src/annotation/constants.ts +36 -0
  335. package/src/annotation/index.ts +343 -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 +921 -0
  342. package/src/breakouts/request.ts +55 -0
  343. package/src/breakouts/utils.ts +57 -0
  344. package/src/common/errors/webex-errors.ts +6 -2
  345. package/src/common/logs/logger-proxy.ts +1 -1
  346. package/src/config.ts +5 -7
  347. package/src/constants.ts +155 -20
  348. package/src/controls-options-manager/constants.ts +5 -0
  349. package/src/controls-options-manager/enums.ts +18 -0
  350. package/src/controls-options-manager/index.ts +278 -0
  351. package/src/controls-options-manager/types.ts +59 -0
  352. package/src/controls-options-manager/util.ts +286 -0
  353. package/src/index.ts +34 -0
  354. package/src/locus-info/controlsUtils.ts +108 -0
  355. package/src/locus-info/index.ts +310 -21
  356. package/src/locus-info/mediaSharesUtils.ts +48 -0
  357. package/src/locus-info/parser.ts +2 -1
  358. package/src/locus-info/selfUtils.ts +71 -1
  359. package/src/media/index.ts +70 -142
  360. package/src/media/properties.ts +41 -104
  361. package/src/mediaQualityMetrics/config.ts +379 -377
  362. package/src/meeting/in-meeting-actions.ts +156 -0
  363. package/src/meeting/index.ts +1730 -1768
  364. package/src/meeting/locusMediaRequest.ts +309 -0
  365. package/src/meeting/muteState.ts +228 -132
  366. package/src/meeting/request.ts +100 -91
  367. package/src/meeting/request.type.ts +2 -0
  368. package/src/meeting/util.ts +421 -421
  369. package/src/meeting-info/meeting-info-v2.ts +134 -13
  370. package/src/meeting-info/utilv2.ts +13 -3
  371. package/src/meetings/collection.ts +20 -0
  372. package/src/meetings/index.ts +375 -83
  373. package/src/meetings/meetings.types.ts +9 -0
  374. package/src/meetings/request.ts +3 -1
  375. package/src/meetings/util.ts +103 -4
  376. package/src/member/index.ts +40 -0
  377. package/src/member/types.ts +24 -0
  378. package/src/member/util.ts +81 -1
  379. package/src/members/collection.ts +8 -0
  380. package/src/members/index.ts +108 -6
  381. package/src/members/request.ts +98 -17
  382. package/src/members/types.ts +28 -0
  383. package/src/members/util.ts +319 -240
  384. package/src/metrics/config.ts +49 -10
  385. package/src/metrics/constants.ts +2 -4
  386. package/src/metrics/index.ts +43 -27
  387. package/src/multistream/mediaRequestManager.ts +210 -45
  388. package/src/multistream/receiveSlot.ts +68 -26
  389. package/src/multistream/receiveSlotManager.ts +61 -38
  390. package/src/multistream/remoteMedia.ts +29 -3
  391. package/src/multistream/remoteMediaGroup.ts +61 -2
  392. package/src/multistream/remoteMediaManager.ts +260 -66
  393. package/src/networkQualityMonitor/index.ts +6 -6
  394. package/src/reachability/index.ts +75 -25
  395. package/src/reachability/request.ts +10 -5
  396. package/src/reactions/constants.ts +4 -0
  397. package/src/reactions/reactions.ts +4 -4
  398. package/src/reactions/reactions.type.ts +28 -3
  399. package/src/reconnection-manager/index.ts +53 -32
  400. package/src/recording-controller/enums.ts +8 -0
  401. package/src/recording-controller/index.ts +315 -0
  402. package/src/recording-controller/util.ts +58 -0
  403. package/src/roap/index.ts +21 -30
  404. package/src/roap/request.ts +51 -52
  405. package/src/roap/turnDiscovery.ts +51 -27
  406. package/src/statsAnalyzer/global.ts +1 -94
  407. package/src/statsAnalyzer/index.ts +380 -390
  408. package/src/statsAnalyzer/mqaUtil.ts +106 -99
  409. package/test/integration/spec/converged-space-meetings.js +233 -0
  410. package/test/integration/spec/journey.js +332 -255
  411. package/test/integration/spec/space-meeting.js +78 -5
  412. package/test/integration/spec/transcription.js +1 -1
  413. package/test/unit/spec/annotation/index.ts +436 -0
  414. package/test/unit/spec/breakouts/breakout.ts +203 -0
  415. package/test/unit/spec/breakouts/collection.ts +15 -0
  416. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  417. package/test/unit/spec/breakouts/events.ts +77 -0
  418. package/test/unit/spec/breakouts/index.ts +1790 -0
  419. package/test/unit/spec/breakouts/request.ts +104 -0
  420. package/test/unit/spec/breakouts/utils.js +72 -0
  421. package/test/unit/spec/controls-options-manager/index.js +287 -0
  422. package/test/unit/spec/controls-options-manager/util.js +518 -0
  423. package/test/unit/spec/fixture/locus.js +1 -0
  424. package/test/unit/spec/locus-info/controlsUtils.js +303 -30
  425. package/test/unit/spec/locus-info/index.js +615 -4
  426. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  427. package/test/unit/spec/locus-info/selfConstant.js +38 -0
  428. package/test/unit/spec/locus-info/selfUtils.js +200 -0
  429. package/test/unit/spec/media/index.ts +118 -22
  430. package/test/unit/spec/media/properties.ts +9 -9
  431. package/test/unit/spec/meeting/in-meeting-actions.ts +76 -0
  432. package/test/unit/spec/meeting/index.js +2394 -1381
  433. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  434. package/test/unit/spec/meeting/muteState.js +370 -208
  435. package/test/unit/spec/meeting/request.js +354 -42
  436. package/test/unit/spec/meeting/utils.js +268 -156
  437. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  438. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  439. package/test/unit/spec/meetings/collection.js +14 -0
  440. package/test/unit/spec/meetings/index.js +842 -128
  441. package/test/unit/spec/meetings/utils.js +206 -2
  442. package/test/unit/spec/member/index.js +24 -0
  443. package/test/unit/spec/member/util.js +384 -32
  444. package/test/unit/spec/members/index.js +320 -1
  445. package/test/unit/spec/members/request.js +206 -27
  446. package/test/unit/spec/members/utils.js +184 -0
  447. package/test/unit/spec/metrics/index.js +98 -0
  448. package/test/unit/spec/multistream/mediaRequestManager.ts +676 -105
  449. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  450. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  451. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  452. package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
  453. package/test/unit/spec/multistream/remoteMediaManager.ts +672 -65
  454. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  455. package/test/unit/spec/reachability/index.ts +176 -25
  456. package/test/unit/spec/reachability/request.js +66 -0
  457. package/test/unit/spec/reconnection-manager/index.js +46 -13
  458. package/test/unit/spec/recording-controller/index.js +231 -0
  459. package/test/unit/spec/recording-controller/util.js +102 -0
  460. package/test/unit/spec/roap/index.ts +21 -51
  461. package/test/unit/spec/roap/request.ts +187 -0
  462. package/test/unit/spec/roap/turnDiscovery.ts +73 -34
  463. package/test/unit/spec/stats-analyzer/index.js +94 -43
  464. package/test/utils/constants.js +9 -0
  465. package/test/utils/integrationTestUtils.js +46 -0
  466. package/test/utils/testUtils.js +0 -45
  467. package/test/utils/webex-config.js +4 -0
  468. package/test/utils/webex-test-users.js +7 -3
  469. package/tsconfig.json +6 -0
  470. package/dist/media/internal-media-core-wrapper.js +0 -22
  471. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  472. package/dist/meeting/effectsState.js +0 -334
  473. package/dist/meeting/effectsState.js.map +0 -1
  474. package/dist/multistream/multistreamMedia.js +0 -117
  475. package/dist/multistream/multistreamMedia.js.map +0 -1
  476. package/src/index.js +0 -15
  477. package/src/media/internal-media-core-wrapper.ts +0 -9
  478. package/src/meeting/effectsState.ts +0 -211
  479. package/src/multistream/multistreamMedia.ts +0 -93
  480. package/test/unit/spec/meeting/effectsState.js +0 -281
@@ -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,122 @@ 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
+
667
974
  it('should trigger SELF_REMOTE_MUTE_STATUS_UPDATED if muted and disallowUnmute changed', () => {
668
975
  locusInfo.self = self;
669
976
  const selfWithMutedByOthersAndDissalowUnmute = cloneDeep(self);
@@ -889,6 +1196,44 @@ describe('plugin-meetings', () => {
889
1196
  {isSharingBlocked: true}
890
1197
  );
891
1198
  });
1199
+
1200
+ it('should trigger SELF_ROLES_CHANGED if self roles changed', () => {
1201
+ locusInfo.self = self;
1202
+ locusInfo.emitScoped = sinon.stub();
1203
+ const sampleNewSelf = cloneDeep(self);
1204
+ sampleNewSelf.controls.role.roles = [{type: 'COHOST', hasRole: true}];
1205
+
1206
+ locusInfo.updateSelf(sampleNewSelf, []);
1207
+
1208
+ assert.calledWith(
1209
+ locusInfo.emitScoped,
1210
+ {
1211
+ file: 'locus-info',
1212
+ function: 'updateSelf',
1213
+ },
1214
+ LOCUSINFO.EVENTS.SELF_ROLES_CHANGED,
1215
+ {oldRoles: ['PRESENTER'], newRoles: ['COHOST']}
1216
+ );
1217
+ });
1218
+
1219
+ it('should not trigger SELF_ROLES_CHANGED if self roles not changed', () => {
1220
+ locusInfo.self = self;
1221
+ locusInfo.emitScoped = sinon.stub();
1222
+ const sampleNewSelf = cloneDeep(self);
1223
+ sampleNewSelf.controls.role.roles = [{type: 'PRESENTER', hasRole: true}];
1224
+
1225
+ locusInfo.updateSelf(sampleNewSelf, []);
1226
+
1227
+ assert.neverCalledWith(
1228
+ locusInfo.emitScoped,
1229
+ {
1230
+ file: 'locus-info',
1231
+ function: 'updateSelf',
1232
+ },
1233
+ LOCUSINFO.EVENTS.SELF_ROLES_CHANGED,
1234
+ {oldRoles: ['PRESENTER'], newRoles: ['PRESENTER']}
1235
+ );
1236
+ });
892
1237
  });
893
1238
 
894
1239
  describe('#updateMeetingInfo', () => {
@@ -962,7 +1307,25 @@ describe('plugin-meetings', () => {
962
1307
  function: 'updateMeetingInfo',
963
1308
  },
964
1309
  LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,
965
- {info: locusInfo.parsedLocus.info, self},
1310
+ {info: locusInfo.parsedLocus.info, self},
1311
+ ];
1312
+
1313
+ if (expected) {
1314
+ assert.calledWith(...expectedArgs);
1315
+ } else {
1316
+ assert.neverCalledWith(...expectedArgs);
1317
+ }
1318
+ locusInfo.emitScoped.resetHistory();
1319
+ };
1320
+
1321
+ const checkMeetingInfoUpdatedCalledForRoles = (expected) => {
1322
+ const expectedArgs = [
1323
+ locusInfo.emitScoped,
1324
+ {
1325
+ file: 'locus-info',
1326
+ function: 'updateMeetingInfo',
1327
+ },
1328
+ LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,
966
1329
  ];
967
1330
 
968
1331
  if (expected) {
@@ -973,6 +1336,7 @@ describe('plugin-meetings', () => {
973
1336
  locusInfo.emitScoped.resetHistory();
974
1337
  };
975
1338
 
1339
+
976
1340
  it('emits MEETING_INFO_UPDATED if the info changes', () => {
977
1341
  const initialInfo = cloneDeep(meetingInfo);
978
1342
 
@@ -998,6 +1362,16 @@ describe('plugin-meetings', () => {
998
1362
 
999
1363
  // since the info is the same it should not call trigger the event
1000
1364
  checkMeetingInfoUpdatedCalled(false);
1365
+
1366
+ // update it with the same info, but roles changed
1367
+ const updateSelf = cloneDeep(self);
1368
+ updateSelf?.controls?.role?.roles.push({
1369
+ type: 'COHOST',
1370
+ hasRole: true,
1371
+ });
1372
+ locusInfo.updateMeetingInfo(newInfo, updateSelf);
1373
+ // since the info is the same but roles changed, it should call trigger the event
1374
+ checkMeetingInfoUpdatedCalledForRoles(true);
1001
1375
  });
1002
1376
 
1003
1377
  it('gets roles from self if available', () => {
@@ -1103,6 +1477,7 @@ describe('plugin-meetings', () => {
1103
1477
  fakeLocus = {
1104
1478
  meeting: true,
1105
1479
  participants: true,
1480
+ url: 'newLocusUrl',
1106
1481
  };
1107
1482
  });
1108
1483
 
@@ -1147,6 +1522,55 @@ describe('plugin-meetings', () => {
1147
1522
  assert.isFunction(locusParser.onDeltaAction);
1148
1523
  });
1149
1524
 
1525
+ it('#updateLocusInfo ignores breakout LEFT message', () => {
1526
+ const newLocus = {
1527
+ self: {
1528
+ reason: 'MOVED',
1529
+ state: 'LEFT',
1530
+ },
1531
+ };
1532
+
1533
+ locusInfo.updateControls = sinon.stub();
1534
+ locusInfo.updateConversationUrl = sinon.stub();
1535
+ locusInfo.updateCreated = sinon.stub();
1536
+ locusInfo.updateFullState = sinon.stub();
1537
+ locusInfo.updateHostInfo = sinon.stub();
1538
+ locusInfo.updateMeetingInfo = sinon.stub();
1539
+ locusInfo.updateMediaShares = sinon.stub();
1540
+ locusInfo.updateParticipantsUrl = sinon.stub();
1541
+ locusInfo.updateReplace = sinon.stub();
1542
+ locusInfo.updateSelf = sinon.stub();
1543
+ locusInfo.updateLocusUrl = sinon.stub();
1544
+ locusInfo.updateAclUrl = sinon.stub();
1545
+ locusInfo.updateBasequence = sinon.stub();
1546
+ locusInfo.updateSequence = sinon.stub();
1547
+ locusInfo.updateMemberShip = sinon.stub();
1548
+ locusInfo.updateIdentifiers = sinon.stub();
1549
+ locusInfo.updateEmbeddedApps = sinon.stub();
1550
+ locusInfo.compareAndUpdate = sinon.stub();
1551
+
1552
+ locusInfo.updateLocusInfo(newLocus);
1553
+
1554
+ assert.notCalled(locusInfo.updateControls);
1555
+ assert.notCalled(locusInfo.updateConversationUrl);
1556
+ assert.notCalled(locusInfo.updateCreated);
1557
+ assert.notCalled(locusInfo.updateFullState);
1558
+ assert.notCalled(locusInfo.updateHostInfo);
1559
+ assert.notCalled(locusInfo.updateMeetingInfo);
1560
+ assert.notCalled(locusInfo.updateMediaShares);
1561
+ assert.notCalled(locusInfo.updateParticipantsUrl);
1562
+ assert.notCalled(locusInfo.updateReplace);
1563
+ assert.notCalled(locusInfo.updateSelf);
1564
+ assert.notCalled(locusInfo.updateLocusUrl);
1565
+ assert.notCalled(locusInfo.updateAclUrl);
1566
+ assert.notCalled(locusInfo.updateBasequence);
1567
+ assert.notCalled(locusInfo.updateSequence);
1568
+ assert.notCalled(locusInfo.updateMemberShip);
1569
+ assert.notCalled(locusInfo.updateIdentifiers);
1570
+ assert.notCalled(locusInfo.updateEmbeddedApps);
1571
+ assert.notCalled(locusInfo.compareAndUpdate);
1572
+ });
1573
+
1150
1574
  it('onFullLocus() updates the working-copy of locus parser', () => {
1151
1575
  const eventType = 'fakeEvent';
1152
1576
 
@@ -1196,12 +1620,18 @@ describe('plugin-meetings', () => {
1196
1620
  locusInfo: {
1197
1621
  onFullLocus: sandbox.stub(),
1198
1622
  },
1623
+ locusUrl: 'oldLocusUrl',
1199
1624
  };
1200
1625
 
1201
1626
  locusInfo.locusParser.resume = sandbox.stub();
1202
1627
  locusInfo.applyLocusDeltaData(DESYNC, fakeLocus, meeting);
1203
1628
 
1204
- assert.calledOnce(meeting.meetingRequest.getFullLocus);
1629
+ assert.calledOnceWithExactly(meeting.meetingRequest.getFullLocus,
1630
+ {
1631
+ desync: true,
1632
+ locusUrl: 'newLocusUrl',
1633
+ }
1634
+ );
1205
1635
  });
1206
1636
 
1207
1637
  it('getFullLocus handles DESYNC action correctly', () => {
@@ -1226,6 +1656,187 @@ describe('plugin-meetings', () => {
1226
1656
  assert.calledOnce(locusInfo.locusParser.resume);
1227
1657
  });
1228
1658
  });
1659
+
1660
+ it('onDeltaLocus handle delta data', () => {
1661
+ fakeLocus.participants = {};
1662
+ const fakeBreakout = {
1663
+ sessionId: 'sessionId',
1664
+ groupId: 'groupId',
1665
+ };
1666
+
1667
+ fakeLocus.controls = {
1668
+ breakout: fakeBreakout
1669
+ };
1670
+ locusInfo.controls = {
1671
+ breakout: {
1672
+ sessionId: 'sessionId',
1673
+ groupId: 'groupId',
1674
+ }
1675
+ }
1676
+ locusInfo.updateParticipants = sinon.stub();
1677
+ locusInfo.onDeltaLocus(fakeLocus);
1678
+ assert.calledWith(locusInfo.updateParticipants, {}, false);
1679
+
1680
+ fakeLocus.controls.breakout.sessionId = 'sessionId2';
1681
+ locusInfo.onDeltaLocus(fakeLocus);
1682
+ assert.calledWith(locusInfo.updateParticipants, {}, true);
1683
+ });
1684
+ });
1685
+
1686
+ describe('#updateLocusCache', () => {
1687
+ it('cache it if income locus is main session locus', () => {
1688
+ const locus = {url: 'url'};
1689
+ locusInfo.mainSessionLocusCache = null;
1690
+ locusInfo.updateLocusCache(locus);
1691
+
1692
+ assert.deepEqual(locusInfo.mainSessionLocusCache, locus);
1693
+ });
1694
+
1695
+ it('not cache it if income locus is breakout session locus', () => {
1696
+ const locus = {url: 'url', controls: {breakout: {sessionType: 'BREAKOUT'}}};
1697
+ locusInfo.mainSessionLocusCache = null;
1698
+ locusInfo.updateLocusCache(locus);
1699
+
1700
+ assert.isNull(locusInfo.mainSessionLocusCache);
1701
+ });
1702
+ });
1703
+
1704
+ describe('#getTheLocusToUpdate', () => {
1705
+ it('return the cache locus if return to main session', () => {
1706
+ locusInfo.mainSessionLocusCache = {url: 'url'};
1707
+ locusInfo.controls = {
1708
+ breakout: {
1709
+ sessionType: 'BREAKOUT'
1710
+ }
1711
+ }
1712
+ const newLocus = {
1713
+ controls: {
1714
+ breakout: {
1715
+ sessionType: 'MAIN',
1716
+ },
1717
+ },
1718
+ };
1719
+
1720
+ assert.deepEqual(locusInfo.getTheLocusToUpdate(newLocus), {url: 'url'});
1721
+ });
1722
+
1723
+ it('return the new locus if return to main session but no cache', () => {
1724
+ locusInfo.mainSessionLocusCache = null;
1725
+ locusInfo.controls = {
1726
+ breakout: {
1727
+ sessionType: 'BREAKOUT'
1728
+ }
1729
+ }
1730
+ const newLocus = {
1731
+ controls: {
1732
+ breakout: {
1733
+ sessionType: 'MAIN',
1734
+ },
1735
+ },
1736
+ };
1737
+
1738
+ assert.deepEqual(locusInfo.getTheLocusToUpdate(newLocus), newLocus);
1739
+ });
1740
+
1741
+ it('return the new locus if not return to main session', () => {
1742
+ locusInfo.mainSessionLocusCache = {url: 'url'};
1743
+ locusInfo.controls = {
1744
+ breakout: {
1745
+ sessionType: 'MAIN'
1746
+ }
1747
+ }
1748
+ const newLocus = {
1749
+ controls: {
1750
+ breakout: {
1751
+ sessionType: 'BREAKOUT',
1752
+ },
1753
+ },
1754
+ };
1755
+
1756
+ assert.deepEqual(locusInfo.getTheLocusToUpdate(newLocus), newLocus);
1757
+ });
1758
+ });
1759
+
1760
+ describe('#mergeParticipants', () => {
1761
+ let participants;
1762
+ let sourceParticipants;
1763
+ beforeEach(() => {
1764
+ participants = [{id: '111', status: 'JOINED'}, {id: '222'}];
1765
+ sourceParticipants = [{id: '111', status: 'LEFT'}, {id: '333'}];
1766
+ });
1767
+
1768
+ it('merge the participants, replace it by id if exist in old array', () => {
1769
+ const result = locusInfo.mergeParticipants(participants, sourceParticipants);
1770
+ assert.deepEqual(result, [{id: '111', status: 'LEFT'}, {id: '222'}, {id: '333'}]);
1771
+ });
1772
+
1773
+ it('return new participants if previous participants is empty', () => {
1774
+ const result = locusInfo.mergeParticipants([], sourceParticipants);
1775
+ assert.deepEqual(result, sourceParticipants);
1776
+ });
1777
+
1778
+ it('return new participants if previous participants is null/undefined', () => {
1779
+ let result = locusInfo.mergeParticipants(null, sourceParticipants);
1780
+ assert.deepEqual(result, sourceParticipants);
1781
+
1782
+ result = locusInfo.mergeParticipants(undefined, sourceParticipants);
1783
+ assert.deepEqual(result, sourceParticipants);
1784
+ });
1785
+
1786
+ it('return previous participants if new participants is empty', () => {
1787
+ const result = locusInfo.mergeParticipants(participants, []);
1788
+ assert.deepEqual(result, participants);
1789
+ });
1790
+
1791
+ it('return previous participants if new participants is null/undefined', () => {
1792
+ let result = locusInfo.mergeParticipants(participants, null);
1793
+ assert.deepEqual(result, participants);
1794
+
1795
+ result = locusInfo.mergeParticipants(participants, undefined);
1796
+ assert.deepEqual(result, participants);
1797
+ });
1798
+ });
1799
+
1800
+ describe('#updateMainSessionLocusCache', () => {
1801
+ let cachedLocus;
1802
+ let newLocus;
1803
+ beforeEach(() => {
1804
+ cachedLocus = {controls: {}, participants: [], info: {webExMeetingId: 'testId1', topic: 'test'}};
1805
+ newLocus = {self: {}, participants: [{id: '111'}], info: {testId: 'testId2', webExMeetingName: 'hello'}};
1806
+ });
1807
+ it('shallow merge new locus into cache', () => {
1808
+ locusInfo.mainSessionLocusCache = cachedLocus;
1809
+ locusInfo.updateMainSessionLocusCache(newLocus);
1810
+
1811
+ assert.deepEqual(locusInfo.mainSessionLocusCache, {
1812
+ controls: {},
1813
+ participants: [{id: '111'}],
1814
+ info: {testId: 'testId2', webExMeetingName: 'hello'},
1815
+ self: {},
1816
+ });
1817
+ });
1818
+
1819
+ it('cache new locus if no cache before', () => {
1820
+ locusInfo.mainSessionLocusCache = null;
1821
+ locusInfo.updateMainSessionLocusCache(newLocus);
1822
+
1823
+ assert.deepEqual(locusInfo.mainSessionLocusCache, newLocus);
1824
+ });
1825
+
1826
+ it('do nothing if new locus is null', () => {
1827
+ locusInfo.mainSessionLocusCache = cachedLocus;
1828
+ locusInfo.updateMainSessionLocusCache(null);
1829
+
1830
+ assert.deepEqual(locusInfo.mainSessionLocusCache, cachedLocus);
1831
+ });
1832
+ });
1833
+
1834
+ describe('#clearMainSessionLocusCache', () => {
1835
+ it('clear main session locus cache', () => {
1836
+ locusInfo.mainSessionLocusCache = {controls: {}};
1837
+ locusInfo.clearMainSessionLocusCache();
1838
+ assert.isNull(locusInfo.mainSessionLocusCache);
1839
+ })
1229
1840
  });
1230
1841
 
1231
1842
  describe('#handleOneonOneEvent', () => {