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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +41 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +357 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +215 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +22 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +51 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +44 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1047 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +77 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +64 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/browser-detection.js +1 -2
  23. package/dist/common/browser-detection.js.map +1 -1
  24. package/dist/common/collection.js +1 -2
  25. package/dist/common/collection.js.map +1 -1
  26. package/dist/common/config.js +1 -2
  27. package/dist/common/config.js.map +1 -1
  28. package/dist/common/errors/captcha-error.js +1 -2
  29. package/dist/common/errors/captcha-error.js.map +1 -1
  30. package/dist/common/errors/intent-to-join.js +1 -2
  31. package/dist/common/errors/intent-to-join.js.map +1 -1
  32. package/dist/common/errors/join-meeting.js +1 -2
  33. package/dist/common/errors/join-meeting.js.map +1 -1
  34. package/dist/common/errors/media.js +1 -2
  35. package/dist/common/errors/media.js.map +1 -1
  36. package/dist/common/errors/no-meeting-info.js +50 -0
  37. package/dist/common/errors/no-meeting-info.js.map +1 -0
  38. package/dist/common/errors/parameter.js +3 -4
  39. package/dist/common/errors/parameter.js.map +1 -1
  40. package/dist/common/errors/password-error.js +1 -2
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +1 -2
  43. package/dist/common/errors/permission.js.map +1 -1
  44. package/dist/common/errors/reclaim-host-role-errors.js +154 -0
  45. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  46. package/dist/common/errors/reconnection-in-progress.js +1 -2
  47. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  48. package/dist/common/errors/reconnection.js +1 -2
  49. package/dist/common/errors/reconnection.js.map +1 -1
  50. package/dist/common/errors/stats.js +1 -2
  51. package/dist/common/errors/stats.js.map +1 -1
  52. package/dist/common/errors/webex-errors.js +48 -28
  53. package/dist/common/errors/webex-errors.js.map +1 -1
  54. package/dist/common/errors/webex-meetings-error.js +1 -2
  55. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  56. package/dist/common/events/events-scope.js +1 -2
  57. package/dist/common/events/events-scope.js.map +1 -1
  58. package/dist/common/events/events.js +1 -2
  59. package/dist/common/events/events.js.map +1 -1
  60. package/dist/common/events/trigger-proxy.js +1 -2
  61. package/dist/common/events/trigger-proxy.js.map +1 -1
  62. package/dist/common/events/util.js +1 -2
  63. package/dist/common/events/util.js.map +1 -1
  64. package/dist/common/logs/logger-config.js +1 -2
  65. package/dist/common/logs/logger-config.js.map +1 -1
  66. package/dist/common/logs/logger-proxy.js +2 -3
  67. package/dist/common/logs/logger-proxy.js.map +1 -1
  68. package/dist/common/logs/request.js +8 -5
  69. package/dist/common/logs/request.js.map +1 -1
  70. package/dist/common/queue.js +22 -9
  71. package/dist/common/queue.js.map +1 -1
  72. package/dist/config.js +9 -12
  73. package/dist/config.js.map +1 -1
  74. package/dist/constants.js +437 -433
  75. package/dist/constants.js.map +1 -1
  76. package/dist/controls-options-manager/constants.js +3 -6
  77. package/dist/controls-options-manager/constants.js.map +1 -1
  78. package/dist/controls-options-manager/enums.js +14 -6
  79. package/dist/controls-options-manager/enums.js.map +1 -1
  80. package/dist/controls-options-manager/index.js +126 -37
  81. package/dist/controls-options-manager/index.js.map +1 -1
  82. package/dist/controls-options-manager/types.js +7 -0
  83. package/dist/controls-options-manager/types.js.map +1 -0
  84. package/dist/controls-options-manager/util.js +309 -19
  85. package/dist/controls-options-manager/util.js.map +1 -1
  86. package/dist/index.js +116 -4
  87. package/dist/index.js.map +1 -1
  88. package/dist/interpretation/collection.js +22 -0
  89. package/dist/interpretation/collection.js.map +1 -0
  90. package/dist/interpretation/index.js +365 -0
  91. package/dist/interpretation/index.js.map +1 -0
  92. package/dist/interpretation/siLanguage.js +24 -0
  93. package/dist/interpretation/siLanguage.js.map +1 -0
  94. package/dist/locus-info/controlsUtils.js +95 -6
  95. package/dist/locus-info/controlsUtils.js.map +1 -1
  96. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  97. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  98. package/dist/locus-info/fullState.js +1 -2
  99. package/dist/locus-info/fullState.js.map +1 -1
  100. package/dist/locus-info/hostUtils.js +1 -2
  101. package/dist/locus-info/hostUtils.js.map +1 -1
  102. package/dist/locus-info/index.js +408 -67
  103. package/dist/locus-info/index.js.map +1 -1
  104. package/dist/locus-info/infoUtils.js +13 -5
  105. package/dist/locus-info/infoUtils.js.map +1 -1
  106. package/dist/locus-info/mediaSharesUtils.js +58 -3
  107. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  108. package/dist/locus-info/parser.js +251 -78
  109. package/dist/locus-info/parser.js.map +1 -1
  110. package/dist/locus-info/selfUtils.js +97 -13
  111. package/dist/locus-info/selfUtils.js.map +1 -1
  112. package/dist/media/index.js +106 -319
  113. package/dist/media/index.js.map +1 -1
  114. package/dist/media/properties.js +96 -153
  115. package/dist/media/properties.js.map +1 -1
  116. package/dist/media/util.js +1 -22
  117. package/dist/media/util.js.map +1 -1
  118. package/dist/mediaQualityMetrics/config.js +498 -493
  119. package/dist/mediaQualityMetrics/config.js.map +1 -1
  120. package/dist/meeting/in-meeting-actions.js +90 -3
  121. package/dist/meeting/in-meeting-actions.js.map +1 -1
  122. package/dist/meeting/index.js +4579 -2951
  123. package/dist/meeting/index.js.map +1 -1
  124. package/dist/meeting/locusMediaRequest.js +291 -0
  125. package/dist/meeting/locusMediaRequest.js.map +1 -0
  126. package/dist/meeting/muteState.js +224 -133
  127. package/dist/meeting/muteState.js.map +1 -1
  128. package/dist/meeting/request.js +295 -197
  129. package/dist/meeting/request.js.map +1 -1
  130. package/dist/meeting/request.type.js +7 -0
  131. package/dist/meeting/request.type.js.map +1 -0
  132. package/dist/meeting/state.js +1 -2
  133. package/dist/meeting/state.js.map +1 -1
  134. package/dist/meeting/util.js +602 -432
  135. package/dist/meeting/util.js.map +1 -1
  136. package/dist/meeting-info/collection.js +1 -2
  137. package/dist/meeting-info/collection.js.map +1 -1
  138. package/dist/meeting-info/index.js +74 -7
  139. package/dist/meeting-info/index.js.map +1 -1
  140. package/dist/meeting-info/meeting-info-v2.js +197 -63
  141. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  142. package/dist/meeting-info/request.js +1 -2
  143. package/dist/meeting-info/request.js.map +1 -1
  144. package/dist/meeting-info/util.js +2 -3
  145. package/dist/meeting-info/util.js.map +1 -1
  146. package/dist/meeting-info/utilv2.js +25 -12
  147. package/dist/meeting-info/utilv2.js.map +1 -1
  148. package/dist/meetings/collection.js +23 -2
  149. package/dist/meetings/collection.js.map +1 -1
  150. package/dist/meetings/index.js +464 -123
  151. package/dist/meetings/index.js.map +1 -1
  152. package/dist/meetings/meetings.types.js +7 -0
  153. package/dist/meetings/meetings.types.js.map +1 -0
  154. package/dist/meetings/request.js +4 -3
  155. package/dist/meetings/request.js.map +1 -1
  156. package/dist/meetings/util.js +107 -6
  157. package/dist/meetings/util.js.map +1 -1
  158. package/dist/member/index.js +54 -2
  159. package/dist/member/index.js.map +1 -1
  160. package/dist/member/member.types.js +3 -4
  161. package/dist/member/member.types.js.map +1 -1
  162. package/dist/member/types.js +23 -0
  163. package/dist/member/types.js.map +1 -0
  164. package/dist/member/util.js +131 -29
  165. package/dist/member/util.js.map +1 -1
  166. package/dist/members/collection.js +11 -2
  167. package/dist/members/collection.js.map +1 -1
  168. package/dist/members/index.js +172 -8
  169. package/dist/members/index.js.map +1 -1
  170. package/dist/members/request.js +108 -41
  171. package/dist/members/request.js.map +1 -1
  172. package/dist/members/types.js +14 -0
  173. package/dist/members/types.js.map +1 -0
  174. package/dist/members/util.js +327 -234
  175. package/dist/members/util.js.map +1 -1
  176. package/dist/metrics/constants.js +14 -7
  177. package/dist/metrics/constants.js.map +1 -1
  178. package/dist/metrics/index.js +4 -452
  179. package/dist/metrics/index.js.map +1 -1
  180. package/dist/multistream/mediaRequestManager.js +344 -0
  181. package/dist/multistream/mediaRequestManager.js.map +1 -0
  182. package/dist/multistream/receiveSlot.js +200 -0
  183. package/dist/multistream/receiveSlot.js.map +1 -0
  184. package/dist/multistream/receiveSlotManager.js +174 -0
  185. package/dist/multistream/receiveSlotManager.js.map +1 -0
  186. package/dist/multistream/remoteMedia.js +268 -0
  187. package/dist/multistream/remoteMedia.js.map +1 -0
  188. package/dist/multistream/remoteMediaGroup.js +267 -0
  189. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  190. package/dist/multistream/remoteMediaManager.js +1211 -0
  191. package/dist/multistream/remoteMediaManager.js.map +1 -0
  192. package/dist/multistream/sendSlotManager.js +236 -0
  193. package/dist/multistream/sendSlotManager.js.map +1 -0
  194. package/dist/networkQualityMonitor/index.js +5 -4
  195. package/dist/networkQualityMonitor/index.js.map +1 -1
  196. package/dist/personal-meeting-room/index.js +2 -3
  197. package/dist/personal-meeting-room/index.js.map +1 -1
  198. package/dist/personal-meeting-room/request.js +2 -3
  199. package/dist/personal-meeting-room/request.js.map +1 -1
  200. package/dist/personal-meeting-room/util.js +1 -2
  201. package/dist/personal-meeting-room/util.js.map +1 -1
  202. package/dist/reachability/index.js +258 -72
  203. package/dist/reachability/index.js.map +1 -1
  204. package/dist/reachability/request.js +18 -10
  205. package/dist/reachability/request.js.map +1 -1
  206. package/dist/reactions/constants.js +12 -0
  207. package/dist/reactions/constants.js.map +1 -0
  208. package/dist/reactions/reactions.js +4 -6
  209. package/dist/reactions/reactions.js.map +1 -1
  210. package/dist/reactions/reactions.type.js +21 -23
  211. package/dist/reactions/reactions.type.js.map +1 -1
  212. package/dist/reconnection-manager/index.js +272 -220
  213. package/dist/reconnection-manager/index.js.map +1 -1
  214. package/dist/recording-controller/enums.js +4 -5
  215. package/dist/recording-controller/enums.js.map +1 -1
  216. package/dist/recording-controller/index.js +57 -46
  217. package/dist/recording-controller/index.js.map +1 -1
  218. package/dist/recording-controller/util.js +10 -10
  219. package/dist/recording-controller/util.js.map +1 -1
  220. package/dist/roap/index.js +101 -235
  221. package/dist/roap/index.js.map +1 -1
  222. package/dist/roap/request.js +126 -180
  223. package/dist/roap/request.js.map +1 -1
  224. package/dist/roap/turnDiscovery.js +115 -105
  225. package/dist/roap/turnDiscovery.js.map +1 -1
  226. package/dist/rtcMetrics/constants.js +11 -0
  227. package/dist/rtcMetrics/constants.js.map +1 -0
  228. package/dist/rtcMetrics/index.js +115 -0
  229. package/dist/rtcMetrics/index.js.map +1 -0
  230. package/dist/statsAnalyzer/global.js +2 -93
  231. package/dist/statsAnalyzer/global.js.map +1 -1
  232. package/dist/statsAnalyzer/index.js +374 -374
  233. package/dist/statsAnalyzer/index.js.map +1 -1
  234. package/dist/statsAnalyzer/mqaUtil.js +100 -66
  235. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  236. package/dist/transcription/index.js +1 -2
  237. package/dist/transcription/index.js.map +1 -1
  238. package/dist/webinar/collection.js +43 -0
  239. package/dist/webinar/collection.js.map +1 -0
  240. package/dist/webinar/index.js +68 -0
  241. package/dist/webinar/index.js.map +1 -0
  242. package/package.json +27 -18
  243. package/src/annotation/annotation.types.ts +50 -0
  244. package/src/annotation/constants.ts +36 -0
  245. package/src/annotation/index.ts +328 -0
  246. package/src/breakouts/README.md +220 -0
  247. package/src/breakouts/breakout.ts +188 -0
  248. package/src/breakouts/collection.ts +19 -0
  249. package/src/breakouts/edit-lock-error.ts +25 -0
  250. package/src/breakouts/events.ts +56 -0
  251. package/src/breakouts/index.ts +925 -0
  252. package/src/breakouts/request.ts +55 -0
  253. package/src/breakouts/utils.ts +57 -0
  254. package/src/common/errors/no-meeting-info.ts +24 -0
  255. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  256. package/src/common/errors/webex-errors.ts +36 -12
  257. package/src/common/logs/logger-proxy.ts +1 -1
  258. package/src/common/logs/request.ts +5 -1
  259. package/src/common/queue.ts +22 -8
  260. package/src/config.ts +7 -9
  261. package/src/constants.ts +263 -89
  262. package/src/controls-options-manager/enums.ts +11 -1
  263. package/src/controls-options-manager/index.ts +116 -21
  264. package/src/controls-options-manager/types.ts +59 -0
  265. package/src/controls-options-manager/util.ts +294 -14
  266. package/src/index.ts +40 -0
  267. package/src/interpretation/README.md +60 -0
  268. package/src/interpretation/collection.ts +19 -0
  269. package/src/interpretation/index.ts +332 -0
  270. package/src/interpretation/siLanguage.ts +18 -0
  271. package/src/locus-info/controlsUtils.ts +110 -0
  272. package/src/locus-info/index.ts +449 -61
  273. package/src/locus-info/infoUtils.ts +14 -2
  274. package/src/locus-info/mediaSharesUtils.ts +64 -0
  275. package/src/locus-info/parser.ts +258 -47
  276. package/src/locus-info/selfUtils.ts +85 -2
  277. package/src/media/index.ts +153 -370
  278. package/src/media/properties.ts +106 -136
  279. package/src/media/util.ts +0 -21
  280. package/src/mediaQualityMetrics/config.ts +379 -377
  281. package/src/meeting/in-meeting-actions.ts +168 -0
  282. package/src/meeting/index.ts +3801 -2457
  283. package/src/meeting/locusMediaRequest.ts +313 -0
  284. package/src/meeting/muteState.ts +224 -138
  285. package/src/meeting/request.ts +207 -127
  286. package/src/meeting/request.type.ts +13 -0
  287. package/src/meeting/util.ts +590 -423
  288. package/src/meeting-info/index.ts +81 -8
  289. package/src/meeting-info/meeting-info-v2.ts +159 -13
  290. package/src/meeting-info/util.ts +1 -1
  291. package/src/meeting-info/utilv2.ts +22 -9
  292. package/src/meetings/collection.ts +20 -0
  293. package/src/meetings/index.ts +466 -124
  294. package/src/meetings/meetings.types.ts +12 -0
  295. package/src/meetings/request.ts +2 -0
  296. package/src/meetings/util.ts +116 -5
  297. package/src/member/index.ts +52 -1
  298. package/src/member/types.ts +38 -0
  299. package/src/member/util.ts +139 -28
  300. package/src/members/collection.ts +8 -0
  301. package/src/members/index.ts +196 -7
  302. package/src/members/request.ts +97 -17
  303. package/src/members/types.ts +29 -0
  304. package/src/members/util.ts +333 -240
  305. package/src/metrics/constants.ts +12 -4
  306. package/src/metrics/index.ts +1 -471
  307. package/src/multistream/mediaRequestManager.ts +440 -0
  308. package/src/multistream/receiveSlot.ts +184 -0
  309. package/src/multistream/receiveSlotManager.ts +166 -0
  310. package/src/multistream/remoteMedia.ts +254 -0
  311. package/src/multistream/remoteMediaGroup.ts +284 -0
  312. package/src/multistream/remoteMediaManager.ts +1145 -0
  313. package/src/multistream/sendSlotManager.ts +170 -0
  314. package/src/networkQualityMonitor/index.ts +6 -6
  315. package/src/reachability/index.ts +238 -45
  316. package/src/reachability/request.ts +17 -8
  317. package/src/reactions/constants.ts +4 -0
  318. package/src/reactions/reactions.ts +4 -4
  319. package/src/reactions/reactions.type.ts +30 -4
  320. package/src/reconnection-manager/index.ts +124 -107
  321. package/src/recording-controller/index.ts +20 -3
  322. package/src/recording-controller/util.ts +26 -9
  323. package/src/roap/index.ts +98 -240
  324. package/src/roap/request.ts +74 -148
  325. package/src/roap/turnDiscovery.ts +62 -56
  326. package/src/rtcMetrics/constants.ts +3 -0
  327. package/src/rtcMetrics/index.ts +100 -0
  328. package/src/statsAnalyzer/global.ts +1 -92
  329. package/src/statsAnalyzer/index.ts +429 -447
  330. package/src/statsAnalyzer/mqaUtil.ts +105 -103
  331. package/src/webinar/collection.ts +31 -0
  332. package/src/webinar/index.ts +62 -0
  333. package/test/integration/spec/converged-space-meetings.js +233 -0
  334. package/test/integration/spec/journey.js +320 -264
  335. package/test/integration/spec/space-meeting.js +77 -4
  336. package/test/unit/spec/annotation/index.ts +418 -0
  337. package/test/unit/spec/breakouts/breakout.ts +237 -0
  338. package/test/unit/spec/breakouts/collection.ts +15 -0
  339. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  340. package/test/unit/spec/breakouts/events.ts +89 -0
  341. package/test/unit/spec/breakouts/index.ts +1790 -0
  342. package/test/unit/spec/breakouts/request.ts +104 -0
  343. package/test/unit/spec/breakouts/utils.js +72 -0
  344. package/test/unit/spec/common/queue.js +31 -2
  345. package/test/unit/spec/controls-options-manager/index.js +163 -0
  346. package/test/unit/spec/controls-options-manager/util.js +576 -60
  347. package/test/unit/spec/fixture/locus.js +1 -0
  348. package/test/unit/spec/interpretation/collection.ts +15 -0
  349. package/test/unit/spec/interpretation/index.ts +589 -0
  350. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  351. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  352. package/test/unit/spec/locus-info/index.js +1390 -16
  353. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  354. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  355. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  356. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  357. package/test/unit/spec/locus-info/parser.js +116 -35
  358. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  359. package/test/unit/spec/media/index.ts +274 -0
  360. package/test/unit/spec/media/properties.ts +75 -84
  361. package/test/unit/spec/meeting/in-meeting-actions.ts +82 -0
  362. package/test/unit/spec/meeting/index.js +7420 -3125
  363. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  364. package/test/unit/spec/meeting/muteState.js +407 -212
  365. package/test/unit/spec/meeting/request.js +512 -42
  366. package/test/unit/spec/meeting/utils.js +741 -24
  367. package/test/unit/spec/meeting-info/index.js +300 -0
  368. package/test/unit/spec/meeting-info/meetinginfov2.js +500 -6
  369. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  370. package/test/unit/spec/meetings/collection.js +14 -0
  371. package/test/unit/spec/meetings/index.js +1012 -209
  372. package/test/unit/spec/meetings/utils.js +202 -2
  373. package/test/unit/spec/member/index.js +38 -8
  374. package/test/unit/spec/member/util.js +528 -27
  375. package/test/unit/spec/members/index.js +597 -3
  376. package/test/unit/spec/members/request.js +206 -27
  377. package/test/unit/spec/members/utils.js +210 -0
  378. package/test/unit/spec/metrics/index.js +1 -50
  379. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  380. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  381. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  382. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  383. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  384. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  385. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  386. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  387. package/test/unit/spec/reachability/index.ts +598 -24
  388. package/test/unit/spec/reachability/request.js +68 -0
  389. package/test/unit/spec/reconnection-manager/index.js +130 -22
  390. package/test/unit/spec/recording-controller/index.js +293 -218
  391. package/test/unit/spec/recording-controller/util.js +223 -96
  392. package/test/unit/spec/roap/index.ts +200 -77
  393. package/test/unit/spec/roap/request.ts +232 -0
  394. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  395. package/test/unit/spec/rtcMetrics/index.ts +73 -0
  396. package/test/unit/spec/stats-analyzer/index.js +205 -50
  397. package/test/unit/spec/webinar/collection.ts +13 -0
  398. package/test/unit/spec/webinar/index.ts +60 -0
  399. package/test/utils/constants.js +9 -0
  400. package/test/utils/integrationTestUtils.js +46 -0
  401. package/test/utils/testUtils.js +0 -45
  402. package/test/utils/webex-config.js +4 -0
  403. package/test/utils/webex-test-users.js +7 -3
  404. package/dist/meeting/effectsState.js +0 -260
  405. package/dist/meeting/effectsState.js.map +0 -1
  406. package/dist/metrics/config.js +0 -289
  407. package/dist/metrics/config.js.map +0 -1
  408. package/dist/peer-connection-manager/index.js +0 -671
  409. package/dist/peer-connection-manager/index.js.map +0 -1
  410. package/dist/peer-connection-manager/util.js +0 -110
  411. package/dist/peer-connection-manager/util.js.map +0 -1
  412. package/dist/roap/collection.js +0 -63
  413. package/dist/roap/collection.js.map +0 -1
  414. package/dist/roap/handler.js +0 -279
  415. package/dist/roap/handler.js.map +0 -1
  416. package/dist/roap/state.js +0 -127
  417. package/dist/roap/state.js.map +0 -1
  418. package/dist/roap/util.js +0 -76
  419. package/dist/roap/util.js.map +0 -1
  420. package/src/index.js +0 -15
  421. package/src/meeting/effectsState.ts +0 -209
  422. package/src/metrics/config.ts +0 -485
  423. package/src/peer-connection-manager/index.ts +0 -847
  424. package/src/peer-connection-manager/util.ts +0 -119
  425. package/src/roap/collection.ts +0 -62
  426. package/src/roap/handler.ts +0 -294
  427. package/src/roap/state.ts +0 -156
  428. package/src/roap/util.ts +0 -100
  429. package/test/unit/spec/meeting/effectsState.js +0 -281
  430. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  431. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  432. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  433. package/test/unit/spec/roap/util.js +0 -30
@@ -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
+ });