@webex/plugin-meetings 2.59.8-next.2 → 2.60.0-next.1

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 (433) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +41 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +357 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +215 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +22 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +51 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +44 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1047 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +77 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +64 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/browser-detection.js +1 -2
  23. package/dist/common/browser-detection.js.map +1 -1
  24. package/dist/common/collection.js +1 -2
  25. package/dist/common/collection.js.map +1 -1
  26. package/dist/common/config.js +1 -2
  27. package/dist/common/config.js.map +1 -1
  28. package/dist/common/errors/captcha-error.js +1 -2
  29. package/dist/common/errors/captcha-error.js.map +1 -1
  30. package/dist/common/errors/intent-to-join.js +1 -2
  31. package/dist/common/errors/intent-to-join.js.map +1 -1
  32. package/dist/common/errors/join-meeting.js +1 -2
  33. package/dist/common/errors/join-meeting.js.map +1 -1
  34. package/dist/common/errors/media.js +1 -2
  35. package/dist/common/errors/media.js.map +1 -1
  36. package/dist/common/errors/no-meeting-info.js +50 -0
  37. package/dist/common/errors/no-meeting-info.js.map +1 -0
  38. package/dist/common/errors/parameter.js +3 -4
  39. package/dist/common/errors/parameter.js.map +1 -1
  40. package/dist/common/errors/password-error.js +1 -2
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +1 -2
  43. package/dist/common/errors/permission.js.map +1 -1
  44. package/dist/common/errors/reclaim-host-role-errors.js +154 -0
  45. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  46. package/dist/common/errors/reconnection-in-progress.js +1 -2
  47. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  48. package/dist/common/errors/reconnection.js +1 -2
  49. package/dist/common/errors/reconnection.js.map +1 -1
  50. package/dist/common/errors/stats.js +1 -2
  51. package/dist/common/errors/stats.js.map +1 -1
  52. package/dist/common/errors/webex-errors.js +48 -28
  53. package/dist/common/errors/webex-errors.js.map +1 -1
  54. package/dist/common/errors/webex-meetings-error.js +1 -2
  55. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  56. package/dist/common/events/events-scope.js +1 -2
  57. package/dist/common/events/events-scope.js.map +1 -1
  58. package/dist/common/events/events.js +1 -2
  59. package/dist/common/events/events.js.map +1 -1
  60. package/dist/common/events/trigger-proxy.js +1 -2
  61. package/dist/common/events/trigger-proxy.js.map +1 -1
  62. package/dist/common/events/util.js +1 -2
  63. package/dist/common/events/util.js.map +1 -1
  64. package/dist/common/logs/logger-config.js +1 -2
  65. package/dist/common/logs/logger-config.js.map +1 -1
  66. package/dist/common/logs/logger-proxy.js +2 -3
  67. package/dist/common/logs/logger-proxy.js.map +1 -1
  68. package/dist/common/logs/request.js +8 -5
  69. package/dist/common/logs/request.js.map +1 -1
  70. package/dist/common/queue.js +22 -9
  71. package/dist/common/queue.js.map +1 -1
  72. package/dist/config.js +9 -12
  73. package/dist/config.js.map +1 -1
  74. package/dist/constants.js +437 -433
  75. package/dist/constants.js.map +1 -1
  76. package/dist/controls-options-manager/constants.js +3 -6
  77. package/dist/controls-options-manager/constants.js.map +1 -1
  78. package/dist/controls-options-manager/enums.js +14 -6
  79. package/dist/controls-options-manager/enums.js.map +1 -1
  80. package/dist/controls-options-manager/index.js +126 -37
  81. package/dist/controls-options-manager/index.js.map +1 -1
  82. package/dist/controls-options-manager/types.js +7 -0
  83. package/dist/controls-options-manager/types.js.map +1 -0
  84. package/dist/controls-options-manager/util.js +309 -19
  85. package/dist/controls-options-manager/util.js.map +1 -1
  86. package/dist/index.js +116 -4
  87. package/dist/index.js.map +1 -1
  88. package/dist/interpretation/collection.js +22 -0
  89. package/dist/interpretation/collection.js.map +1 -0
  90. package/dist/interpretation/index.js +365 -0
  91. package/dist/interpretation/index.js.map +1 -0
  92. package/dist/interpretation/siLanguage.js +24 -0
  93. package/dist/interpretation/siLanguage.js.map +1 -0
  94. package/dist/locus-info/controlsUtils.js +95 -6
  95. package/dist/locus-info/controlsUtils.js.map +1 -1
  96. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  97. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  98. package/dist/locus-info/fullState.js +1 -2
  99. package/dist/locus-info/fullState.js.map +1 -1
  100. package/dist/locus-info/hostUtils.js +1 -2
  101. package/dist/locus-info/hostUtils.js.map +1 -1
  102. package/dist/locus-info/index.js +408 -67
  103. package/dist/locus-info/index.js.map +1 -1
  104. package/dist/locus-info/infoUtils.js +13 -5
  105. package/dist/locus-info/infoUtils.js.map +1 -1
  106. package/dist/locus-info/mediaSharesUtils.js +58 -3
  107. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  108. package/dist/locus-info/parser.js +251 -78
  109. package/dist/locus-info/parser.js.map +1 -1
  110. package/dist/locus-info/selfUtils.js +97 -13
  111. package/dist/locus-info/selfUtils.js.map +1 -1
  112. package/dist/media/index.js +106 -319
  113. package/dist/media/index.js.map +1 -1
  114. package/dist/media/properties.js +96 -153
  115. package/dist/media/properties.js.map +1 -1
  116. package/dist/media/util.js +1 -22
  117. package/dist/media/util.js.map +1 -1
  118. package/dist/mediaQualityMetrics/config.js +498 -493
  119. package/dist/mediaQualityMetrics/config.js.map +1 -1
  120. package/dist/meeting/in-meeting-actions.js +90 -3
  121. package/dist/meeting/in-meeting-actions.js.map +1 -1
  122. package/dist/meeting/index.js +4579 -2951
  123. package/dist/meeting/index.js.map +1 -1
  124. package/dist/meeting/locusMediaRequest.js +291 -0
  125. package/dist/meeting/locusMediaRequest.js.map +1 -0
  126. package/dist/meeting/muteState.js +224 -133
  127. package/dist/meeting/muteState.js.map +1 -1
  128. package/dist/meeting/request.js +295 -197
  129. package/dist/meeting/request.js.map +1 -1
  130. package/dist/meeting/request.type.js +7 -0
  131. package/dist/meeting/request.type.js.map +1 -0
  132. package/dist/meeting/state.js +1 -2
  133. package/dist/meeting/state.js.map +1 -1
  134. package/dist/meeting/util.js +602 -432
  135. package/dist/meeting/util.js.map +1 -1
  136. package/dist/meeting-info/collection.js +1 -2
  137. package/dist/meeting-info/collection.js.map +1 -1
  138. package/dist/meeting-info/index.js +74 -7
  139. package/dist/meeting-info/index.js.map +1 -1
  140. package/dist/meeting-info/meeting-info-v2.js +197 -63
  141. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  142. package/dist/meeting-info/request.js +1 -2
  143. package/dist/meeting-info/request.js.map +1 -1
  144. package/dist/meeting-info/util.js +2 -3
  145. package/dist/meeting-info/util.js.map +1 -1
  146. package/dist/meeting-info/utilv2.js +25 -12
  147. package/dist/meeting-info/utilv2.js.map +1 -1
  148. package/dist/meetings/collection.js +23 -2
  149. package/dist/meetings/collection.js.map +1 -1
  150. package/dist/meetings/index.js +464 -123
  151. package/dist/meetings/index.js.map +1 -1
  152. package/dist/meetings/meetings.types.js +7 -0
  153. package/dist/meetings/meetings.types.js.map +1 -0
  154. package/dist/meetings/request.js +4 -3
  155. package/dist/meetings/request.js.map +1 -1
  156. package/dist/meetings/util.js +107 -6
  157. package/dist/meetings/util.js.map +1 -1
  158. package/dist/member/index.js +54 -2
  159. package/dist/member/index.js.map +1 -1
  160. package/dist/member/member.types.js +3 -4
  161. package/dist/member/member.types.js.map +1 -1
  162. package/dist/member/types.js +23 -0
  163. package/dist/member/types.js.map +1 -0
  164. package/dist/member/util.js +131 -29
  165. package/dist/member/util.js.map +1 -1
  166. package/dist/members/collection.js +11 -2
  167. package/dist/members/collection.js.map +1 -1
  168. package/dist/members/index.js +172 -8
  169. package/dist/members/index.js.map +1 -1
  170. package/dist/members/request.js +108 -41
  171. package/dist/members/request.js.map +1 -1
  172. package/dist/members/types.js +14 -0
  173. package/dist/members/types.js.map +1 -0
  174. package/dist/members/util.js +327 -234
  175. package/dist/members/util.js.map +1 -1
  176. package/dist/metrics/constants.js +14 -7
  177. package/dist/metrics/constants.js.map +1 -1
  178. package/dist/metrics/index.js +4 -452
  179. package/dist/metrics/index.js.map +1 -1
  180. package/dist/multistream/mediaRequestManager.js +344 -0
  181. package/dist/multistream/mediaRequestManager.js.map +1 -0
  182. package/dist/multistream/receiveSlot.js +200 -0
  183. package/dist/multistream/receiveSlot.js.map +1 -0
  184. package/dist/multistream/receiveSlotManager.js +174 -0
  185. package/dist/multistream/receiveSlotManager.js.map +1 -0
  186. package/dist/multistream/remoteMedia.js +268 -0
  187. package/dist/multistream/remoteMedia.js.map +1 -0
  188. package/dist/multistream/remoteMediaGroup.js +267 -0
  189. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  190. package/dist/multistream/remoteMediaManager.js +1211 -0
  191. package/dist/multistream/remoteMediaManager.js.map +1 -0
  192. package/dist/multistream/sendSlotManager.js +236 -0
  193. package/dist/multistream/sendSlotManager.js.map +1 -0
  194. package/dist/networkQualityMonitor/index.js +5 -4
  195. package/dist/networkQualityMonitor/index.js.map +1 -1
  196. package/dist/personal-meeting-room/index.js +2 -3
  197. package/dist/personal-meeting-room/index.js.map +1 -1
  198. package/dist/personal-meeting-room/request.js +2 -3
  199. package/dist/personal-meeting-room/request.js.map +1 -1
  200. package/dist/personal-meeting-room/util.js +1 -2
  201. package/dist/personal-meeting-room/util.js.map +1 -1
  202. package/dist/reachability/index.js +258 -72
  203. package/dist/reachability/index.js.map +1 -1
  204. package/dist/reachability/request.js +18 -10
  205. package/dist/reachability/request.js.map +1 -1
  206. package/dist/reactions/constants.js +12 -0
  207. package/dist/reactions/constants.js.map +1 -0
  208. package/dist/reactions/reactions.js +4 -6
  209. package/dist/reactions/reactions.js.map +1 -1
  210. package/dist/reactions/reactions.type.js +21 -23
  211. package/dist/reactions/reactions.type.js.map +1 -1
  212. package/dist/reconnection-manager/index.js +272 -220
  213. package/dist/reconnection-manager/index.js.map +1 -1
  214. package/dist/recording-controller/enums.js +4 -5
  215. package/dist/recording-controller/enums.js.map +1 -1
  216. package/dist/recording-controller/index.js +57 -46
  217. package/dist/recording-controller/index.js.map +1 -1
  218. package/dist/recording-controller/util.js +10 -10
  219. package/dist/recording-controller/util.js.map +1 -1
  220. package/dist/roap/index.js +101 -235
  221. package/dist/roap/index.js.map +1 -1
  222. package/dist/roap/request.js +126 -180
  223. package/dist/roap/request.js.map +1 -1
  224. package/dist/roap/turnDiscovery.js +115 -105
  225. package/dist/roap/turnDiscovery.js.map +1 -1
  226. package/dist/rtcMetrics/constants.js +11 -0
  227. package/dist/rtcMetrics/constants.js.map +1 -0
  228. package/dist/rtcMetrics/index.js +115 -0
  229. package/dist/rtcMetrics/index.js.map +1 -0
  230. package/dist/statsAnalyzer/global.js +2 -93
  231. package/dist/statsAnalyzer/global.js.map +1 -1
  232. package/dist/statsAnalyzer/index.js +374 -374
  233. package/dist/statsAnalyzer/index.js.map +1 -1
  234. package/dist/statsAnalyzer/mqaUtil.js +100 -66
  235. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  236. package/dist/transcription/index.js +1 -2
  237. package/dist/transcription/index.js.map +1 -1
  238. package/dist/webinar/collection.js +43 -0
  239. package/dist/webinar/collection.js.map +1 -0
  240. package/dist/webinar/index.js +68 -0
  241. package/dist/webinar/index.js.map +1 -0
  242. package/package.json +27 -18
  243. package/src/annotation/annotation.types.ts +50 -0
  244. package/src/annotation/constants.ts +36 -0
  245. package/src/annotation/index.ts +328 -0
  246. package/src/breakouts/README.md +220 -0
  247. package/src/breakouts/breakout.ts +188 -0
  248. package/src/breakouts/collection.ts +19 -0
  249. package/src/breakouts/edit-lock-error.ts +25 -0
  250. package/src/breakouts/events.ts +56 -0
  251. package/src/breakouts/index.ts +925 -0
  252. package/src/breakouts/request.ts +55 -0
  253. package/src/breakouts/utils.ts +57 -0
  254. package/src/common/errors/no-meeting-info.ts +24 -0
  255. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  256. package/src/common/errors/webex-errors.ts +36 -12
  257. package/src/common/logs/logger-proxy.ts +1 -1
  258. package/src/common/logs/request.ts +5 -1
  259. package/src/common/queue.ts +22 -8
  260. package/src/config.ts +7 -9
  261. package/src/constants.ts +263 -89
  262. package/src/controls-options-manager/enums.ts +11 -1
  263. package/src/controls-options-manager/index.ts +116 -21
  264. package/src/controls-options-manager/types.ts +59 -0
  265. package/src/controls-options-manager/util.ts +294 -14
  266. package/src/index.ts +40 -0
  267. package/src/interpretation/README.md +60 -0
  268. package/src/interpretation/collection.ts +19 -0
  269. package/src/interpretation/index.ts +332 -0
  270. package/src/interpretation/siLanguage.ts +18 -0
  271. package/src/locus-info/controlsUtils.ts +110 -0
  272. package/src/locus-info/index.ts +449 -61
  273. package/src/locus-info/infoUtils.ts +14 -2
  274. package/src/locus-info/mediaSharesUtils.ts +64 -0
  275. package/src/locus-info/parser.ts +258 -47
  276. package/src/locus-info/selfUtils.ts +85 -2
  277. package/src/media/index.ts +153 -370
  278. package/src/media/properties.ts +106 -136
  279. package/src/media/util.ts +0 -21
  280. package/src/mediaQualityMetrics/config.ts +379 -377
  281. package/src/meeting/in-meeting-actions.ts +168 -0
  282. package/src/meeting/index.ts +3801 -2457
  283. package/src/meeting/locusMediaRequest.ts +313 -0
  284. package/src/meeting/muteState.ts +224 -138
  285. package/src/meeting/request.ts +207 -127
  286. package/src/meeting/request.type.ts +13 -0
  287. package/src/meeting/util.ts +590 -423
  288. package/src/meeting-info/index.ts +81 -8
  289. package/src/meeting-info/meeting-info-v2.ts +159 -13
  290. package/src/meeting-info/util.ts +1 -1
  291. package/src/meeting-info/utilv2.ts +22 -9
  292. package/src/meetings/collection.ts +20 -0
  293. package/src/meetings/index.ts +466 -124
  294. package/src/meetings/meetings.types.ts +12 -0
  295. package/src/meetings/request.ts +2 -0
  296. package/src/meetings/util.ts +116 -5
  297. package/src/member/index.ts +52 -1
  298. package/src/member/types.ts +38 -0
  299. package/src/member/util.ts +139 -28
  300. package/src/members/collection.ts +8 -0
  301. package/src/members/index.ts +196 -7
  302. package/src/members/request.ts +97 -17
  303. package/src/members/types.ts +29 -0
  304. package/src/members/util.ts +333 -240
  305. package/src/metrics/constants.ts +12 -4
  306. package/src/metrics/index.ts +1 -471
  307. package/src/multistream/mediaRequestManager.ts +440 -0
  308. package/src/multistream/receiveSlot.ts +184 -0
  309. package/src/multistream/receiveSlotManager.ts +166 -0
  310. package/src/multistream/remoteMedia.ts +254 -0
  311. package/src/multistream/remoteMediaGroup.ts +284 -0
  312. package/src/multistream/remoteMediaManager.ts +1145 -0
  313. package/src/multistream/sendSlotManager.ts +170 -0
  314. package/src/networkQualityMonitor/index.ts +6 -6
  315. package/src/reachability/index.ts +238 -45
  316. package/src/reachability/request.ts +17 -8
  317. package/src/reactions/constants.ts +4 -0
  318. package/src/reactions/reactions.ts +4 -4
  319. package/src/reactions/reactions.type.ts +30 -4
  320. package/src/reconnection-manager/index.ts +124 -107
  321. package/src/recording-controller/index.ts +20 -3
  322. package/src/recording-controller/util.ts +26 -9
  323. package/src/roap/index.ts +98 -240
  324. package/src/roap/request.ts +74 -148
  325. package/src/roap/turnDiscovery.ts +62 -56
  326. package/src/rtcMetrics/constants.ts +3 -0
  327. package/src/rtcMetrics/index.ts +100 -0
  328. package/src/statsAnalyzer/global.ts +1 -92
  329. package/src/statsAnalyzer/index.ts +429 -447
  330. package/src/statsAnalyzer/mqaUtil.ts +105 -103
  331. package/src/webinar/collection.ts +31 -0
  332. package/src/webinar/index.ts +62 -0
  333. package/test/integration/spec/converged-space-meetings.js +233 -0
  334. package/test/integration/spec/journey.js +320 -264
  335. package/test/integration/spec/space-meeting.js +77 -4
  336. package/test/unit/spec/annotation/index.ts +418 -0
  337. package/test/unit/spec/breakouts/breakout.ts +237 -0
  338. package/test/unit/spec/breakouts/collection.ts +15 -0
  339. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  340. package/test/unit/spec/breakouts/events.ts +89 -0
  341. package/test/unit/spec/breakouts/index.ts +1790 -0
  342. package/test/unit/spec/breakouts/request.ts +104 -0
  343. package/test/unit/spec/breakouts/utils.js +72 -0
  344. package/test/unit/spec/common/queue.js +31 -2
  345. package/test/unit/spec/controls-options-manager/index.js +163 -0
  346. package/test/unit/spec/controls-options-manager/util.js +576 -60
  347. package/test/unit/spec/fixture/locus.js +1 -0
  348. package/test/unit/spec/interpretation/collection.ts +15 -0
  349. package/test/unit/spec/interpretation/index.ts +589 -0
  350. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  351. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  352. package/test/unit/spec/locus-info/index.js +1390 -16
  353. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  354. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  355. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  356. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  357. package/test/unit/spec/locus-info/parser.js +116 -35
  358. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  359. package/test/unit/spec/media/index.ts +274 -0
  360. package/test/unit/spec/media/properties.ts +75 -84
  361. package/test/unit/spec/meeting/in-meeting-actions.ts +82 -0
  362. package/test/unit/spec/meeting/index.js +7420 -3125
  363. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  364. package/test/unit/spec/meeting/muteState.js +407 -212
  365. package/test/unit/spec/meeting/request.js +512 -42
  366. package/test/unit/spec/meeting/utils.js +741 -24
  367. package/test/unit/spec/meeting-info/index.js +300 -0
  368. package/test/unit/spec/meeting-info/meetinginfov2.js +500 -6
  369. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  370. package/test/unit/spec/meetings/collection.js +14 -0
  371. package/test/unit/spec/meetings/index.js +1012 -209
  372. package/test/unit/spec/meetings/utils.js +202 -2
  373. package/test/unit/spec/member/index.js +38 -8
  374. package/test/unit/spec/member/util.js +528 -27
  375. package/test/unit/spec/members/index.js +597 -3
  376. package/test/unit/spec/members/request.js +206 -27
  377. package/test/unit/spec/members/utils.js +210 -0
  378. package/test/unit/spec/metrics/index.js +1 -50
  379. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  380. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  381. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  382. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  383. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  384. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  385. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  386. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  387. package/test/unit/spec/reachability/index.ts +598 -24
  388. package/test/unit/spec/reachability/request.js +68 -0
  389. package/test/unit/spec/reconnection-manager/index.js +130 -22
  390. package/test/unit/spec/recording-controller/index.js +293 -218
  391. package/test/unit/spec/recording-controller/util.js +223 -96
  392. package/test/unit/spec/roap/index.ts +200 -77
  393. package/test/unit/spec/roap/request.ts +232 -0
  394. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  395. package/test/unit/spec/rtcMetrics/index.ts +73 -0
  396. package/test/unit/spec/stats-analyzer/index.js +205 -50
  397. package/test/unit/spec/webinar/collection.ts +13 -0
  398. package/test/unit/spec/webinar/index.ts +60 -0
  399. package/test/utils/constants.js +9 -0
  400. package/test/utils/integrationTestUtils.js +46 -0
  401. package/test/utils/testUtils.js +0 -45
  402. package/test/utils/webex-config.js +4 -0
  403. package/test/utils/webex-test-users.js +7 -3
  404. package/dist/meeting/effectsState.js +0 -260
  405. package/dist/meeting/effectsState.js.map +0 -1
  406. package/dist/metrics/config.js +0 -289
  407. package/dist/metrics/config.js.map +0 -1
  408. package/dist/peer-connection-manager/index.js +0 -671
  409. package/dist/peer-connection-manager/index.js.map +0 -1
  410. package/dist/peer-connection-manager/util.js +0 -110
  411. package/dist/peer-connection-manager/util.js.map +0 -1
  412. package/dist/roap/collection.js +0 -63
  413. package/dist/roap/collection.js.map +0 -1
  414. package/dist/roap/handler.js +0 -279
  415. package/dist/roap/handler.js.map +0 -1
  416. package/dist/roap/state.js +0 -127
  417. package/dist/roap/state.js.map +0 -1
  418. package/dist/roap/util.js +0 -76
  419. package/dist/roap/util.js.map +0 -1
  420. package/src/index.js +0 -15
  421. package/src/meeting/effectsState.ts +0 -209
  422. package/src/metrics/config.ts +0 -485
  423. package/src/peer-connection-manager/index.ts +0 -847
  424. package/src/peer-connection-manager/util.ts +0 -119
  425. package/src/roap/collection.ts +0 -62
  426. package/src/roap/handler.ts +0 -294
  427. package/src/roap/state.ts +0 -156
  428. package/src/roap/util.ts +0 -100
  429. package/test/unit/spec/meeting/effectsState.js +0 -281
  430. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  431. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  432. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  433. package/test/unit/spec/roap/util.js +0 -30
