@webex/plugin-meetings 3.7.0 → 3.8.0

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 (351) hide show
  1. package/dist/annotation/annotation.types.d.ts +42 -0
  2. package/dist/annotation/constants.d.ts +31 -0
  3. package/dist/annotation/index.d.ts +117 -0
  4. package/dist/annotation/index.js +17 -0
  5. package/dist/annotation/index.js.map +1 -1
  6. package/dist/breakouts/breakout.d.ts +8 -0
  7. package/dist/breakouts/breakout.js +1 -1
  8. package/dist/breakouts/collection.d.ts +5 -0
  9. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  10. package/dist/breakouts/events.d.ts +8 -0
  11. package/dist/breakouts/index.d.ts +5 -0
  12. package/dist/breakouts/index.js +1 -1
  13. package/dist/breakouts/request.d.ts +22 -0
  14. package/dist/breakouts/utils.d.ts +15 -0
  15. package/dist/common/browser-detection.d.ts +9 -0
  16. package/dist/common/collection.d.ts +48 -0
  17. package/dist/common/config.d.ts +2 -0
  18. package/dist/common/errors/captcha-error.d.ts +15 -0
  19. package/dist/common/errors/intent-to-join.d.ts +16 -0
  20. package/dist/common/errors/join-forbidden-error.js +52 -0
  21. package/dist/common/errors/join-forbidden-error.js.map +1 -0
  22. package/dist/common/errors/join-meeting.d.ts +17 -0
  23. package/dist/common/errors/{webinar-registration-error.js → join-webinar-error.js} +12 -12
  24. package/dist/common/errors/join-webinar-error.js.map +1 -0
  25. package/dist/common/errors/media.d.ts +15 -0
  26. package/dist/common/errors/multistream-not-supported-error.js +53 -0
  27. package/dist/common/errors/multistream-not-supported-error.js.map +1 -0
  28. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  29. package/dist/common/errors/parameter.d.ts +15 -0
  30. package/dist/common/errors/password-error.d.ts +15 -0
  31. package/dist/common/errors/permission.d.ts +14 -0
  32. package/dist/common/errors/reclaim-host-role-error.js +149 -0
  33. package/dist/common/errors/reclaim-host-role-error.js.map +1 -0
  34. package/dist/common/errors/reclaim-host-role-errors.d.ts +60 -0
  35. package/dist/common/errors/reconnection-in-progress.d.ts +9 -0
  36. package/dist/common/errors/reconnection-in-progress.js +33 -0
  37. package/dist/common/errors/reconnection-in-progress.js.map +1 -0
  38. package/dist/common/errors/reconnection.d.ts +15 -0
  39. package/dist/common/errors/stats.d.ts +15 -0
  40. package/dist/common/errors/webex-errors.d.ts +93 -0
  41. package/dist/common/errors/webex-meetings-error.d.ts +20 -0
  42. package/dist/common/events/events-scope.d.ts +17 -0
  43. package/dist/common/events/events.d.ts +12 -0
  44. package/dist/common/events/trigger-proxy.d.ts +2 -0
  45. package/dist/common/events/util.d.ts +2 -0
  46. package/dist/common/logs/logger-config.d.ts +2 -0
  47. package/dist/common/logs/logger-proxy.d.ts +2 -0
  48. package/dist/common/logs/request.d.ts +36 -0
  49. package/dist/common/queue.d.ts +34 -0
  50. package/dist/config.d.ts +72 -0
  51. package/dist/config.js +2 -1
  52. package/dist/config.js.map +1 -1
  53. package/dist/constants.d.ts +1088 -0
  54. package/dist/constants.js +68 -6
  55. package/dist/constants.js.map +1 -1
  56. package/dist/controls-options-manager/constants.d.ts +4 -0
  57. package/dist/controls-options-manager/enums.d.ts +15 -0
  58. package/dist/controls-options-manager/index.d.ts +136 -0
  59. package/dist/controls-options-manager/types.d.ts +43 -0
  60. package/dist/controls-options-manager/util.d.ts +1 -0
  61. package/dist/index.d.ts +7 -0
  62. package/dist/index.js +16 -11
  63. package/dist/index.js.map +1 -1
  64. package/dist/interceptors/index.d.ts +2 -0
  65. package/dist/interceptors/locusRetry.d.ts +27 -0
  66. package/dist/interpretation/collection.d.ts +5 -0
  67. package/dist/interpretation/index.d.ts +5 -0
  68. package/dist/interpretation/index.js +1 -1
  69. package/dist/interpretation/siLanguage.d.ts +5 -0
  70. package/dist/interpretation/siLanguage.js +1 -1
  71. package/dist/locus-info/controlsUtils.d.ts +2 -0
  72. package/dist/locus-info/embeddedAppsUtils.d.ts +2 -0
  73. package/dist/locus-info/fullState.d.ts +2 -0
  74. package/dist/locus-info/hostUtils.d.ts +2 -0
  75. package/dist/locus-info/index.d.ts +322 -0
  76. package/dist/locus-info/index.js +14 -3
  77. package/dist/locus-info/index.js.map +1 -1
  78. package/dist/locus-info/infoUtils.d.ts +2 -0
  79. package/dist/locus-info/mediaSharesUtils.d.ts +2 -0
  80. package/dist/locus-info/parser.d.ts +272 -0
  81. package/dist/locus-info/selfUtils.d.ts +2 -0
  82. package/dist/locus-info/selfUtils.js +35 -17
  83. package/dist/locus-info/selfUtils.js.map +1 -1
  84. package/dist/media/MediaConnectionAwaiter.js +1 -0
  85. package/dist/media/MediaConnectionAwaiter.js.map +1 -1
  86. package/dist/media/index.d.ts +34 -0
  87. package/dist/media/properties.d.ts +93 -0
  88. package/dist/media/properties.js +30 -16
  89. package/dist/media/properties.js.map +1 -1
  90. package/dist/media/util.d.ts +2 -0
  91. package/dist/mediaQualityMetrics/config.d.ts +241 -0
  92. package/dist/mediaQualityMetrics/config.js +502 -0
  93. package/dist/mediaQualityMetrics/config.js.map +1 -0
  94. package/dist/meeting/brbState.js +167 -0
  95. package/dist/meeting/brbState.js.map +1 -0
  96. package/dist/meeting/effectsState.js +260 -0
  97. package/dist/meeting/effectsState.js.map +1 -0
  98. package/dist/meeting/in-meeting-actions.d.ts +167 -0
  99. package/dist/meeting/in-meeting-actions.js +13 -1
  100. package/dist/meeting/in-meeting-actions.js.map +1 -1
  101. package/dist/meeting/index.d.ts +1825 -0
  102. package/dist/meeting/index.js +1331 -1051
  103. package/dist/meeting/index.js.map +1 -1
  104. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  105. package/dist/meeting/locusMediaRequest.js +11 -6
  106. package/dist/meeting/locusMediaRequest.js.map +1 -1
  107. package/dist/meeting/muteState.d.ts +178 -0
  108. package/dist/meeting/muteState.js +1 -6
  109. package/dist/meeting/muteState.js.map +1 -1
  110. package/dist/meeting/request.d.ts +295 -0
  111. package/dist/meeting/request.js +51 -29
  112. package/dist/meeting/request.js.map +1 -1
  113. package/dist/meeting/request.type.d.ts +11 -0
  114. package/dist/meeting/request.type.js.map +1 -1
  115. package/dist/meeting/state.d.ts +9 -0
  116. package/dist/meeting/util.d.ts +119 -0
  117. package/dist/meeting/util.js +103 -67
  118. package/dist/meeting/util.js.map +1 -1
  119. package/dist/meeting/voicea-meeting.d.ts +16 -0
  120. package/dist/meeting-info/collection.d.ts +20 -0
  121. package/dist/meeting-info/index.d.ts +69 -0
  122. package/dist/meeting-info/meeting-info-v2.d.ts +123 -0
  123. package/dist/meeting-info/meeting-info-v2.js +115 -45
  124. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  125. package/dist/meeting-info/request.d.ts +22 -0
  126. package/dist/meeting-info/util.d.ts +2 -0
  127. package/dist/meeting-info/utilv2.d.ts +2 -0
  128. package/dist/meeting-info/utilv2.js +6 -2
  129. package/dist/meeting-info/utilv2.js.map +1 -1
  130. package/dist/meetings/collection.d.ts +40 -0
  131. package/dist/meetings/index.d.ts +390 -0
  132. package/dist/meetings/index.js +107 -55
  133. package/dist/meetings/index.js.map +1 -1
  134. package/dist/meetings/meetings.types.d.ts +4 -0
  135. package/dist/meetings/meetings.types.js +2 -0
  136. package/dist/meetings/meetings.types.js.map +1 -1
  137. package/dist/meetings/request.d.ts +27 -0
  138. package/dist/meetings/util.d.ts +18 -0
  139. package/dist/meetings/util.js +1 -1
  140. package/dist/meetings/util.js.map +1 -1
  141. package/dist/member/index.d.ts +160 -0
  142. package/dist/member/index.js +9 -0
  143. package/dist/member/index.js.map +1 -1
  144. package/dist/member/member.types.js +17 -0
  145. package/dist/member/member.types.js.map +1 -0
  146. package/dist/member/types.d.ts +32 -0
  147. package/dist/member/types.js.map +1 -1
  148. package/dist/member/util.d.ts +2 -0
  149. package/dist/member/util.js +39 -28
  150. package/dist/member/util.js.map +1 -1
  151. package/dist/members/collection.d.ts +29 -0
  152. package/dist/members/index.d.ts +353 -0
  153. package/dist/members/request.d.ts +114 -0
  154. package/dist/members/types.d.ts +25 -0
  155. package/dist/members/util.d.ts +215 -0
  156. package/dist/members/util.js +4 -2
  157. package/dist/members/util.js.map +1 -1
  158. package/dist/metrics/config.js +276 -0
  159. package/dist/metrics/config.js.map +1 -0
  160. package/dist/metrics/constants.d.ts +70 -0
  161. package/dist/metrics/constants.js +6 -1
  162. package/dist/metrics/constants.js.map +1 -1
  163. package/dist/metrics/index.d.ts +45 -0
  164. package/dist/multistream/mediaRequestManager.d.ts +119 -0
  165. package/dist/multistream/receiveSlot.d.ts +68 -0
  166. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  167. package/dist/multistream/remoteMedia.d.ts +72 -0
  168. package/dist/multistream/remoteMedia.js +30 -15
  169. package/dist/multistream/remoteMedia.js.map +1 -1
  170. package/dist/multistream/remoteMediaGroup.d.ts +49 -0
  171. package/dist/multistream/remoteMediaManager.d.ts +300 -0
  172. package/dist/multistream/sendSlotManager.d.ts +69 -0
  173. package/dist/multistream/sendSlotManager.js +24 -0
  174. package/dist/multistream/sendSlotManager.js.map +1 -1
  175. package/dist/networkQualityMonitor/index.d.ts +70 -0
  176. package/dist/networkQualityMonitor/index.js +13 -19
  177. package/dist/networkQualityMonitor/index.js.map +1 -1
  178. package/dist/peer-connection-manager/index.js +671 -0
  179. package/dist/peer-connection-manager/index.js.map +1 -0
  180. package/dist/peer-connection-manager/util.js +109 -0
  181. package/dist/peer-connection-manager/util.js.map +1 -0
  182. package/dist/personal-meeting-room/index.d.ts +47 -0
  183. package/dist/personal-meeting-room/request.d.ts +14 -0
  184. package/dist/personal-meeting-room/util.d.ts +2 -0
  185. package/dist/reachability/clusterReachability.d.ts +109 -0
  186. package/dist/reachability/clusterReachability.js +12 -15
  187. package/dist/reachability/clusterReachability.js.map +1 -1
  188. package/dist/reachability/index.d.ts +105 -0
  189. package/dist/reachability/index.js +461 -136
  190. package/dist/reachability/index.js.map +1 -1
  191. package/dist/reachability/reachability.types.js +7 -0
  192. package/dist/reachability/reachability.types.js.map +1 -0
  193. package/dist/reachability/request.d.ts +39 -0
  194. package/dist/reachability/request.js +21 -8
  195. package/dist/reachability/request.js.map +1 -1
  196. package/dist/reachability/util.d.ts +8 -0
  197. package/dist/reactions/constants.d.ts +3 -0
  198. package/dist/reactions/reactions.d.ts +4 -0
  199. package/dist/reactions/reactions.type.d.ts +52 -0
  200. package/dist/reconnection-manager/index.d.ts +136 -0
  201. package/dist/recording-controller/enums.d.ts +7 -0
  202. package/dist/recording-controller/enums.js +8 -4
  203. package/dist/recording-controller/enums.js.map +1 -1
  204. package/dist/recording-controller/index.d.ts +207 -0
  205. package/dist/recording-controller/index.js +18 -9
  206. package/dist/recording-controller/index.js.map +1 -1
  207. package/dist/recording-controller/util.d.ts +14 -0
  208. package/dist/recording-controller/util.js +13 -9
  209. package/dist/recording-controller/util.js.map +1 -1
  210. package/dist/roap/collection.js +62 -0
  211. package/dist/roap/collection.js.map +1 -0
  212. package/dist/roap/handler.js +275 -0
  213. package/dist/roap/handler.js.map +1 -0
  214. package/dist/roap/index.d.ts +86 -0
  215. package/dist/roap/index.js +15 -15
  216. package/dist/roap/index.js.map +1 -1
  217. package/dist/roap/request.d.ts +39 -0
  218. package/dist/roap/request.js +45 -79
  219. package/dist/roap/request.js.map +1 -1
  220. package/dist/roap/state.js +126 -0
  221. package/dist/roap/state.js.map +1 -0
  222. package/dist/roap/turnDiscovery.d.ts +155 -0
  223. package/dist/roap/turnDiscovery.js +3 -6
  224. package/dist/roap/turnDiscovery.js.map +1 -1
  225. package/dist/roap/util.js +75 -0
  226. package/dist/roap/util.js.map +1 -0
  227. package/dist/rtcMetrics/constants.d.ts +4 -0
  228. package/dist/rtcMetrics/index.d.ts +61 -0
  229. package/dist/statsAnalyzer/global.d.ts +36 -0
  230. package/dist/statsAnalyzer/global.js +126 -0
  231. package/dist/statsAnalyzer/global.js.map +1 -0
  232. package/dist/statsAnalyzer/index.d.ts +217 -0
  233. package/dist/statsAnalyzer/index.js +1013 -0
  234. package/dist/statsAnalyzer/index.js.map +1 -0
  235. package/dist/statsAnalyzer/mqaUtil.d.ts +48 -0
  236. package/dist/statsAnalyzer/mqaUtil.js +179 -0
  237. package/dist/statsAnalyzer/mqaUtil.js.map +1 -0
  238. package/dist/transcription/index.d.ts +64 -0
  239. package/dist/types/annotation/index.d.ts +5 -0
  240. package/dist/types/common/errors/join-forbidden-error.d.ts +15 -0
  241. package/dist/types/common/errors/{webinar-registration-error.d.ts → join-webinar-error.d.ts} +2 -2
  242. package/dist/types/common/errors/multistream-not-supported-error.d.ts +17 -0
  243. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  244. package/dist/types/config.d.ts +1 -0
  245. package/dist/types/constants.d.ts +53 -1
  246. package/dist/types/index.d.ts +3 -3
  247. package/dist/types/locus-info/index.d.ts +2 -1
  248. package/dist/types/mediaQualityMetrics/config.d.ts +241 -0
  249. package/dist/types/meeting/brbState.d.ts +54 -0
  250. package/dist/types/meeting/in-meeting-actions.d.ts +12 -0
  251. package/dist/types/meeting/index.d.ts +64 -14
  252. package/dist/types/meeting/locusMediaRequest.d.ts +6 -3
  253. package/dist/types/meeting/request.d.ts +14 -3
  254. package/dist/types/meeting/request.type.d.ts +6 -0
  255. package/dist/types/meeting/util.d.ts +3 -3
  256. package/dist/types/meeting-info/meeting-info-v2.d.ts +30 -5
  257. package/dist/types/meetings/index.d.ts +20 -2
  258. package/dist/types/meetings/meetings.types.d.ts +8 -0
  259. package/dist/types/member/index.d.ts +1 -0
  260. package/dist/types/member/types.d.ts +7 -0
  261. package/dist/types/members/util.d.ts +2 -0
  262. package/dist/types/metrics/constants.d.ts +6 -1
  263. package/dist/types/multistream/sendSlotManager.d.ts +8 -1
  264. package/dist/types/reachability/clusterReachability.d.ts +1 -10
  265. package/dist/types/reachability/index.d.ts +83 -36
  266. package/dist/types/reachability/reachability.types.d.ts +64 -0
  267. package/dist/types/reachability/request.d.ts +5 -1
  268. package/dist/types/recording-controller/enums.d.ts +5 -2
  269. package/dist/types/recording-controller/index.d.ts +1 -0
  270. package/dist/types/recording-controller/util.d.ts +2 -1
  271. package/dist/types/roap/request.d.ts +1 -13
  272. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  273. package/dist/types/statsAnalyzer/index.d.ts +217 -0
  274. package/dist/types/statsAnalyzer/mqaUtil.d.ts +48 -0
  275. package/dist/webinar/collection.d.ts +16 -0
  276. package/dist/webinar/index.d.ts +5 -0
  277. package/dist/webinar/index.js +390 -7
  278. package/dist/webinar/index.js.map +1 -1
  279. package/package.json +23 -22
  280. package/src/annotation/index.ts +16 -0
  281. package/src/common/errors/join-forbidden-error.ts +26 -0
  282. package/src/common/errors/join-webinar-error.ts +24 -0
  283. package/src/common/errors/multistream-not-supported-error.ts +30 -0
  284. package/src/config.ts +1 -0
  285. package/src/constants.ts +61 -3
  286. package/src/index.ts +5 -3
  287. package/src/locus-info/index.ts +20 -3
  288. package/src/locus-info/selfUtils.ts +24 -6
  289. package/src/media/MediaConnectionAwaiter.ts +2 -0
  290. package/src/media/properties.ts +34 -13
  291. package/src/meeting/brbState.ts +169 -0
  292. package/src/meeting/in-meeting-actions.ts +25 -0
  293. package/src/meeting/index.ts +443 -87
  294. package/src/meeting/locusMediaRequest.ts +11 -8
  295. package/src/meeting/muteState.ts +1 -6
  296. package/src/meeting/request.ts +30 -12
  297. package/src/meeting/request.type.ts +7 -0
  298. package/src/meeting/util.ts +32 -13
  299. package/src/meeting-info/meeting-info-v2.ts +83 -12
  300. package/src/meeting-info/utilv2.ts +17 -3
  301. package/src/meetings/index.ts +79 -20
  302. package/src/meetings/meetings.types.ts +10 -0
  303. package/src/meetings/util.ts +2 -1
  304. package/src/member/index.ts +9 -0
  305. package/src/member/types.ts +8 -0
  306. package/src/member/util.ts +34 -24
  307. package/src/members/util.ts +1 -0
  308. package/src/metrics/constants.ts +6 -1
  309. package/src/multistream/remoteMedia.ts +28 -15
  310. package/src/multistream/sendSlotManager.ts +31 -0
  311. package/src/reachability/clusterReachability.ts +5 -15
  312. package/src/reachability/index.ts +311 -75
  313. package/src/reachability/reachability.types.ts +85 -0
  314. package/src/reachability/request.ts +55 -31
  315. package/src/recording-controller/enums.ts +5 -2
  316. package/src/recording-controller/index.ts +17 -4
  317. package/src/recording-controller/util.ts +20 -5
  318. package/src/roap/index.ts +14 -13
  319. package/src/roap/request.ts +30 -44
  320. package/src/roap/turnDiscovery.ts +2 -4
  321. package/src/webinar/index.ts +235 -9
  322. package/test/unit/spec/annotation/index.ts +46 -1
  323. package/test/unit/spec/locus-info/index.js +292 -60
  324. package/test/unit/spec/locus-info/selfConstant.js +7 -0
  325. package/test/unit/spec/locus-info/selfUtils.js +101 -1
  326. package/test/unit/spec/media/properties.ts +15 -0
  327. package/test/unit/spec/meeting/brbState.ts +114 -0
  328. package/test/unit/spec/meeting/in-meeting-actions.ts +15 -1
  329. package/test/unit/spec/meeting/index.js +851 -107
  330. package/test/unit/spec/meeting/locusMediaRequest.ts +18 -11
  331. package/test/unit/spec/meeting/muteState.js +0 -24
  332. package/test/unit/spec/meeting/request.js +3 -26
  333. package/test/unit/spec/meeting/utils.js +73 -28
  334. package/test/unit/spec/meeting-info/meetinginfov2.js +46 -4
  335. package/test/unit/spec/meeting-info/utilv2.js +26 -0
  336. package/test/unit/spec/meetings/index.js +159 -18
  337. package/test/unit/spec/meetings/utils.js +10 -0
  338. package/test/unit/spec/member/util.js +52 -11
  339. package/test/unit/spec/members/utils.js +95 -0
  340. package/test/unit/spec/multistream/remoteMedia.ts +11 -7
  341. package/test/unit/spec/reachability/clusterReachability.ts +7 -0
  342. package/test/unit/spec/reachability/index.ts +383 -9
  343. package/test/unit/spec/reachability/request.js +48 -12
  344. package/test/unit/spec/recording-controller/index.js +61 -5
  345. package/test/unit/spec/recording-controller/util.js +39 -3
  346. package/test/unit/spec/roap/index.ts +48 -1
  347. package/test/unit/spec/roap/request.ts +51 -109
  348. package/test/unit/spec/roap/turnDiscovery.ts +202 -147
  349. package/test/unit/spec/webinar/index.ts +504 -0
  350. package/dist/common/errors/webinar-registration-error.js.map +0 -1
  351. package/src/common/errors/webinar-registration-error.ts +0 -27
