@webex/plugin-meetings 2.60.0 → 2.60.1-next.2

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 (535) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.d.ts +42 -0
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.d.ts +31 -0
  6. package/dist/annotation/constants.js +41 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.d.ts +117 -0
  9. package/dist/annotation/index.js +357 -0
  10. package/dist/annotation/index.js.map +1 -0
  11. package/dist/breakouts/breakout.d.ts +8 -0
  12. package/dist/breakouts/breakout.js +215 -0
  13. package/dist/breakouts/breakout.js.map +1 -0
  14. package/dist/breakouts/collection.d.ts +5 -0
  15. package/dist/breakouts/collection.js +22 -0
  16. package/dist/breakouts/collection.js.map +1 -0
  17. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  18. package/dist/breakouts/edit-lock-error.js +51 -0
  19. package/dist/breakouts/edit-lock-error.js.map +1 -0
  20. package/dist/breakouts/events.d.ts +8 -0
  21. package/dist/breakouts/events.js +44 -0
  22. package/dist/breakouts/events.js.map +1 -0
  23. package/dist/breakouts/index.d.ts +5 -0
  24. package/dist/breakouts/index.js +1047 -0
  25. package/dist/breakouts/index.js.map +1 -0
  26. package/dist/breakouts/request.d.ts +22 -0
  27. package/dist/breakouts/request.js +77 -0
  28. package/dist/breakouts/request.js.map +1 -0
  29. package/dist/breakouts/utils.d.ts +15 -0
  30. package/dist/breakouts/utils.js +64 -0
  31. package/dist/breakouts/utils.js.map +1 -0
  32. package/dist/common/browser-detection.js +2 -3
  33. package/dist/common/browser-detection.js.map +1 -1
  34. package/dist/common/collection.js +3 -4
  35. package/dist/common/collection.js.map +1 -1
  36. package/dist/common/config.js +1 -2
  37. package/dist/common/config.js.map +1 -1
  38. package/dist/common/errors/captcha-error.js +1 -2
  39. package/dist/common/errors/captcha-error.js.map +1 -1
  40. package/dist/common/errors/intent-to-join.js +1 -2
  41. package/dist/common/errors/intent-to-join.js.map +1 -1
  42. package/dist/common/errors/join-meeting.js +1 -2
  43. package/dist/common/errors/join-meeting.js.map +1 -1
  44. package/dist/common/errors/media.js +1 -2
  45. package/dist/common/errors/media.js.map +1 -1
  46. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  47. package/dist/common/errors/no-meeting-info.js +50 -0
  48. package/dist/common/errors/no-meeting-info.js.map +1 -0
  49. package/dist/common/errors/parameter.js +3 -4
  50. package/dist/common/errors/parameter.js.map +1 -1
  51. package/dist/common/errors/password-error.js +1 -2
  52. package/dist/common/errors/password-error.js.map +1 -1
  53. package/dist/common/errors/permission.js +1 -2
  54. package/dist/common/errors/permission.js.map +1 -1
  55. package/dist/common/errors/{reclaim-host-role-error.js → reclaim-host-role-errors.js} +7 -11
  56. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  57. package/dist/common/errors/reconnection-in-progress.js +1 -2
  58. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  59. package/dist/common/errors/reconnection.js +1 -2
  60. package/dist/common/errors/reconnection.js.map +1 -1
  61. package/dist/common/errors/stats.js +1 -2
  62. package/dist/common/errors/stats.js.map +1 -1
  63. package/dist/common/errors/webex-errors.d.ts +20 -8
  64. package/dist/common/errors/webex-errors.js +48 -28
  65. package/dist/common/errors/webex-errors.js.map +1 -1
  66. package/dist/common/errors/webex-meetings-error.js +1 -2
  67. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  68. package/dist/common/events/events-scope.js +1 -2
  69. package/dist/common/events/events-scope.js.map +1 -1
  70. package/dist/common/events/events.js +1 -2
  71. package/dist/common/events/events.js.map +1 -1
  72. package/dist/common/events/trigger-proxy.js +1 -2
  73. package/dist/common/events/trigger-proxy.js.map +1 -1
  74. package/dist/common/events/util.js +1 -2
  75. package/dist/common/events/util.js.map +1 -1
  76. package/dist/common/logs/logger-config.js +1 -2
  77. package/dist/common/logs/logger-config.js.map +1 -1
  78. package/dist/common/logs/logger-proxy.js +2 -3
  79. package/dist/common/logs/logger-proxy.js.map +1 -1
  80. package/dist/common/logs/request.d.ts +3 -1
  81. package/dist/common/logs/request.js +8 -5
  82. package/dist/common/logs/request.js.map +1 -1
  83. package/dist/common/queue.d.ts +9 -7
  84. package/dist/common/queue.js +22 -9
  85. package/dist/common/queue.js.map +1 -1
  86. package/dist/config.d.ts +6 -7
  87. package/dist/config.js +8 -10
  88. package/dist/config.js.map +1 -1
  89. package/dist/constants.d.ts +217 -97
  90. package/dist/constants.js +416 -441
  91. package/dist/constants.js.map +1 -1
  92. package/dist/controls-options-manager/constants.js +3 -6
  93. package/dist/controls-options-manager/constants.js.map +1 -1
  94. package/dist/controls-options-manager/enums.d.ts +11 -1
  95. package/dist/controls-options-manager/enums.js +15 -6
  96. package/dist/controls-options-manager/enums.js.map +1 -1
  97. package/dist/controls-options-manager/index.d.ts +17 -1
  98. package/dist/controls-options-manager/index.js +127 -38
  99. package/dist/controls-options-manager/index.js.map +1 -1
  100. package/dist/controls-options-manager/types.d.ts +43 -0
  101. package/dist/controls-options-manager/types.js +7 -0
  102. package/dist/controls-options-manager/types.js.map +1 -0
  103. package/dist/controls-options-manager/util.d.ts +1 -7
  104. package/dist/controls-options-manager/util.js +309 -19
  105. package/dist/controls-options-manager/util.js.map +1 -1
  106. package/dist/index.d.ts +6 -3
  107. package/dist/index.js +121 -5
  108. package/dist/index.js.map +1 -1
  109. package/dist/interceptors/index.d.ts +2 -0
  110. package/dist/interceptors/index.js +15 -0
  111. package/dist/interceptors/index.js.map +1 -0
  112. package/dist/interceptors/locusRetry.d.ts +27 -0
  113. package/dist/interceptors/locusRetry.js +94 -0
  114. package/dist/interceptors/locusRetry.js.map +1 -0
  115. package/dist/interpretation/collection.d.ts +5 -0
  116. package/dist/interpretation/collection.js +22 -0
  117. package/dist/interpretation/collection.js.map +1 -0
  118. package/dist/interpretation/index.d.ts +5 -0
  119. package/dist/interpretation/index.js +365 -0
  120. package/dist/interpretation/index.js.map +1 -0
  121. package/dist/interpretation/siLanguage.d.ts +5 -0
  122. package/dist/interpretation/siLanguage.js +24 -0
  123. package/dist/interpretation/siLanguage.js.map +1 -0
  124. package/dist/locus-info/controlsUtils.js +100 -11
  125. package/dist/locus-info/controlsUtils.js.map +1 -1
  126. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  127. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  128. package/dist/locus-info/fullState.js +1 -2
  129. package/dist/locus-info/fullState.js.map +1 -1
  130. package/dist/locus-info/hostUtils.js +1 -2
  131. package/dist/locus-info/hostUtils.js.map +1 -1
  132. package/dist/locus-info/index.d.ts +57 -4
  133. package/dist/locus-info/index.js +425 -84
  134. package/dist/locus-info/index.js.map +1 -1
  135. package/dist/locus-info/infoUtils.js +13 -5
  136. package/dist/locus-info/infoUtils.js.map +1 -1
  137. package/dist/locus-info/mediaSharesUtils.js +58 -3
  138. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  139. package/dist/locus-info/parser.d.ts +66 -6
  140. package/dist/locus-info/parser.js +253 -80
  141. package/dist/locus-info/parser.js.map +1 -1
  142. package/dist/locus-info/selfUtils.js +97 -13
  143. package/dist/locus-info/selfUtils.js.map +1 -1
  144. package/dist/media/index.d.ts +2 -0
  145. package/dist/media/index.js +107 -319
  146. package/dist/media/index.js.map +1 -1
  147. package/dist/media/properties.d.ts +38 -53
  148. package/dist/media/properties.js +96 -153
  149. package/dist/media/properties.js.map +1 -1
  150. package/dist/media/util.js +1 -22
  151. package/dist/media/util.js.map +1 -1
  152. package/dist/mediaQualityMetrics/config.d.ts +234 -230
  153. package/dist/mediaQualityMetrics/config.js +302 -498
  154. package/dist/mediaQualityMetrics/config.js.map +1 -1
  155. package/dist/meeting/in-meeting-actions.d.ts +88 -0
  156. package/dist/meeting/in-meeting-actions.js +94 -3
  157. package/dist/meeting/in-meeting-actions.js.map +1 -1
  158. package/dist/meeting/index.d.ts +591 -494
  159. package/dist/meeting/index.js +4732 -2990
  160. package/dist/meeting/index.js.map +1 -1
  161. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  162. package/dist/meeting/locusMediaRequest.js +291 -0
  163. package/dist/meeting/locusMediaRequest.js.map +1 -0
  164. package/dist/meeting/muteState.d.ts +93 -25
  165. package/dist/meeting/muteState.js +224 -133
  166. package/dist/meeting/muteState.js.map +1 -1
  167. package/dist/meeting/request.d.ts +82 -47
  168. package/dist/meeting/request.js +297 -199
  169. package/dist/meeting/request.js.map +1 -1
  170. package/dist/meeting/request.type.d.ts +11 -0
  171. package/dist/meeting/request.type.js +7 -0
  172. package/dist/meeting/request.type.js.map +1 -0
  173. package/dist/meeting/state.js +1 -2
  174. package/dist/meeting/state.js.map +1 -1
  175. package/dist/meeting/util.d.ts +102 -1
  176. package/dist/meeting/util.js +605 -435
  177. package/dist/meeting/util.js.map +1 -1
  178. package/dist/meeting-info/collection.js +3 -4
  179. package/dist/meeting-info/collection.js.map +1 -1
  180. package/dist/meeting-info/index.d.ts +13 -1
  181. package/dist/meeting-info/index.js +74 -7
  182. package/dist/meeting-info/index.js.map +1 -1
  183. package/dist/meeting-info/meeting-info-v2.d.ts +31 -1
  184. package/dist/meeting-info/meeting-info-v2.js +200 -63
  185. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  186. package/dist/meeting-info/request.js +1 -2
  187. package/dist/meeting-info/request.js.map +1 -1
  188. package/dist/meeting-info/util.js +2 -3
  189. package/dist/meeting-info/util.js.map +1 -1
  190. package/dist/meeting-info/utilv2.js +39 -41
  191. package/dist/meeting-info/utilv2.js.map +1 -1
  192. package/dist/meetings/collection.d.ts +17 -0
  193. package/dist/meetings/collection.js +42 -4
  194. package/dist/meetings/collection.js.map +1 -1
  195. package/dist/meetings/index.d.ts +93 -21
  196. package/dist/meetings/index.js +490 -127
  197. package/dist/meetings/index.js.map +1 -1
  198. package/dist/meetings/meetings.types.d.ts +4 -0
  199. package/dist/meetings/meetings.types.js +7 -0
  200. package/dist/meetings/meetings.types.js.map +1 -0
  201. package/dist/meetings/request.js +4 -3
  202. package/dist/meetings/request.js.map +1 -1
  203. package/dist/meetings/util.js +107 -6
  204. package/dist/meetings/util.js.map +1 -1
  205. package/dist/member/index.d.ts +13 -1
  206. package/dist/member/index.js +45 -2
  207. package/dist/member/index.js.map +1 -1
  208. package/dist/member/member.types.js +3 -4
  209. package/dist/member/member.types.js.map +1 -1
  210. package/dist/member/types.d.ts +32 -0
  211. package/dist/member/types.js +23 -0
  212. package/dist/member/types.js.map +1 -0
  213. package/dist/member/util.js +120 -29
  214. package/dist/member/util.js.map +1 -1
  215. package/dist/members/collection.d.ts +5 -0
  216. package/dist/members/collection.js +11 -2
  217. package/dist/members/collection.js.map +1 -1
  218. package/dist/members/index.d.ts +56 -11
  219. package/dist/members/index.js +174 -47
  220. package/dist/members/index.js.map +1 -1
  221. package/dist/members/request.d.ts +67 -11
  222. package/dist/members/request.js +102 -54
  223. package/dist/members/request.js.map +1 -1
  224. package/dist/members/types.js +3 -4
  225. package/dist/members/types.js.map +1 -1
  226. package/dist/members/util.d.ts +214 -1
  227. package/dist/members/util.js +327 -284
  228. package/dist/members/util.js.map +1 -1
  229. package/dist/metrics/constants.d.ts +15 -6
  230. package/dist/metrics/constants.js +17 -9
  231. package/dist/metrics/constants.js.map +1 -1
  232. package/dist/metrics/index.d.ts +4 -111
  233. package/dist/metrics/index.js +4 -452
  234. package/dist/metrics/index.js.map +1 -1
  235. package/dist/multistream/mediaRequestManager.d.ts +118 -0
  236. package/dist/multistream/mediaRequestManager.js +344 -0
  237. package/dist/multistream/mediaRequestManager.js.map +1 -0
  238. package/dist/multistream/receiveSlot.d.ts +68 -0
  239. package/dist/multistream/receiveSlot.js +200 -0
  240. package/dist/multistream/receiveSlot.js.map +1 -0
  241. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  242. package/dist/multistream/receiveSlotManager.js +174 -0
  243. package/dist/multistream/receiveSlotManager.js.map +1 -0
  244. package/dist/multistream/remoteMedia.d.ts +72 -0
  245. package/dist/multistream/remoteMedia.js +268 -0
  246. package/dist/multistream/remoteMedia.js.map +1 -0
  247. package/dist/multistream/remoteMediaGroup.d.ts +47 -0
  248. package/dist/multistream/remoteMediaGroup.js +267 -0
  249. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  250. package/dist/multistream/remoteMediaManager.d.ts +285 -0
  251. package/dist/multistream/remoteMediaManager.js +1211 -0
  252. package/dist/multistream/remoteMediaManager.js.map +1 -0
  253. package/dist/multistream/sendSlotManager.d.ts +61 -0
  254. package/dist/multistream/sendSlotManager.js +236 -0
  255. package/dist/multistream/sendSlotManager.js.map +1 -0
  256. package/dist/networkQualityMonitor/index.js +5 -4
  257. package/dist/networkQualityMonitor/index.js.map +1 -1
  258. package/dist/personal-meeting-room/index.js +2 -3
  259. package/dist/personal-meeting-room/index.js.map +1 -1
  260. package/dist/personal-meeting-room/request.js +2 -3
  261. package/dist/personal-meeting-room/request.js.map +1 -1
  262. package/dist/personal-meeting-room/util.js +1 -2
  263. package/dist/personal-meeting-room/util.js.map +1 -1
  264. package/dist/reachability/clusterReachability.d.ts +109 -0
  265. package/dist/reachability/clusterReachability.js +357 -0
  266. package/dist/reachability/clusterReachability.js.map +1 -0
  267. package/dist/reachability/index.d.ts +61 -95
  268. package/dist/reachability/index.js +300 -393
  269. package/dist/reachability/index.js.map +1 -1
  270. package/dist/reachability/request.d.ts +7 -3
  271. package/dist/reachability/request.js +18 -10
  272. package/dist/reachability/request.js.map +1 -1
  273. package/dist/reachability/util.d.ts +8 -0
  274. package/dist/reachability/util.js +29 -0
  275. package/dist/reachability/util.js.map +1 -0
  276. package/dist/reactions/constants.d.ts +3 -0
  277. package/dist/reactions/constants.js +12 -0
  278. package/dist/reactions/constants.js.map +1 -0
  279. package/dist/reactions/reactions.d.ts +2 -2
  280. package/dist/reactions/reactions.js +4 -6
  281. package/dist/reactions/reactions.js.map +1 -1
  282. package/dist/reactions/reactions.type.d.ts +23 -3
  283. package/dist/reactions/reactions.type.js +21 -23
  284. package/dist/reactions/reactions.type.js.map +1 -1
  285. package/dist/reconnection-manager/index.d.ts +32 -8
  286. package/dist/reconnection-manager/index.js +282 -231
  287. package/dist/reconnection-manager/index.js.map +1 -1
  288. package/dist/recording-controller/enums.js +4 -5
  289. package/dist/recording-controller/enums.js.map +1 -1
  290. package/dist/recording-controller/index.d.ts +15 -1
  291. package/dist/recording-controller/index.js +57 -46
  292. package/dist/recording-controller/index.js.map +1 -1
  293. package/dist/recording-controller/util.d.ts +5 -4
  294. package/dist/recording-controller/util.js +10 -10
  295. package/dist/recording-controller/util.js.map +1 -1
  296. package/dist/roap/index.d.ts +9 -47
  297. package/dist/roap/index.js +101 -235
  298. package/dist/roap/index.js.map +1 -1
  299. package/dist/roap/request.d.ts +18 -12
  300. package/dist/roap/request.js +126 -180
  301. package/dist/roap/request.js.map +1 -1
  302. package/dist/roap/turnDiscovery.d.ts +27 -16
  303. package/dist/roap/turnDiscovery.js +115 -105
  304. package/dist/roap/turnDiscovery.js.map +1 -1
  305. package/dist/rtcMetrics/constants.d.ts +4 -0
  306. package/dist/rtcMetrics/constants.js +11 -0
  307. package/dist/rtcMetrics/constants.js.map +1 -0
  308. package/dist/rtcMetrics/index.d.ts +54 -0
  309. package/dist/rtcMetrics/index.js +140 -0
  310. package/dist/rtcMetrics/index.js.map +1 -0
  311. package/dist/statsAnalyzer/global.d.ts +1 -83
  312. package/dist/statsAnalyzer/global.js +2 -85
  313. package/dist/statsAnalyzer/global.js.map +1 -1
  314. package/dist/statsAnalyzer/index.d.ts +50 -30
  315. package/dist/statsAnalyzer/index.js +435 -510
  316. package/dist/statsAnalyzer/index.js.map +1 -1
  317. package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
  318. package/dist/statsAnalyzer/mqaUtil.js +120 -83
  319. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  320. package/dist/transcription/index.js +1 -2
  321. package/dist/transcription/index.js.map +1 -1
  322. package/dist/webinar/collection.d.ts +16 -0
  323. package/dist/webinar/collection.js +43 -0
  324. package/dist/webinar/collection.js.map +1 -0
  325. package/dist/webinar/index.d.ts +5 -0
  326. package/dist/webinar/index.js +68 -0
  327. package/dist/webinar/index.js.map +1 -0
  328. package/package.json +38 -26
  329. package/src/annotation/annotation.types.ts +50 -0
  330. package/src/annotation/constants.ts +36 -0
  331. package/src/annotation/index.ts +328 -0
  332. package/src/breakouts/README.md +220 -0
  333. package/src/breakouts/breakout.ts +188 -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 +56 -0
  337. package/src/breakouts/index.ts +925 -0
  338. package/src/breakouts/request.ts +55 -0
  339. package/src/breakouts/utils.ts +57 -0
  340. package/src/common/errors/no-meeting-info.ts +24 -0
  341. package/src/common/errors/webex-errors.ts +36 -12
  342. package/src/common/logs/logger-proxy.ts +1 -1
  343. package/src/common/logs/request.ts +5 -1
  344. package/src/common/queue.ts +22 -8
  345. package/src/config.ts +6 -7
  346. package/src/constants.ts +244 -97
  347. package/src/controls-options-manager/enums.ts +12 -0
  348. package/src/controls-options-manager/index.ts +116 -21
  349. package/src/controls-options-manager/types.ts +59 -0
  350. package/src/controls-options-manager/util.ts +294 -14
  351. package/src/index.ts +44 -0
  352. package/src/interceptors/index.ts +3 -0
  353. package/src/interceptors/locusRetry.ts +67 -0
  354. package/src/interpretation/README.md +60 -0
  355. package/src/interpretation/collection.ts +19 -0
  356. package/src/interpretation/index.ts +332 -0
  357. package/src/interpretation/siLanguage.ts +18 -0
  358. package/src/locus-info/controlsUtils.ts +110 -0
  359. package/src/locus-info/index.ts +449 -61
  360. package/src/locus-info/infoUtils.ts +14 -2
  361. package/src/locus-info/mediaSharesUtils.ts +64 -0
  362. package/src/locus-info/parser.ts +258 -47
  363. package/src/locus-info/selfUtils.ts +85 -2
  364. package/src/media/index.ts +153 -370
  365. package/src/media/properties.ts +106 -136
  366. package/src/media/util.ts +0 -21
  367. package/src/mediaQualityMetrics/config.ts +244 -377
  368. package/src/meeting/in-meeting-actions.ts +176 -0
  369. package/src/meeting/index.ts +3944 -2489
  370. package/src/meeting/locusMediaRequest.ts +313 -0
  371. package/src/meeting/muteState.ts +224 -138
  372. package/src/meeting/request.ts +207 -127
  373. package/src/meeting/request.type.ts +13 -0
  374. package/src/meeting/util.ts +590 -423
  375. package/src/meeting-info/index.ts +81 -8
  376. package/src/meeting-info/meeting-info-v2.ts +163 -13
  377. package/src/meeting-info/util.ts +1 -1
  378. package/src/meeting-info/utilv2.ts +28 -28
  379. package/src/meetings/collection.ts +33 -0
  380. package/src/meetings/index.ts +487 -126
  381. package/src/meetings/meetings.types.ts +12 -0
  382. package/src/meetings/request.ts +2 -0
  383. package/src/meetings/util.ts +116 -5
  384. package/src/member/index.ts +43 -1
  385. package/src/member/types.ts +38 -0
  386. package/src/member/util.ts +125 -28
  387. package/src/members/collection.ts +8 -0
  388. package/src/members/index.ts +187 -52
  389. package/src/members/request.ts +87 -27
  390. package/src/members/util.ts +332 -291
  391. package/src/metrics/constants.ts +15 -6
  392. package/src/metrics/index.ts +1 -471
  393. package/src/multistream/mediaRequestManager.ts +440 -0
  394. package/src/multistream/receiveSlot.ts +184 -0
  395. package/src/multistream/receiveSlotManager.ts +166 -0
  396. package/src/multistream/remoteMedia.ts +254 -0
  397. package/src/multistream/remoteMediaGroup.ts +284 -0
  398. package/src/multistream/remoteMediaManager.ts +1145 -0
  399. package/src/multistream/sendSlotManager.ts +170 -0
  400. package/src/networkQualityMonitor/index.ts +6 -6
  401. package/src/reachability/clusterReachability.ts +320 -0
  402. package/src/reachability/index.ts +243 -347
  403. package/src/reachability/request.ts +17 -8
  404. package/src/reachability/util.ts +24 -0
  405. package/src/reactions/constants.ts +4 -0
  406. package/src/reactions/reactions.ts +4 -4
  407. package/src/reactions/reactions.type.ts +30 -4
  408. package/src/reconnection-manager/index.ts +168 -156
  409. package/src/recording-controller/index.ts +20 -3
  410. package/src/recording-controller/util.ts +26 -9
  411. package/src/roap/index.ts +98 -241
  412. package/src/roap/request.ts +74 -148
  413. package/src/roap/turnDiscovery.ts +62 -56
  414. package/src/rtcMetrics/constants.ts +3 -0
  415. package/src/rtcMetrics/index.ts +124 -0
  416. package/src/statsAnalyzer/global.ts +1 -84
  417. package/src/statsAnalyzer/index.ts +477 -643
  418. package/src/statsAnalyzer/mqaUtil.ts +115 -114
  419. package/src/webinar/collection.ts +31 -0
  420. package/src/webinar/index.ts +62 -0
  421. package/test/integration/spec/converged-space-meetings.js +233 -0
  422. package/test/integration/spec/journey.js +320 -264
  423. package/test/integration/spec/space-meeting.js +77 -4
  424. package/test/unit/spec/annotation/index.ts +418 -0
  425. package/test/unit/spec/breakouts/breakout.ts +237 -0
  426. package/test/unit/spec/breakouts/collection.ts +15 -0
  427. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  428. package/test/unit/spec/breakouts/events.ts +89 -0
  429. package/test/unit/spec/breakouts/index.ts +1790 -0
  430. package/test/unit/spec/breakouts/request.ts +104 -0
  431. package/test/unit/spec/breakouts/utils.js +72 -0
  432. package/test/unit/spec/common/queue.js +31 -2
  433. package/test/unit/spec/controls-options-manager/index.js +163 -0
  434. package/test/unit/spec/controls-options-manager/util.js +576 -60
  435. package/test/unit/spec/fixture/locus.js +1 -0
  436. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  437. package/test/unit/spec/interpretation/collection.ts +15 -0
  438. package/test/unit/spec/interpretation/index.ts +589 -0
  439. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  440. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  441. package/test/unit/spec/locus-info/index.js +1390 -16
  442. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  443. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  444. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  445. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  446. package/test/unit/spec/locus-info/parser.js +116 -35
  447. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  448. package/test/unit/spec/media/index.ts +290 -0
  449. package/test/unit/spec/media/properties.ts +75 -84
  450. package/test/unit/spec/meeting/in-meeting-actions.ts +86 -0
  451. package/test/unit/spec/meeting/index.js +8187 -2769
  452. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  453. package/test/unit/spec/meeting/muteState.js +409 -213
  454. package/test/unit/spec/meeting/request.js +512 -42
  455. package/test/unit/spec/meeting/utils.js +741 -24
  456. package/test/unit/spec/meeting-info/index.js +300 -0
  457. package/test/unit/spec/meeting-info/meetinginfov2.js +527 -5
  458. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  459. package/test/unit/spec/meetings/collection.js +26 -0
  460. package/test/unit/spec/meetings/index.js +1313 -243
  461. package/test/unit/spec/meetings/utils.js +202 -2
  462. package/test/unit/spec/member/index.js +32 -9
  463. package/test/unit/spec/member/util.js +499 -61
  464. package/test/unit/spec/members/index.js +394 -5
  465. package/test/unit/spec/members/request.js +206 -27
  466. package/test/unit/spec/members/utils.js +173 -38
  467. package/test/unit/spec/metrics/index.js +1 -50
  468. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  469. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  470. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  471. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  472. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  473. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  474. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  475. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  476. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  477. package/test/unit/spec/reachability/index.ts +531 -24
  478. package/test/unit/spec/reachability/request.js +68 -0
  479. package/test/unit/spec/reachability/util.ts +40 -0
  480. package/test/unit/spec/reconnection-manager/index.js +162 -24
  481. package/test/unit/spec/recording-controller/index.js +293 -218
  482. package/test/unit/spec/recording-controller/util.js +223 -96
  483. package/test/unit/spec/roap/index.ts +200 -76
  484. package/test/unit/spec/roap/request.ts +255 -0
  485. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  486. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  487. package/test/unit/spec/stats-analyzer/index.js +261 -167
  488. package/test/unit/spec/webinar/collection.ts +13 -0
  489. package/test/unit/spec/webinar/index.ts +60 -0
  490. package/test/utils/constants.js +9 -0
  491. package/test/utils/integrationTestUtils.js +46 -0
  492. package/test/utils/testUtils.js +0 -45
  493. package/test/utils/webex-config.js +4 -0
  494. package/test/utils/webex-test-users.js +7 -3
  495. package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
  496. package/dist/meeting/effectsState.d.ts +0 -42
  497. package/dist/meeting/effectsState.js +0 -260
  498. package/dist/meeting/effectsState.js.map +0 -1
  499. package/dist/metrics/config.d.ts +0 -169
  500. package/dist/metrics/config.js +0 -289
  501. package/dist/metrics/config.js.map +0 -1
  502. package/dist/peer-connection-manager/index.d.ts +0 -6
  503. package/dist/peer-connection-manager/index.js +0 -671
  504. package/dist/peer-connection-manager/index.js.map +0 -1
  505. package/dist/peer-connection-manager/util.d.ts +0 -6
  506. package/dist/peer-connection-manager/util.js +0 -110
  507. package/dist/peer-connection-manager/util.js.map +0 -1
  508. package/dist/roap/collection.d.ts +0 -10
  509. package/dist/roap/collection.js +0 -63
  510. package/dist/roap/collection.js.map +0 -1
  511. package/dist/roap/handler.d.ts +0 -47
  512. package/dist/roap/handler.js +0 -279
  513. package/dist/roap/handler.js.map +0 -1
  514. package/dist/roap/state.d.ts +0 -9
  515. package/dist/roap/state.js +0 -127
  516. package/dist/roap/state.js.map +0 -1
  517. package/dist/roap/util.d.ts +0 -2
  518. package/dist/roap/util.js +0 -76
  519. package/dist/roap/util.js.map +0 -1
  520. package/src/index.js +0 -15
  521. package/src/meeting/effectsState.ts +0 -209
  522. package/src/metrics/config.ts +0 -485
  523. package/src/peer-connection-manager/index.ts +0 -847
  524. package/src/peer-connection-manager/util.ts +0 -119
  525. package/src/roap/collection.ts +0 -62
  526. package/src/roap/handler.ts +0 -294
  527. package/src/roap/state.ts +0 -156
  528. package/src/roap/util.ts +0 -100
  529. package/test/unit/spec/meeting/effectsState.js +0 -281
  530. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  531. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  532. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  533. package/test/unit/spec/roap/util.js +0 -30
  534. /package/dist/common/errors/{reclaim-host-role-error.d.ts → reclaim-host-role-errors.d.ts} +0 -0
  535. /package/src/common/errors/{reclaim-host-role-error.ts → reclaim-host-role-errors.ts} +0 -0
