@webex/plugin-meetings 3.0.0-beta.11 → 3.0.0-beta.111

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 (512) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.js +48 -0
  6. package/dist/annotation/constants.js.map +1 -0
  7. package/dist/annotation/index.js +357 -0
  8. package/dist/annotation/index.js.map +1 -0
  9. package/dist/breakouts/breakout.js +176 -0
  10. package/dist/breakouts/breakout.js.map +1 -0
  11. package/dist/breakouts/collection.js +23 -0
  12. package/dist/breakouts/collection.js.map +1 -0
  13. package/dist/breakouts/edit-lock-error.js +52 -0
  14. package/dist/breakouts/edit-lock-error.js.map +1 -0
  15. package/dist/breakouts/events.js +43 -0
  16. package/dist/breakouts/events.js.map +1 -0
  17. package/dist/breakouts/index.js +944 -0
  18. package/dist/breakouts/index.js.map +1 -0
  19. package/dist/breakouts/request.js +78 -0
  20. package/dist/breakouts/request.js.map +1 -0
  21. package/dist/breakouts/utils.js +67 -0
  22. package/dist/breakouts/utils.js.map +1 -0
  23. package/dist/common/browser-detection.js +1 -20
  24. package/dist/common/browser-detection.js.map +1 -1
  25. package/dist/common/collection.js +5 -20
  26. package/dist/common/collection.js.map +1 -1
  27. package/dist/common/config.js +0 -7
  28. package/dist/common/config.js.map +1 -1
  29. package/dist/common/errors/captcha-error.js +5 -26
  30. package/dist/common/errors/captcha-error.js.map +1 -1
  31. package/dist/common/errors/intent-to-join.js +5 -26
  32. package/dist/common/errors/intent-to-join.js.map +1 -1
  33. package/dist/common/errors/join-meeting.js +6 -27
  34. package/dist/common/errors/join-meeting.js.map +1 -1
  35. package/dist/common/errors/media.js +5 -26
  36. package/dist/common/errors/media.js.map +1 -1
  37. package/dist/common/errors/parameter.js +5 -33
  38. package/dist/common/errors/parameter.js.map +1 -1
  39. package/dist/common/errors/password-error.js +5 -26
  40. package/dist/common/errors/password-error.js.map +1 -1
  41. package/dist/common/errors/permission.js +4 -25
  42. package/dist/common/errors/permission.js.map +1 -1
  43. package/dist/common/errors/reconnection-in-progress.js +0 -17
  44. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  45. package/dist/common/errors/reconnection.js +5 -26
  46. package/dist/common/errors/reconnection.js.map +1 -1
  47. package/dist/common/errors/stats.js +5 -26
  48. package/dist/common/errors/stats.js.map +1 -1
  49. package/dist/common/errors/webex-errors.js +6 -41
  50. package/dist/common/errors/webex-errors.js.map +1 -1
  51. package/dist/common/errors/webex-meetings-error.js +1 -24
  52. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  53. package/dist/common/events/events-scope.js +0 -22
  54. package/dist/common/events/events-scope.js.map +1 -1
  55. package/dist/common/events/events.js +0 -23
  56. package/dist/common/events/events.js.map +1 -1
  57. package/dist/common/events/trigger-proxy.js +0 -12
  58. package/dist/common/events/trigger-proxy.js.map +1 -1
  59. package/dist/common/events/util.js +0 -15
  60. package/dist/common/events/util.js.map +1 -1
  61. package/dist/common/logs/logger-config.js +0 -4
  62. package/dist/common/logs/logger-config.js.map +1 -1
  63. package/dist/common/logs/logger-proxy.js +1 -8
  64. package/dist/common/logs/logger-proxy.js.map +1 -1
  65. package/dist/common/logs/request.js +35 -61
  66. package/dist/common/logs/request.js.map +1 -1
  67. package/dist/common/queue.js +4 -14
  68. package/dist/common/queue.js.map +1 -1
  69. package/dist/config.js +6 -6
  70. package/dist/config.js.map +1 -1
  71. package/dist/constants.js +193 -53
  72. package/dist/constants.js.map +1 -1
  73. package/dist/controls-options-manager/constants.js +14 -0
  74. package/dist/controls-options-manager/constants.js.map +1 -0
  75. package/dist/controls-options-manager/enums.js +27 -0
  76. package/dist/controls-options-manager/enums.js.map +1 -0
  77. package/dist/controls-options-manager/index.js +297 -0
  78. package/dist/controls-options-manager/index.js.map +1 -0
  79. package/dist/controls-options-manager/types.js +7 -0
  80. package/dist/controls-options-manager/types.js.map +1 -0
  81. package/dist/controls-options-manager/util.js +286 -0
  82. package/dist/controls-options-manager/util.js.map +1 -0
  83. package/dist/index.js +72 -17
  84. package/dist/index.js.map +1 -1
  85. package/dist/locus-info/controlsUtils.js +94 -29
  86. package/dist/locus-info/controlsUtils.js.map +1 -1
  87. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  88. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  89. package/dist/locus-info/fullState.js +0 -15
  90. package/dist/locus-info/fullState.js.map +1 -1
  91. package/dist/locus-info/hostUtils.js +4 -12
  92. package/dist/locus-info/hostUtils.js.map +1 -1
  93. package/dist/locus-info/index.js +383 -212
  94. package/dist/locus-info/index.js.map +1 -1
  95. package/dist/locus-info/infoUtils.js +0 -38
  96. package/dist/locus-info/infoUtils.js.map +1 -1
  97. package/dist/locus-info/mediaSharesUtils.js +12 -38
  98. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  99. package/dist/locus-info/parser.js +88 -123
  100. package/dist/locus-info/parser.js.map +1 -1
  101. package/dist/locus-info/selfUtils.js +99 -91
  102. package/dist/locus-info/selfUtils.js.map +1 -1
  103. package/dist/media/index.js +62 -147
  104. package/dist/media/index.js.map +1 -1
  105. package/dist/media/properties.js +71 -117
  106. package/dist/media/properties.js.map +1 -1
  107. package/dist/media/util.js +2 -9
  108. package/dist/media/util.js.map +1 -1
  109. package/dist/mediaQualityMetrics/config.js +505 -495
  110. package/dist/mediaQualityMetrics/config.js.map +1 -1
  111. package/dist/meeting/in-meeting-actions.js +67 -14
  112. package/dist/meeting/in-meeting-actions.js.map +1 -1
  113. package/dist/meeting/index.js +2477 -2417
  114. package/dist/meeting/index.js.map +1 -1
  115. package/dist/meeting/muteState.js +252 -113
  116. package/dist/meeting/muteState.js.map +1 -1
  117. package/dist/meeting/request.js +296 -289
  118. package/dist/meeting/request.js.map +1 -1
  119. package/dist/meeting/request.type.js +7 -0
  120. package/dist/meeting/request.type.js.map +1 -0
  121. package/dist/meeting/state.js +21 -31
  122. package/dist/meeting/state.js.map +1 -1
  123. package/dist/meeting/util.js +58 -217
  124. package/dist/meeting/util.js.map +1 -1
  125. package/dist/meeting-info/collection.js +3 -25
  126. package/dist/meeting-info/collection.js.map +1 -1
  127. package/dist/meeting-info/index.js +10 -33
  128. package/dist/meeting-info/index.js.map +1 -1
  129. package/dist/meeting-info/meeting-info-v2.js +278 -281
  130. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  131. package/dist/meeting-info/request.js +1 -16
  132. package/dist/meeting-info/request.js.map +1 -1
  133. package/dist/meeting-info/util.js +98 -183
  134. package/dist/meeting-info/util.js.map +1 -1
  135. package/dist/meeting-info/utilv2.js +155 -232
  136. package/dist/meeting-info/utilv2.js.map +1 -1
  137. package/dist/meetings/collection.js +24 -20
  138. package/dist/meetings/collection.js.map +1 -1
  139. package/dist/meetings/index.js +675 -593
  140. package/dist/meetings/index.js.map +1 -1
  141. package/dist/meetings/request.js +23 -42
  142. package/dist/meetings/request.js.map +1 -1
  143. package/dist/meetings/util.js +177 -155
  144. package/dist/meetings/util.js.map +1 -1
  145. package/dist/member/index.js +89 -88
  146. package/dist/member/index.js.map +1 -1
  147. package/dist/member/types.js +15 -0
  148. package/dist/member/types.js.map +1 -0
  149. package/dist/member/util.js +101 -69
  150. package/dist/member/util.js.map +1 -1
  151. package/dist/members/collection.js +12 -12
  152. package/dist/members/collection.js.map +1 -1
  153. package/dist/members/index.js +162 -204
  154. package/dist/members/index.js.map +1 -1
  155. package/dist/members/request.js +58 -53
  156. package/dist/members/request.js.map +1 -1
  157. package/dist/members/types.js +15 -0
  158. package/dist/members/types.js.map +1 -0
  159. package/dist/members/util.js +107 -44
  160. package/dist/members/util.js.map +1 -1
  161. package/dist/metrics/config.js +50 -16
  162. package/dist/metrics/config.js.map +1 -1
  163. package/dist/metrics/constants.js +3 -7
  164. package/dist/metrics/constants.js.map +1 -1
  165. package/dist/metrics/index.js +93 -162
  166. package/dist/metrics/index.js.map +1 -1
  167. package/dist/multistream/mediaRequestManager.js +167 -50
  168. package/dist/multistream/mediaRequestManager.js.map +1 -1
  169. package/dist/multistream/receiveSlot.js +58 -65
  170. package/dist/multistream/receiveSlot.js.map +1 -1
  171. package/dist/multistream/receiveSlotManager.js +74 -93
  172. package/dist/multistream/receiveSlotManager.js.map +1 -1
  173. package/dist/multistream/remoteMedia.js +55 -74
  174. package/dist/multistream/remoteMedia.js.map +1 -1
  175. package/dist/multistream/remoteMediaGroup.js +6 -40
  176. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  177. package/dist/multistream/remoteMediaManager.js +466 -442
  178. package/dist/multistream/remoteMediaManager.js.map +1 -1
  179. package/dist/networkQualityMonitor/index.js +32 -59
  180. package/dist/networkQualityMonitor/index.js.map +1 -1
  181. package/dist/personal-meeting-room/index.js +10 -45
  182. package/dist/personal-meeting-room/index.js.map +1 -1
  183. package/dist/personal-meeting-room/request.js +2 -33
  184. package/dist/personal-meeting-room/request.js.map +1 -1
  185. package/dist/personal-meeting-room/util.js +0 -13
  186. package/dist/personal-meeting-room/util.js.map +1 -1
  187. package/dist/reachability/index.js +190 -199
  188. package/dist/reachability/index.js.map +1 -1
  189. package/dist/reachability/request.js +14 -23
  190. package/dist/reachability/request.js.map +1 -1
  191. package/dist/reactions/constants.js +13 -0
  192. package/dist/reactions/constants.js.map +1 -0
  193. package/dist/reactions/reactions.js +2 -4
  194. package/dist/reactions/reactions.js.map +1 -1
  195. package/dist/reactions/reactions.type.js +19 -23
  196. package/dist/reactions/reactions.type.js.map +1 -1
  197. package/dist/reconnection-manager/index.js +326 -465
  198. package/dist/reconnection-manager/index.js.map +1 -1
  199. package/dist/recording-controller/enums.js +17 -0
  200. package/dist/recording-controller/enums.js.map +1 -0
  201. package/dist/recording-controller/index.js +343 -0
  202. package/dist/recording-controller/index.js.map +1 -0
  203. package/dist/recording-controller/util.js +63 -0
  204. package/dist/recording-controller/util.js.map +1 -0
  205. package/dist/roap/index.js +38 -67
  206. package/dist/roap/index.js.map +1 -1
  207. package/dist/roap/request.js +143 -134
  208. package/dist/roap/request.js.map +1 -1
  209. package/dist/roap/turnDiscovery.js +149 -101
  210. package/dist/roap/turnDiscovery.js.map +1 -1
  211. package/dist/statsAnalyzer/global.js +1 -95
  212. package/dist/statsAnalyzer/global.js.map +1 -1
  213. package/dist/statsAnalyzer/index.js +369 -461
  214. package/dist/statsAnalyzer/index.js.map +1 -1
  215. package/dist/statsAnalyzer/mqaUtil.js +144 -94
  216. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  217. package/dist/transcription/index.js +13 -45
  218. package/dist/transcription/index.js.map +1 -1
  219. package/dist/types/annotation/annotation.types.d.ts +34 -0
  220. package/dist/types/annotation/constants.d.ts +31 -0
  221. package/dist/types/annotation/index.d.ts +124 -0
  222. package/dist/types/breakouts/breakout.d.ts +8 -0
  223. package/dist/types/breakouts/collection.d.ts +5 -0
  224. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  225. package/dist/types/breakouts/events.d.ts +2 -0
  226. package/dist/types/breakouts/index.d.ts +5 -0
  227. package/dist/types/breakouts/request.d.ts +22 -0
  228. package/dist/types/breakouts/utils.d.ts +15 -0
  229. package/dist/types/common/browser-detection.d.ts +9 -0
  230. package/dist/types/common/collection.d.ts +48 -0
  231. package/dist/types/common/config.d.ts +2 -0
  232. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  233. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  234. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  235. package/dist/types/common/errors/media.d.ts +15 -0
  236. package/dist/types/common/errors/parameter.d.ts +15 -0
  237. package/dist/types/common/errors/password-error.d.ts +15 -0
  238. package/dist/types/common/errors/permission.d.ts +14 -0
  239. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  240. package/dist/types/common/errors/reconnection.d.ts +15 -0
  241. package/dist/types/common/errors/stats.d.ts +15 -0
  242. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  243. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  244. package/dist/types/common/events/events-scope.d.ts +17 -0
  245. package/dist/types/common/events/events.d.ts +12 -0
  246. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  247. package/dist/types/common/events/util.d.ts +2 -0
  248. package/dist/types/common/logs/logger-config.d.ts +2 -0
  249. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  250. package/dist/types/common/logs/request.d.ts +34 -0
  251. package/dist/types/common/queue.d.ts +32 -0
  252. package/dist/types/config.d.ts +78 -0
  253. package/dist/types/constants.d.ts +984 -0
  254. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  255. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  256. package/dist/types/controls-options-manager/index.d.ts +136 -0
  257. package/dist/types/controls-options-manager/types.d.ts +43 -0
  258. package/dist/types/controls-options-manager/util.d.ts +1 -0
  259. package/dist/types/index.d.ts +7 -0
  260. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  261. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  262. package/dist/types/locus-info/fullState.d.ts +2 -0
  263. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  264. package/dist/types/locus-info/index.d.ts +315 -0
  265. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  266. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  267. package/dist/types/locus-info/parser.d.ts +212 -0
  268. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  269. package/dist/types/media/index.d.ts +34 -0
  270. package/dist/types/media/properties.d.ts +108 -0
  271. package/dist/types/media/util.d.ts +2 -0
  272. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  273. package/dist/types/meeting/in-meeting-actions.d.ts +137 -0
  274. package/dist/types/meeting/index.d.ts +1753 -0
  275. package/dist/types/meeting/muteState.d.ts +185 -0
  276. package/dist/types/meeting/request.d.ts +275 -0
  277. package/dist/types/meeting/request.type.d.ts +11 -0
  278. package/dist/types/meeting/state.d.ts +9 -0
  279. package/dist/types/meeting/util.d.ts +2 -0
  280. package/dist/types/meeting-info/collection.d.ts +20 -0
  281. package/dist/types/meeting-info/index.d.ts +57 -0
  282. package/dist/types/meeting-info/meeting-info-v2.d.ts +115 -0
  283. package/dist/types/meeting-info/request.d.ts +22 -0
  284. package/dist/types/meeting-info/util.d.ts +2 -0
  285. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  286. package/dist/types/meetings/collection.d.ts +31 -0
  287. package/dist/types/meetings/index.d.ts +345 -0
  288. package/dist/types/meetings/request.d.ts +27 -0
  289. package/dist/types/meetings/util.d.ts +18 -0
  290. package/dist/types/member/index.d.ts +157 -0
  291. package/dist/types/member/types.d.ts +21 -0
  292. package/dist/types/member/util.d.ts +2 -0
  293. package/dist/types/members/collection.d.ts +29 -0
  294. package/dist/types/members/index.d.ts +353 -0
  295. package/dist/types/members/request.d.ts +69 -0
  296. package/dist/types/members/types.d.ts +24 -0
  297. package/dist/types/members/util.d.ts +2 -0
  298. package/dist/types/metrics/config.d.ts +195 -0
  299. package/dist/types/metrics/constants.d.ts +54 -0
  300. package/dist/types/metrics/index.d.ts +169 -0
  301. package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
  302. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  303. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  304. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  305. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  306. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  307. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  308. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  309. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  310. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  311. package/dist/types/reachability/index.d.ts +152 -0
  312. package/dist/types/reachability/request.d.ts +37 -0
  313. package/dist/types/reactions/constants.d.ts +3 -0
  314. package/dist/types/reactions/reactions.d.ts +4 -0
  315. package/dist/types/reactions/reactions.type.d.ts +52 -0
  316. package/dist/types/reconnection-manager/index.d.ts +126 -0
  317. package/dist/types/recording-controller/enums.d.ts +7 -0
  318. package/dist/types/recording-controller/index.d.ts +193 -0
  319. package/dist/types/recording-controller/util.d.ts +13 -0
  320. package/dist/types/roap/index.d.ts +77 -0
  321. package/dist/types/roap/request.d.ts +38 -0
  322. package/dist/types/roap/turnDiscovery.d.ts +88 -0
  323. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  324. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  325. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  326. package/dist/types/transcription/index.d.ts +64 -0
  327. package/internal-README.md +7 -6
  328. package/package.json +28 -21
  329. package/src/annotation/annotation.types.ts +41 -0
  330. package/src/annotation/constants.ts +36 -0
  331. package/src/annotation/index.ts +339 -0
  332. package/src/breakouts/README.md +220 -0
  333. package/src/breakouts/breakout.ts +141 -0
  334. package/src/breakouts/collection.ts +19 -0
  335. package/src/breakouts/edit-lock-error.ts +25 -0
  336. package/src/breakouts/events.ts +37 -0
  337. package/src/breakouts/index.ts +835 -0
  338. package/src/breakouts/request.ts +55 -0
  339. package/src/breakouts/utils.ts +57 -0
  340. package/src/common/browser-detection.ts +9 -6
  341. package/src/common/collection.ts +3 -1
  342. package/src/common/errors/captcha-error.ts +6 -6
  343. package/src/common/errors/intent-to-join.ts +6 -6
  344. package/src/common/errors/join-meeting.ts +12 -8
  345. package/src/common/errors/media.ts +6 -6
  346. package/src/common/errors/parameter.ts +9 -6
  347. package/src/common/errors/password-error.ts +6 -6
  348. package/src/common/errors/permission.ts +5 -5
  349. package/src/common/errors/reconnection.ts +6 -6
  350. package/src/common/errors/stats.ts +6 -6
  351. package/src/common/errors/webex-errors.ts +7 -5
  352. package/src/common/errors/webex-meetings-error.ts +1 -1
  353. package/src/common/events/events-scope.ts +5 -1
  354. package/src/common/events/events.ts +5 -1
  355. package/src/common/events/trigger-proxy.ts +8 -3
  356. package/src/common/events/util.ts +1 -2
  357. package/src/common/logs/logger-proxy.ts +21 -10
  358. package/src/common/logs/request.ts +11 -8
  359. package/src/config.ts +16 -12
  360. package/src/constants.ts +141 -6
  361. package/src/controls-options-manager/constants.ts +5 -0
  362. package/src/controls-options-manager/enums.ts +18 -0
  363. package/src/controls-options-manager/index.ts +278 -0
  364. package/src/controls-options-manager/types.ts +59 -0
  365. package/src/controls-options-manager/util.ts +274 -0
  366. package/src/index.ts +33 -0
  367. package/src/locus-info/controlsUtils.ts +145 -24
  368. package/src/locus-info/fullState.ts +15 -11
  369. package/src/locus-info/hostUtils.ts +4 -3
  370. package/src/locus-info/index.ts +326 -55
  371. package/src/locus-info/infoUtils.ts +12 -4
  372. package/src/locus-info/mediaSharesUtils.ts +4 -4
  373. package/src/locus-info/parser.ts +46 -68
  374. package/src/locus-info/selfUtils.ts +187 -56
  375. package/src/media/index.ts +142 -172
  376. package/src/media/properties.ts +43 -36
  377. package/src/media/util.ts +1 -1
  378. package/src/mediaQualityMetrics/config.ts +380 -378
  379. package/src/meeting/in-meeting-actions.ts +139 -3
  380. package/src/meeting/index.ts +2674 -1543
  381. package/src/meeting/muteState.ts +271 -68
  382. package/src/meeting/request.ts +231 -135
  383. package/src/meeting/request.type.ts +13 -0
  384. package/src/meeting/state.ts +45 -30
  385. package/src/meeting/util.ts +119 -110
  386. package/src/meeting-info/collection.ts +2 -1
  387. package/src/meeting-info/index.ts +32 -30
  388. package/src/meeting-info/meeting-info-v2.ts +201 -113
  389. package/src/meeting-info/request.ts +9 -3
  390. package/src/meeting-info/util.ts +54 -46
  391. package/src/meeting-info/utilv2.ts +70 -55
  392. package/src/meetings/collection.ts +21 -1
  393. package/src/meetings/index.ts +749 -437
  394. package/src/meetings/request.ts +29 -25
  395. package/src/meetings/util.ts +122 -33
  396. package/src/member/index.ts +95 -49
  397. package/src/member/types.ts +24 -0
  398. package/src/member/util.ts +106 -13
  399. package/src/members/collection.ts +8 -1
  400. package/src/members/index.ts +281 -129
  401. package/src/members/request.ts +87 -14
  402. package/src/members/types.ts +28 -0
  403. package/src/members/util.ts +140 -49
  404. package/src/metrics/config.ts +302 -90
  405. package/src/metrics/constants.ts +1 -6
  406. package/src/metrics/index.ts +124 -95
  407. package/src/multistream/mediaRequestManager.ts +203 -45
  408. package/src/multistream/receiveSlot.ts +69 -26
  409. package/src/multistream/receiveSlotManager.ts +62 -38
  410. package/src/multistream/remoteMedia.ts +30 -4
  411. package/src/multistream/remoteMediaGroup.ts +4 -3
  412. package/src/multistream/remoteMediaManager.ts +230 -66
  413. package/src/networkQualityMonitor/index.ts +24 -27
  414. package/src/personal-meeting-room/index.ts +12 -16
  415. package/src/personal-meeting-room/request.ts +10 -3
  416. package/src/personal-meeting-room/util.ts +3 -3
  417. package/src/reachability/index.ts +131 -79
  418. package/src/reachability/request.ts +43 -34
  419. package/src/reactions/constants.ts +4 -0
  420. package/src/reactions/reactions.ts +8 -8
  421. package/src/reactions/reactions.type.ts +31 -5
  422. package/src/reconnection-manager/index.ts +193 -111
  423. package/src/recording-controller/enums.ts +8 -0
  424. package/src/recording-controller/index.ts +315 -0
  425. package/src/recording-controller/util.ts +58 -0
  426. package/src/roap/index.ts +63 -51
  427. package/src/roap/request.ts +86 -53
  428. package/src/roap/turnDiscovery.ts +105 -46
  429. package/src/statsAnalyzer/global.ts +8 -104
  430. package/src/statsAnalyzer/index.ts +624 -376
  431. package/src/statsAnalyzer/mqaUtil.ts +203 -90
  432. package/src/transcription/index.ts +34 -32
  433. package/test/integration/spec/converged-space-meetings.js +177 -0
  434. package/test/integration/spec/journey.js +670 -466
  435. package/test/integration/spec/space-meeting.js +320 -204
  436. package/test/integration/spec/transcription.js +7 -8
  437. package/test/unit/spec/annotation/index.ts +435 -0
  438. package/test/unit/spec/breakouts/breakout.ts +184 -0
  439. package/test/unit/spec/breakouts/collection.ts +15 -0
  440. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  441. package/test/unit/spec/breakouts/events.ts +77 -0
  442. package/test/unit/spec/breakouts/index.ts +1542 -0
  443. package/test/unit/spec/breakouts/request.ts +104 -0
  444. package/test/unit/spec/breakouts/utils.js +72 -0
  445. package/test/unit/spec/common/browser-detection.js +9 -28
  446. package/test/unit/spec/controls-options-manager/index.js +287 -0
  447. package/test/unit/spec/controls-options-manager/util.js +504 -0
  448. package/test/unit/spec/fixture/locus.js +93 -90
  449. package/test/unit/spec/locus-info/controlsUtils.js +289 -32
  450. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  451. package/test/unit/spec/locus-info/index.js +585 -5
  452. package/test/unit/spec/locus-info/infoUtils.js +26 -33
  453. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  454. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  455. package/test/unit/spec/locus-info/parser.js +3 -9
  456. package/test/unit/spec/locus-info/selfConstant.js +110 -103
  457. package/test/unit/spec/locus-info/selfUtils.js +236 -12
  458. package/test/unit/spec/media/index.ts +104 -8
  459. package/test/unit/spec/media/properties.ts +9 -9
  460. package/test/unit/spec/meeting/in-meeting-actions.ts +66 -3
  461. package/test/unit/spec/meeting/index.js +2934 -946
  462. package/test/unit/spec/meeting/muteState.js +368 -70
  463. package/test/unit/spec/meeting/request.js +194 -44
  464. package/test/unit/spec/meeting/utils.js +146 -165
  465. package/test/unit/spec/meeting-info/meetinginfov2.js +333 -74
  466. package/test/unit/spec/meeting-info/request.js +7 -9
  467. package/test/unit/spec/meeting-info/util.js +11 -12
  468. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  469. package/test/unit/spec/meetings/collection.js +15 -1
  470. package/test/unit/spec/meetings/index.js +1052 -329
  471. package/test/unit/spec/meetings/utils.js +163 -14
  472. package/test/unit/spec/member/index.js +24 -1
  473. package/test/unit/spec/member/util.js +383 -32
  474. package/test/unit/spec/members/index.js +402 -54
  475. package/test/unit/spec/members/request.js +76 -20
  476. package/test/unit/spec/members/utils.js +191 -4
  477. package/test/unit/spec/metrics/index.js +104 -20
  478. package/test/unit/spec/multistream/mediaRequestManager.ts +650 -105
  479. package/test/unit/spec/multistream/receiveSlot.ts +76 -17
  480. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  481. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  482. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  483. package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
  484. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  485. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  486. package/test/unit/spec/reachability/index.ts +176 -27
  487. package/test/unit/spec/reachability/request.js +66 -0
  488. package/test/unit/spec/reconnection-manager/index.js +62 -31
  489. package/test/unit/spec/recording-controller/index.js +231 -0
  490. package/test/unit/spec/recording-controller/util.js +102 -0
  491. package/test/unit/spec/roap/index.ts +21 -16
  492. package/test/unit/spec/roap/request.ts +217 -0
  493. package/test/unit/spec/roap/turnDiscovery.ts +93 -49
  494. package/test/unit/spec/stats-analyzer/index.js +116 -60
  495. package/test/utils/cmr.js +44 -42
  496. package/test/utils/constants.js +9 -0
  497. package/test/utils/integrationTestUtils.js +64 -0
  498. package/test/utils/testUtils.js +63 -99
  499. package/test/utils/webex-config.js +22 -18
  500. package/test/utils/webex-test-users.js +57 -50
  501. package/tsconfig.json +6 -0
  502. package/dist/media/internal-media-core-wrapper.js +0 -22
  503. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  504. package/dist/meeting/effectsState.js +0 -334
  505. package/dist/meeting/effectsState.js.map +0 -1
  506. package/dist/multistream/multistreamMedia.js +0 -116
  507. package/dist/multistream/multistreamMedia.js.map +0 -1
  508. package/src/index.js +0 -15
  509. package/src/media/internal-media-core-wrapper.ts +0 -9
  510. package/src/meeting/effectsState.ts +0 -211
  511. package/src/multistream/multistreamMedia.ts +0 -92
  512. 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,84 @@ 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