@@ -37,11 +37,13 @@ import {
37
37
  LOCUSINFO,
38
38
  EVENT_TRIGGERS,
39
39
  DESTINATION_TYPE,
40
+ INITIAL_REGISTRATION_STATUS,
40
41
  } from '../../../../src/constants';
41
42
  import CaptchaError from '@webex/plugin-meetings/src/common/errors/captcha-error';
42
43
  import {forEach} from 'lodash';
43
44
  import PasswordError from '@webex/plugin-meetings/src/common/errors/password-error';
44
45
  import PermissionError from '@webex/plugin-meetings/src/common/errors/permission';
46
+ import JoinForbiddenError from '@webex/plugin-meetings/src/common/errors/join-forbidden-error';
45
47
  import {NoiseReductionEffect, VirtualBackgroundEffect} from '@webex/media-helpers';
46
48
  import NoMeetingInfoError from '../../../../src/common/errors/no-meeting-info';
47
49
 
@@ -131,9 +133,9 @@ describe('plugin-meetings', () => {
131
133
  logger,
132
134
  people: {
133
135
  _getMe: sinon.stub().resolves({
134
- type: 'validuser',
136
+ type: 'validuser',
135
137
  }),
136
- }
138
+ },
137
139
  });
138
140
 
139
141
  startReachabilityStub = sinon.stub(webex.meetings, 'startReachability').resolves();
