@webex/plugin-meetings 3.0.0-beta.25 → 3.0.0-beta.251

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 (365) 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 +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +114 -14
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +841 -19
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/request.js +78 -0
  17. package/dist/breakouts/request.js.map +1 -0
  18. package/dist/breakouts/utils.js +67 -0
  19. package/dist/breakouts/utils.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +28 -7
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/queue.js +24 -9
  25. package/dist/common/queue.js.map +1 -1
  26. package/dist/config.js +5 -10
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +195 -28
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/constants.js +14 -0
  31. package/dist/controls-options-manager/constants.js.map +1 -0
  32. package/dist/controls-options-manager/enums.js +27 -0
  33. package/dist/controls-options-manager/enums.js.map +1 -0
  34. package/dist/controls-options-manager/index.js +297 -0
  35. package/dist/controls-options-manager/index.js.map +1 -0
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +319 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +112 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +366 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +91 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +381 -62
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/infoUtils.js +7 -1
  53. package/dist/locus-info/infoUtils.js.map +1 -1
  54. package/dist/locus-info/mediaSharesUtils.js +43 -1
  55. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  56. package/dist/locus-info/parser.js +224 -63
  57. package/dist/locus-info/parser.js.map +1 -1
  58. package/dist/locus-info/selfUtils.js +89 -14
  59. package/dist/locus-info/selfUtils.js.map +1 -1
  60. package/dist/media/index.js +58 -116
  61. package/dist/media/index.js.map +1 -1
  62. package/dist/media/properties.js +60 -121
  63. package/dist/media/properties.js.map +1 -1
  64. package/dist/meeting/in-meeting-actions.js +90 -2
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +2785 -2652
  67. package/dist/meeting/index.js.map +1 -1
  68. package/dist/meeting/locusMediaRequest.js +292 -0
  69. package/dist/meeting/locusMediaRequest.js.map +1 -0
  70. package/dist/meeting/muteState.js +230 -124
  71. package/dist/meeting/muteState.js.map +1 -1
  72. package/dist/meeting/request.js +256 -196
  73. package/dist/meeting/request.js.map +1 -1
  74. package/dist/meeting/util.js +601 -417
  75. package/dist/meeting/util.js.map +1 -1
  76. package/dist/meeting-info/index.js +48 -7
  77. package/dist/meeting-info/index.js.map +1 -1
  78. package/dist/meeting-info/meeting-info-v2.js +171 -51
  79. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  80. package/dist/meeting-info/util.js +1 -1
  81. package/dist/meeting-info/util.js.map +1 -1
  82. package/dist/meeting-info/utilv2.js +36 -36
  83. package/dist/meeting-info/utilv2.js.map +1 -1
  84. package/dist/meetings/collection.js +22 -0
  85. package/dist/meetings/collection.js.map +1 -1
  86. package/dist/meetings/index.js +370 -90
  87. package/dist/meetings/index.js.map +1 -1
  88. package/dist/meetings/meetings.types.js +7 -0
  89. package/dist/meetings/meetings.types.js.map +1 -0
  90. package/dist/meetings/request.js +2 -0
  91. package/dist/meetings/request.js.map +1 -1
  92. package/dist/meetings/util.js +88 -1
  93. package/dist/meetings/util.js.map +1 -1
  94. package/dist/member/index.js +49 -0
  95. package/dist/member/index.js.map +1 -1
  96. package/dist/member/types.js +25 -0
  97. package/dist/member/types.js.map +1 -0
  98. package/dist/member/util.js +121 -25
  99. package/dist/member/util.js.map +1 -1
  100. package/dist/members/collection.js +10 -0
  101. package/dist/members/collection.js.map +1 -1
  102. package/dist/members/index.js +86 -5
  103. package/dist/members/index.js.map +1 -1
  104. package/dist/members/request.js +106 -38
  105. package/dist/members/request.js.map +1 -1
  106. package/dist/members/types.js +15 -0
  107. package/dist/members/types.js.map +1 -0
  108. package/dist/members/util.js +316 -233
  109. package/dist/members/util.js.map +1 -1
  110. package/dist/metrics/constants.js +6 -5
  111. package/dist/metrics/constants.js.map +1 -1
  112. package/dist/metrics/index.js +1 -468
  113. package/dist/metrics/index.js.map +1 -1
  114. package/dist/multistream/mediaRequestManager.js +238 -49
  115. package/dist/multistream/mediaRequestManager.js.map +1 -1
  116. package/dist/multistream/receiveSlot.js +49 -16
  117. package/dist/multistream/receiveSlot.js.map +1 -1
  118. package/dist/multistream/receiveSlotManager.js +52 -34
  119. package/dist/multistream/receiveSlotManager.js.map +1 -1
  120. package/dist/multistream/remoteMedia.js +44 -18
  121. package/dist/multistream/remoteMedia.js.map +1 -1
  122. package/dist/multistream/remoteMediaGroup.js +60 -3
  123. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  124. package/dist/multistream/remoteMediaManager.js +209 -59
  125. package/dist/multistream/remoteMediaManager.js.map +1 -1
  126. package/dist/multistream/sendSlotManager.js +233 -0
  127. package/dist/multistream/sendSlotManager.js.map +1 -0
  128. package/dist/reachability/index.js +81 -30
  129. package/dist/reachability/index.js.map +1 -1
  130. package/dist/reachability/request.js +16 -7
  131. package/dist/reachability/request.js.map +1 -1
  132. package/dist/reconnection-manager/index.js +199 -154
  133. package/dist/reconnection-manager/index.js.map +1 -1
  134. package/dist/recording-controller/index.js +21 -2
  135. package/dist/recording-controller/index.js.map +1 -1
  136. package/dist/recording-controller/util.js +9 -8
  137. package/dist/recording-controller/util.js.map +1 -1
  138. package/dist/roap/index.js +23 -29
  139. package/dist/roap/index.js.map +1 -1
  140. package/dist/roap/request.js +112 -89
  141. package/dist/roap/request.js.map +1 -1
  142. package/dist/roap/turnDiscovery.js +96 -36
  143. package/dist/roap/turnDiscovery.js.map +1 -1
  144. package/dist/rtcMetrics/constants.js +12 -0
  145. package/dist/rtcMetrics/constants.js.map +1 -0
  146. package/dist/rtcMetrics/index.js +117 -0
  147. package/dist/rtcMetrics/index.js.map +1 -0
  148. package/dist/statsAnalyzer/index.js +51 -34
  149. package/dist/statsAnalyzer/index.js.map +1 -1
  150. package/dist/statsAnalyzer/mqaUtil.js +6 -6
  151. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  152. package/dist/types/annotation/annotation.types.d.ts +42 -0
  153. package/dist/types/annotation/constants.d.ts +31 -0
  154. package/dist/types/annotation/index.d.ts +117 -0
  155. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  156. package/dist/types/breakouts/events.d.ts +8 -0
  157. package/dist/types/breakouts/request.d.ts +22 -0
  158. package/dist/types/breakouts/utils.d.ts +15 -0
  159. package/dist/types/common/errors/webex-errors.d.ts +13 -1
  160. package/dist/types/common/queue.d.ts +9 -7
  161. package/dist/types/config.d.ts +1 -6
  162. package/dist/types/constants.d.ts +157 -21
  163. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  164. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  165. package/dist/types/controls-options-manager/index.d.ts +136 -0
  166. package/dist/types/controls-options-manager/types.d.ts +43 -0
  167. package/dist/types/controls-options-manager/util.d.ts +1 -0
  168. package/dist/types/index.d.ts +6 -4
  169. package/dist/types/interpretation/collection.d.ts +5 -0
  170. package/dist/types/interpretation/index.d.ts +5 -0
  171. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  172. package/dist/types/locus-info/index.d.ts +57 -4
  173. package/dist/types/locus-info/parser.d.ts +65 -6
  174. package/dist/types/media/index.d.ts +2 -0
  175. package/dist/types/media/properties.d.ts +34 -48
  176. package/dist/types/meeting/in-meeting-actions.d.ts +90 -2
  177. package/dist/types/meeting/index.d.ts +330 -503
  178. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  179. package/dist/types/meeting/muteState.d.ts +99 -23
  180. package/dist/types/meeting/request.d.ts +72 -43
  181. package/dist/types/meeting/util.d.ts +101 -1
  182. package/dist/types/meeting-info/index.d.ts +6 -1
  183. package/dist/types/meeting-info/meeting-info-v2.d.ts +30 -1
  184. package/dist/types/meetings/collection.d.ts +8 -0
  185. package/dist/types/meetings/index.d.ts +76 -12
  186. package/dist/types/meetings/meetings.types.d.ts +4 -0
  187. package/dist/types/member/index.d.ts +13 -0
  188. package/dist/types/member/types.d.ts +32 -0
  189. package/dist/types/members/collection.d.ts +5 -0
  190. package/dist/types/members/index.d.ts +35 -2
  191. package/dist/types/members/request.d.ts +73 -9
  192. package/dist/types/members/types.d.ts +24 -0
  193. package/dist/types/members/util.d.ts +209 -1
  194. package/dist/types/metrics/constants.d.ts +5 -4
  195. package/dist/types/metrics/index.d.ts +4 -119
  196. package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
  197. package/dist/types/multistream/receiveSlot.d.ts +16 -12
  198. package/dist/types/multistream/receiveSlotManager.d.ts +19 -4
  199. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  200. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  201. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  202. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  203. package/dist/types/reachability/index.d.ts +15 -3
  204. package/dist/types/reachability/request.d.ts +7 -3
  205. package/dist/types/reconnection-manager/index.d.ts +9 -0
  206. package/dist/types/recording-controller/index.d.ts +15 -1
  207. package/dist/types/recording-controller/util.d.ts +5 -4
  208. package/dist/types/roap/request.d.ts +15 -11
  209. package/dist/types/roap/turnDiscovery.d.ts +18 -1
  210. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  211. package/dist/types/rtcMetrics/index.d.ts +47 -0
  212. package/dist/types/statsAnalyzer/index.d.ts +6 -1
  213. package/package.json +23 -20
  214. package/src/annotation/annotation.types.ts +50 -0
  215. package/src/annotation/constants.ts +36 -0
  216. package/src/annotation/index.ts +328 -0
  217. package/src/breakouts/README.md +44 -14
  218. package/src/breakouts/breakout.ts +87 -9
  219. package/src/breakouts/edit-lock-error.ts +25 -0
  220. package/src/breakouts/events.ts +56 -0
  221. package/src/breakouts/index.ts +710 -10
  222. package/src/breakouts/request.ts +55 -0
  223. package/src/breakouts/utils.ts +57 -0
  224. package/src/common/errors/webex-errors.ts +27 -2
  225. package/src/common/logs/logger-proxy.ts +1 -1
  226. package/src/common/queue.ts +22 -8
  227. package/src/config.ts +4 -9
  228. package/src/constants.ts +178 -18
  229. package/src/controls-options-manager/constants.ts +5 -0
  230. package/src/controls-options-manager/enums.ts +18 -0
  231. package/src/controls-options-manager/index.ts +278 -0
  232. package/src/controls-options-manager/types.ts +59 -0
  233. package/src/controls-options-manager/util.ts +300 -0
  234. package/src/index.ts +40 -0
  235. package/src/interpretation/README.md +60 -0
  236. package/src/interpretation/collection.ts +19 -0
  237. package/src/interpretation/index.ts +332 -0
  238. package/src/interpretation/siLanguage.ts +18 -0
  239. package/src/locus-info/controlsUtils.ts +108 -0
  240. package/src/locus-info/index.ts +412 -59
  241. package/src/locus-info/infoUtils.ts +10 -2
  242. package/src/locus-info/mediaSharesUtils.ts +48 -0
  243. package/src/locus-info/parser.ts +231 -39
  244. package/src/locus-info/selfUtils.ts +81 -5
  245. package/src/media/index.ts +100 -122
  246. package/src/media/properties.ts +70 -108
  247. package/src/meeting/in-meeting-actions.ts +179 -3
  248. package/src/meeting/index.ts +2269 -2218
  249. package/src/meeting/locusMediaRequest.ts +313 -0
  250. package/src/meeting/muteState.ts +229 -131
  251. package/src/meeting/request.ts +172 -121
  252. package/src/meeting/util.ts +588 -394
  253. package/src/meeting-info/index.ts +54 -8
  254. package/src/meeting-info/meeting-info-v2.ts +148 -14
  255. package/src/meeting-info/util.ts +1 -1
  256. package/src/meeting-info/utilv2.ts +23 -23
  257. package/src/meetings/collection.ts +20 -0
  258. package/src/meetings/index.ts +407 -108
  259. package/src/meetings/meetings.types.ts +12 -0
  260. package/src/meetings/request.ts +2 -0
  261. package/src/meetings/util.ts +103 -4
  262. package/src/member/index.ts +49 -0
  263. package/src/member/types.ts +38 -0
  264. package/src/member/util.ts +127 -25
  265. package/src/members/collection.ts +8 -0
  266. package/src/members/index.ts +107 -6
  267. package/src/members/request.ts +97 -17
  268. package/src/members/types.ts +28 -0
  269. package/src/members/util.ts +319 -240
  270. package/src/metrics/constants.ts +5 -4
  271. package/src/metrics/index.ts +1 -490
  272. package/src/multistream/mediaRequestManager.ts +289 -79
  273. package/src/multistream/receiveSlot.ts +55 -18
  274. package/src/multistream/receiveSlotManager.ts +46 -24
  275. package/src/multistream/remoteMedia.ts +27 -2
  276. package/src/multistream/remoteMediaGroup.ts +59 -0
  277. package/src/multistream/remoteMediaManager.ts +148 -30
  278. package/src/multistream/sendSlotManager.ts +170 -0
  279. package/src/reachability/index.ts +69 -17
  280. package/src/reachability/request.ts +16 -7
  281. package/src/reconnection-manager/index.ts +81 -54
  282. package/src/recording-controller/index.ts +20 -3
  283. package/src/recording-controller/util.ts +26 -9
  284. package/src/roap/index.ts +23 -30
  285. package/src/roap/request.ts +104 -95
  286. package/src/roap/turnDiscovery.ts +50 -25
  287. package/src/rtcMetrics/constants.ts +3 -0
  288. package/src/rtcMetrics/index.ts +100 -0
  289. package/src/statsAnalyzer/index.ts +73 -35
  290. package/src/statsAnalyzer/mqaUtil.ts +8 -10
  291. package/test/integration/spec/converged-space-meetings.js +233 -0
  292. package/test/integration/spec/journey.js +320 -261
  293. package/test/integration/spec/space-meeting.js +76 -3
  294. package/test/unit/spec/annotation/index.ts +418 -0
  295. package/test/unit/spec/breakouts/breakout.ts +142 -24
  296. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  297. package/test/unit/spec/breakouts/events.ts +89 -0
  298. package/test/unit/spec/breakouts/index.ts +1545 -48
  299. package/test/unit/spec/breakouts/request.ts +104 -0
  300. package/test/unit/spec/breakouts/utils.js +72 -0
  301. package/test/unit/spec/common/queue.js +31 -2
  302. package/test/unit/spec/controls-options-manager/index.js +287 -0
  303. package/test/unit/spec/controls-options-manager/util.js +582 -0
  304. package/test/unit/spec/fixture/locus.js +1 -0
  305. package/test/unit/spec/interpretation/collection.ts +15 -0
  306. package/test/unit/spec/interpretation/index.ts +589 -0
  307. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  308. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  309. package/test/unit/spec/locus-info/index.js +1283 -33
  310. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  311. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  312. package/test/unit/spec/locus-info/parser.js +62 -22
  313. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  314. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  315. package/test/unit/spec/media/index.ts +104 -37
  316. package/test/unit/spec/meeting/in-meeting-actions.ts +89 -3
  317. package/test/unit/spec/meeting/index.js +3688 -1861
  318. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  319. package/test/unit/spec/meeting/muteState.js +408 -208
  320. package/test/unit/spec/meeting/request.js +440 -45
  321. package/test/unit/spec/meeting/utils.js +679 -64
  322. package/test/unit/spec/meeting-info/index.js +181 -0
  323. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  324. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  325. package/test/unit/spec/meetings/collection.js +14 -0
  326. package/test/unit/spec/meetings/index.js +939 -150
  327. package/test/unit/spec/meetings/utils.js +206 -2
  328. package/test/unit/spec/member/index.js +58 -4
  329. package/test/unit/spec/member/util.js +479 -35
  330. package/test/unit/spec/members/index.js +319 -1
  331. package/test/unit/spec/members/request.js +206 -27
  332. package/test/unit/spec/members/utils.js +184 -0
  333. package/test/unit/spec/metrics/index.js +1 -50
  334. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  335. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  336. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  337. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  338. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  339. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  340. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  341. package/test/unit/spec/reachability/index.ts +185 -7
  342. package/test/unit/spec/reachability/request.js +68 -0
  343. package/test/unit/spec/reconnection-manager/index.js +84 -9
  344. package/test/unit/spec/recording-controller/index.js +294 -218
  345. package/test/unit/spec/recording-controller/util.js +223 -96
  346. package/test/unit/spec/roap/index.ts +31 -51
  347. package/test/unit/spec/roap/request.ts +202 -85
  348. package/test/unit/spec/roap/turnDiscovery.ts +45 -10
  349. package/test/unit/spec/rtcMetrics/index.ts +68 -0
  350. package/test/unit/spec/stats-analyzer/index.js +29 -2
  351. package/test/utils/constants.js +9 -0
  352. package/test/utils/integrationTestUtils.js +46 -0
  353. package/test/utils/testUtils.js +0 -45
  354. package/test/utils/webex-config.js +4 -0
  355. package/test/utils/webex-test-users.js +6 -3
  356. package/dist/meeting/effectsState.js +0 -262
  357. package/dist/meeting/effectsState.js.map +0 -1
  358. package/dist/metrics/config.js +0 -299
  359. package/dist/metrics/config.js.map +0 -1
  360. package/dist/types/meeting/effectsState.d.ts +0 -42
  361. package/dist/types/metrics/config.d.ts +0 -178
  362. package/src/index.js +0 -16
  363. package/src/meeting/effectsState.ts +0 -211
  364. package/src/metrics/config.ts +0 -495
  365. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -1,13 +1,22 @@