+
98
183
  it('should not trigger the CONTROLS_RECORDING_UPDATED event', () => {
99
184
  locusInfo.controls = {};
100
185
  locusInfo.emitScoped = sinon.stub();
@@ -277,6 +362,28 @@ describe('plugin-meetings', () => {
277
362
  );
278
363
  });
279
364
 
365
+ it('should update the breakout state', () => {
366
+ locusInfo.emitScoped = sinon.stub();
367
+ let tmpStub = sinon.stub(SelfUtils, 'getReplacedBreakoutMoveId').returns('breakoutMoveId');
368
+ newControls.breakout = { 'breakout': {} };
369
+ let selfInfo = {};
370
+
371
+ locusInfo.updateControls(newControls, selfInfo);
372
+
373
+ assert.calledWith(
374
+ locusInfo.emitScoped,
375
+ {
376
+ file: 'locus-info',
377
+ function: 'updateControls',
378
+ },
379
+ LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED,
380
+ {
381
+ breakout: newControls.breakout,
382
+ }
383
+ );
384
+ tmpStub.restore();
385
+ });
386
+
280
387
  it('should update the transcript state', () => {
281
388
  locusInfo.emitScoped = sinon.stub();
282
389
  locusInfo.controls = {
@@ -398,6 +505,39 @@ describe('plugin-meetings', () => {
398
505
  assert.notEqual(x.args[1], LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED);
399
506
  });
400
507
  });
508
+
509
+ it('should update videoEnabled when changed', () => {
510
+ locusInfo.controls = {};
511
+
512
+ locusInfo.emitScoped = sinon.stub();
513
+ locusInfo.updateControls(newControls);
514
+
515
+ assert.calledWith(
516
+ locusInfo.emitScoped,
517
+ {
518
+ file: 'locus-info',
519
+ function: 'updateControls',
520
+ },
521
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
522
+ {unmuteAllowed: true}
523
+ );
524
+
525
+ assert.equal(mockMeeting.unmuteVideoAllowed, true);
526
+ });
527
+
528
+ it('should not update videoEnabled when unchanged', () => {
529
+ locusInfo.controls = {videoEnabled: true};
530
+
531
+ locusInfo.emitScoped = sinon.stub();
532
+ locusInfo.updateControls(newControls);
533
+
534
+ locusInfo.emitScoped.getCalls().forEach((x) => {
535
+ // check that no calls in emitScoped are for SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED
536
+ assert.notEqual(x.args[1], LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED);
537
+ });
538
+
539
+ assert.equal(mockMeeting.unmuteVideoAllowed, undefined);
540
+ });
401
541
  });
