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