@@ -2,10 +2,12 @@ import 'jsdom-global/register';
2
2
  import chai from 'chai';
3
3
  import chaiAsPromised from 'chai-as-promised';
4
4
  import sinon from 'sinon';
5
+ import {ConnectionState} from '@webex/internal-media-core';
5
6
 
6
7
  import {StatsAnalyzer, EVENTS} from '../../../../src/statsAnalyzer';
7
8
  import NetworkQualityMonitor from '../../../../src/networkQualityMonitor';
8
9
  import testUtils from '../../../utils/testUtils';
10
+ import {MEDIA_DEVICES, _UNKNOWN_} from '@webex/plugin-meetings/src/constants';
9
11
 
10
12
  const {assert} = chai;
11
13
 
@@ -23,14 +25,15 @@ describe('plugin-meetings', () => {
23
25
  };
24
26
 
25
27
  const defaultStats = {
28
+ resolutions: {},
26
29
  internal: {
27
- video: {
30
+ 'video-send-1': {
28
31
  send: {
29
32
  totalPacketsLostOnReceiver: 10,
30
33
  },
31
34
  },
32
35
  },
33
- video: {
36
+ 'video-send-1': {
34
37
  send: {
35
38
  packetsSent: 2,
36
39
  meanRemoteJitter: [],
@@ -51,7 +54,12 @@ describe('plugin-meetings', () => {
51
54
  beforeEach(() => {
52
55
  const networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
53
56
 
54
- statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor, defaultStats);
57
+ statsAnalyzer = new StatsAnalyzer(
58
+ initialConfig,
59
+ () => ({}),
60
+ networkQualityMonitor,
61
+ defaultStats
62
+ );
55
63
 
56
64
  sandBoxSpy = sandbox.spy(
57
65
  statsAnalyzer.networkQualityMonitor,
@@ -64,12 +72,12 @@ describe('plugin-meetings', () => {
64
72
  });
65
73
 
66
74
  it('should trigger determineUplinkNetworkQuality with specific arguments', async () => {
67
- await statsAnalyzer.parseGetStatsResult(statusResult, 'video');
75
+ await statsAnalyzer.parseGetStatsResult(statusResult, 'video-send-1', true);
68
76
 
69
77
  assert.calledOnce(statsAnalyzer.networkQualityMonitor.determineUplinkNetworkQuality);
70
78
  assert(
71
79
  sandBoxSpy.calledWith({
72
- mediaType: 'video',
80
+ mediaType: 'video-send-1',
73
81
  remoteRtpResults: statusResult,
74
82
  statsAnalyzerCurrentStats: statsAnalyzer.statsResults,
75
83
  })
@@ -82,6 +90,7 @@ describe('plugin-meetings', () => {
82
90
  let pc;
83
91
  let networkQualityMonitor;
84
92
  let statsAnalyzer;
93
+ let mqeData;
85
94
 
86
95
  let receivedEventsData = {
87
96
  local: {},
@@ -109,61 +118,145 @@ describe('plugin-meetings', () => {
109
118
  // bytesReceived and bytesSent need to be non-zero in order for StatsAnalyzer to parse any other values
110
119
  fakeStats = {
111
120
  audio: {
112
- receiver: {
113
- type: 'inbound-rtp',
114
- packetsReceived: 0,
115
- bytesReceived: 1,
116
- },
117
- sender: {
118
- type: 'outbound-rtp',
119
- packetsSent: 0,
120
- bytesSent: 1,
121
- },
121
+ senders: [
122
+ {
123
+ localTrackLabel: 'fake-microphone',
124
+ report: [
125
+ {
126
+ type: 'outbound-rtp',
127
+ packetsSent: 0,
128
+ bytesSent: 1,
129
+ },
130
+ {
131
+ type: 'candidate-pair',
132
+ state: 'succeeded',
133
+ localCandidateId: 'fake-candidate-id'
134
+ },
135
+ {
136
+ type: 'candidate-pair',
137
+ state: 'failed',
138
+ localCandidateId: 'bad-candidate-id'
139
+ },
140
+ {
141
+ type: 'local-candidate',
142
+ id: 'fake-candidate-id',
143
+ protocol: 'tcp'
144
+ },
145
+ ],
146
+ },
147
+ ],
148
+ receivers: [
149
+ {
150
+ report: [
151
+ {
152
+ type: 'inbound-rtp',
153
+ packetsReceived: 0,
154
+ bytesReceived: 1,
155
+ },
156
+ {
157
+ type: 'candidate-pair',
158
+ state: 'succeeded',
159
+ localCandidateId: 'fake-candidate-id'
160
+ },
161
+ {
162
+ type: 'candidate-pair',
163
+ state: 'failed',
164
+ localCandidateId: 'bad-candidate-id'
165
+ },
166
+ {
167
+ type: 'local-candidate',
168
+ id: 'fake-candidate-id',
169
+ protocol: 'tcp'
170
+ },
171
+ ],
172
+ },
173
+ ],
122
174
  },
123
175
  video: {
124
- receiver: {
125
- type: 'inbound-rtp',
126
- framesDecoded: 0,
127
- bytesReceived: 1,
128
- },
129
- sender: {
130
- type: 'outbound-rtp',
131
- framesSent: 0,
132
- bytesSent: 1,
133
- },
176
+ senders: [
177
+ {
178
+ localTrackLabel: 'fake-camera',
179
+ report: [
180
+ {
181
+ type: 'outbound-rtp',
182
+ framesSent: 0,
183
+ bytesSent: 1,
184
+ },
185
+ {
186
+ type: 'candidate-pair',
187
+ state: 'succeeded',
188
+ localCandidateId: 'fake-candidate-id'
189
+ },
190
+ {
191
+ type: 'candidate-pair',
192
+ state: 'failed',
193
+ localCandidateId: 'bad-candidate-id'
194
+ },
195
+ {
196
+ type: 'local-candidate',
197
+ id: 'fake-candidate-id',
198
+ protocol: 'tcp'
199
+ },
200
+ ],
201
+ },
202
+ ],
203
+ receivers: [
204
+ {
205
+ report: [
206
+ {
207
+ type: 'inbound-rtp',
208
+ framesDecoded: 0,
209
+ bytesReceived: 1,
210
+ frameHeight: 720,
211
+ frameWidth: 1280,
212
+ framesReceived: 1,
213
+ },
214
+ {
215
+ type: 'candidate-pair',
216
+ state: 'succeeded',
217
+ localCandidateId: 'fake-candidate-id'
218
+ },
219
+ {
220
+ type: 'candidate-pair',
221
+ state: 'failed',
222
+ localCandidateId: 'bad-candidate-id'
223
+ },
224
+ {
225
+ type: 'local-candidate',
226
+ id: 'fake-candidate-id',
227
+ protocol: 'tcp'
228
+ },
229
+ ],
230
+ },
231
+ ],
134
232
  },
135
233
  };
136
234
 
137
235
  pc = {
138
- audioTransceiver: {
139
- sender: {
140
- getStats: sinon.stub().resolves([fakeStats.audio.sender]),
236
+ getConnectionState: sinon.stub().returns(ConnectionState.Connected),
237
+ getTransceiverStats: sinon.stub().resolves({
238
+ audio: {
239
+ senders: [fakeStats.audio.senders[0]],
240
+ receivers: [fakeStats.audio.receivers[0]],
141
241
  },
142
- receiver: {
143
- getStats: sinon.stub().resolves([fakeStats.audio.receiver]),
242
+ video: {
243
+ senders: [fakeStats.video.senders[0]],
244
+ receivers: [fakeStats.video.receivers[0]],
144
245
  },
145
- },
146
- videoTransceiver: {
147
- sender: {
148
- getStats: sinon.stub().resolves([fakeStats.video.sender]),
149
- },
150
- receiver: {
151
- getStats: sinon.stub().resolves([fakeStats.video.receiver]),
152
- },
153
- },
154
- shareTransceiver: {
155
- sender: {
156
- getStats: sinon.stub().resolves([]),
246
+ screenShareAudio: {
247
+ senders: [],
248
+ receivers: [],
157
249
  },
158
- receiver: {
159
- getStats: sinon.stub().resolves([]),
250
+ screenShareVideo: {
251
+ senders: [],
252
+ receivers: [],
160
253
  },
161
- },
254
+ }),
162
255
  };
163
256
 
164
257
  networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
165
258
 
166
- statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor);
259
+ statsAnalyzer = new StatsAnalyzer(initialConfig, () => ({}), networkQualityMonitor);
167
260
 
168
261
  statsAnalyzer.on(EVENTS.LOCAL_MEDIA_STARTED, (data) => {
169
262
  receivedEventsData.local.started = data;
@@ -177,6 +270,9 @@ describe('plugin-meetings', () => {
177
270
  statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STOPPED, (data) => {
178
271
  receivedEventsData.remote.stopped = data;
179
272
  });
273
+ statsAnalyzer.on(EVENTS.MEDIA_QUALITY, ({data}) => {
274
+ mqeData = data;
275
+ });
180
276
  });
181
277
 
182
278
  afterEach(() => {
@@ -203,6 +299,12 @@ describe('plugin-meetings', () => {
203
299
  assert.deepEqual(receivedEventsData.remote.stopped, expected.remote?.stopped);
204
300
  };
205
301
 
302
+ const checkMqeData = () => {
303
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedFrameSize, 3600);
304
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedHeight, 720);
305
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedWidth, 1280);
306
+ };
307
+
206
308
  it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for audio', async () => {
207
309
  await startStatsAnalyzer({expected: {sendAudio: true}});
208
310
 
@@ -210,7 +312,7 @@ describe('plugin-meetings', () => {
210
312
  checkReceivedEvent({expected: {}});
211
313
 
212
314
  // setup a mock to return some values higher the previous ones
213
- fakeStats.audio.sender.packetsSent += 10;
315
+ fakeStats.audio.senders[0].report[0].packetsSent += 10;
214
316
 
215
317
  await progressTime();
216
318
 
@@ -230,7 +332,7 @@ describe('plugin-meetings', () => {
230
332
  checkReceivedEvent({expected: {}});
231
333
 
232
334
  // setup a mock to return some values higher the previous ones
233
- fakeStats.video.sender.framesSent += 1;
335
+ fakeStats.video.senders[0].report[0].framesSent += 1;
234
336
 
235
337
  await progressTime();
236
338
 
@@ -250,7 +352,7 @@ describe('plugin-meetings', () => {
250
352
  checkReceivedEvent({expected: {}});
251
353
 
252
354
  // setup a mock to return some values higher the previous ones
253
- fakeStats.audio.receiver.packetsReceived += 5;
355
+ fakeStats.audio.receivers[0].report[0].packetsReceived += 5;
254
356
 
255
357
  await progressTime();
256
358
  // check that we got the REMOTE_MEDIA_STARTED event for audio
@@ -270,7 +372,7 @@ describe('plugin-meetings', () => {
270
372
  checkReceivedEvent({expected: {}});
271
373
 
272
374
  // setup a mock to return some values higher the previous ones
273
- fakeStats.video.receiver.framesDecoded += 1;
375
+ fakeStats.video.receivers[0].report[0].framesDecoded += 1;
274
376
 
275
377
  await progressTime();
276
378
  // check that we got the REMOTE_MEDIA_STARTED event for video
@@ -282,6 +384,59 @@ describe('plugin-meetings', () => {
282
384
 
283
385
  checkReceivedEvent({expected: {remote: {stopped: {type: 'video'}}}});
284
386
  });
387
+
388
+ it('emits the correct MEDIA_QUALITY events', async () => {
389
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
390
+
391
+ await progressTime();
392
+
393
+ // Check that the mqe data has been emitted and is correctly computed.
394
+ checkMqeData();
395
+ });
396
+
397
+ it('emits the correct transportType in MEDIA_QUALITY events', async () => {
398
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
399
+
400
+ await progressTime();
401
+
402
+ assert.strictEqual(mqeData.audioTransmit[0].common.transportType, 'TCP');
403
+ assert.strictEqual(mqeData.videoReceive[0].common.transportType, 'TCP');
404
+ });
405
+
406
+ it('emits the correct transportType in MEDIA_QUALITY events when using a TURN server', async () => {
407
+ fakeStats.audio.senders[0].report[3].relayProtocol = 'tls';
408
+ fakeStats.video.senders[0].report[3].relayProtocol = 'tls';
409
+ fakeStats.audio.receivers[0].report[3].relayProtocol = 'tls';
410
+ fakeStats.video.receivers[0].report[3].relayProtocol = 'tls';
411
+
412
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
413
+
414
+ await progressTime();
415
+
416
+ assert.strictEqual(mqeData.audioTransmit[0].common.transportType, 'TLS');
417
+ assert.strictEqual(mqeData.videoReceive[0].common.transportType, 'TLS');
418
+ });
419
+
420
+ it('emits the correct peripherals in MEDIA_QUALITY events', async () => {
421
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
422
+
423
+ await progressTime();
424
+
425
+ assert.strictEqual(mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.MICROPHONE).information, 'fake-microphone');
426
+ assert.strictEqual(mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.CAMERA).information, 'fake-camera');
427
+ });
428
+
429
+ it('emits the correct peripherals in MEDIA_QUALITY events when localTrackLabel is undefined', async () => {
430
+ fakeStats.audio.senders[0].localTrackLabel = undefined;
431
+ fakeStats.video.senders[0].localTrackLabel = undefined;
432
+
433
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
434
+
435
+ await progressTime();
436
+
437
+ assert.strictEqual(mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.MICROPHONE).information, _UNKNOWN_);
438
+ assert.strictEqual(mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.CAMERA).information, _UNKNOWN_);
439
+ });
285
440
  });
286
441
  });
287
442
  });
@@ -0,0 +1,13 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import WebinarCollection from '@webex/plugin-meetings/src/webinar/collection';
3
+
4
+ describe('plugin-meetings', () => {
5
+ describe('WebinarCollection', () => {
6
+ it('the webinar collection is as expected', () => {
7
+ const collection = new WebinarCollection();
8
+
9
+ assert.equal(collection.namespace, 'Meetings');
10
+ assert.equal(collection.mainIndex, 'sessionId');
11
+ });
12
+ });
13
+ });
@@ -0,0 +1,60 @@
1
+ import {assert, expect} from '@webex/test-helper-chai';
2
+ import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
3
+ import Webinar from '@webex/plugin-meetings/src/webinar';
4
+ import MockWebex from '@webex/test-helper-mock-webex';
5
+ import sinon from 'sinon';
6
+
7
+ describe('plugin-meetings', () => {
8
+ describe('Webinar', () => {
9
+
10
+ let webex;
11
+ let webinar;
12
+
13
+ beforeEach(() => {
14
+ // @ts-ignore
15
+ webex = new MockWebex({});
16
+ webex.internal.mercury.on = sinon.stub();
17
+ webinar = new Webinar({}, {parent: webex});
18
+ webinar.locusUrl = 'locusUrl';
19
+ webex.request = sinon.stub().returns(Promise.resolve('REQUEST_RETURN_VALUE'));
20
+ webex.meetings = {};
21
+ webex.meetings.getMeetingByType = sinon.stub();
22
+ });
23
+
24
+ describe('#locusUrlUpdate', () => {
25
+ it('sets the locus url', () => {
26
+ webinar.locusUrlUpdate('newUrl');
27
+
28
+ assert.equal(webinar.locusUrl, 'newUrl');
29
+ });
30
+ });
31
+
32
+ describe('#webcastUrlUpdate', () => {
33
+ it('sets the webcast url', () => {
34
+ webinar.webcastUrlUpdate('newUrl');
35
+
36
+ assert.equal(webinar.webcastUrl, 'newUrl');
37
+ });
38
+ });
39
+
40
+ describe('#webinarAttendeesSearchingUrlUpdate', () => {
41
+ it('sets the webinarAttendeesSearching url', () => {
42
+ webinar.webinarAttendeesSearchingUrlUpdate('newUrl');
43
+
44
+ assert.equal(webinar.webinarAttendeesSearchingUrl, 'newUrl');
45
+ });
46
+ });
47
+
48
+ describe('#updateCanManageWebcast', () => {
49
+ it('update canManageWebcast', () => {
50
+ webinar.updateCanManageWebcast(true);
51
+
52
+ assert.equal(webinar.canManageWebcast, true);
53
+
54
+ webinar.updateCanManageWebcast(false);
55
+
56
+ assert.equal(webinar.canManageWebcast, false);
57
+ });
58
+ });
59
+ })
60
+ })
@@ -0,0 +1,9 @@
1
+ // MOVE TO TEST CONSTANTS
2
+ export const MEDIA_SERVERS = {
3
+ // The homer media server for converged multistream meetings.
4
+ HOMER: 'homer',
5
+ // The linus media server
6
+ LINUS: 'linus',
7
+ // The calliope media server for transcoded meetings
8
+ CALLIOPE: 'calliope',
9
+ };
@@ -0,0 +1,46 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import {Defer} from '@webex/common';
3
+
4
+ const addMedia = async (user, options = {}) => {
5
+
6
+ const {microphone, camera} = options;
7
+
8
+ if (options.multistream) {
9
+ await user.meeting.addMedia({localStreams: {microphone, camera}});
10
+ } else {
11
+ const mediaReadyPromises = Array.isArray(options.expectedMediaReadyTypes)
12
+ ? options.expectedMediaReadyTypes.reduce((output, expectedMediaReadyType) => {
13
+ if (typeof expectedMediaReadyType !== 'string') {
14
+ return output;
15
+ }
16
+
17
+ output[expectedMediaReadyType] = new Defer();
18
+
19
+ return output;
20
+ }, {})
21
+ : {remoteAudio: new Defer(), remoteVideo: new Defer()};
22
+
23
+ const mediaReady = (media) => {
24
+ if (!media) {
25
+ return;
26
+ }
27
+ if (mediaReadyPromises[media.type]) {
28
+ mediaReadyPromises[media.type].resolve();
29
+ }
30
+ };
31
+
32
+ user.meeting.on('media:ready', mediaReady);
33
+
34
+ await user.meeting.addMedia({localStreams: {microphone, camera}});
35
+ await Promise.all(Object.values(mediaReadyPromises).map((defer) => defer.promise));
36
+ };
37
+
38
+
39
+ assert.exists(user.meeting.mediaProperties.audioStream, 'audioStream not present');
40
+ assert.exists(user.meeting.mediaProperties.videoStream, 'videoStream not present');
41
+
42
+ };
43
+
44
+ export default {
45
+ addMedia
46
+ };
@@ -1,5 +1,3 @@
1
- import {assert} from '@webex/test-helper-chai';
2
- import {Defer} from '@webex/common';
3
1
 
4
2
  const max = 30000;
5
3
  const waitForSpy = (spy, event) => {
@@ -195,49 +193,7 @@ const delayedTest = (callback, timeout) =>
195
193
  }, timeout);
196
194
  });
197
195
 
198
- const addMedia = (user) => {
199
- const mediaReadyPromises = {
200
- local: new Defer(),
201
- remoteAudio: new Defer(),
202
- remoteVideo: new Defer(),
203
- };
204
- const mediaReady = (media) => {
205
- if (!media) {
206
- return;
207
- }
208
- if (mediaReadyPromises[media.type]) {
209
- mediaReadyPromises[media.type].resolve();
210
- }
211
- };
212
-
213
- user.meeting.on('media:ready', mediaReady);
214
196
 
215
- return user.meeting
216
- .getMediaStreams({
217
- sendAudio: true,
218
- sendVideo: true,
219
- sendShare: false,
220
- })
221
- .then(([localStream, localShare]) =>
222
- user.meeting.addMedia({
223
- mediaSettings: {
224
- sendAudio: true,
225
- sendVideo: true,
226
- sendShare: false,
227
- receiveShare: true,
228
- receiveAudio: true,
229
- receiveVideo: true,
230
- },
231
- localShare,
232
- localStream,
233
- })
234
- )
235
- .then(() => Promise.all(Object.values(mediaReadyPromises).map((defer) => defer.promise)))
236
- .then(() => {
237
- assert.exists(user.meeting.mediaProperties.audioTrack, 'audioTrack not present');
238
- assert.exists(user.meeting.mediaProperties.videoTrack, 'videoTrack not present');
239
- });
240
- };
241
197
 
242
198
  const waitUntil = (waitTime) =>
243
199
  new Promise((resolve) => {
@@ -279,7 +235,6 @@ export default {
279
235
  waitForEvents,
280
236
  checkParticipantUpdatedStatus,
281
237
  delayedPromise,
282
- addMedia,
283
238
  waitUntil,
284
239
  delayedTest,
285
240
  flushPromises,
@@ -57,6 +57,10 @@ Config.webex = {
57
57
  enabled: true,
58
58
  },
59
59
  enableRtx: true,
60
+ experimental: {
61
+ enableMediaNegotiatedEvent: true,
62
+ enableUnifiedMeetings: true,
63
+ },
60
64
  },
61
65
  people: {
62
66
  showAllTypes: true,
@@ -8,6 +8,7 @@ const config = require('./webex-config');
8
8
 
9
9
  // Include the plugins which you feel will be used by the webex instance
10
10
  require('@webex/internal-plugin-mercury');
11
+ require('@webex/internal-plugin-llm');
11
12
  require('@webex/internal-plugin-user');
12
13
  require('@webex/internal-plugin-device');
13
14
  require('@webex/internal-plugin-conversation');
@@ -16,9 +17,11 @@ require('@webex/plugin-people');
16
17
  require('@webex/plugin-rooms');
17
18
  require('@webex/plugin-meetings');
18
19
 
19
- const generateTestUsers = (options) =>
20
- testUser
21
- .create({count: options.count})
20
+ const generateTestUsers = (options = {}) => {
21
+ options.config = options.config || {};
22
+ options.config.orgId = options.config.orgId || process.env.WEBEX_CONVERGED_ORG_ID;
23
+
24
+ return testUser.create(options)
22
25
  .then(async (userSet) => {
23
26
  if (userSet.length !== options.count) {
24
27
  return Promise.reject(new Error('Test users not created'));
@@ -51,6 +54,7 @@ const generateTestUsers = (options) =>
51
54
  .catch((error) => {
52
55
  console.error('#generateTestUsers=>ERROR', error);
53
56
  });
57
+ };
54
58
 
55
59
  const reserveCMR = (user) =>
56
60
  user.webex