402
542
 
403
543
  describe('#updateParticipants()', () => {
@@ -451,6 +591,7 @@ describe('plugin-meetings', () => {
451
591
  selfIdentity: '123',
452
592
  selfId: '2',
453
593
  hostId: '3',
594
+ isReplace: undefined,
454
595
  }
455
596
  );
456
597
  // note: in a real use case, recordingId, selfId, and hostId would all be the same
@@ -458,6 +599,43 @@ describe('plugin-meetings', () => {
458
599
  // are being correctly grabbed from locusInfo.parsedLocus within updateParticipants
459
600
  });
460
601
 
602
+ it('should call with breakout control info', () => {
603
+ locusInfo.parsedLocus = {
604
+ controls: {
605
+ record: {
606
+ modifiedBy: '1',
607
+ },
608
+ },
609
+ self: {
610
+ selfIdentity: '123',
611
+ selfId: '2',
612
+ },
613
+ host: {
614
+ hostId: '3',
615
+ },
616
+ };
617
+
618
+ locusInfo.emitScoped = sinon.stub();
619
+ locusInfo.updateParticipants({}, true);
620
+
621
+ assert.calledWith(
622
+ locusInfo.emitScoped,
623
+ {
624
+ file: 'locus-info',
625
+ function: 'updateParticipants',
626
+ },
627
+ EVENTS.LOCUS_INFO_UPDATE_PARTICIPANTS,
628
+ {
629
+ participants: {},
630
+ recordingId: '1',
631
+ selfIdentity: '123',
632
+ selfId: '2',
633
+ hostId: '3',
634
+ isReplace: true,
635
+ }
636
+ );
637
+ });
638
+
461
639
  it('should update the deltaParticipants object', () => {
462
640
  const prev = locusInfo.deltaParticipants;
463
641
 
@@ -664,6 +842,143 @@ describe('plugin-meetings', () => {
664
842
  );
665
843
  });
666
844
 
845
+ describe('SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED', () => {
846
+ it('should emit event when video muted on entry', () => {
847
+ // usually "previous self" is just undefined when we get first self from locus
848
+ locusInfo.self = undefined;
849
+ const selfWithMutedByOthers = cloneDeep(self);
850
+
851
+ // remoteVideoMuted
852
+ selfWithMutedByOthers.controls.video.muted = true;
853
+
854
+ locusInfo.webex.internal.device.url = self.deviceUrl;
855
+ locusInfo.emitScoped = sinon.stub();
856
+ locusInfo.updateSelf(selfWithMutedByOthers, []);
857
+
858
+ assert.calledWith(
859
+ locusInfo.emitScoped,
860
+ {
861
+ file: 'locus-info',
862
+ function: 'updateSelf',
863
+ },
864
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
865
+ {muted: true}
866
+ );
867
+
868
+ // but sometimes "previous self" is defined, but without controls.audio.muted, so we test this here:
869
+ locusInfo.self = cloneDeep(self);
870
+ locusInfo.self.controls.video = {};
871
+
872
+ locusInfo.updateSelf(selfWithMutedByOthers, []);
873
+ assert.calledWith(
874
+ locusInfo.emitScoped,
875
+ {
876
+ file: 'locus-info',
877
+ function: 'updateSelf',
878
+ },
879
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
880
+ {muted: true}
881
+ );
882
+ });
883
+
884
+ it('should not emit event when not muted on entry', () => {
885
+ locusInfo.self = undefined;
886
+ const selfWithMutedByOthersFalse = cloneDeep(self);
887
+
888
+ selfWithMutedByOthersFalse.controls.video.muted = false;
889
+
890
+ locusInfo.webex.internal.device.url = self.deviceUrl;
891
+ locusInfo.emitScoped = sinon.stub();
892
+ locusInfo.updateSelf(selfWithMutedByOthersFalse, []);
893
+
894
+ // we might get some calls to emitScoped, but we need to check that none of them are for SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED
895
+ locusInfo.emitScoped.getCalls().forEach((x) => {
896
+ assert.notEqual(x.args[1], LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED);
897
+ });
898
+ });
899
+
900
+ it('should emit event when remoteVideoMuted changed', () => {
901
+ locusInfo.self = self;
902
+ const selfWithMutedByOthers = cloneDeep(self);
903
+
904
+ selfWithMutedByOthers.controls.video.muted = true;
905
+
906
+ locusInfo.webex.internal.device.url = self.deviceUrl;
907
+ locusInfo.emitScoped = sinon.stub();
908
+ locusInfo.updateSelf(selfWithMutedByOthers, []);
909
+
910
+ assert.calledWith(
911
+ locusInfo.emitScoped,
912
+ {
913
+ file: 'locus-info',
914
+ function: 'updateSelf',
915
+ },
916
+ LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
917
+ {muted: true}
918
+ );
919
+ });
920
+ });
921
+
922
+ it('should trigger SELF_MEETING_BREAKOUTS_CHANGED when breakouts changed', () => {
923
+ locusInfo.self = self;
924
+ const selfWithBreakoutsChanged = cloneDeep(self);
925
+
926
+ selfWithBreakoutsChanged.controls.breakout.sessions.active[0].name = 'new name';
927
+
928
+ locusInfo.emitScoped = sinon.stub();
929
+ locusInfo.updateSelf(selfWithBreakoutsChanged, []);
930
+
931
+ assert.calledWith(
932
+ locusInfo.emitScoped,
933
+ {
934
+ file: 'locus-info',
935
+ function: 'updateSelf',
936
+ },
937
+ LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED,
938
+ {
939
+ breakoutSessions: {
940
+ active: [
941
+ {
942
+ name: 'new name',
943
+ groupId: '0e73abb8-5584-49d8-be8d-806d2a8247ca',
944
+ sessionId: '1cf41ab1-2e57-4d95-b7e9-5613acddfb0f',
945
+ sessionType: 'BREAKOUT',
946
+ },
947
+ ],
948
+ allowed: [
949
+ {
950
+ name: 'Breakout session 2',
951
+ groupId: '0e73abb8-5584-49d8-be8d-806d2a8247ca',
952
+ sessionId: '1cf41ab1-2e57-4d95-b7e9-5613acddfb0f',
953
+ sessionType: 'BREAKOUT',
954
+ },
955
+ ],
956
+ },
957
+ }
958
+ );
959
+ });
960
+
961
+ it('should trigger upgradeToModeratorOrCohost for breakouts', () => {
962
+
963
+ locusInfo.self = self;
964
+ const upgradeToModeratorOrCohost = cloneDeep(self);
965
+ upgradeToModeratorOrCohost.roles = ['ATTENDEE','COHOST'];
966
+
967
+ locusInfo.webex.internal.device.url = self.deviceUrl;
968
+ locusInfo.emitScoped = sinon.stub();
969
+ locusInfo.updateSelf(upgradeToModeratorOrCohost, []);
970
+
971
+ assert.neverCalledWith(
972
+ locusInfo.emitScoped,
973
+ {
974
+ file: 'locus-info',
975
+ function: 'updateSelf',
976
+ },
977
+ LOCUSINFO.EVENTS.SELF_MODERATOR_OR_COHOST_UPGRADE,
978
+ self
979
+ );
980
+ });
981
+
667
982
  it('should trigger SELF_REMOTE_MUTE_STATUS_UPDATED if muted and disallowUnmute changed', () => {
668
983
  locusInfo.self = self;
669
984
  const selfWithMutedByOthersAndDissalowUnmute = cloneDeep(self);
@@ -962,18 +1277,36 @@ describe('plugin-meetings', () => {
962
1277
  function: 'updateMeetingInfo',
963
1278
  },
964
1279
  LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,
965
- {info: locusInfo.parsedLocus.info, self},
1280
+ {info: locusInfo.parsedLocus.info, self},
966
1281
  ];
967
1282
 
968
1283
  if (expected) {
969
1284
  assert.calledWith(...expectedArgs);
1285
+ } else {
1286
+ assert.neverCalledWith(...expectedArgs);
970
1287
  }
971
- else {
1288
+ locusInfo.emitScoped.resetHistory();
1289
+ };
1290
+
1291
+ const checkMeetingInfoUpdatedCalledForRoles = (expected) => {
1292
+ const expectedArgs = [
1293
+ locusInfo.emitScoped,
1294
+ {
1295
+ file: 'locus-info',
1296
+ function: 'updateMeetingInfo',
1297
+ },
1298
+ LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,
1299
+ ];
1300
+
1301
+ if (expected) {
1302
+ assert.calledWith(...expectedArgs);
1303
+ } else {
972
1304
  assert.neverCalledWith(...expectedArgs);
973
1305
  }
974
1306
  locusInfo.emitScoped.resetHistory();
975
1307
  };
976
1308
 
1309
+
977
1310
  it('emits MEETING_INFO_UPDATED if the info changes', () => {
978
1311
  const initialInfo = cloneDeep(meetingInfo);
979
1312
 
@@ -999,6 +1332,16 @@ describe('plugin-meetings', () => {
999
1332
 
1000
1333
  // since the info is the same it should not call trigger the event
1001
1334
  checkMeetingInfoUpdatedCalled(false);
1335
+
1336
+ // update it with the same info, but roles changed
1337
+ const updateSelf = cloneDeep(self);
1338
+ updateSelf?.controls?.role?.roles.push({
1339
+ type: 'COHOST',
1340
+ hasRole: true,
1341
+ });
1342
+ locusInfo.updateMeetingInfo(newInfo, updateSelf);
1343
+ // since the info is the same but roles changed, it should call trigger the event
1344
+ checkMeetingInfoUpdatedCalledForRoles(true);
1002
1345
  });
1003
1346
 
1004
1347
  it('gets roles from self if available', () => {
@@ -1104,6 +1447,7 @@ describe('plugin-meetings', () => {
1104
1447
  fakeLocus = {
1105
1448
  meeting: true,
1106
1449
  participants: true,
1450
+ url: 'newLocusUrl',
1107
1451
  };
1108
1452
  });
1109
1453
 
@@ -1148,6 +1492,55 @@ describe('plugin-meetings', () => {
1148
1492
  assert.isFunction(locusParser.onDeltaAction);
1149
1493
  });
1150
1494
 
1495
+ it('#updateLocusInfo ignores breakout LEFT message', () => {
1496
+ const newLocus = {
1497
+ self: {
1498
+ reason: 'MOVED',
1499
+ state: 'LEFT',
1500
+ },
1501
+ };
1502
+
1503
+ locusInfo.updateControls = sinon.stub();
1504
+ locusInfo.updateConversationUrl = sinon.stub();
1505
+ locusInfo.updateCreated = sinon.stub();
1506
+ locusInfo.updateFullState = sinon.stub();
1507
+ locusInfo.updateHostInfo = sinon.stub();
1508
+ locusInfo.updateMeetingInfo = sinon.stub();
1509
+ locusInfo.updateMediaShares = sinon.stub();
1510
+ locusInfo.updateParticipantsUrl = sinon.stub();
1511
+ locusInfo.updateReplace = sinon.stub();
1512
+ locusInfo.updateSelf = sinon.stub();
1513
+ locusInfo.updateLocusUrl = sinon.stub();
1514
+ locusInfo.updateAclUrl = sinon.stub();
1515
+ locusInfo.updateBasequence = sinon.stub();
1516
+ locusInfo.updateSequence = sinon.stub();
1517
+ locusInfo.updateMemberShip = sinon.stub();
1518
+ locusInfo.updateIdentifiers = sinon.stub();
1519
+ locusInfo.updateEmbeddedApps = sinon.stub();
1520
+ locusInfo.compareAndUpdate = sinon.stub();
1521
+
1522
+ locusInfo.updateLocusInfo(newLocus);
1523
+
1524
+ assert.notCalled(locusInfo.updateControls);
1525
+ assert.notCalled(locusInfo.updateConversationUrl);
1526
+ assert.notCalled(locusInfo.updateCreated);
1527
+ assert.notCalled(locusInfo.updateFullState);
1528
+ assert.notCalled(locusInfo.updateHostInfo);
1529
+ assert.notCalled(locusInfo.updateMeetingInfo);
1530
+ assert.notCalled(locusInfo.updateMediaShares);
1531
+ assert.notCalled(locusInfo.updateParticipantsUrl);
1532
+ assert.notCalled(locusInfo.updateReplace);
1533
+ assert.notCalled(locusInfo.updateSelf);
1534
+ assert.notCalled(locusInfo.updateLocusUrl);
1535
+ assert.notCalled(locusInfo.updateAclUrl);
1536
+ assert.notCalled(locusInfo.updateBasequence);
1537
+ assert.notCalled(locusInfo.updateSequence);
1538
+ assert.notCalled(locusInfo.updateMemberShip);
1539
+ assert.notCalled(locusInfo.updateIdentifiers);
1540
+ assert.notCalled(locusInfo.updateEmbeddedApps);
1541
+ assert.notCalled(locusInfo.compareAndUpdate);
1542
+ });
1543
+
1151
1544
  it('onFullLocus() updates the working-copy of locus parser', () => {
1152
1545
  const eventType = 'fakeEvent';
1153
1546
 
@@ -1197,12 +1590,18 @@ describe('plugin-meetings', () => {
1197
1590
  locusInfo: {
1198
1591
  onFullLocus: sandbox.stub(),
1199
1592
  },
1593
+ locusUrl: 'oldLocusUrl',
1200
1594
  };
1201
1595
 
1202
1596
  locusInfo.locusParser.resume = sandbox.stub();
1203
1597
  locusInfo.applyLocusDeltaData(DESYNC, fakeLocus, meeting);
1204
1598
 
1205
- assert.calledOnce(meeting.meetingRequest.getFullLocus);
1599
+ assert.calledOnceWithExactly(meeting.meetingRequest.getFullLocus,
1600
+ {
1601
+ desync: true,
1602
+ locusUrl: 'newLocusUrl',
1603
+ }
1604
+ );
1206
1605
  });
1207
1606
 
1208
1607
  it('getFullLocus handles DESYNC action correctly', () => {
@@ -1227,6 +1626,187 @@ describe('plugin-meetings', () => {
1227
1626
  assert.calledOnce(locusInfo.locusParser.resume);
1228
1627
  });
1229
1628
  });
1629
+
1630
+ it('onDeltaLocus handle delta data', () => {
1631
+ fakeLocus.participants = {};
1632
+ const fakeBreakout = {
1633
+ sessionId: 'sessionId',
1634
+ groupId: 'groupId',
1635
+ };
1636
+
1637
+ fakeLocus.controls = {
1638
+ breakout: fakeBreakout
1639
+ };
1640
+ locusInfo.controls = {
1641
+ breakout: {
1642
+ sessionId: 'sessionId',
1643
+ groupId: 'groupId',
1644
+ }
1645
+ }
1646
+ locusInfo.updateParticipants = sinon.stub();
1647
+ locusInfo.onDeltaLocus(fakeLocus);
1648
+ assert.calledWith(locusInfo.updateParticipants, {}, false);
1649
+
1650
+ fakeLocus.controls.breakout.sessionId = 'sessionId2';
1651
+ locusInfo.onDeltaLocus(fakeLocus);
1652
+ assert.calledWith(locusInfo.updateParticipants, {}, true);
1653
+ });
1654
+ });
1655
+
1656
+ describe('#updateLocusCache', () => {
1657
+ it('cache it if income locus is main session locus', () => {
1658
+ const locus = {url: 'url'};
1659
+ locusInfo.mainSessionLocusCache = null;
1660
+ locusInfo.updateLocusCache(locus);
1661
+
1662
+ assert.deepEqual(locusInfo.mainSessionLocusCache, locus);
1663
+ });
1664
+
1665
+ it('not cache it if income locus is breakout session locus', () => {
1666
+ const locus = {url: 'url', controls: {breakout: {sessionType: 'BREAKOUT'}}};
1667
+ locusInfo.mainSessionLocusCache = null;
1668
+ locusInfo.updateLocusCache(locus);
1669
+
1670
+ assert.isNull(locusInfo.mainSessionLocusCache);
1671
+ });
1672
+ });
1673
+
1674
+ describe('#getTheLocusToUpdate', () => {
1675
+ it('return the cache locus if return to main session', () => {
1676
+ locusInfo.mainSessionLocusCache = {url: 'url'};
1677
+ locusInfo.controls = {
1678
+ breakout: {
1679
+ sessionType: 'BREAKOUT'
1680
+ }
1681
+ }
1682
+ const newLocus = {
1683
+ controls: {
1684
+ breakout: {
1685
+ sessionType: 'MAIN',
1686
+ },
1687
+ },
1688
+ };
1689
+
1690
+ assert.deepEqual(locusInfo.getTheLocusToUpdate(newLocus), {url: 'url'});
1691
+ });
1692
+
1693
+ it('return the new locus if return to main session but no cache', () => {
1694
+ locusInfo.mainSessionLocusCache = null;
1695
+ locusInfo.controls = {
1696
+ breakout: {
1697
+ sessionType: 'BREAKOUT'
1698
+ }
1699
+ }
1700
+ const newLocus = {
1701
+ controls: {
1702
+ breakout: {
1703
+ sessionType: 'MAIN',
1704
+ },
1705
+ },
1706
+ };
1707
+
1708
+ assert.deepEqual(locusInfo.getTheLocusToUpdate(newLocus), newLocus);
1709
+ });
1710
+
1711
+ it('return the new locus if not return to main session', () => {
1712
+ locusInfo.mainSessionLocusCache = {url: 'url'};
1713
+ locusInfo.controls = {
1714
+ breakout: {
1715
+ sessionType: 'MAIN'
1716
+ }
1717
+ }
1718
+ const newLocus = {
1719
+ controls: {
1720
+ breakout: {
1721
+ sessionType: 'BREAKOUT',
1722
+ },
1723
+ },
1724
+ };
1725
+
1726
+ assert.deepEqual(locusInfo.getTheLocusToUpdate(newLocus), newLocus);
1727
+ });
1728
+ });
1729
+
1730
+ describe('#mergeParticipants', () => {
1731
+ let participants;
1732
+ let sourceParticipants;
1733
+ beforeEach(() => {
1734
+ participants = [{id: '111', status: 'JOINED'}, {id: '222'}];
1735
+ sourceParticipants = [{id: '111', status: 'LEFT'}, {id: '333'}];
1736
+ });
1737
+
1738
+ it('merge the participants, replace it by id if exist in old array', () => {
1739
+ const result = locusInfo.mergeParticipants(participants, sourceParticipants);
1740
+ assert.deepEqual(result, [{id: '111', status: 'LEFT'}, {id: '222'}, {id: '333'}]);
1741
+ });
1742
+
1743
+ it('return new participants if previous participants is empty', () => {
1744
+ const result = locusInfo.mergeParticipants([], sourceParticipants);
1745
+ assert.deepEqual(result, sourceParticipants);
1746
+ });
1747
+
1748
+ it('return new participants if previous participants is null/undefined', () => {
1749
+ let result = locusInfo.mergeParticipants(null, sourceParticipants);
1750
+ assert.deepEqual(result, sourceParticipants);
1751
+
1752
+ result = locusInfo.mergeParticipants(undefined, sourceParticipants);
1753
+ assert.deepEqual(result, sourceParticipants);
1754
+ });
1755
+
1756
+ it('return previous participants if new participants is empty', () => {
1757
+ const result = locusInfo.mergeParticipants(participants, []);
1758
+ assert.deepEqual(result, participants);
1759
+ });
1760
+
1761
+ it('return previous participants if new participants is null/undefined', () => {
1762
+ let result = locusInfo.mergeParticipants(participants, null);
1763
+ assert.deepEqual(result, participants);
1764
+
1765
+ result = locusInfo.mergeParticipants(participants, undefined);
1766
+ assert.deepEqual(result, participants);
1767
+ });
1768
+ });
1769
+
1770
+ describe('#updateMainSessionLocusCache', () => {
1771
+ let cachedLocus;
1772
+ let newLocus;
1773
+ beforeEach(() => {
1774
+ cachedLocus = {controls: {}, participants: [], info: {webExMeetingId: 'testId1', topic: 'test'}};
1775
+ newLocus = {self: {}, participants: [{id: '111'}], info: {testId: 'testId2', webExMeetingName: 'hello'}};
1776
+ });
1777
+ it('shallow merge new locus into cache', () => {
1778
+ locusInfo.mainSessionLocusCache = cachedLocus;
1779
+ locusInfo.updateMainSessionLocusCache(newLocus);
1780
+
1781
+ assert.deepEqual(locusInfo.mainSessionLocusCache, {
1782
+ controls: {},
1783
+ participants: [{id: '111'}],
1784
+ info: {testId: 'testId2', webExMeetingName: 'hello'},
1785
+ self: {},
1786
+ });
1787
+ });
1788
+
1789
+ it('cache new locus if no cache before', () => {
1790
+ locusInfo.mainSessionLocusCache = null;
1791
+ locusInfo.updateMainSessionLocusCache(newLocus);
1792
+
1793
+ assert.deepEqual(locusInfo.mainSessionLocusCache, newLocus);
1794
+ });
1795
+
1796
+ it('do nothing if new locus is null', () => {
1797
+ locusInfo.mainSessionLocusCache = cachedLocus;
1798
+ locusInfo.updateMainSessionLocusCache(null);
1799
+
1800
+ assert.deepEqual(locusInfo.mainSessionLocusCache, cachedLocus);
1801
+ });
1802
+ });
1803
+
1804
+ describe('#clearMainSessionLocusCache', () => {
1805
+ it('clear main session locus cache', () => {
1806
+ locusInfo.mainSessionLocusCache = {controls: {}};
1807
+ locusInfo.clearMainSessionLocusCache();
1808
+ assert.isNull(locusInfo.mainSessionLocusCache);
1809
+ })
1230
1810
  });
1231
1811
 
1232
1812
  describe('#handleOneonOneEvent', () => {