@webex/plugin-meetings 3.0.0-stream-classes.5 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (465) hide show
  1. package/.eslintrc.js +6 -0
  2. package/README.md +12 -0
  3. package/babel.config.js +3 -0
  4. package/dist/annotation/constants.js +12 -20
  5. package/dist/annotation/constants.js.map +1 -1
  6. package/dist/annotation/index.js +25 -10
  7. package/dist/annotation/index.js.map +1 -1
  8. package/dist/breakouts/breakout.js +2 -3
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/collection.js +1 -2
  11. package/dist/breakouts/collection.js.map +1 -1
  12. package/dist/breakouts/edit-lock-error.js +1 -2
  13. package/dist/breakouts/edit-lock-error.js.map +1 -1
  14. package/dist/breakouts/events.js +1 -2
  15. package/dist/breakouts/events.js.map +1 -1
  16. package/dist/breakouts/index.js +13 -14
  17. package/dist/breakouts/index.js.map +1 -1
  18. package/dist/breakouts/request.js +1 -2
  19. package/dist/breakouts/request.js.map +1 -1
  20. package/dist/breakouts/utils.js +3 -6
  21. package/dist/breakouts/utils.js.map +1 -1
  22. package/dist/common/browser-detection.js +2 -3
  23. package/dist/common/browser-detection.js.map +1 -1
  24. package/dist/common/collection.js +3 -4
  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.d.ts +14 -0
  37. package/dist/common/errors/no-meeting-info.js +50 -0
  38. package/dist/common/errors/no-meeting-info.js.map +1 -0
  39. package/dist/common/errors/parameter.js +3 -4
  40. package/dist/common/errors/parameter.js.map +1 -1
  41. package/dist/common/errors/password-error.js +1 -2
  42. package/dist/common/errors/password-error.js.map +1 -1
  43. package/dist/common/errors/permission.js +1 -2
  44. package/dist/common/errors/permission.js.map +1 -1
  45. package/dist/common/errors/reclaim-host-role-errors.d.ts +60 -0
  46. package/dist/common/errors/reclaim-host-role-errors.js +154 -0
  47. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  48. package/dist/common/errors/reconnection-in-progress.js +1 -2
  49. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  50. package/dist/common/errors/reconnection.js +1 -2
  51. package/dist/common/errors/reconnection.js.map +1 -1
  52. package/dist/common/errors/stats.js +1 -2
  53. package/dist/common/errors/stats.js.map +1 -1
  54. package/dist/{types/common → common}/errors/webex-errors.d.ts +13 -1
  55. package/dist/common/errors/webex-errors.js +35 -16
  56. package/dist/common/errors/webex-errors.js.map +1 -1
  57. package/dist/common/errors/webex-meetings-error.js +1 -2
  58. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  59. package/dist/common/events/events-scope.js +1 -2
  60. package/dist/common/events/events-scope.js.map +1 -1
  61. package/dist/common/events/events.js +1 -2
  62. package/dist/common/events/events.js.map +1 -1
  63. package/dist/common/events/trigger-proxy.js +1 -2
  64. package/dist/common/events/trigger-proxy.js.map +1 -1
  65. package/dist/common/events/util.js +1 -2
  66. package/dist/common/events/util.js.map +1 -1
  67. package/dist/common/logs/logger-config.js +1 -2
  68. package/dist/common/logs/logger-config.js.map +1 -1
  69. package/dist/common/logs/logger-proxy.js +1 -2
  70. package/dist/common/logs/logger-proxy.js.map +1 -1
  71. package/dist/{types/common → common}/logs/request.d.ts +3 -1
  72. package/dist/common/logs/request.js +8 -5
  73. package/dist/common/logs/request.js.map +1 -1
  74. package/dist/common/queue.js +2 -4
  75. package/dist/common/queue.js.map +1 -1
  76. package/dist/{types/config.d.ts → config.d.ts} +1 -1
  77. package/dist/config.js +3 -3
  78. package/dist/config.js.map +1 -1
  79. package/dist/{types/constants.d.ts → constants.d.ts} +71 -15
  80. package/dist/constants.js +252 -371
  81. package/dist/constants.js.map +1 -1
  82. package/dist/controls-options-manager/constants.js +3 -6
  83. package/dist/controls-options-manager/constants.js.map +1 -1
  84. package/dist/controls-options-manager/enums.js +7 -10
  85. package/dist/controls-options-manager/enums.js.map +1 -1
  86. package/dist/controls-options-manager/index.js +27 -32
  87. package/dist/controls-options-manager/index.js.map +1 -1
  88. package/dist/controls-options-manager/util.js +1 -2
  89. package/dist/controls-options-manager/util.js.map +1 -1
  90. package/dist/index.js +8 -5
  91. package/dist/index.js.map +1 -1
  92. package/dist/interceptors/index.d.ts +2 -0
  93. package/dist/interceptors/index.js +15 -0
  94. package/dist/interceptors/index.js.map +1 -0
  95. package/dist/interceptors/locusRetry.d.ts +27 -0
  96. package/dist/interceptors/locusRetry.js +94 -0
  97. package/dist/interceptors/locusRetry.js.map +1 -0
  98. package/dist/interpretation/collection.js +1 -2
  99. package/dist/interpretation/collection.js.map +1 -1
  100. package/dist/interpretation/index.js +2 -3
  101. package/dist/interpretation/index.js.map +1 -1
  102. package/dist/interpretation/siLanguage.js +2 -3
  103. package/dist/interpretation/siLanguage.js.map +1 -1
  104. package/dist/locus-info/controlsUtils.js +12 -13
  105. package/dist/locus-info/controlsUtils.js.map +1 -1
  106. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  107. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  108. package/dist/locus-info/fullState.js +1 -2
  109. package/dist/locus-info/fullState.js.map +1 -1
  110. package/dist/locus-info/hostUtils.js +1 -2
  111. package/dist/locus-info/hostUtils.js.map +1 -1
  112. package/dist/{types/locus-info → locus-info}/index.d.ts +1 -1
  113. package/dist/locus-info/index.js +38 -37
  114. package/dist/locus-info/index.js.map +1 -1
  115. package/dist/locus-info/infoUtils.js +3 -4
  116. package/dist/locus-info/infoUtils.js.map +1 -1
  117. package/dist/locus-info/mediaSharesUtils.js +16 -3
  118. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  119. package/dist/{types/locus-info → locus-info}/parser.d.ts +3 -2
  120. package/dist/locus-info/parser.js +43 -31
  121. package/dist/locus-info/parser.js.map +1 -1
  122. package/dist/locus-info/selfUtils.js +7 -6
  123. package/dist/locus-info/selfUtils.js.map +1 -1
  124. package/dist/media/index.js +15 -10
  125. package/dist/media/index.js.map +1 -1
  126. package/dist/media/properties.js +16 -7
  127. package/dist/media/properties.js.map +1 -1
  128. package/dist/media/util.js +1 -2
  129. package/dist/media/util.js.map +1 -1
  130. package/dist/mediaQualityMetrics/config.d.ts +241 -0
  131. package/dist/mediaQualityMetrics/config.js +135 -339
  132. package/dist/mediaQualityMetrics/config.js.map +1 -1
  133. package/dist/{types/meeting → meeting}/in-meeting-actions.d.ts +4 -0
  134. package/dist/meeting/in-meeting-actions.js +18 -2
  135. package/dist/meeting/in-meeting-actions.js.map +1 -1
  136. package/dist/{types/meeting → meeting}/index.d.ts +318 -45
  137. package/dist/meeting/index.js +2620 -1405
  138. package/dist/meeting/index.js.map +1 -1
  139. package/dist/meeting/locusMediaRequest.js +4 -5
  140. package/dist/meeting/locusMediaRequest.js.map +1 -1
  141. package/dist/meeting/muteState.js +2 -4
  142. package/dist/meeting/muteState.js.map +1 -1
  143. package/dist/{types/meeting → meeting}/request.d.ts +2 -0
  144. package/dist/meeting/request.js +46 -31
  145. package/dist/meeting/request.js.map +1 -1
  146. package/dist/meeting/state.js +1 -2
  147. package/dist/meeting/state.js.map +1 -1
  148. package/dist/{types/meeting → meeting}/util.d.ts +17 -0
  149. package/dist/meeting/util.js +83 -10
  150. package/dist/meeting/util.js.map +1 -1
  151. package/dist/meeting/voicea-meeting.d.ts +16 -0
  152. package/dist/meeting/voicea-meeting.js +169 -0
  153. package/dist/meeting/voicea-meeting.js.map +1 -0
  154. package/dist/meeting-info/collection.js +3 -4
  155. package/dist/meeting-info/collection.js.map +1 -1
  156. package/dist/{types/meeting-info → meeting-info}/index.d.ts +7 -0
  157. package/dist/meeting-info/index.js +53 -27
  158. package/dist/meeting-info/index.js.map +1 -1
  159. package/dist/{types/meeting-info → meeting-info}/meeting-info-v2.d.ts +1 -0
  160. package/dist/meeting-info/meeting-info-v2.js +52 -33
  161. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  162. package/dist/meeting-info/request.js +1 -2
  163. package/dist/meeting-info/request.js.map +1 -1
  164. package/dist/meeting-info/util.js +8 -8
  165. package/dist/meeting-info/util.js.map +1 -1
  166. package/dist/meeting-info/utilv2.js +12 -9
  167. package/dist/meeting-info/utilv2.js.map +1 -1
  168. package/dist/{types/meetings → meetings}/collection.d.ts +9 -0
  169. package/dist/meetings/collection.js +21 -5
  170. package/dist/meetings/collection.js.map +1 -1
  171. package/dist/{types/meetings → meetings}/index.d.ts +45 -16
  172. package/dist/meetings/index.js +166 -74
  173. package/dist/meetings/index.js.map +1 -1
  174. package/dist/meetings/request.js +2 -3
  175. package/dist/meetings/request.js.map +1 -1
  176. package/dist/meetings/util.js +3 -10
  177. package/dist/meetings/util.js.map +1 -1
  178. package/dist/{types/member → member}/index.d.ts +1 -0
  179. package/dist/member/index.js +10 -3
  180. package/dist/member/index.js.map +1 -1
  181. package/dist/member/member.types.d.ts +11 -0
  182. package/dist/member/member.types.js +17 -0
  183. package/dist/member/member.types.js.map +1 -0
  184. package/dist/member/types.js +6 -8
  185. package/dist/member/types.js.map +1 -1
  186. package/dist/member/util.js +12 -2
  187. package/dist/member/util.js.map +1 -1
  188. package/dist/members/collection.js +1 -2
  189. package/dist/members/collection.js.map +1 -1
  190. package/dist/members/index.js +25 -8
  191. package/dist/members/index.js.map +1 -1
  192. package/dist/members/request.js +2 -3
  193. package/dist/members/request.js.map +1 -1
  194. package/dist/{types/members → members}/types.d.ts +1 -0
  195. package/dist/members/types.js +3 -4
  196. package/dist/members/types.js.map +1 -1
  197. package/dist/{types/members → members}/util.d.ts +6 -1
  198. package/dist/members/util.js +18 -8
  199. package/dist/members/util.js.map +1 -1
  200. package/dist/{types/metrics → metrics}/constants.d.ts +12 -0
  201. package/dist/metrics/constants.js +14 -3
  202. package/dist/metrics/constants.js.map +1 -1
  203. package/dist/metrics/index.js +3 -2
  204. package/dist/metrics/index.js.map +1 -1
  205. package/dist/multistream/mediaRequestManager.js +9 -11
  206. package/dist/multistream/mediaRequestManager.js.map +1 -1
  207. package/dist/multistream/receiveSlot.js +3 -5
  208. package/dist/multistream/receiveSlot.js.map +1 -1
  209. package/dist/multistream/receiveSlotManager.js +7 -9
  210. package/dist/multistream/receiveSlotManager.js.map +1 -1
  211. package/dist/multistream/remoteMedia.js +3 -5
  212. package/dist/multistream/remoteMedia.js.map +1 -1
  213. package/dist/multistream/remoteMediaGroup.js +7 -6
  214. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  215. package/dist/multistream/remoteMediaManager.js +28 -27
  216. package/dist/multistream/remoteMediaManager.js.map +1 -1
  217. package/dist/multistream/sendSlotManager.js +9 -6
  218. package/dist/multistream/sendSlotManager.js.map +1 -1
  219. package/dist/networkQualityMonitor/index.js +1 -2
  220. package/dist/networkQualityMonitor/index.js.map +1 -1
  221. package/dist/personal-meeting-room/index.js +2 -3
  222. package/dist/personal-meeting-room/index.js.map +1 -1
  223. package/dist/personal-meeting-room/request.js +2 -3
  224. package/dist/personal-meeting-room/request.js.map +1 -1
  225. package/dist/personal-meeting-room/util.js +1 -2
  226. package/dist/personal-meeting-room/util.js.map +1 -1
  227. package/dist/reachability/clusterReachability.d.ts +109 -0
  228. package/dist/reachability/clusterReachability.js +357 -0
  229. package/dist/reachability/clusterReachability.js.map +1 -0
  230. package/dist/reachability/index.d.ts +105 -0
  231. package/dist/reachability/index.js +279 -436
  232. package/dist/reachability/index.js.map +1 -1
  233. package/dist/reachability/request.js +14 -11
  234. package/dist/reachability/request.js.map +1 -1
  235. package/dist/reachability/util.d.ts +8 -0
  236. package/dist/reachability/util.js +29 -0
  237. package/dist/reachability/util.js.map +1 -0
  238. package/dist/reactions/constants.js +1 -2
  239. package/dist/reactions/constants.js.map +1 -1
  240. package/dist/reactions/reactions.js +2 -4
  241. package/dist/reactions/reactions.js.map +1 -1
  242. package/dist/reactions/reactions.type.js +6 -8
  243. package/dist/reactions/reactions.type.js.map +1 -1
  244. package/dist/{types/reconnection-manager → reconnection-manager}/index.d.ts +10 -0
  245. package/dist/reconnection-manager/index.js +129 -106
  246. package/dist/reconnection-manager/index.js.map +1 -1
  247. package/dist/recording-controller/enums.js +4 -5
  248. package/dist/recording-controller/enums.js.map +1 -1
  249. package/dist/recording-controller/index.js +43 -51
  250. package/dist/recording-controller/index.js.map +1 -1
  251. package/dist/recording-controller/util.js +1 -2
  252. package/dist/recording-controller/util.js.map +1 -1
  253. package/dist/{types/roap → roap}/index.d.ts +2 -1
  254. package/dist/roap/index.js +59 -28
  255. package/dist/roap/index.js.map +1 -1
  256. package/dist/roap/request.js +14 -22
  257. package/dist/roap/request.js.map +1 -1
  258. package/dist/{types/roap → roap}/turnDiscovery.d.ts +21 -4
  259. package/dist/roap/turnDiscovery.js +182 -89
  260. package/dist/roap/turnDiscovery.js.map +1 -1
  261. package/dist/rtcMetrics/constants.js +1 -2
  262. package/dist/rtcMetrics/constants.js.map +1 -1
  263. package/dist/{types/rtcMetrics → rtcMetrics}/index.d.ts +15 -1
  264. package/dist/rtcMetrics/index.js +72 -12
  265. package/dist/rtcMetrics/index.js.map +1 -1
  266. package/dist/statsAnalyzer/global.js +1 -2
  267. package/dist/statsAnalyzer/global.js.map +1 -1
  268. package/dist/{types/statsAnalyzer → statsAnalyzer}/index.d.ts +28 -11
  269. package/dist/statsAnalyzer/index.js +371 -318
  270. package/dist/statsAnalyzer/index.js.map +1 -1
  271. package/dist/statsAnalyzer/mqaUtil.d.ts +48 -0
  272. package/dist/statsAnalyzer/mqaUtil.js +295 -162
  273. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  274. package/dist/transcription/index.js +1 -2
  275. package/dist/transcription/index.js.map +1 -1
  276. package/dist/webinar/collection.d.ts +16 -0
  277. package/dist/webinar/collection.js +43 -0
  278. package/dist/webinar/collection.js.map +1 -0
  279. package/dist/webinar/index.d.ts +5 -0
  280. package/dist/webinar/index.js +68 -0
  281. package/dist/webinar/index.js.map +1 -0
  282. package/jest.config.js +3 -0
  283. package/package.json +44 -24
  284. package/process +1 -0
  285. package/src/common/errors/no-meeting-info.ts +24 -0
  286. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  287. package/src/common/errors/webex-errors.ts +19 -2
  288. package/src/common/logs/request.ts +5 -1
  289. package/src/config.ts +3 -5
  290. package/src/constants.ts +77 -8
  291. package/src/index.ts +4 -0
  292. package/src/interceptors/index.ts +3 -0
  293. package/src/interceptors/locusRetry.ts +67 -0
  294. package/src/locus-info/index.ts +19 -14
  295. package/src/locus-info/mediaSharesUtils.ts +16 -0
  296. package/src/locus-info/parser.ts +40 -21
  297. package/src/media/index.ts +8 -6
  298. package/src/media/properties.ts +17 -2
  299. package/src/mediaQualityMetrics/config.ts +103 -238
  300. package/src/meeting/in-meeting-actions.ts +8 -0
  301. package/src/meeting/index.ts +1664 -642
  302. package/src/meeting/request.ts +18 -0
  303. package/src/meeting/util.ts +102 -1
  304. package/src/meeting/voicea-meeting.ts +122 -0
  305. package/src/meeting-info/index.ts +47 -20
  306. package/src/meeting-info/meeting-info-v2.ts +32 -16
  307. package/src/meeting-info/util.ts +12 -9
  308. package/src/meeting-info/utilv2.ts +25 -15
  309. package/src/meetings/collection.ts +13 -0
  310. package/src/meetings/index.ts +112 -31
  311. package/src/meetings/util.ts +2 -8
  312. package/src/member/index.ts +9 -1
  313. package/src/member/member.types.ts +13 -0
  314. package/src/member/util.ts +14 -0
  315. package/src/members/index.ts +29 -2
  316. package/src/members/types.ts +1 -0
  317. package/src/members/util.ts +15 -1
  318. package/src/metrics/constants.ts +12 -0
  319. package/src/reachability/clusterReachability.ts +320 -0
  320. package/src/reachability/index.ts +221 -382
  321. package/src/reachability/request.ts +1 -1
  322. package/src/reachability/util.ts +24 -0
  323. package/src/reconnection-manager/index.ts +87 -83
  324. package/src/roap/index.ts +60 -24
  325. package/src/roap/request.ts +4 -17
  326. package/src/roap/turnDiscovery.ts +112 -39
  327. package/src/rtcMetrics/index.ts +71 -5
  328. package/src/statsAnalyzer/index.ts +430 -427
  329. package/src/statsAnalyzer/mqaUtil.ts +317 -168
  330. package/src/webinar/collection.ts +31 -0
  331. package/src/webinar/index.ts +62 -0
  332. package/test/integration/spec/journey.js +12 -12
  333. package/test/integration/spec/space-meeting.js +1 -1
  334. package/test/unit/spec/breakouts/breakout.ts +2 -1
  335. package/test/unit/spec/breakouts/index.ts +7 -4
  336. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  337. package/test/unit/spec/locus-info/index.js +88 -12
  338. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  339. package/test/unit/spec/locus-info/mediaSharesUtils.ts +10 -0
  340. package/test/unit/spec/locus-info/parser.js +54 -13
  341. package/test/unit/spec/locus-info/selfUtils.js +1 -1
  342. package/test/unit/spec/media/index.ts +25 -4
  343. package/test/unit/spec/media/properties.ts +2 -2
  344. package/test/unit/spec/meeting/in-meeting-actions.ts +4 -0
  345. package/test/unit/spec/meeting/index.js +4388 -1382
  346. package/test/unit/spec/meeting/request.js +63 -12
  347. package/test/unit/spec/meeting/utils.js +145 -10
  348. package/test/unit/spec/meeting/voicea-meeting.ts +266 -0
  349. package/test/unit/spec/meeting-info/index.js +180 -61
  350. package/test/unit/spec/meeting-info/meetinginfov2.js +216 -68
  351. package/test/unit/spec/meetings/collection.js +12 -0
  352. package/test/unit/spec/meetings/index.js +674 -193
  353. package/test/unit/spec/meetings/utils.js +35 -12
  354. package/test/unit/spec/member/index.js +8 -7
  355. package/test/unit/spec/member/util.js +32 -0
  356. package/test/unit/spec/members/index.js +130 -17
  357. package/test/unit/spec/members/utils.js +26 -0
  358. package/test/unit/spec/metrics/index.js +1 -2
  359. package/test/unit/spec/multistream/mediaRequestManager.ts +1 -0
  360. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  361. package/test/unit/spec/reachability/index.ts +505 -135
  362. package/test/unit/spec/reachability/util.ts +40 -0
  363. package/test/unit/spec/reconnection-manager/index.js +74 -17
  364. package/test/unit/spec/recording-controller/index.js +0 -1
  365. package/test/unit/spec/roap/index.ts +181 -61
  366. package/test/unit/spec/roap/request.ts +27 -3
  367. package/test/unit/spec/roap/turnDiscovery.ts +363 -102
  368. package/test/unit/spec/rtcMetrics/index.ts +57 -3
  369. package/test/unit/spec/stats-analyzer/index.js +1225 -12
  370. package/test/unit/spec/webinar/collection.ts +13 -0
  371. package/test/unit/spec/webinar/index.ts +60 -0
  372. package/test/utils/webex-test-users.js +12 -4
  373. package/dist/types/mediaQualityMetrics/config.d.ts +0 -365
  374. package/dist/types/reachability/index.d.ts +0 -152
  375. package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -24
  376. /package/dist/{types/annotation → annotation}/annotation.types.d.ts +0 -0
  377. /package/dist/{types/annotation → annotation}/constants.d.ts +0 -0
  378. /package/dist/{types/annotation → annotation}/index.d.ts +0 -0
  379. /package/dist/{types/breakouts → breakouts}/breakout.d.ts +0 -0
  380. /package/dist/{types/breakouts → breakouts}/collection.d.ts +0 -0
  381. /package/dist/{types/breakouts → breakouts}/edit-lock-error.d.ts +0 -0
  382. /package/dist/{types/breakouts → breakouts}/events.d.ts +0 -0
  383. /package/dist/{types/breakouts → breakouts}/index.d.ts +0 -0
  384. /package/dist/{types/breakouts → breakouts}/request.d.ts +0 -0
  385. /package/dist/{types/breakouts → breakouts}/utils.d.ts +0 -0
  386. /package/dist/{types/common → common}/browser-detection.d.ts +0 -0
  387. /package/dist/{types/common → common}/collection.d.ts +0 -0
  388. /package/dist/{types/common → common}/config.d.ts +0 -0
  389. /package/dist/{types/common → common}/errors/captcha-error.d.ts +0 -0
  390. /package/dist/{types/common → common}/errors/intent-to-join.d.ts +0 -0
  391. /package/dist/{types/common → common}/errors/join-meeting.d.ts +0 -0
  392. /package/dist/{types/common → common}/errors/media.d.ts +0 -0
  393. /package/dist/{types/common → common}/errors/parameter.d.ts +0 -0
  394. /package/dist/{types/common → common}/errors/password-error.d.ts +0 -0
  395. /package/dist/{types/common → common}/errors/permission.d.ts +0 -0
  396. /package/dist/{types/common → common}/errors/reconnection-in-progress.d.ts +0 -0
  397. /package/dist/{types/common → common}/errors/reconnection.d.ts +0 -0
  398. /package/dist/{types/common → common}/errors/stats.d.ts +0 -0
  399. /package/dist/{types/common → common}/errors/webex-meetings-error.d.ts +0 -0
  400. /package/dist/{types/common → common}/events/events-scope.d.ts +0 -0
  401. /package/dist/{types/common → common}/events/events.d.ts +0 -0
  402. /package/dist/{types/common → common}/events/trigger-proxy.d.ts +0 -0
  403. /package/dist/{types/common → common}/events/util.d.ts +0 -0
  404. /package/dist/{types/common → common}/logs/logger-config.d.ts +0 -0
  405. /package/dist/{types/common → common}/logs/logger-proxy.d.ts +0 -0
  406. /package/dist/{types/common → common}/queue.d.ts +0 -0
  407. /package/dist/{types/controls-options-manager → controls-options-manager}/constants.d.ts +0 -0
  408. /package/dist/{types/controls-options-manager → controls-options-manager}/enums.d.ts +0 -0
  409. /package/dist/{types/controls-options-manager → controls-options-manager}/index.d.ts +0 -0
  410. /package/dist/{types/controls-options-manager → controls-options-manager}/types.d.ts +0 -0
  411. /package/dist/{types/controls-options-manager → controls-options-manager}/util.d.ts +0 -0
  412. /package/dist/{types/index.d.ts → index.d.ts} +0 -0
  413. /package/dist/{types/interpretation → interpretation}/collection.d.ts +0 -0
  414. /package/dist/{types/interpretation → interpretation}/index.d.ts +0 -0
  415. /package/dist/{types/interpretation → interpretation}/siLanguage.d.ts +0 -0
  416. /package/dist/{types/locus-info → locus-info}/controlsUtils.d.ts +0 -0
  417. /package/dist/{types/locus-info → locus-info}/embeddedAppsUtils.d.ts +0 -0
  418. /package/dist/{types/locus-info → locus-info}/fullState.d.ts +0 -0
  419. /package/dist/{types/locus-info → locus-info}/hostUtils.d.ts +0 -0
  420. /package/dist/{types/locus-info → locus-info}/infoUtils.d.ts +0 -0
  421. /package/dist/{types/locus-info → locus-info}/mediaSharesUtils.d.ts +0 -0
  422. /package/dist/{types/locus-info → locus-info}/selfUtils.d.ts +0 -0
  423. /package/dist/{types/media → media}/index.d.ts +0 -0
  424. /package/dist/{types/media → media}/properties.d.ts +0 -0
  425. /package/dist/{types/media → media}/util.d.ts +0 -0
  426. /package/dist/{types/meeting → meeting}/locusMediaRequest.d.ts +0 -0
  427. /package/dist/{types/meeting → meeting}/muteState.d.ts +0 -0
  428. /package/dist/{types/meeting → meeting}/request.type.d.ts +0 -0
  429. /package/dist/{types/meeting → meeting}/state.d.ts +0 -0
  430. /package/dist/{types/meeting-info → meeting-info}/collection.d.ts +0 -0
  431. /package/dist/{types/meeting-info → meeting-info}/request.d.ts +0 -0
  432. /package/dist/{types/meeting-info → meeting-info}/util.d.ts +0 -0
  433. /package/dist/{types/meeting-info → meeting-info}/utilv2.d.ts +0 -0
  434. /package/dist/{types/meetings → meetings}/meetings.types.d.ts +0 -0
  435. /package/dist/{types/meetings → meetings}/request.d.ts +0 -0
  436. /package/dist/{types/meetings → meetings}/util.d.ts +0 -0
  437. /package/dist/{types/member → member}/types.d.ts +0 -0
  438. /package/dist/{types/member → member}/util.d.ts +0 -0
  439. /package/dist/{types/members → members}/collection.d.ts +0 -0
  440. /package/dist/{types/members → members}/index.d.ts +0 -0
  441. /package/dist/{types/members → members}/request.d.ts +0 -0
  442. /package/dist/{types/metrics → metrics}/index.d.ts +0 -0
  443. /package/dist/{types/multistream → multistream}/mediaRequestManager.d.ts +0 -0
  444. /package/dist/{types/multistream → multistream}/receiveSlot.d.ts +0 -0
  445. /package/dist/{types/multistream → multistream}/receiveSlotManager.d.ts +0 -0
  446. /package/dist/{types/multistream → multistream}/remoteMedia.d.ts +0 -0
  447. /package/dist/{types/multistream → multistream}/remoteMediaGroup.d.ts +0 -0
  448. /package/dist/{types/multistream → multistream}/remoteMediaManager.d.ts +0 -0
  449. /package/dist/{types/multistream → multistream}/sendSlotManager.d.ts +0 -0
  450. /package/dist/{types/networkQualityMonitor → networkQualityMonitor}/index.d.ts +0 -0
  451. /package/dist/{types/personal-meeting-room → personal-meeting-room}/index.d.ts +0 -0
  452. /package/dist/{types/personal-meeting-room → personal-meeting-room}/request.d.ts +0 -0
  453. /package/dist/{types/personal-meeting-room → personal-meeting-room}/util.d.ts +0 -0
  454. /package/dist/{types/reachability → reachability}/request.d.ts +0 -0
  455. /package/dist/{types/reactions → reactions}/constants.d.ts +0 -0
  456. /package/dist/{types/reactions → reactions}/reactions.d.ts +0 -0
  457. /package/dist/{types/reactions → reactions}/reactions.type.d.ts +0 -0
  458. /package/dist/{types/recording-controller → recording-controller}/enums.d.ts +0 -0
  459. /package/dist/{types/recording-controller → recording-controller}/index.d.ts +0 -0
  460. /package/dist/{types/recording-controller → recording-controller}/util.d.ts +0 -0
  461. /package/dist/{types/roap → roap}/request.d.ts +0 -0
  462. /package/dist/{types/rtcMetrics → rtcMetrics}/constants.d.ts +0 -0
  463. /package/dist/{types/statsAnalyzer → statsAnalyzer}/global.d.ts +0 -0
  464. /package/dist/{types/transcription → transcription}/index.d.ts +0 -0
  465. /package/test/unit/spec/locus-info/{selfConstant.js → lib/selfConstant.js} +0 -0