1
1
  import {assert} from '@webex/test-helper-chai';
2
2
  import MockWebex from '@webex/test-helper-mock-webex';
3
3
  import sinon from 'sinon';
4
- import Reachability from '@webex/plugin-meetings/src/reachability/';
4
+ import Reachability, {ICECandidateResult} from '@webex/plugin-meetings/src/reachability/';
5
+ import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
6
+
7
+ import { IP_VERSION } from '@webex/plugin-meetings/src/constants';
5
8
 
6
9
  describe('isAnyClusterReachable', () => {
7
10
  let webex;
8
11
 
9
12
  beforeEach(() => {
10
13
  webex = new MockWebex();
14
+
15
+ sinon.stub(MeetingUtil, 'getIpVersion').returns(IP_VERSION.unknown);
16
+ });
17
+
18
+ afterEach(() => {
19
+ sinon.restore();
11
20
  });
12
21
 
13
22
  const checkIsClusterReachable = async (mockStorage: any, expectedValue: boolean) => {
@@ -66,19 +75,188 @@ describe('gatherReachability', () => {
66
75
  it('stores the reachability', async () => {
67
76
  const reachability = new Reachability(webex);
68
77
 
69
- const clusters = {some: 'clusters'};
70
- const reachabilityResults = {some: 'results'};
78
+ const reachabilityResults = {
79
+ clusters: {
80
+ clusterId: {
81
+ udp: 'testUDP',
82
+ },
83
+ },
84
+ };
85
+ const getClustersResult = {
86
+ clusters: {clusterId: 'cluster'},
87
+ joinCookie: {id: 'id'},
88
+ };
71
89
 
72
- reachability.reachabilityRequest.getClusters = sinon.stub().returns(clusters);
73
- (reachability as any).performReachabilityCheck = sinon.stub().returns(reachabilityResults)
90
+ reachability.reachabilityRequest.getClusters = sinon.stub().returns(getClustersResult);
91
+ (reachability as any).performReachabilityCheck = sinon.stub().returns(reachabilityResults);
74
92
 
75
93
  const result = await reachability.gatherReachability();
76
94
 
77
95
  assert.equal(result, reachabilityResults);
78
96
 
79
- const storedResult = await webex.boundedStorage.get('Reachability', 'reachability.result');
97
+ const storedResultForReachabilityResult = await webex.boundedStorage.get(
98
+ 'Reachability',
99
+ 'reachability.result'
100
+ );
101
+ const storedResultForJoinCookie = await webex.boundedStorage.get(
102
+ 'Reachability',
103
+ 'reachability.joinCookie'
104
+ );
105
+
106
+ assert.equal(JSON.stringify(result), storedResultForReachabilityResult);
107
+ assert.equal(JSON.stringify(getClustersResult.joinCookie), storedResultForJoinCookie);
108
+ });
109
+
110
+ it('does reachability only on udp', async () => {
111
+ const reachability = new Reachability(webex);
112
+
113
+ const getClustersResult = {
114
+ clusters: {clusterId: {
115
+ tcp: [
116
+ 'stun:170.72.164.1:5004',
117
+ 'stun:170.72.165.2:5004'
118
+ ],
119
+ udp: [
120
+ 'stun:170.72.164.3:5004',
121
+ 'stun:170.72.164.3:9000',
122
+ ],
123
+ xtls: [
124
+ 'stun:external-media101.public.wjfkm-a-4.prod.infra.webex.com:443',
125
+ 'stun:external-media94.public.wjfkm-a-8.prod.infra.webex.com:443'
126
+ ]
127
+ }},
128
+ joinCookie: {id: 'id'},
129
+ };
130
+
131
+ sinon.stub(reachability.reachabilityRequest, 'getClusters').returns(getClustersResult);
132
+
133
+ const createPeerConnectionStub = sinon.stub(reachability, 'createPeerConnection');
80
134
 
81
- assert.equal(JSON.stringify(result), storedResult);
135
+ await reachability.gatherReachability();
136
+
137
+ // check that a peer connection was created with only the udp urls
138
+ assert.calledOnceWithExactly(createPeerConnectionStub, {
139
+ key: 'clusterId',
140
+ config: {
141
+ iceServers: [
142
+ {
143
+ username: '',
144
+ credential: '',
145
+ urls: ['stun:170.72.164.3:5004'],
146
+ },
147
+ {
148
+ username: '',
149
+ credential: '',
150
+ urls: ['stun:170.72.164.3:9000'],
151
+ }
152
+ ],
153
+ iceCandidatePoolSize: '0',
154
+ iceTransportPolicy: 'all'
155
+ }
156
+ })
82
157
  });
83
158
 
159
+ describe('clientMediaIPs', () => {
160
+ let testingClass: TestReachability;
161
+
162
+ class TestReachability extends Reachability {
163
+ public testParseIceResultsToReachabilityResults(iceResults: Array<ICECandidateResult>) {
164
+ return this.parseIceResultsToReachabilityResults(iceResults);
165
+ }
166
+ public testAddPublicIP(peerConnection: RTCPeerConnection, publicIP?: string | null) {
167
+ return this.addPublicIP(peerConnection, publicIP);
168
+ }
169
+ }
170
+ beforeEach(() => {
171
+ testingClass = new TestReachability({webex});
172
+ });
173
+
174
+ it('calls parseIceResultsToReachabilityResults correctly', () => {
175
+ const res = testingClass.testParseIceResultsToReachabilityResults([
176
+ {
177
+ clusterId: 'id1',
178
+ elapsed: '12312',
179
+ publicIPs: ['1.1.1.1'],
180
+ },
181
+ {
182
+ clusterId: 'id2',
183
+ elapsed: null,
184
+ publicIPs: ['1.1.1.1'],
185
+ },
186
+ {
187
+ clusterId: 'id2',
188
+ elapsed: '14123',
189
+ publicIPs: undefined,
190
+ },
191
+ ]);
192
+
193
+ assert.deepEqual(res, {
194
+ id1: {
195
+ tcp: {
196
+ untested: 'true',
197
+ },
198
+ xtls: {
199
+ untested: 'true',
200
+ },
201
+ udp: {
202
+ clientMediaIPs: ['1.1.1.1'],
203
+ latencyInMilliseconds: '12312',
204
+ reachable: 'true',
205
+ },
206
+ },
207
+ id2: {
208
+ xtls: {
209
+ untested: 'true',
210
+ },
211
+ tcp: {
212
+ untested: 'true',
213
+ },
214
+ udp: {
215
+ latencyInMilliseconds: '14123',
216
+ reachable: 'true',
217
+ },
218
+ },
219
+ });
220
+ });
221
+
222
+ it('calls addPublicIP correctly with no existing public APIs', () => {
223
+ const peerConnection = {
224
+ connectionState: 'not_closed',
225
+ };
226
+
227
+ testingClass.testAddPublicIP(peerConnection as RTCPeerConnection, '1.1.1.1');
228
+
229
+ assert.deepEqual(peerConnection, {
230
+ connectionState: 'not_closed',
231
+ publicIPs: ['1.1.1.1'],
232
+ });
233
+ });
234
+
235
+ it('calls addPublicIP correctly with existing public APIs', () => {
236
+ const peerConnection = {
237
+ connectionState: 'not_closed',
238
+ publicIPs: ['2.2.2.2'],
239
+ };
240
+
241
+ testingClass.testAddPublicIP(peerConnection as any, '1.1.1.1');
242
+
243
+ assert.deepEqual(peerConnection, {
244
+ connectionState: 'not_closed',
245
+ publicIPs: ['2.2.2.2', '1.1.1.1'],
246
+ });
247
+ });
248
+
249
+ it('calls addPublicIP correctly null publicAPI', () => {
250
+ const peerConnection = {
251
+ connectionState: 'not_closed',
252
+ };
253
+
254
+ testingClass.testAddPublicIP(peerConnection as RTCPeerConnection, null);
255
+
256
+ assert.deepEqual(peerConnection, {
257
+ connectionState: 'not_closed',
258
+ publicIPs: null,
259
+ });
260
+ });
261
+ });
84
262
  });
@@ -0,0 +1,68 @@
1
+ import sinon from 'sinon';
2
+ import {assert} from '@webex/test-helper-chai';
3
+ import MockWebex from '@webex/test-helper-mock-webex';
4
+ import Meetings from '@webex/plugin-meetings';
5
+ import ReachabilityRequest from '@webex/plugin-meetings/src/reachability/request';
6
+ import {IP_VERSION} from '@webex/plugin-meetings/src/constants';
7
+
8
+
9
+ describe('plugin-meetings/reachability', () => {
10
+ let reachabilityRequest;
11
+ let webex;
12
+
13
+ beforeEach(() => {
14
+ webex = new MockWebex({
15
+ children: {
16
+ meetings: Meetings,
17
+ },
18
+ });
19
+
20
+ webex.meetings.clientRegion = {
21
+ countryCode: 'US',
22
+ regionCode: 'WEST-COAST',
23
+ };
24
+
25
+ webex.internal = {
26
+ services: {
27
+ get: sinon.mock().returns('locusUrl'),
28
+ waitForCatalog: sinon.mock().returns(Promise.resolve({})),
29
+ },
30
+ };
31
+
32
+
33
+ reachabilityRequest = new ReachabilityRequest(webex);
34
+
35
+ });
36
+
37
+ describe('#getClusters', () => {
38
+ it('sends a GET request with the correct params', async () => {
39
+ webex.request = sinon.mock().returns(Promise.resolve({
40
+ body: {
41
+ clusterClasses: {
42
+ hybridMedia: ["clusterId"]
43
+ },
44
+ clusters: {"clusterId": {
45
+ udp: "testUDP"
46
+ }},
47
+ joinCookie: {anycastEntryPoint: "aws-eu-west-1"}
48
+ }
49
+ }));
50
+
51
+ const res = await reachabilityRequest.getClusters(IP_VERSION.only_ipv4);
52
+
53
+ const requestParams = webex.request.getCall(0).args[0];
54
+
55
+ assert.equal(requestParams.method, 'GET');
56
+ assert.equal(requestParams.resource, `clusters`);
57
+ assert.equal(requestParams.api, 'calliopeDiscovery');
58
+ assert.equal(requestParams.shouldRefreshAccessToken, false);
59
+
60
+ assert.deepEqual(requestParams.qs, {
61
+ JCSupport: 1,
62
+ ipver: 4,
63
+ });
64
+ assert.deepEqual(res.clusters.clusterId, {udp: "testUDP", isVideoMesh: true})
65
+ assert.deepEqual(res.joinCookie, {anycastEntryPoint: "aws-eu-west-1"})
66
+ });
67
+ });
68
+ });
@@ -3,7 +3,6 @@ import chai from 'chai';
3
3
  import chaiAsPromised from 'chai-as-promised';
4
4
  import sinon from 'sinon';
5
5
  import ReconnectionManager from '@webex/plugin-meetings/src/reconnection-manager';
6
- import Metrics from '@webex/plugin-meetings/src/metrics';
7
6
 
8
7
  const {assert} = chai;
9
8
 
@@ -16,7 +15,6 @@ describe('plugin-meetings', () => {
16
15
  let fakeMeeting;
17
16
 
18
17
  beforeEach(() => {
19
- Metrics.postEvent = sinon.stub();
20
18
  fakeMediaConnection = {
21
19
  initiateOffer: sinon.stub().resolves({}),
22
20
  reconnect: sinon.stub().resolves({}),
@@ -43,8 +41,8 @@ describe('plugin-meetings', () => {
43
41
  webrtcMediaConnection: fakeMediaConnection,
44
42
  },
45
43
  mediaRequestManagers: {
46
- audio: {commit: sinon.stub()},
47
- video: {commit: sinon.stub()},
44
+ audio: {commit: sinon.stub(), clearPreviousRequests: sinon.stub()},
45
+ video: {commit: sinon.stub(), clearPreviousRequests: sinon.stub()},
48
46
  },
49
47
  roap: {
50
48
  doTurnDiscovery: sinon.stub().resolves({
@@ -60,14 +58,40 @@ describe('plugin-meetings', () => {
60
58
  updateMediaConnection: sinon.stub(),
61
59
  },
62
60
  webex: {
61
+ credentials: {
62
+ isUnverifiedGuest: false,
63
+ },
63
64
  meetings: {
64
65
  getMeetingByType: sinon.stub().returns(true),
65
66
  syncMeetings: sinon.stub().resolves({}),
66
67
  },
68
+ internal: {
69
+ newMetrics: {
70
+ submitClientEvent: sinon.stub()
71
+ }
72
+ }
67
73
  },
68
74
  };
69
75
  });
70
76
 
77
+ it('syncs meetings if it is not an unverified guest', async () => {
78
+ const rm = new ReconnectionManager(fakeMeeting);
79
+
80
+ await rm.reconnect();
81
+
82
+ assert.calledOnce(rm.webex.meetings.syncMeetings);
83
+ });
84
+
85
+ it('does not sync meetings if it is an unverified guest', async () => {
86
+ const rm = new ReconnectionManager(fakeMeeting);
87
+
88
+ rm.webex.credentials.isUnverifiedGuest = true;
89
+
90
+ await rm.reconnect();
91
+
92
+ assert.notCalled(rm.webex.meetings.syncMeetings);
93
+ });
94
+
71
95
  it('uses correct TURN TLS information on the reconnection', async () => {
72
96
  const rm = new ReconnectionManager(fakeMeeting);
73
97
 
@@ -82,27 +106,77 @@ describe('plugin-meetings', () => {
82
106
  credential: 'fake_turn_password',
83
107
  },
84
108
  ]);
109
+
110
+ assert.calledWith(fakeMeeting.webex.internal.newMetrics.submitClientEvent, {
111
+ name: 'client.media.reconnecting',
112
+ options: {
113
+ meetingId: rm.meeting.id,
114
+ },
115
+ });
116
+
117
+ assert.calledWith(fakeMeeting.webex.internal.newMetrics.submitClientEvent, {
118
+ name: 'client.media.recovered',
119
+ payload: {
120
+ recoveredBy: 'new',
121
+ },
122
+ options: {
123
+ meetingId: rm.meeting.id,
124
+ },
125
+ });
85
126
  });
86
127
 
87
- it('does not re-request media for non-multistream meetings', async () => {
128
+ it('does not clear previous requests and re-request media for non-multistream meetings', async () => {
88
129
  fakeMeeting.isMultistream = false;
89
130
  const rm = new ReconnectionManager(fakeMeeting);
90
131
 
91
132
  await rm.reconnect();
92
133
 
134
+ assert.notCalled(fakeMeeting.mediaRequestManagers.audio.clearPreviousRequests);
135
+ assert.notCalled(fakeMeeting.mediaRequestManagers.video.clearPreviousRequests);
93
136
  assert.notCalled(fakeMeeting.mediaRequestManagers.audio.commit);
94
137
  assert.notCalled(fakeMeeting.mediaRequestManagers.video.commit);
95
138
  });
96
139
 
97
- it('does re-request media for multistream meetings', async () => {
140
+ it('does clear previous requests and re-request media for multistream meetings', async () => {
98
141
  fakeMeeting.isMultistream = true;
99
142
  const rm = new ReconnectionManager(fakeMeeting);
100
143
 
101
144
  await rm.reconnect();
102
145
 
146
+ assert.calledOnce(fakeMeeting.mediaRequestManagers.audio.clearPreviousRequests);
147
+ assert.calledOnce(fakeMeeting.mediaRequestManagers.video.clearPreviousRequests);
103
148
  assert.calledOnce(fakeMeeting.mediaRequestManagers.audio.commit);
104
149
  assert.calledOnce(fakeMeeting.mediaRequestManagers.video.commit);
105
150
  });
151
+
152
+
153
+ it('sends the correct client event when reconnection fails', async () => {
154
+ sinon.stub(ReconnectionManager.prototype, 'executeReconnection').rejects();
155
+ fakeMeeting.isMultistream = true;
156
+ const rm = new ReconnectionManager(fakeMeeting);
157
+
158
+ try {
159
+ await rm.reconnect();
160
+ } catch (err) {
161
+ assert.calledWith(fakeMeeting.webex.internal.newMetrics.submitClientEvent, {
162
+ name: 'client.call.aborted',
163
+ payload: {
164
+ errors: [
165
+ {
166
+ category: 'expected',
167
+ errorCode: 2008,
168
+ fatal: true,
169
+ name: 'media-engine',
170
+ shownToUser: false,
171
+ },
172
+ ],
173
+ },
174
+ options: {
175
+ meetingId: rm.meeting.id,
176
+ },
177
+ });
178
+ }
179
+ });
106
180
  });
107
181
 
108
182
  /**
@@ -110,7 +184,7 @@ describe('plugin-meetings', () => {
110
184
  * level causes testing errors in CI based around related files. Skipping this here until a solution
111
185
  * to this problem is generated.
112
186
  */
113
- describe.skip('ReconnectionManager', () => {
187
+ describe('ReconnectionManager', () => {
114
188
  let reconnectionManager;
115
189
 
116
190
  beforeEach(() => {
@@ -203,10 +277,11 @@ describe('plugin-meetings', () => {
203
277
  assert.isTrue(reconnectionManager.iceState.disconnected);
204
278
  });
205
279
 
206
- it('should return a promise that rejects after a duration', () => {
280
+ it('should return a promise that rejects after a duration', (done) => {
207
281
  reconnectionManager.iceState.timeoutDuration = 100;
208
282
 
209
- return assert.isRejected(reconnectionManager.waitForIceReconnect());
283
+ assert.isRejected(reconnectionManager.waitForIceReconnect());
284
+ done();
210
285
  });
211
286
 
212
287
  it('should resolve return a resolved promise when triggered', () => {