@@ -0,0 +1,242 @@
1
+ import SendSlotManager from '@webex/plugin-meetings/src/multistream/sendSlotManager';
2
+ import { LocalStream, MediaType, MultistreamRoapMediaConnection } from "@webex/internal-media-core";
3
+ import {expect} from '@webex/test-helper-chai';
4
+ import sinon from 'sinon';
5
+
6
+ describe('SendSlotsManager', () => {
7
+ let sendSlotsManager: SendSlotManager;
8
+ const LoggerProxy = {
9
+ logger: {
10
+ info: sinon.stub(),
11
+ },
12
+ };
13
+
14
+ beforeEach(() => {
15
+ sendSlotsManager = new SendSlotManager(LoggerProxy);
16
+ });
17
+
18
+ describe('createSlot', () => {
19
+ let mediaConnection;
20
+ const mediaType = MediaType.AudioMain;
21
+
22
+ beforeEach(() => {
23
+ mediaConnection = {
24
+ createSendSlot: sinon.stub(),
25
+ } as MultistreamRoapMediaConnection;
26
+ });
27
+
28
+ it('should create a slot for the given mediaType', () => {
29
+ sendSlotsManager.createSlot(mediaConnection, mediaType);
30
+
31
+ expect(mediaConnection.createSendSlot.calledWith(mediaType, true));
32
+ });
33
+
34
+ it('should create a slot for the given mediaType & active state', () => {
35
+ sendSlotsManager.createSlot(mediaConnection, mediaType, false);
36
+
37
+ expect(mediaConnection.createSendSlot.calledWith(mediaType, false));
38
+ });
39
+
40
+ it('should throw an error if a slot for the given mediaType already exists', () => {
41
+ sendSlotsManager.createSlot(mediaConnection, mediaType);
42
+
43
+ expect(() => sendSlotsManager.createSlot(mediaConnection, mediaType)).to.throw(`Slot for ${mediaType} already exists`);
44
+ });
45
+ });
46
+
47
+ describe('getSlot', () => {
48
+ const mediaType = MediaType.AudioMain;
49
+ let mediaConnection;
50
+
51
+ beforeEach(() => {
52
+ mediaConnection = {
53
+ createSendSlot: sinon.stub().returns({}),
54
+ } as MultistreamRoapMediaConnection;
55
+ });
56
+
57
+ it('should return the slot for the given mediaType', () => {
58
+ const slot = sendSlotsManager.createSlot(mediaConnection,mediaType);
59
+
60
+ expect(sendSlotsManager.getSlot(mediaType)).to.equal(slot);
61
+ });
62
+
63
+ it('should throw an error if a slot for the given mediaType does not exist', () => {
64
+ expect(() => sendSlotsManager.getSlot(mediaType)).to.throw(`Slot for ${mediaType} does not exist`);
65
+ });
66
+ });
67
+
68
+ describe('publishStream', () => {
69
+ let mediaConnection;
70
+ const mediaType = MediaType.AudioMain;
71
+ const stream = {} as LocalStream;
72
+
73
+ beforeEach(() => {
74
+ mediaConnection = {
75
+ createSendSlot: sinon.stub(),
76
+ } as MultistreamRoapMediaConnection;
77
+ });
78
+
79
+ it('should publish the given stream to the sendSlot for the given mediaType', async () => {
80
+ const slot = {
81
+ publishStream: sinon.stub().resolves(),
82
+ };
83
+ mediaConnection.createSendSlot.returns(slot);
84
+ sendSlotsManager.createSlot(mediaConnection, mediaType);
85
+
86
+ await sendSlotsManager.publishStream(mediaType, stream);
87
+
88
+ expect(slot.publishStream.calledWith(stream));
89
+ });
90
+
91
+ it('should throw an error if a slot for the given mediaType does not exist', (done) => {
92
+ sendSlotsManager.publishStream(mediaType, stream).catch((error) => {
93
+ expect(error.message).to.equal(`Slot for ${mediaType} does not exist`);
94
+ done();
95
+ });
96
+ });
97
+ });
98
+
99
+ describe('unpublishStream', () => {
100
+ let mediaConnection;
101
+ const mediaType = MediaType.AudioMain;
102
+
103
+ beforeEach(() => {
104
+ mediaConnection = {
105
+ createSendSlot: sinon.stub(),
106
+ } as MultistreamRoapMediaConnection;
107
+ });
108
+
109
+ it('should unpublish the stream from the sendSlot of the given mediaType', async () => {
110
+ const slot = {
111
+ unpublishStream: sinon.stub().resolves(),
112
+ };
113
+ mediaConnection.createSendSlot.returns(slot);
114
+ sendSlotsManager.createSlot(mediaConnection, mediaType);
115
+
116
+ await sendSlotsManager.unpublishStream(mediaType);
117
+
118
+ expect(slot.unpublishStream.called);
119
+ });
120
+
121
+ it('should throw an error if a slot for the given mediaType does not exist',(done) => {
122
+ sendSlotsManager.unpublishStream(mediaType).catch((error) => {
123
+ expect(error.message).to.equal(`Slot for ${mediaType} does not exist`);
124
+ done();
125
+ });
126
+ });
127
+ });
128
+
129
+ describe('setActive', () => {
130
+ let mediaConnection;
131
+ const mediaType = MediaType.AudioMain;
132
+
133
+ beforeEach(() => {
134
+ mediaConnection = {
135
+ createSendSlot: sinon.stub(),
136
+ } as MultistreamRoapMediaConnection;
137
+ });
138
+
139
+ it('should set the active state of the sendSlot for the given mediaType', async () => {
140
+ const slot = {
141
+ setActive: sinon.stub().resolves(),
142
+ };
143
+ mediaConnection.createSendSlot.returns(slot);
144
+ sendSlotsManager.createSlot(mediaConnection, mediaType);
145
+
146
+ await sendSlotsManager.setActive(mediaType,true);
147
+
148
+ expect(slot.setActive.called);
149
+ });
150
+
151
+ it('should throw an error if a slot for the given mediaType does not exist', () => {
152
+ expect(() => sendSlotsManager.setActive(mediaType)).to.throw(`Slot for ${mediaType} does not exist`)
153
+ });
154
+ });
155
+
156
+ describe('setCodecParameters', () => {
157
+ let mediaConnection;
158
+ const mediaType = MediaType.AudioMain;
159
+ const codecParameters = {};
160
+
161
+ beforeEach(() => {
162
+ mediaConnection = {
163
+ createSendSlot: sinon.stub(),
164
+ } as MultistreamRoapMediaConnection;
165
+ });
166
+
167
+ it('should set the codec parameters of the sendSlot for the given mediaType', async () => {
168
+ const slot = {
169
+ setCodecParameters: sinon.stub().resolves(),
170
+ };
171
+ mediaConnection.createSendSlot.returns(slot);
172
+ sendSlotsManager.createSlot(mediaConnection, mediaType);
173
+
174
+ await sendSlotsManager.setCodecParameters(mediaType, codecParameters);
175
+
176
+ expect(slot.setCodecParameters.calledWith(codecParameters));
177
+ });
178
+
179
+ it('should throw an error if a slot for the given mediaType does not exist', (done) => {
180
+ sendSlotsManager.setCodecParameters(mediaType, codecParameters).catch((error) => {
181
+ expect(error.message).to.equal(`Slot for ${mediaType} does not exist`);
182
+ done();
183
+ });
184
+ });
185
+ });
186
+
187
+ describe('deleteCodecParameters', () => {
188
+ let mediaConnection;
189
+ const mediaType = MediaType.AudioMain;
190
+
191
+ beforeEach(() => {
192
+ mediaConnection = {
193
+ createSendSlot: sinon.stub(),
194
+ } as MultistreamRoapMediaConnection;
195
+ });
196
+
197
+ it('should delete the codec parameters of the sendSlot for the given mediaType', async () => {
198
+ const slot = {
199
+ deleteCodecParameters: sinon.stub().resolves(),
200
+ };
201
+ mediaConnection.createSendSlot.returns(slot);
202
+ sendSlotsManager.createSlot(mediaConnection, mediaType);
203
+
204
+ await sendSlotsManager.deleteCodecParameters(mediaType,[]);
205
+
206
+ expect(slot.deleteCodecParameters.called);
207
+ });
208
+
209
+ it('should throw an error if a slot for the given mediaType does not exist', (done) => {
210
+ sendSlotsManager.deleteCodecParameters(mediaType,[]).catch((error) => {
211
+ expect(error.message).to.equal(`Slot for ${mediaType} does not exist`);
212
+ done();
213
+ });
214
+ });
215
+ });
216
+
217
+ describe('reset', () => {
218
+ let mediaConnection;
219
+
220
+ beforeEach(() => {
221
+ mediaConnection = {
222
+ createSendSlot: sinon.stub().returns({}),
223
+ } as MultistreamRoapMediaConnection;
224
+ });
225
+
226
+ it('should reset the send slot manager', () => {
227
+ const AudioSlot = sendSlotsManager.createSlot(mediaConnection, MediaType.AudioMain);
228
+ const VideoSlot = sendSlotsManager.createSlot(mediaConnection, MediaType.VideoMain);
229
+ const AudioSlidesSlot = sendSlotsManager.createSlot(mediaConnection, MediaType.AudioSlides);
230
+ const VideoSlidesSlot = sendSlotsManager.createSlot(mediaConnection, MediaType.VideoSlides);
231
+ expect(sendSlotsManager.getSlot(MediaType.AudioMain)).to.equal(AudioSlot);
232
+ expect(sendSlotsManager.getSlot(MediaType.VideoMain)).to.equal(VideoSlot);
233
+ expect(sendSlotsManager.getSlot(MediaType.AudioSlides)).to.equal(AudioSlidesSlot);
234
+ expect(sendSlotsManager.getSlot(MediaType.VideoSlides)).to.equal(VideoSlidesSlot);
235
+ sendSlotsManager.reset();
236
+ expect(() => sendSlotsManager.getSlot(MediaType.AudioMain)).to.throw();
237
+ expect(() => sendSlotsManager.getSlot(MediaType.VideoMain)).to.throw();
238
+ expect(() => sendSlotsManager.getSlot(MediaType.AudioSlides)).to.throw();
239
+ expect(() => sendSlotsManager.getSlot(MediaType.VideoSlides)).to.throw();
240
+ });
241
+ });
242
+ });
@@ -24,7 +24,7 @@ describe('plugin-meetings', () => {
24
24
  };
25
25
 
26
26
  const configObject = {
27
- mediaType: 'video',
27
+ mediaType: 'video-send',
28
28
  remoteRtpResults: {
29
29
  id: 'RTCRemoteInboundRtpVideoStream_2411086660',
30
30
  timestamp: 1624472676193.79,
@@ -42,12 +42,12 @@ describe('plugin-meetings', () => {
42
42
  roundTripTimeMeasurements: 14,
43
43
  },
44
44
  statsAnalyzerCurrentStats: {
45
- audio: {
45
+ 'audio-send': {
46
46
  send: {
47
47
  currentPacketLossRatio: 8,
48
48
  },
49
49
  },
50
- video: {
50
+ 'video-send': {
51
51
  send: {
52
52
  currentPacketLossRatio: 10,
53
53
  },
@@ -83,7 +83,7 @@ describe('plugin-meetings', () => {
83
83
  }),
84
84
  sinon.match(EVENT_TRIGGERS.NETWORK_QUALITY),
85
85
  sinon.match({
86
- mediaType: 'video',
86
+ mediaType: 'video-send',
87
87
  networkQualityScore: 0,
88
88
  })
89
89
  )
@@ -0,0 +1,279 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import MockWebex from '@webex/test-helper-mock-webex';
3
+ import sinon from 'sinon';
4
+ import testUtils from '../../../utils/testUtils';
5
+
6
+ // packages/@webex/plugin-meetings/test/unit/spec/reachability/clusterReachability.ts
7
+ import { ClusterReachability } from '@webex/plugin-meetings/src/reachability/clusterReachability'; // replace with actual path
8
+
9
+ describe('ClusterReachability', () => {
10
+ let previousRTCPeerConnection;
11
+ let clusterReachability;
12
+ let fakePeerConnection;
13
+
14
+ const FAKE_OFFER = {type: 'offer', sdp: 'fake sdp'};
15
+
16
+ beforeEach(() => {
17
+ fakePeerConnection = {
18
+ createOffer: sinon.stub().resolves(FAKE_OFFER),
19
+ setLocalDescription: sinon.stub().resolves(),
20
+ close: sinon.stub(),
21
+ iceGatheringState: 'new',
22
+ };
23
+
24
+ previousRTCPeerConnection = global.RTCPeerConnection;
25
+ global.RTCPeerConnection = sinon.stub().returns(fakePeerConnection);
26
+
27
+ clusterReachability = new ClusterReachability('testName', {
28
+ isVideoMesh: false,
29
+ udp: ['stun:udp1', 'stun:udp2'],
30
+ tcp: ['stun:tcp1.webex.com', 'stun:tcp2.webex.com:5004'],
31
+ xtls: ['xtls1', 'xtls2'],
32
+ });
33
+
34
+ });
35
+
36
+ afterEach(() => {
37
+ global.RTCPeerConnection = previousRTCPeerConnection;
38
+ });
39
+
40
+ it('should create an instance correctly', () => {
41
+ assert.instanceOf(clusterReachability, ClusterReachability);
42
+ assert.equal(clusterReachability.name, 'testName');
43
+ assert.equal(clusterReachability.isVideoMesh, false);
44
+ assert.equal(clusterReachability.numUdpUrls, 2);
45
+ assert.equal(clusterReachability.numTcpUrls, 2);
46
+ });
47
+
48
+ it('should create a peer connection with the right config', () => {
49
+ assert.calledOnceWithExactly(global.RTCPeerConnection, {
50
+ iceServers: [
51
+ {username: '', credential: '', urls: ['stun:udp1']},
52
+ {username: '', credential: '', urls: ['stun:udp2']},
53
+ {username: 'webexturnreachuser', credential: 'webexturnreachpwd', urls: ['turn:tcp1.webex.com?transport=tcp']},
54
+ {username: 'webexturnreachuser', credential: 'webexturnreachpwd', urls: ['turn:tcp2.webex.com:5004?transport=tcp']}
55
+ ],
56
+ iceCandidatePoolSize: 0,
57
+ iceTransportPolicy: 'all',
58
+ });
59
+ });
60
+
61
+ it('should create a peer connection with the right config even if lists of urls are empty', () => {
62
+ (global.RTCPeerConnection as any).resetHistory();
63
+
64
+ clusterReachability = new ClusterReachability('testName', {
65
+ isVideoMesh: false,
66
+ udp: [],
67
+ tcp: [],
68
+ xtls: [],
69
+ });
70
+
71
+ assert.calledOnceWithExactly(global.RTCPeerConnection, {
72
+ iceServers: [],
73
+ iceCandidatePoolSize: 0,
74
+ iceTransportPolicy: 'all',
75
+ });
76
+ });
77
+
78
+ it('returns correct results before start() is called', () => {
79
+ assert.deepEqual(clusterReachability.getResult(), {
80
+ udp: {result: 'untested'},
81
+ tcp: {result: 'untested'},
82
+ xtls: {result: 'untested'}
83
+ });
84
+ });
85
+
86
+ describe('#start', () => {
87
+ let clock;
88
+
89
+ beforeEach(() => {
90
+ clock = sinon.useFakeTimers();
91
+ });
92
+
93
+ afterEach(() => {
94
+ clock.restore();
95
+ })
96
+
97
+ it('should initiate the ICE gathering process', async () => {
98
+ const promise = clusterReachability.start();
99
+
100
+ await testUtils.flushPromises();
101
+
102
+ // check that the right listeners are setup
103
+ assert.isFunction(fakePeerConnection.onicecandidate);
104
+ assert.isFunction(fakePeerConnection.onicegatheringstatechange);
105
+
106
+ // check that the right webrtc APIs are called
107
+ assert.calledOnceWithExactly(fakePeerConnection.createOffer, {offerToReceiveAudio: true});
108
+ assert.calledOnce(fakePeerConnection.setLocalDescription);
109
+
110
+ await clock.tickAsync(3000);// move the clock so that reachability times out
111
+ await promise;
112
+ });
113
+
114
+ it('resolves and has correct result as soon as it finds that both udp and tcp is reachable', async () => {
115
+ const promise = clusterReachability.start();
116
+
117
+ await clock.tickAsync(100);
118
+ fakePeerConnection.onicecandidate({candidate: {type: 'srflx', address: 'somePublicIp'}});
119
+
120
+ await clock.tickAsync(100);
121
+ fakePeerConnection.onicecandidate({candidate: {type: 'relay', address: 'someTurnRelayIp'}});
122
+
123
+ await promise;
124
+
125
+ assert.deepEqual(clusterReachability.getResult(), {
126
+ udp: {result: 'reachable', latencyInMilliseconds: 100, clientMediaIPs: ['somePublicIp']},
127
+ tcp: {result: 'reachable', latencyInMilliseconds: 200},
128
+ xtls: {result: 'untested'}
129
+ });
130
+ });
131
+
132
+ it('times out correctly', async () => {
133
+ const promise = clusterReachability.start();
134
+
135
+ // progress time without any candidates
136
+ await clock.tickAsync(3000);
137
+ await promise;
138
+
139
+ assert.deepEqual(clusterReachability.getResult(), {
140
+ udp: {result: 'unreachable'},
141
+ tcp: {result: 'unreachable'},
142
+ xtls: {result: 'untested'}
143
+ });
144
+ });
145
+
146
+ it('times out correctly for video mesh nodes', async () => {
147
+ clusterReachability = new ClusterReachability('testName', {
148
+ isVideoMesh: true,
149
+ udp: ['stun:udp1', 'stun:udp2'],
150
+ tcp: ['stun:tcp1.webex.com', 'stun:tcp2.webex.com:5004'],
151
+ xtls: ['xtls1', 'xtls2'],
152
+ });
153
+
154
+ const promise = clusterReachability.start();
155
+
156
+ // video mesh nodes have shorter timeout of just 1s
157
+ await clock.tickAsync(1000);
158
+ await promise;
159
+
160
+ assert.deepEqual(clusterReachability.getResult(), {
161
+ udp: {result: 'unreachable'},
162
+ tcp: {result: 'unreachable'},
163
+ xtls: {result: 'untested'}
164
+ });
165
+ });
166
+
167
+ it('resolves when ICE gathering is completed', async () => {
168
+ const promise = clusterReachability.start();
169
+
170
+ await testUtils.flushPromises();
171
+
172
+ fakePeerConnection.iceConnectionState = 'complete';
173
+ fakePeerConnection.onicegatheringstatechange();
174
+ await promise;
175
+
176
+ assert.deepEqual(clusterReachability.getResult(), {
177
+ udp: {result: 'unreachable'},
178
+ tcp: {result: 'unreachable'},
179
+ xtls: {result: 'untested'}
180
+ });
181
+ });
182
+
183
+ it('resolves with the right result when ICE gathering is completed', async () => {
184
+ const promise = clusterReachability.start();
185
+
186
+ // send 1 candidate
187
+ await clock.tickAsync(30);
188
+ fakePeerConnection.onicecandidate({candidate: {type: 'srflx', address: 'somePublicIp1'}});
189
+
190
+ fakePeerConnection.iceConnectionState = 'complete';
191
+ fakePeerConnection.onicegatheringstatechange();
192
+ await promise;
193
+
194
+ assert.deepEqual(clusterReachability.getResult(), {
195
+ udp: {result: 'reachable', latencyInMilliseconds: 30, clientMediaIPs: ['somePublicIp1']},
196
+ tcp: {result: 'unreachable'},
197
+ xtls: {result: 'untested'}
198
+ });
199
+ });
200
+
201
+ it('should store latency only for the first srflx candidate, but IPs from all of them', async () => {
202
+ const promise = clusterReachability.start();
203
+
204
+ await clock.tickAsync(10);
205
+ fakePeerConnection.onicecandidate({candidate: {type: 'srflx', address: 'somePublicIp1'}});
206
+
207
+ // generate more candidates
208
+ await clock.tickAsync(10);
209
+ fakePeerConnection.onicecandidate({candidate: {type: 'srflx', address: 'somePublicIp2'}});
210
+
211
+ await clock.tickAsync(10);
212
+ fakePeerConnection.onicecandidate({candidate: {type: 'srflx', address: 'somePublicIp3'}});
213
+
214
+ await clock.tickAsync(3000);// move the clock so that reachability times out
215
+
216
+ await promise;
217
+
218
+ // latency should be from only the first candidates, but the clientMediaIps should be from all UDP candidates (not TCP)
219
+ assert.deepEqual(clusterReachability.getResult(), {
220
+ udp: {result: 'reachable', latencyInMilliseconds: 10, clientMediaIPs: ['somePublicIp1', 'somePublicIp2', 'somePublicIp3']},
221
+ tcp: {result: 'unreachable'},
222
+ xtls: {result: 'untested'}
223
+ });
224
+ });
225
+
226
+ it('should store latency only for the first relay candidate', async () => {
227
+ const promise = clusterReachability.start();
228
+
229
+ await clock.tickAsync(10);
230
+ fakePeerConnection.onicecandidate({candidate: {type: 'relay', address: 'someTurnRelayIp1'}});
231
+
232
+ // generate more candidates
233
+ await clock.tickAsync(10);
234
+ fakePeerConnection.onicecandidate({candidate: {type: 'relay', address: 'someTurnRelayIp2'}});
235
+
236
+ await clock.tickAsync(10);
237
+ fakePeerConnection.onicecandidate({candidate: {type: 'relay', address: 'someTurnRelayIp3'}});
238
+
239
+ await clock.tickAsync(3000);// move the clock so that reachability times out
240
+
241
+ await promise;
242
+
243
+ // latency should be from only the first candidates, but the clientMediaIps should be from only from UDP candidates
244
+ assert.deepEqual(clusterReachability.getResult(), {
245
+ udp: {result: 'unreachable'},
246
+ tcp: {result: 'reachable', latencyInMilliseconds: 10},
247
+ xtls: {result: 'untested'}
248
+ });
249
+ });
250
+
251
+ it('ignores duplicate clientMediaIps', async () => {
252
+ const promise = clusterReachability.start();
253
+
254
+ // generate candidates with duplicate addresses
255
+ await clock.tickAsync(10);
256
+ fakePeerConnection.onicecandidate({candidate: {type: 'srflx', address: 'somePublicIp1'}});
257
+
258
+ await clock.tickAsync(10);
259
+ fakePeerConnection.onicecandidate({candidate: {type: 'srflx', address: 'somePublicIp1'}});
260
+
261
+ await clock.tickAsync(10);
262
+ fakePeerConnection.onicecandidate({candidate: {type: 'srflx', address: 'somePublicIp2'}});
263
+
264
+ await clock.tickAsync(10);
265
+ fakePeerConnection.onicecandidate({candidate: {type: 'srflx', address: 'somePublicIp2'}});
266
+
267
+ // send also a relay candidate so that the reachability check finishes
268
+ fakePeerConnection.onicecandidate({candidate: {type: 'relay', address: 'someTurnRelayIp'}});
269
+
270
+ await promise;
271
+
272
+ assert.deepEqual(clusterReachability.getResult(), {
273
+ udp: {result: 'reachable', latencyInMilliseconds: 10, clientMediaIPs: ['somePublicIp1', 'somePublicIp2']},
274
+ tcp: {result: 'reachable', latencyInMilliseconds: 40},
275
+ xtls: {result: 'untested'}
276
+ });
277
+ });
278
+ });
279
+ });