@@ -1,12 +1,13 @@
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, {ICECandidateResult} from '@webex/plugin-meetings/src/reachability/';
4
+ import Reachability, {ReachabilityResults, ReachabilityResultsForBackend} from '@webex/plugin-meetings/src/reachability/';
5
5
  import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
6
+ import * as ClusterReachabilityModule from '@webex/plugin-meetings/src/reachability/clusterReachability';
6
7
 
7
8
  import { IP_VERSION } from '@webex/plugin-meetings/src/constants';
8
9
 
9
- describe('isAnyClusterReachable', () => {
10
+ describe('isAnyPublicClusterReachable', () => {
10
11
  let webex;
11
12
 
12
13
  beforeEach(() => {
@@ -29,25 +30,25 @@ describe('isAnyClusterReachable', () => {
29
30
  }
30
31
  const reachability = new Reachability(webex);
31
32
 
32
- const result = await reachability.isAnyClusterReachable();
33
+ const result = await reachability.isAnyPublicClusterReachable();
33
34
 
34
35
  assert.equal(result, expectedValue);
35
36
  };
36
37
 
37
38
  it('returns true when udp is reachable', async () => {
38
- await checkIsClusterReachable({x: {udp: {reachable: 'true'}, tcp: {reachable: 'false'}}}, true);
39
+ await checkIsClusterReachable({x: {udp: {result: 'reachable'}, tcp: {result: 'unreachable'}}}, true);
39
40
  });
40
41
 
41
42
  it('returns true when tcp is reachable', async () => {
42
- await checkIsClusterReachable({x: {udp: {reachable: 'false'}, tcp: {reachable: 'true'}}}, true);
43
+ await checkIsClusterReachable({x: {udp: {result: 'unreachable'}, tcp: {result: 'reachable'}}}, true);
43
44
  });
44
45
 
45
46
  it('returns true when both tcp and udp are reachable', async () => {
46
- await checkIsClusterReachable({x: {udp: {reachable: 'true'}, tcp: {reachable: 'true'}}}, true);
47
+ await checkIsClusterReachable({x: {udp: {result: 'reachable'}, tcp: {result: 'reachable'}}}, true);
47
48
  });
48
49
 
49
50
  it('returns false when both tcp and udp are unreachable', async () => {
50
- await checkIsClusterReachable({x: {udp: {reachable: 'false'}, tcp: {reachable: 'false'}}}, false);
51
+ await checkIsClusterReachable({x: {udp: {result: 'unreachable'}, tcp: {result: 'unreachable'}}}, false);
51
52
  });
52
53
 
53
54
  it('returns false when reachability result is empty', async () => {
@@ -57,6 +58,63 @@ describe('isAnyClusterReachable', () => {
57
58
  it('returns false when reachability.result item is not there', async () => {
58
59
  await checkIsClusterReachable(undefined, false);
59
60
  });
61
+
62
+ describe('ignores video mesh reachability', () => {
63
+ it('returns false if there are no public cluster results, only video mesh', async () => {
64
+ await checkIsClusterReachable({
65
+ x: {
66
+ udp: {result: 'reachable'},
67
+ tcp: {result: 'reachable'},
68
+ isVideoMesh: true,
69
+ },
70
+ y: {
71
+ udp: {result: 'unreachable'},
72
+ tcp: {result: 'reachable'},
73
+ isVideoMesh: true,
74
+ }
75
+ }, false);
76
+ });
77
+
78
+ it('returns false if there public cluster reachability failed, only video mesh succeeded', async () => {
79
+ await checkIsClusterReachable({
80
+ x: {
81
+ udp: {result: 'unreachable'},
82
+ tcp: {result: 'reachable'},
83
+ isVideoMesh: true,
84
+ },
85
+ y: {
86
+ udp: {result: 'reachable'},
87
+ tcp: {result: 'unreachable'},
88
+ isVideoMesh: true,
89
+ },
90
+ publicOne: {
91
+ udp: {result: 'unreachable'},
92
+ tcp: {result: 'unreachable'},
93
+ isVideoMesh: false,
94
+ }
95
+ }, false);
96
+ });
97
+
98
+ it('returns true if there is at least 1 public cluster result, while video mesh is not reachable', async () => {
99
+ await checkIsClusterReachable({
100
+ x: {
101
+ udp: {result: 'reachable'},
102
+ tcp: {result: 'reachable'},
103
+ isVideoMesh: true,
104
+ },
105
+ y: {
106
+ udp: {result: 'unreachable'},
107
+ tcp: {result: 'reachable'},
108
+ isVideoMesh: true,
109
+ },
110
+ publicOne: {
111
+ udp: {result: 'unreachable'},
112
+ tcp: {result: 'reachable'},
113
+ isVideoMesh: false,
114
+ }
115
+ }, true);
116
+ });
117
+ })
60
118
  });
61
119
 
62
120
  describe('gatherReachability', () => {
@@ -70,6 +128,15 @@ describe('gatherReachability', () => {
70
128
  'reachability.result',
71
129
  JSON.stringify({old: 'results'})
72
130
  );
131
+ await webex.boundedStorage.put(
132
+ 'Reachability',
133
+ 'reachability.joinCookie',
134
+ JSON.stringify({old: 'joinCookie'})
135
+ );
136
+ });
137
+
138
+ afterEach(() => {
139
+ sinon.restore();
73
140
  });
74
141
 
75
142
  it('stores the reachability', async () => {
@@ -88,7 +155,7 @@ describe('gatherReachability', () => {
88
155
  };
89
156
 
90
157
  reachability.reachabilityRequest.getClusters = sinon.stub().returns(getClustersResult);
91
- (reachability as any).performReachabilityCheck = sinon.stub().returns(reachabilityResults);
158
+ (reachability as any).performReachabilityChecks = sinon.stub().returns(reachabilityResults);
92
159
 
93
160
  const result = await reachability.gatherReachability();
94
161
 
@@ -107,156 +174,459 @@ describe('gatherReachability', () => {
107
174
  assert.equal(JSON.stringify(getClustersResult.joinCookie), storedResultForJoinCookie);
108
175
  });
109
176
 
110
- it('does reachability only on udp', async () => {
177
+ it('keeps the stored reachability from previous call to gatherReachability if getClusters fails', async () => {
111
178
  const reachability = new Reachability(webex);
112
179
 
180
+ const reachabilityResults = {
181
+ clusters: {
182
+ clusterId: {
183
+ udp: 'testUDP',
184
+ },
185
+ },
186
+ };
113
187
  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
- }},
188
+ clusters: {clusterId: 'cluster'},
128
189
  joinCookie: {id: 'id'},
129
190
  };
130
191
 
131
- sinon.stub(reachability.reachabilityRequest, 'getClusters').returns(getClustersResult);
192
+ reachability.reachabilityRequest.getClusters = sinon.stub().throws();
132
193
 
133
- const createPeerConnectionStub = sinon.stub(reachability, 'createPeerConnection');
194
+ const result = await reachability.gatherReachability();
134
195
 
135
- await reachability.gatherReachability();
196
+ assert.empty(result);
136
197
 
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
- })
198
+ const storedResultForReachabilityResult = await webex.boundedStorage.get(
199
+ 'Reachability',
200
+ 'reachability.result'
201
+ );
202
+ const storedResultForJoinCookie = await webex.boundedStorage.get(
203
+ 'Reachability',
204
+ 'reachability.joinCookie'
205
+ );
206
+
207
+ assert.equal(JSON.stringify({old: 'results'}), storedResultForReachabilityResult);
208
+ assert.equal(JSON.stringify({old: 'joinCookie'}), storedResultForJoinCookie);
157
209
  });
158
210
 
159
- describe('clientMediaIPs', () => {
160
- let testingClass: TestReachability;
211
+ it('keeps the stored reachability from previous call to gatherReachability if performReachabilityChecks fails', async () => {
212
+ const reachability = new Reachability(webex);
161
213
 
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
- });
214
+ const reachabilityResults = {
215
+ clusters: {
216
+ clusterId: {
217
+ udp: 'testUDP',
218
+ },
219
+ },
220
+ };
221
+ const getClustersResult = {
222
+ clusters: {clusterId: 'cluster'},
223
+ joinCookie: {id: 'id'},
224
+ };
173
225
 
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
- });
226
+ reachability.reachabilityRequest.getClusters = sinon.stub().returns(getClustersResult);
227
+ (reachability as any).performReachabilityChecks = sinon.stub().throws();
221
228
 
222
- it('calls addPublicIP correctly with no existing public APIs', () => {
223
- const peerConnection = {
224
- connectionState: 'not_closed',
225
- };
229
+ const result = await reachability.gatherReachability();
226
230
 
227
- testingClass.testAddPublicIP(peerConnection as RTCPeerConnection, '1.1.1.1');
231
+ assert.empty(result);
228
232
 
229
- assert.deepEqual(peerConnection, {
230
- connectionState: 'not_closed',
231
- publicIPs: ['1.1.1.1'],
232
- });
233
- });
233
+ const storedResultForReachabilityResult = await webex.boundedStorage.get(
234
+ 'Reachability',
235
+ 'reachability.result'
236
+ );
237
+ const storedResultForJoinCookie = await webex.boundedStorage.get(
238
+ 'Reachability',
239
+ 'reachability.joinCookie'
240
+ );
241
+
242
+ assert.equal(JSON.stringify({old: 'results'}), storedResultForReachabilityResult);
243
+ assert.equal(JSON.stringify({old: 'joinCookie'}), storedResultForJoinCookie);
244
+ });
245
+
246
+ it('starts ClusterReachability on each media cluster', async () => {
247
+ webex.config.meetings.experimental = {enableTcpReachability: true};
248
+
249
+ const getClustersResult = {
250
+ clusters: {
251
+ 'cluster 1': {
252
+ udp: ['udp1.1', 'udp1.2'],
253
+ tcp: ['tcp1.1', 'tcp1.2'],
254
+ xtls: ['xtls1.1', 'xtls1.2'],
255
+ isVideoMesh: false,
256
+ },
257
+ 'cluster 2': {
258
+ udp: ['udp2.1', 'udp2.2'],
259
+ tcp: ['tcp2.1', 'tcp2.2'],
260
+ xtls: ['xtls2.1', 'xtls2.2'],
261
+ isVideoMesh: true,
262
+ },
263
+ },
264
+ joinCookie: {id: 'id'},
265
+ };
234
266
 
235
- it('calls addPublicIP correctly with existing public APIs', () => {
236
- const peerConnection = {
237
- connectionState: 'not_closed',
238
- publicIPs: ['2.2.2.2'],
239
- };
267
+ const reachability = new Reachability(webex);
240
268
 
241
- testingClass.testAddPublicIP(peerConnection as any, '1.1.1.1');
269
+ reachability.reachabilityRequest.getClusters = sinon.stub().returns(getClustersResult);
270
+
271
+ const startStub = sinon.stub().resolves({});
272
+ const clusterReachabilityCtorStub = sinon
273
+ .stub(ClusterReachabilityModule, 'ClusterReachability')
274
+ .callsFake(() => ({
275
+ start: startStub,
276
+ }));
277
+
278
+ await reachability.gatherReachability();
242
279
 
243
- assert.deepEqual(peerConnection, {
244
- connectionState: 'not_closed',
245
- publicIPs: ['2.2.2.2', '1.1.1.1'],
246
- });
280
+ assert.calledTwice(clusterReachabilityCtorStub);
281
+ assert.calledWith(clusterReachabilityCtorStub, 'cluster 1', {
282
+ udp: ['udp1.1', 'udp1.2'],
283
+ tcp: ['tcp1.1', 'tcp1.2'],
284
+ xtls: ['xtls1.1', 'xtls1.2'],
285
+ isVideoMesh: false,
286
+ });
287
+ // cluster 2 is video mesh, so we should not do TCP reachability on it
288
+ assert.calledWith(clusterReachabilityCtorStub, 'cluster 2', {
289
+ udp: ['udp2.1', 'udp2.2'],
290
+ tcp: [],
291
+ xtls: ['xtls2.1', 'xtls2.2'],
292
+ isVideoMesh: true,
247
293
  });
248
294
 
249
- it('calls addPublicIP correctly null publicAPI', () => {
250
- const peerConnection = {
251
- connectionState: 'not_closed',
252
- };
295
+ assert.calledTwice(startStub);
296
+ });
253
297
 
254
- testingClass.testAddPublicIP(peerConnection as RTCPeerConnection, null);
298
+ it('does not do TCP reachability if it is disabled in config', async () => {
299
+ webex.config.meetings.experimental = {enableTcpReachability: false};
255
300
 
256
- assert.deepEqual(peerConnection, {
257
- connectionState: 'not_closed',
258
- publicIPs: null,
259
- });
301
+ const getClustersResult = {
302
+ clusters: {
303
+ 'cluster name': {
304
+ udp: ['testUDP1', 'testUDP2'],
305
+ tcp: ['testTCP1', 'testTCP2'],
306
+ xtls: ['testXTLS1', 'testXTLS2'],
307
+ isVideoMesh: false,
308
+ },
309
+ },
310
+ joinCookie: {id: 'id'},
311
+ };
312
+
313
+ const reachability = new Reachability(webex);
314
+
315
+ reachability.reachabilityRequest.getClusters = sinon.stub().returns(getClustersResult);
316
+
317
+ const clusterReachabilityCtorStub = sinon
318
+ .stub(ClusterReachabilityModule, 'ClusterReachability')
319
+ .callsFake(() => ({
320
+ start: sinon.stub().resolves({}),
321
+ }));
322
+
323
+ await reachability.gatherReachability();
324
+
325
+ assert.calledOnceWithExactly(clusterReachabilityCtorStub, 'cluster name', {
326
+ isVideoMesh: false,
327
+ udp: ['testUDP1', 'testUDP2'],
328
+ tcp: [], // empty list because TCP is disabled in config
329
+ xtls: ['testXTLS1', 'testXTLS2'],
260
330
  });
261
331
  });
262
332
  });
333
+
334
+ describe('getReachabilityResults', () => {
335
+ let webex;
336
+
337
+ beforeEach(() => {
338
+ webex = new MockWebex();
339
+ });
340
+
341
+ afterEach(() => {
342
+ sinon.restore();
343
+ });
344
+
345
+ const runCheck = async (mockStorage: any, expectedResult: ReachabilityResultsForBackend) => {
346
+ if (mockStorage) {
347
+ await webex.boundedStorage.put(
348
+ 'Reachability',
349
+ 'reachability.result',
350
+ JSON.stringify(mockStorage)
351
+ );
352
+ }
353
+ const reachability = new Reachability(webex);
354
+
355
+ const result = await reachability.getReachabilityResults();
356
+
357
+ assert.deepEqual(result, expectedResult);
358
+ };
359
+
360
+ it('returns undefined if reading from local storage fails', async () => {
361
+ sinon.stub(webex.boundedStorage, 'get').rejects(new Error('fake error'));
362
+
363
+ const reachability = new Reachability(webex);
364
+
365
+ const result = await reachability.getReachabilityResults();
366
+
367
+ assert.isUndefined(result);
368
+ });
369
+
370
+ it('returns results from local storage, converted to the backend data format', async () => {
371
+ await runCheck(
372
+ // mock storage:
373
+ {
374
+ cluster1: {
375
+ udp: {result: 'reachable', latencyInMilliseconds: 100},
376
+ tcp: {result: 'unreachable'},
377
+ xtls: {result: 'untested'},
378
+ },
379
+ cluster2: {
380
+ udp: {result: 'reachable', latencyInMilliseconds: 200},
381
+ tcp: {result: 'unreachable'},
382
+ xtls: {result: 'untested'},
383
+ isVideoMesh: true,
384
+ },
385
+ cluster3: {
386
+ udp: {result: 'unreachable'},
387
+ tcp: {result: 'reachable', latencyInMilliseconds: 100, clientMediaIPs: ['10.10.10.10']},
388
+ xtls: {result: 'untested'},
389
+ isVideoMesh: true,
390
+ someOtherField: 'any value',
391
+ },
392
+ cluster4: {
393
+ udp: {result: 'reachable', latencyInMilliseconds: 300},
394
+ tcp: {result: 'untested'},
395
+ xtls: {result: 'untested'},
396
+ someOtherField: 'any value',
397
+ },
398
+ },
399
+ // expected result (same as above, but with values converted and isVideoMesh and someOtherField stripped out):
400
+ {
401
+ cluster1: {
402
+ udp: {reachable: 'true', latencyInMilliseconds: '100'},
403
+ tcp: {reachable: 'false'},
404
+ xtls: {untested: 'true'},
405
+ },
406
+ cluster2: {
407
+ udp: {reachable: 'true', latencyInMilliseconds: '200'},
408
+ tcp: {reachable: 'false'},
409
+ xtls: {untested: 'true'},
410
+ },
411
+ cluster3: {
412
+ udp: {reachable: 'false'},
413
+ tcp: {reachable: 'true', latencyInMilliseconds: '100', clientMediaIPs: ['10.10.10.10']},
414
+ xtls: {untested: 'true'},
415
+ },
416
+ cluster4: {
417
+ udp: {reachable: 'true', latencyInMilliseconds: '300'},
418
+ tcp: {untested: 'true'},
419
+ xtls: {untested: 'true'},
420
+ },
421
+ }
422
+ );
423
+ });
424
+ });
425
+
426
+ describe('getReachabilityMetrics', () => {
427
+ let webex;
428
+
429
+ beforeEach(() => {
430
+ webex = new MockWebex();
431
+ });
432
+
433
+ afterEach(() => {
434
+ sinon.restore();
435
+ });
436
+
437
+ const runCheck = async (mockStorage: any, expectedResult: any) => {
438
+ if (mockStorage) {
439
+ await webex.boundedStorage.put(
440
+ 'Reachability',
441
+ 'reachability.result',
442
+ JSON.stringify(mockStorage)
443
+ );
444
+ }
445
+ const reachability = new Reachability(webex);
446
+ const result = await reachability.getReachabilityMetrics();
447
+
448
+ assert.deepEqual(result, expectedResult);
449
+ };
450
+
451
+ it('returns all zeros if reading from local storage fails', async () => {
452
+ sinon.stub(webex.boundedStorage, 'get').rejects(new Error('fake error'));
453
+
454
+ const reachability = new Reachability(webex);
455
+
456
+ const result = await reachability.getReachabilityMetrics();
457
+
458
+ assert.deepEqual(result, {
459
+ reachability_public_udp_success: 0,
460
+ reachability_public_udp_failed: 0,
461
+ reachability_public_tcp_success: 0,
462
+ reachability_public_tcp_failed: 0,
463
+ reachability_vmn_udp_success: 0,
464
+ reachability_vmn_udp_failed: 0,
465
+ reachability_vmn_tcp_success: 0,
466
+ reachability_vmn_tcp_failed: 0,
467
+ });
468
+ });
469
+
470
+ it('returns correct stats based on local storage results', async () => {
471
+ await runCheck(
472
+ // mock storage:
473
+ {
474
+ public1: {
475
+ udp: {result: 'reachable', latencyInMilliseconds: 100},
476
+ tcp: {result: 'untested'},
477
+ xtls: {result: 'untested'},
478
+ },
479
+ vmn1: {
480
+ udp: {result: 'reachable', latencyInMilliseconds: 200},
481
+ tcp: {result: 'unreachable'},
482
+ xtls: {result: 'untested'},
483
+ isVideoMesh: true,
484
+ },
485
+ vmn2: {
486
+ udp: {result: 'untested'},
487
+ tcp: {result: 'reachable', latencyInMilliseconds: 100, clientMediaIPs: ['10.10.10.10']},
488
+ xtls: {result: 'untested'},
489
+ isVideoMesh: true,
490
+ someOtherField: 'any value',
491
+ },
492
+ public2: {
493
+ udp: {result: 'unreachable'},
494
+ tcp: {result: 'unreachable'},
495
+ xtls: {result: 'untested'},
496
+ someOtherField: 'any value',
497
+ },
498
+ public3: {
499
+ udp: {result: 'reachable', latencyInMilliseconds: 400, clientMediaIPs: ['10.10.10.10']},
500
+ tcp: {result: 'reachable', latencyInMilliseconds: 100, clientMediaIPs: ['10.10.10.10']},
501
+ xtls: {result: 'untested'},
502
+ isVideoMesh: false,
503
+ someOtherField: 'any value',
504
+ },
505
+ public4: {
506
+ udp: {result: 'reachable', latencyInMilliseconds: 40, clientMediaIPs: ['10.10.10.11']},
507
+ tcp: {result: 'reachable', latencyInMilliseconds: 100, clientMediaIPs: ['10.10.10.11']},
508
+ xtls: {result: 'untested'},
509
+ isVideoMesh: false,
510
+ someOtherField: 'any value',
511
+ },
512
+ public5: {
513
+ udp: {result: 'unreachable'},
514
+ tcp: {result: 'untested'},
515
+ xtls: {result: 'untested'},
516
+ isVideoMesh: false,
517
+ someOtherField: 'any value',
518
+ },
519
+ },
520
+ // expected result:
521
+ {
522
+ reachability_public_udp_success: 3,
523
+ reachability_public_udp_failed: 2,
524
+ reachability_public_tcp_success: 2,
525
+ reachability_public_tcp_failed: 1,
526
+ reachability_vmn_udp_success: 1,
527
+ reachability_vmn_udp_failed: 0,
528
+ reachability_vmn_tcp_success: 1,
529
+ reachability_vmn_tcp_failed: 1,
530
+ }
531
+ );
532
+ });
533
+
534
+ it('returns correct stats when only public nodes were tested', async () => {
535
+ await runCheck(
536
+ // mock storage:
537
+ {
538
+ public1: {
539
+ udp: {result: 'reachable', latencyInMilliseconds: 400, clientMediaIPs: ['10.10.10.10']},
540
+ tcp: {result: 'reachable', latencyInMilliseconds: 100, clientMediaIPs: ['10.10.10.10']},
541
+ xtls: {result: 'untested'},
542
+ isVideoMesh: false,
543
+ },
544
+ public2: {
545
+ udp: {result: 'reachable', latencyInMilliseconds: 100},
546
+ tcp: {result: 'untested'},
547
+ xtls: {result: 'untested'},
548
+ },
549
+ public3: {
550
+ udp: {result: 'unreachable'},
551
+ tcp: {result: 'unreachable'},
552
+ xtls: {result: 'untested'},
553
+ someOtherField: 'any value',
554
+ },
555
+ public4: {
556
+ udp: {result: 'untested'},
557
+ tcp: {result: 'unreachable'},
558
+ xtls: {result: 'untested'},
559
+ isVideoMesh: false,
560
+ someOtherField: 'any value',
561
+ },
562
+ public5: {
563
+ udp: {result: 'reachable', latencyInMilliseconds: '400', clientMediaIPs: ['10.10.10.10']},
564
+ tcp: {result: 'untested'},
565
+ xtls: {result: 'untested'},
566
+ },
567
+ },
568
+ // expected result:
569
+ {
570
+ reachability_public_udp_success: 3,
571
+ reachability_public_udp_failed: 1,
572
+ reachability_public_tcp_success: 1,
573
+ reachability_public_tcp_failed: 2,
574
+ reachability_vmn_udp_success: 0,
575
+ reachability_vmn_udp_failed: 0,
576
+ reachability_vmn_tcp_success: 0,
577
+ reachability_vmn_tcp_failed: 0,
578
+ }
579
+ );
580
+ });
581
+
582
+ it('returns correct stats when only video mesh nodes were tested', async () => {
583
+ await runCheck(
584
+ // mock storage:
585
+ {
586
+ vmn1: {
587
+ udp: {result: 'unreachable'},
588
+ tcp: {result: 'reachable', latencyInMilliseconds: 100, clientMediaIPs: ['10.10.10.10']},
589
+ xtls: {result: 'untested'},
590
+ isVideoMesh: true,
591
+ },
592
+ vmn2: {
593
+ udp: {result: 'reachable', latencyInMilliseconds: 200, clientMediaIPs: ['10.10.10.10']},
594
+ tcp: {result: 'untested'},
595
+ xtls: {result: 'untested'},
596
+ isVideoMesh: true,
597
+ },
598
+ vmn3: {
599
+ udp: {result: 'reachable', latencyInMilliseconds: 300, clientMediaIPs: ['10.10.10.10']},
600
+ tcp: {result: 'unreachable'},
601
+ xtls: {result: 'untested'},
602
+ isVideoMesh: true,
603
+ },
604
+ vmn4: {
605
+ udp: {result: 'untested'},
606
+ tcp: {result: 'unreachable'},
607
+ xtls: {result: 'untested'},
608
+ isVideoMesh: true,
609
+ someOtherField: 'any value',
610
+ },
611
+ vmn5: {
612
+ udp: {result: 'reachable', latencyInMilliseconds: 200, clientMediaIPs: ['10.10.10.10']},
613
+ tcp: {result: 'unreachable'},
614
+ xtls: {result: 'untested'},
615
+ isVideoMesh: true,
616
+ someOtherField: 'any value',
617
+ },
618
+ },
619
+ // expected result:
620
+ {
621
+ reachability_public_udp_success: 0,
622
+ reachability_public_udp_failed: 0,
623
+ reachability_public_tcp_success: 0,
624
+ reachability_public_tcp_failed: 0,
625
+ reachability_vmn_udp_success: 3,
626
+ reachability_vmn_udp_failed: 1,
627
+ reachability_vmn_tcp_success: 1,
628
+ reachability_vmn_tcp_failed: 3,
629
+ }
630
+ );
631
+ });
632
+ });