@@ -267,6 +269,33 @@ describe('plugin-meetings', () => {
267
269
  });
268
270
  });
269
271
 
272
+ describe('#_setLogUploadIntervalMultiplicationFactor', () => {
273
+ it('should have _setLogUploadIntervalMultiplicationFactor', () => {
274
+ assert.equal(typeof webex.meetings._setLogUploadIntervalMultiplicationFactor, 'function');
275
+ });
276
+
277
+ describe('success', () => {
278
+ it('should update the config', () => {
279
+ const someValue = 1.23;
280
+
281
+ webex.meetings._setLogUploadIntervalMultiplicationFactor(someValue);
282
+ assert.equal(webex.meetings.config.logUploadIntervalMultiplicationFactor, someValue);
283
+ });
284
+ });
285
+
286
+ describe('failure', () => {
287
+ it('should not accept non-number input', () => {
288
+ const logUploadIntervalMultiplicationFactor = webex.meetings.config.logUploadIntervalMultiplicationFactor;
289
+
290
+ webex.meetings._setLogUploadIntervalMultiplicationFactor('test');
291
+ assert.equal(
292
+ webex.meetings.config.logUploadIntervalMultiplicationFactor,
293
+ logUploadIntervalMultiplicationFactor
294
+ );
295
+ });
296
+ });
297
+ });
298
+
270
299
  describe('#_toggleUnifiedMeetings', () => {
271
300
  it('should have toggleUnifiedMeetings', () => {
272
301
  assert.equal(typeof webex.meetings._toggleUnifiedMeetings, 'function');
@@ -375,21 +404,21 @@ describe('plugin-meetings', () => {
375
404
  assert.isTrue(webex.meetings.registered);
376
405
  });
377
406
 
378
- it('rejects when SDK canAuthorize is false', () => {
407
+ it('rejects when SDK canAuthorize is false', async () => {
379
408
  webex.canAuthorize = false;
380
- assert.isRejected(webex.meetings.register());
409
+ await assert.isRejected(webex.meetings.register());
381
410
  });
382
411
 
383
- it('rejects when device.register fails', () => {
412
+ it('rejects when device.register fails', async () => {
384
413
  webex.canAuthorize = true;
385
414
  webex.internal.device.register = sinon.stub().returns(Promise.reject());
386
- assert.isRejected(webex.meetings.register());
415
+ await assert.isRejected(webex.meetings.register());
387
416
  });
388
417
 
389
- it('rejects when mercury.connect fails', () => {
418
+ it('rejects when mercury.connect fails', async () => {
390
419
  webex.canAuthorize = true;
391
420
  webex.internal.mercury.connect = sinon.stub().returns(Promise.reject());
392
- assert.isRejected(webex.meetings.register());
421
+ await assert.isRejected(webex.meetings.register());
393
422
  });
394
423
 
395
424
  it('resolves immediately if already registered', async () => {
@@ -420,6 +449,100 @@ describe('plugin-meetings', () => {
420
449
  includeDetails: CatalogDetails.features,
421
450
  });
422
451
  });
452
+
453
+ it('updates registration status as expected', async () => {
454
+ const clock = sinon.useFakeTimers();
455
+
456
+ const delay = (secs) => () =>
457
+ new Promise((resolve) => {
458
+ setTimeout(resolve, secs * 1000);
459
+ });
460
+
461
+ let i = 1;
462
+ sinon.stub(webex.meetings, 'fetchUserPreferredWebexSite').callsFake(delay(i++));
463
+ MeetingsUtil.checkH264Support.callsFake(delay(i++));
464
+ webex.meetings.startReachability.callsFake(delay(i++));
465
+ webex.internal.device.register.callsFake(delay(i++));
466
+ sinon.stub(webex.meetings, 'getGeoHint').callsFake(delay(i++));
467
+ webex.internal.mercury.connect.callsFake(delay(i++));
468
+
469
+ webex.canAuthorize = true;
470
+ webex.meetings.registered = false;
471
+
472
+ const registerPromise = webex.meetings.register({
473
+ includeDetails: CatalogDetails.features,
474
+ });
475
+
476
+ await clock.tick(1000);
477
+ await webex.meetings.fetchUserPreferredWebexSite;
478
+ assert.deepEqual(webex.meetings.registrationStatus, {
479
+ fetchWebexSite: true,
480
+ getGeoHint: false,
481
+ startReachability: false,
482
+ deviceRegister: false,
483
+ mercuryConnect: false,
484
+ checkH264Support: false,
485
+ });
486
+
487
+ await clock.tick(1000);
488
+ await MeetingsUtil.checkH264Support;
489
+ assert.deepEqual(webex.meetings.registrationStatus, {
490
+ fetchWebexSite: true,
491
+ getGeoHint: false,
492
+ startReachability: false,
493
+ deviceRegister: false,
494
+ mercuryConnect: false,
495
+ checkH264Support: true,
496
+ });
497
+
498
+ await clock.tick(1000);
499
+ await webex.meetings.startReachability;
500
+ assert.deepEqual(webex.meetings.registrationStatus, {
501
+ fetchWebexSite: true,
502
+ getGeoHint: false,
503
+ startReachability: true,
504
+ deviceRegister: false,
505
+ mercuryConnect: false,
506
+ checkH264Support: true,
507
+ });
508
+
509
+ await clock.tick(1000);
510
+ await webex.internal.device.register;
511
+ assert.deepEqual(webex.meetings.registrationStatus, {
512
+ fetchWebexSite: true,
513
+ getGeoHint: false,
514
+ startReachability: true,
515
+ deviceRegister: true,
516
+ mercuryConnect: false,
517
+ checkH264Support: true,
518
+ });
519
+
520
+ await clock.tick(1000);
521
+ await webex.meetings.getGeoHint;
522
+ assert.deepEqual(webex.meetings.registrationStatus, {
523
+ fetchWebexSite: true,
524
+ getGeoHint: true,
525
+ startReachability: true,
526
+ deviceRegister: true,
527
+ mercuryConnect: false,
528
+ checkH264Support: true,
529
+ });
530
+
531
+ await clock.tick(6000);
532
+ await webex.internal.mercury.connect;
533
+ assert.deepEqual(webex.meetings.registrationStatus, {
534
+ fetchWebexSite: true,
535
+ getGeoHint: true,
536
+ startReachability: true,
537
+ deviceRegister: true,
538
+ mercuryConnect: true,
539
+ checkH264Support: true,
540
+ });
541
+
542
+ await registerPromise;
543
+
544
+ clock.restore();
545
+ });
423
546
  });
424
547
 
425
548
  describe('#unregister', () => {
@@ -440,27 +563,36 @@ describe('plugin-meetings', () => {
440
563
  });
441
564
  });
442
565
 
443
- it('rejects when device.unregister fails', () => {
566
+ it('rejects when device.unregister fails', async () => {
444
567
  webex.meetings.registered = true;
445
568
  webex.internal.device.unregister = sinon.stub().returns(Promise.reject());
446
- assert.isRejected(webex.meetings.unregister());
569
+ await assert.isRejected(webex.meetings.unregister());
447
570
  });
448
571
 
449
- it('rejects when mercury.disconnect fails', () => {
572
+ it('rejects when mercury.disconnect fails', async () => {
450
573
  webex.meetings.registered = true;
451
574
  webex.internal.mercury.disconnect = sinon.stub().returns(Promise.reject());
452
- assert.isRejected(webex.meetings.unregister());
575
+ await assert.isRejected(webex.meetings.unregister());
453
576
  });
454
577
 
455
- it('resolves immediately if already registered', (done) => {
578
+ it('resolves immediately if not registered', (done) => {
456
579
  webex.meetings.registered = false;
457
580
  webex.meetings.unregister().then(() => {
458
- assert.notCalled(webex.internal.device.register);
459
- assert.notCalled(webex.internal.mercury.connect);
581
+ assert.notCalled(webex.internal.device.unregister);
582
+ assert.notCalled(webex.internal.mercury.disconnect);
460
583
  assert.isFalse(webex.meetings.registered);
461
584
  done();
462
585
  });
463
586
  });
587
+
588
+ it('resets registration status', (done) => {
589
+ webex.meetings.registered = true;
590
+ webex.meetings.registrationStatus = {foo: 'bar'};
591
+ webex.meetings.unregister().then(() => {
592
+ assert.deepEqual(webex.meetings.registrationStatus, INITIAL_REGISTRATION_STATUS);
593
+ done();
594
+ });
595
+ });
464
596
  });
465
597
 
466
598
  describe('virtual background effect', () => {
@@ -1921,6 +2053,11 @@ describe('plugin-meetings', () => {
1921
2053
  debugLogMessage:
1922
2054
  'Meetings:index#createMeeting --> Debug PermissionError: Not allowed to execute the function, some properties on server, or local client state do not allow you to complete this action. fetching /meetingInfo for creation.',
1923
2055
  },
2056
+ {
2057
+ error: new JoinForbiddenError(),
2058
+ debugLogMessage:
2059
+ 'Meetings:index#createMeeting --> Debug JoinForbiddenError: Meeting join forbidden. fetching /meetingInfo for creation.',
2060
+ },
1924
2061
  {
1925
2062
  error: new Error(),
1926
2063
  infoLogMessage: true,
@@ -1985,6 +2122,8 @@ describe('plugin-meetings', () => {
1985
2122
  const meetingIds = {
1986
2123
  meetingId: meeting.id,
1987
2124
  correlationId: meeting.correlationId,
2125
+ roles: meeting.roles,
2126
+ callStateForMetrics: meeting.callStateForMetrics,
1988
2127
  };
1989
2128
 
1990
2129
  webex.meetings.destroy(meeting, test1);
@@ -2021,6 +2160,8 @@ describe('plugin-meetings', () => {
2021
2160
 
2022
2161
  assert.equal(deletedMeetingInfo.id, meetingIds.meetingId);
2023
2162
  assert.equal(deletedMeetingInfo.correlationId, meetingIds.correlationId);
2163
+ assert.equal(deletedMeetingInfo.roles, meetingIds.roles);
2164
+ assert.equal(deletedMeetingInfo.callStateForMetrics, meetingIds.callStateForMetrics);
2024
2165
  });
2025
2166
  });
2026
2167
 
@@ -2092,7 +2233,7 @@ describe('plugin-meetings', () => {
2092
2233
  );
2093
2234
  });
2094
2235
 
2095
- const setup = ({me = { type: 'validuser'}, user} = {}) => {
2236
+ const setup = ({me = {type: 'validuser'}, user} = {}) => {
2096
2237
  loggerProxySpy = sinon.spy(LoggerProxy.logger, 'error');
2097
2238
  assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), []);
2098
2239
 
@@ -2113,9 +2254,9 @@ describe('plugin-meetings', () => {
2113
2254
 
2114
2255
  it('should not call request.getMeetingPreferences if user is a guest', async () => {
2115
2256
  setup({me: {type: 'appuser'}});
2116
-
2257
+
2117
2258
  await webex.meetings.fetchUserPreferredWebexSite();
2118
-
2259
+
2119
2260
  assert.equal(webex.meetings.preferredWebexSite, '');
2120
2261
  assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), []);
2121
2262
  assert.notCalled(webex.internal.services.getMeetingPreferences);
@@ -290,4 +290,14 @@ describe('plugin-meetings', () => {
290
290
  assert.equal(MeetingsUtil.isValidBreakoutLocus(newLocus), true);
291
291
  });
292
292
  });
293
+
294
+ describe('#getMediaServer', () => {
295
+ it('returns the contents of o-line lower cased', () => {
296
+ const sdp1 = 'v=0\r\no=homer 0 1 IN IP4 23.89.67.81\r\ns=-\r\nc=IN IP4 23.89.67.81\r\nb=TIAS:128000\r\nt=0 0\r\na=ice-lite\r\n'
297
+ assert.equal(MeetingsUtil.getMediaServer(sdp1), 'homer');
298
+
299
+ const sdp2 = 'v=0\r\no=HOMER 0 1 IN IP4 23.89.67.81\r\ns=-\r\nc=IN IP4 23.89.67.81\r\nb=TIAS:128000\r\nt=0 0\r\na=ice-lite\r\n'
300
+ assert.equal(MeetingsUtil.getMediaServer(sdp2), 'homer');
301
+ });
302
+ })
293
303
  });
@@ -5,13 +5,13 @@ import {_SEND_RECEIVE_, _RECEIVE_ONLY_} from '../../../../src/constants';
5
5
 
6
6
  describe('plugin-meetings', () => {
7
7
  describe('isHandRaised', () => {
8
- it('throws error when there is no participant', () => {
8
+ it('throws an error when there is no participant', () => {
9
9
  assert.throws(() => {
10
10
  MemberUtil.isHandRaised();
11
11
  }, 'Raise hand could not be processed, participant is undefined.');
12
12
  });
13
13
 
14
- it('returns false when controls is not there', () => {
14
+ it('returns false when controls are not present', () => {
15
15
  const participant = {};
16
16
 
17
17
  assert.isFalse(MemberUtil.isHandRaised(participant));
@@ -51,7 +51,7 @@ describe('plugin-meetings', () => {
51
51
  });
52
52
 
53
53
  describe('MemberUtil.canReclaimHost', () => {
54
- it('throws error when there is no participant', () => {
54
+ it('throws an error when there is no participant', () => {
55
55
  assert.throws(() => {
56
56
  MemberUtil.canReclaimHost();
57
57
  }, 'canReclaimHostRole could not be processed, participant is undefined.');
@@ -352,8 +352,49 @@ describe('plugin-meetings', () => {
352
352
  });
353
353
  });
354
354
 
355
+ describe('MemberUtil.isBrb', () => {
356
+ it('returns true when brb is enabled', () => {
357
+ const participant = {
358
+ controls: {
359
+ brb: {
360
+ enabled: true,
361
+ },
362
+ },
363
+ };
364
+
365
+ assert.isTrue(MemberUtil.isBrb(participant));
366
+ });
367
+
368
+ it('returns false when brb is disabled', () => {
369
+ const participant = {
370
+ controls: {
371
+ brb: {
372
+ enabled: false,
373
+ },
374
+ },
375
+ };
376
+
377
+ assert.isFalse(MemberUtil.isBrb(participant));
378
+ });
379
+
380
+
381
+ it('returns false when brb is not present', () => {
382
+ const participant = {
383
+ controls: {},
384
+ };
385
+
386
+ assert.isFalse(MemberUtil.isBrb(participant));
387
+ });
388
+
389
+ it('returns false when controls is not present', () => {
390
+ const participant = {};
391
+
392
+ assert.isFalse(MemberUtil.isBrb(participant));
393
+ });
394
+ });
395
+
355
396
  describe('MemberUtil.isBreakoutsSupported', () => {
356
- it('throws error when there is no participant', () => {
397
+ it('throws an error when there is no participant', () => {
357
398
  assert.throws(() => {
358
399
  MemberUtil.isBreakoutsSupported();
359
400
  }, 'Breakout support could not be processed, participant is undefined.');
@@ -377,7 +418,7 @@ describe('plugin-meetings', () => {
377
418
  });
378
419
 
379
420
  describe('MemberUtil.isLiveAnnotationSupported', () => {
380
- it('throws error when there is no participant', () => {
421
+ it('throws an error when there is no participant', () => {
381
422
  assert.throws(() => {
382
423
  MemberUtil.isLiveAnnotationSupported();
383
424
  }, 'LiveAnnotation support could not be processed, participant is undefined.');
@@ -401,7 +442,7 @@ describe('plugin-meetings', () => {
401
442
  });
402
443
 
403
444
  describe('MemberUtil.isInterpretationSupported', () => {
404
- it('throws error when there is no participant', () => {
445
+ it('throws an error when there is no participant', () => {
405
446
  assert.throws(() => {
406
447
  MemberUtil.isInterpretationSupported();
407
448
  }, 'Interpretation support could not be processed, participant is undefined.');
@@ -432,7 +473,7 @@ describe('plugin-meetings', () => {
432
473
  };
433
474
 
434
475
  describe('MemberUtil.isAudioMuted', () => {
435
- it('throws error when there is no participant', () => {
476
+ it('throws an error when there is no participant', () => {
436
477
  assert.throws(() => {
437
478
  MemberUtil.isAudioMuted();
438
479
  }, 'Audio could not be processed, participant is undefined.');
@@ -475,7 +516,7 @@ describe('plugin-meetings', () => {
475
516
  });
476
517
 
477
518
  describe('MemberUtil.isVideoMuted', () => {
478
- it('throws error when there is no participant', () => {
519
+ it('throws an error when there is no participant', () => {
479
520
  assert.throws(() => {
480
521
  MemberUtil.isVideoMuted();
481
522
  }, 'Video could not be processed, participant is undefined.');
@@ -519,7 +560,7 @@ describe('plugin-meetings', () => {
519
560
  });
520
561
 
521
562
  describe('extractMediaStatus', () => {
522
- it('throws error when there is no participant', () => {
563
+ it('throws an error when there is no participant', () => {
523
564
  assert.throws(() => {
524
565
  MemberUtil.extractMediaStatus()
525
566
  }, 'Media status could not be extracted, participant is undefined.');
@@ -529,7 +570,7 @@ describe('extractMediaStatus', () => {
529
570
  const participant = {
530
571
  status: {}
531
572
  };
532
-
573
+
533
574
  const mediaStatus = MemberUtil.extractMediaStatus(participant)
534
575
 
535
576
  assert.deepEqual(mediaStatus, {audio: undefined, video: undefined});
@@ -542,7 +583,7 @@ describe('extractMediaStatus', () => {
542
583
  videoStatus: 'SENDRECV'
543
584
  }
544
585
  };
545
-
586
+
546
587
  const mediaStatus = MemberUtil.extractMediaStatus(participant)
547
588
 
548
589
  assert.deepEqual(mediaStatus, {audio: 'RECVONLY', video: 'SENDRECV'});
@@ -262,5 +262,100 @@ describe('plugin-meetings', () => {
262
262
  testParams(false);
263
263
  });
264
264
  });
265
+
266
+ describe('#getAddMemberBody', () => {
267
+ it('returns the correct body with email address and roles', () => {
268
+ const options = {
269
+ invitee: {
270
+ emailAddress: 'test@example.com',
271
+ roles: ['role1', 'role2'],
272
+ },
273
+ alertIfActive: true,
274
+ };
275
+
276
+ assert.deepEqual(MembersUtil.getAddMemberBody(options), {
277
+ invitees: [
278
+ {
279
+ address: 'test@example.com',
280
+ roles: ['role1', 'role2'],
281
+ },
282
+ ],
283
+ alertIfActive: true,
284
+ });
285
+ });
286
+
287
+ it('returns the correct body with phone number and no roles', () => {
288
+ const options = {
289
+ invitee: {
290
+ phoneNumber: '1234567890',
291
+ },
292
+ alertIfActive: false,
293
+ };
294
+
295
+ assert.deepEqual(MembersUtil.getAddMemberBody(options), {
296
+ invitees: [
297
+ {
298
+ address: '1234567890',
299
+ },
300
+ ],
301
+ alertIfActive: false,
302
+ });
303
+ });
304
+
305
+ it('returns the correct body with fallback to email', () => {
306
+ const options = {
307
+ invitee: {
308
+ email: 'fallback@example.com',
309
+ },
310
+ alertIfActive: true,
311
+ };
312
+
313
+ assert.deepEqual(MembersUtil.getAddMemberBody(options), {
314
+ invitees: [
315
+ {
316
+ address: 'fallback@example.com',
317
+ },
318
+ ],
319
+ alertIfActive: true,
320
+ });
321
+ });
322
+
323
+ it('handles missing `alertIfActive` gracefully', () => {
324
+ const options = {
325
+ invitee: {
326
+ emailAddress: 'test@example.com',
327
+ roles: ['role1'],
328
+ },
329
+ };
330
+
331
+ assert.deepEqual(MembersUtil.getAddMemberBody(options), {
332
+ invitees: [
333
+ {
334
+ address: 'test@example.com',
335
+ roles: ['role1'],
336
+ },
337
+ ],
338
+ alertIfActive: undefined,
339
+ });
340
+ });
341
+
342
+ it('ignores roles if not provided', () => {
343
+ const options = {
344
+ invitee: {
345
+ emailAddress: 'test@example.com',
346
+ },
347
+ alertIfActive: false,
348
+ };
349
+
350
+ assert.deepEqual(MembersUtil.getAddMemberBody(options), {
351
+ invitees: [
352
+ {
353
+ address: 'test@example.com',
354
+ },
355
+ ],
356
+ alertIfActive: false,
357
+ });
358
+ });
359
+ });
265
360
  });
266
361
  });
@@ -249,14 +249,18 @@ describe('RemoteMedia', () => {
249
249
 
250
250
  forEach(
251
251
  [
252
- {height: 134, fs: 60},
253
- {height: 135, fs: 240},
254
- {height: 269, fs: 240},
255
- {height: 270, fs: 920},
256
- {height: 539, fs: 920},
257
- {height: 540, fs: 3600},
252
+ {height: 90, fs: 60}, // 90p
253
+ {height: 98, fs: 60},
254
+ {height: 99, fs: 240}, // 180p
255
+ {height: 180, fs: 240},
256
+ {height: 197, fs: 240},
257
+ {height: 198, fs: 920}, // 360p
258
+ {height: 360, fs: 920},
259
+ {height: 395, fs: 920},
260
+ {height: 396, fs: 3600}, // 720p
258
261
  {height: 720, fs: 3600},
259
- {height: 721, fs: 8192},
262
+ {height: 721, fs: 8192}, // 1080p
263
+ {height: 1080, fs: 8192},
260
264
  ],
261
265
  ({height, fs}) => {
262
266
  it(`sets the max fs to ${fs} correctly when height is ${height}`, () => {
@@ -15,6 +15,7 @@ describe('ClusterReachability', () => {
15
15
  let previousRTCPeerConnection;
16
16
  let clusterReachability;
17
17
  let fakePeerConnection;
18
+ let gatherIceCandidatesSpy;
18
19
 
19
20
  const emittedEvents: Record<Events, (ResultEventData | ClientMediaIpsUpdatedEventData)[]> = {
20
21
  [Events.resultReady]: [],
@@ -44,6 +45,8 @@ describe('ClusterReachability', () => {
44
45
  xtls: ['stun:xtls1.webex.com', 'stun:xtls2.webex.com:443'],
45
46
  });
46
47
 
48
+ gatherIceCandidatesSpy = sinon.spy(clusterReachability, 'gatherIceCandidates');
49
+
47
50
  resetEmittedEvents();
48
51
 
49
52
  clusterReachability.on(Events.resultReady, (data: ResultEventData) => {
@@ -151,6 +154,10 @@ describe('ClusterReachability', () => {
151
154
  assert.calledOnceWithExactly(fakePeerConnection.createOffer, {offerToReceiveAudio: true});
152
155
  assert.calledOnce(fakePeerConnection.setLocalDescription);
153
156
 
157
+ // Make sure that gatherIceCandidates is called before setLocalDescription
158
+ // as setLocalDescription triggers the ICE gathering process
159
+ assert.isTrue(gatherIceCandidatesSpy.calledBefore(fakePeerConnection.setLocalDescription));
160
+
154
161
  clusterReachability.abort();
155
162
  await promise;
156
163