@webex/plugin-meetings 3.0.0-beta.39 → 3.0.0-beta.391

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 (393) hide show
  1. package/README.md +58 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +94 -15
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/events.js +45 -0
  11. package/dist/breakouts/events.js.map +1 -0
  12. package/dist/breakouts/index.js +671 -81
  13. package/dist/breakouts/index.js.map +1 -1
  14. package/dist/breakouts/utils.js +45 -1
  15. package/dist/breakouts/utils.js.map +1 -1
  16. package/dist/common/errors/no-meeting-info.js +51 -0
  17. package/dist/common/errors/no-meeting-info.js.map +1 -0
  18. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  19. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +48 -7
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/logs/request.js +5 -1
  25. package/dist/common/logs/request.js.map +1 -1
  26. package/dist/common/queue.js +24 -9
  27. package/dist/common/queue.js.map +1 -1
  28. package/dist/config.js +5 -10
  29. package/dist/config.js.map +1 -1
  30. package/dist/constants.js +242 -33
  31. package/dist/constants.js.map +1 -1
  32. package/dist/controls-options-manager/enums.js +14 -2
  33. package/dist/controls-options-manager/enums.js.map +1 -1
  34. package/dist/controls-options-manager/index.js +109 -15
  35. package/dist/controls-options-manager/index.js.map +1 -1
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +309 -18
  39. package/dist/controls-options-manager/util.js.map +1 -1
  40. package/dist/index.js +110 -2
  41. package/dist/index.js.map +1 -1
  42. package/dist/interceptors/index.js +15 -0
  43. package/dist/interceptors/index.js.map +1 -0
  44. package/dist/interceptors/locusRetry.js +93 -0
  45. package/dist/interceptors/locusRetry.js.map +1 -0
  46. package/dist/interpretation/collection.js +23 -0
  47. package/dist/interpretation/collection.js.map +1 -0
  48. package/dist/interpretation/index.js +380 -0
  49. package/dist/interpretation/index.js.map +1 -0
  50. package/dist/interpretation/siLanguage.js +25 -0
  51. package/dist/interpretation/siLanguage.js.map +1 -0
  52. package/dist/locus-info/controlsUtils.js +91 -2
  53. package/dist/locus-info/controlsUtils.js.map +1 -1
  54. package/dist/locus-info/index.js +386 -62
  55. package/dist/locus-info/index.js.map +1 -1
  56. package/dist/locus-info/infoUtils.js +7 -1
  57. package/dist/locus-info/infoUtils.js.map +1 -1
  58. package/dist/locus-info/mediaSharesUtils.js +71 -1
  59. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  60. package/dist/locus-info/parser.js +249 -72
  61. package/dist/locus-info/parser.js.map +1 -1
  62. package/dist/locus-info/selfUtils.js +89 -14
  63. package/dist/locus-info/selfUtils.js.map +1 -1
  64. package/dist/media/index.js +65 -102
  65. package/dist/media/index.js.map +1 -1
  66. package/dist/media/properties.js +73 -124
  67. package/dist/media/properties.js.map +1 -1
  68. package/dist/mediaQualityMetrics/config.js +135 -330
  69. package/dist/mediaQualityMetrics/config.js.map +1 -1
  70. package/dist/meeting/in-meeting-actions.js +86 -2
  71. package/dist/meeting/in-meeting-actions.js.map +1 -1
  72. package/dist/meeting/index.js +4075 -2827
  73. package/dist/meeting/index.js.map +1 -1
  74. package/dist/meeting/locusMediaRequest.js +292 -0
  75. package/dist/meeting/locusMediaRequest.js.map +1 -0
  76. package/dist/meeting/muteState.js +224 -136
  77. package/dist/meeting/muteState.js.map +1 -1
  78. package/dist/meeting/request.js +177 -152
  79. package/dist/meeting/request.js.map +1 -1
  80. package/dist/meeting/util.js +672 -417
  81. package/dist/meeting/util.js.map +1 -1
  82. package/dist/meeting-info/index.js +73 -7
  83. package/dist/meeting-info/index.js.map +1 -1
  84. package/dist/meeting-info/meeting-info-v2.js +192 -51
  85. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  86. package/dist/meeting-info/util.js +1 -1
  87. package/dist/meeting-info/util.js.map +1 -1
  88. package/dist/meeting-info/utilv2.js +36 -36
  89. package/dist/meeting-info/utilv2.js.map +1 -1
  90. package/dist/meetings/collection.js +39 -0
  91. package/dist/meetings/collection.js.map +1 -1
  92. package/dist/meetings/index.js +484 -119
  93. package/dist/meetings/index.js.map +1 -1
  94. package/dist/meetings/meetings.types.js +7 -0
  95. package/dist/meetings/meetings.types.js.map +1 -0
  96. package/dist/meetings/request.js +2 -0
  97. package/dist/meetings/request.js.map +1 -1
  98. package/dist/meetings/util.js +73 -7
  99. package/dist/meetings/util.js.map +1 -1
  100. package/dist/member/index.js +58 -0
  101. package/dist/member/index.js.map +1 -1
  102. package/dist/member/types.js +25 -0
  103. package/dist/member/types.js.map +1 -0
  104. package/dist/member/util.js +132 -25
  105. package/dist/member/util.js.map +1 -1
  106. package/dist/members/collection.js +10 -0
  107. package/dist/members/collection.js.map +1 -1
  108. package/dist/members/index.js +102 -6
  109. package/dist/members/index.js.map +1 -1
  110. package/dist/members/request.js +106 -38
  111. package/dist/members/request.js.map +1 -1
  112. package/dist/members/types.js +15 -0
  113. package/dist/members/types.js.map +1 -0
  114. package/dist/members/util.js +326 -232
  115. package/dist/members/util.js.map +1 -1
  116. package/dist/metrics/constants.js +18 -1
  117. package/dist/metrics/constants.js.map +1 -1
  118. package/dist/metrics/index.js +1 -446
  119. package/dist/metrics/index.js.map +1 -1
  120. package/dist/multistream/mediaRequestManager.js +223 -32
  121. package/dist/multistream/mediaRequestManager.js.map +1 -1
  122. package/dist/multistream/receiveSlot.js +10 -0
  123. package/dist/multistream/receiveSlot.js.map +1 -1
  124. package/dist/multistream/receiveSlotManager.js +39 -36
  125. package/dist/multistream/receiveSlotManager.js.map +1 -1
  126. package/dist/multistream/remoteMedia.js +3 -1
  127. package/dist/multistream/remoteMedia.js.map +1 -1
  128. package/dist/multistream/remoteMediaGroup.js +76 -5
  129. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  130. package/dist/multistream/remoteMediaManager.js +366 -104
  131. package/dist/multistream/remoteMediaManager.js.map +1 -1
  132. package/dist/multistream/sendSlotManager.js +255 -0
  133. package/dist/multistream/sendSlotManager.js.map +1 -0
  134. package/dist/reachability/clusterReachability.js +356 -0
  135. package/dist/reachability/clusterReachability.js.map +1 -0
  136. package/dist/reachability/index.js +263 -390
  137. package/dist/reachability/index.js.map +1 -1
  138. package/dist/reachability/request.js +6 -4
  139. package/dist/reachability/request.js.map +1 -1
  140. package/dist/reachability/util.js +29 -0
  141. package/dist/reachability/util.js.map +1 -0
  142. package/dist/reconnection-manager/index.js +266 -202
  143. package/dist/reconnection-manager/index.js.map +1 -1
  144. package/dist/recording-controller/index.js +21 -2
  145. package/dist/recording-controller/index.js.map +1 -1
  146. package/dist/recording-controller/util.js +9 -8
  147. package/dist/recording-controller/util.js.map +1 -1
  148. package/dist/roap/index.js +51 -28
  149. package/dist/roap/index.js.map +1 -1
  150. package/dist/roap/request.js +48 -64
  151. package/dist/roap/request.js.map +1 -1
  152. package/dist/roap/turnDiscovery.js +220 -70
  153. package/dist/roap/turnDiscovery.js.map +1 -1
  154. package/dist/rtcMetrics/constants.js +12 -0
  155. package/dist/rtcMetrics/constants.js.map +1 -0
  156. package/dist/rtcMetrics/index.js +179 -0
  157. package/dist/rtcMetrics/index.js.map +1 -0
  158. package/dist/statsAnalyzer/index.js +357 -295
  159. package/dist/statsAnalyzer/index.js.map +1 -1
  160. package/dist/statsAnalyzer/mqaUtil.js +296 -156
  161. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  162. package/dist/types/annotation/annotation.types.d.ts +42 -0
  163. package/dist/types/annotation/constants.d.ts +31 -0
  164. package/dist/types/annotation/index.d.ts +117 -0
  165. package/dist/types/breakouts/events.d.ts +8 -0
  166. package/dist/types/breakouts/utils.d.ts +14 -0
  167. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  168. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  169. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  170. package/dist/types/common/logs/request.d.ts +2 -0
  171. package/dist/types/common/queue.d.ts +9 -7
  172. package/dist/types/config.d.ts +2 -7
  173. package/dist/types/constants.d.ts +203 -31
  174. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  175. package/dist/types/controls-options-manager/index.d.ts +17 -1
  176. package/dist/types/controls-options-manager/types.d.ts +43 -0
  177. package/dist/types/controls-options-manager/util.d.ts +1 -7
  178. package/dist/types/index.d.ts +6 -5
  179. package/dist/types/interceptors/index.d.ts +2 -0
  180. package/dist/types/interceptors/locusRetry.d.ts +27 -0
  181. package/dist/types/interpretation/collection.d.ts +5 -0
  182. package/dist/types/interpretation/index.d.ts +5 -0
  183. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  184. package/dist/types/locus-info/index.d.ts +57 -4
  185. package/dist/types/locus-info/parser.d.ts +66 -6
  186. package/dist/types/media/index.d.ts +2 -0
  187. package/dist/types/media/properties.d.ts +34 -49
  188. package/dist/types/mediaQualityMetrics/config.d.ts +99 -223
  189. package/dist/types/meeting/in-meeting-actions.d.ts +86 -2
  190. package/dist/types/meeting/index.d.ts +567 -496
  191. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  192. package/dist/types/meeting/muteState.d.ts +93 -25
  193. package/dist/types/meeting/request.d.ts +64 -43
  194. package/dist/types/meeting/util.d.ts +117 -1
  195. package/dist/types/meeting-info/index.d.ts +13 -1
  196. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  197. package/dist/types/meetings/collection.d.ts +17 -0
  198. package/dist/types/meetings/index.d.ts +113 -21
  199. package/dist/types/meetings/meetings.types.d.ts +4 -0
  200. package/dist/types/member/index.d.ts +14 -0
  201. package/dist/types/member/types.d.ts +32 -0
  202. package/dist/types/members/collection.d.ts +5 -0
  203. package/dist/types/members/index.d.ts +35 -2
  204. package/dist/types/members/request.d.ts +73 -9
  205. package/dist/types/members/types.d.ts +25 -0
  206. package/dist/types/members/util.d.ts +214 -1
  207. package/dist/types/metrics/constants.d.ts +17 -0
  208. package/dist/types/metrics/index.d.ts +4 -111
  209. package/dist/types/multistream/mediaRequestManager.d.ts +72 -3
  210. package/dist/types/multistream/receiveSlot.d.ts +7 -3
  211. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  212. package/dist/types/multistream/remoteMedia.d.ts +3 -31
  213. package/dist/types/multistream/remoteMediaGroup.d.ts +2 -9
  214. package/dist/types/multistream/remoteMediaManager.d.ts +62 -2
  215. package/dist/types/multistream/sendSlotManager.d.ts +70 -0
  216. package/dist/types/reachability/clusterReachability.d.ts +109 -0
  217. package/dist/types/reachability/index.d.ts +60 -95
  218. package/dist/types/reachability/request.d.ts +3 -1
  219. package/dist/types/reachability/util.d.ts +8 -0
  220. package/dist/types/reconnection-manager/index.d.ts +19 -0
  221. package/dist/types/recording-controller/index.d.ts +15 -1
  222. package/dist/types/recording-controller/util.d.ts +5 -4
  223. package/dist/types/roap/index.d.ts +2 -1
  224. package/dist/types/roap/request.d.ts +9 -8
  225. package/dist/types/roap/turnDiscovery.d.ts +39 -5
  226. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  227. package/dist/types/rtcMetrics/index.d.ts +61 -0
  228. package/dist/types/statsAnalyzer/index.d.ts +34 -12
  229. package/dist/types/statsAnalyzer/mqaUtil.d.ts +28 -4
  230. package/dist/types/webinar/collection.d.ts +16 -0
  231. package/dist/types/webinar/index.d.ts +5 -0
  232. package/dist/webinar/collection.js +44 -0
  233. package/dist/webinar/collection.js.map +1 -0
  234. package/dist/webinar/index.js +69 -0
  235. package/dist/webinar/index.js.map +1 -0
  236. package/package.json +22 -19
  237. package/src/annotation/annotation.types.ts +50 -0
  238. package/src/annotation/constants.ts +36 -0
  239. package/src/annotation/index.ts +328 -0
  240. package/src/breakouts/README.md +35 -11
  241. package/src/breakouts/breakout.ts +67 -9
  242. package/src/breakouts/events.ts +56 -0
  243. package/src/breakouts/index.ts +558 -59
  244. package/src/breakouts/utils.ts +42 -0
  245. package/src/common/errors/no-meeting-info.ts +24 -0
  246. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  247. package/src/common/errors/webex-errors.ts +44 -2
  248. package/src/common/logs/logger-proxy.ts +1 -1
  249. package/src/common/logs/request.ts +5 -1
  250. package/src/common/queue.ts +22 -8
  251. package/src/config.ts +4 -9
  252. package/src/constants.ts +229 -21
  253. package/src/controls-options-manager/enums.ts +12 -0
  254. package/src/controls-options-manager/index.ts +116 -21
  255. package/src/controls-options-manager/types.ts +59 -0
  256. package/src/controls-options-manager/util.ts +294 -14
  257. package/src/index.ts +44 -0
  258. package/src/interceptors/index.ts +3 -0
  259. package/src/interceptors/locusRetry.ts +67 -0
  260. package/src/interpretation/README.md +60 -0
  261. package/src/interpretation/collection.ts +19 -0
  262. package/src/interpretation/index.ts +349 -0
  263. package/src/interpretation/siLanguage.ts +18 -0
  264. package/src/locus-info/controlsUtils.ts +108 -0
  265. package/src/locus-info/index.ts +417 -59
  266. package/src/locus-info/infoUtils.ts +10 -2
  267. package/src/locus-info/mediaSharesUtils.ts +80 -0
  268. package/src/locus-info/parser.ts +258 -47
  269. package/src/locus-info/selfUtils.ts +81 -5
  270. package/src/media/index.ts +100 -108
  271. package/src/media/properties.ts +88 -117
  272. package/src/mediaQualityMetrics/config.ts +103 -238
  273. package/src/meeting/in-meeting-actions.ts +171 -3
  274. package/src/meeting/index.ts +3411 -2435
  275. package/src/meeting/locusMediaRequest.ts +313 -0
  276. package/src/meeting/muteState.ts +223 -136
  277. package/src/meeting/request.ts +155 -120
  278. package/src/meeting/util.ts +685 -395
  279. package/src/meeting-info/index.ts +81 -8
  280. package/src/meeting-info/meeting-info-v2.ts +170 -14
  281. package/src/meeting-info/util.ts +1 -1
  282. package/src/meeting-info/utilv2.ts +23 -23
  283. package/src/meetings/collection.ts +33 -0
  284. package/src/meetings/index.ts +507 -127
  285. package/src/meetings/meetings.types.ts +12 -0
  286. package/src/meetings/request.ts +2 -0
  287. package/src/meetings/util.ts +81 -12
  288. package/src/member/index.ts +58 -0
  289. package/src/member/types.ts +38 -0
  290. package/src/member/util.ts +141 -25
  291. package/src/members/collection.ts +8 -0
  292. package/src/members/index.ts +134 -8
  293. package/src/members/request.ts +97 -17
  294. package/src/members/types.ts +29 -0
  295. package/src/members/util.ts +333 -240
  296. package/src/metrics/constants.ts +17 -0
  297. package/src/metrics/index.ts +1 -469
  298. package/src/multistream/mediaRequestManager.ts +271 -56
  299. package/src/multistream/receiveSlot.ts +11 -4
  300. package/src/multistream/receiveSlotManager.ts +34 -24
  301. package/src/multistream/remoteMedia.ts +5 -3
  302. package/src/multistream/remoteMediaGroup.ts +78 -0
  303. package/src/multistream/remoteMediaManager.ts +248 -44
  304. package/src/multistream/sendSlotManager.ts +199 -0
  305. package/src/reachability/clusterReachability.ts +320 -0
  306. package/src/reachability/index.ts +229 -346
  307. package/src/reachability/request.ts +8 -4
  308. package/src/reachability/util.ts +24 -0
  309. package/src/reconnection-manager/index.ts +128 -97
  310. package/src/recording-controller/index.ts +20 -3
  311. package/src/recording-controller/util.ts +26 -9
  312. package/src/roap/index.ts +52 -23
  313. package/src/roap/request.ts +48 -67
  314. package/src/roap/turnDiscovery.ts +147 -49
  315. package/src/rtcMetrics/constants.ts +3 -0
  316. package/src/rtcMetrics/index.ts +166 -0
  317. package/src/statsAnalyzer/index.ts +457 -416
  318. package/src/statsAnalyzer/mqaUtil.ts +317 -170
  319. package/src/webinar/collection.ts +31 -0
  320. package/src/webinar/index.ts +62 -0
  321. package/test/integration/spec/converged-space-meetings.js +60 -3
  322. package/test/integration/spec/journey.js +320 -261
  323. package/test/integration/spec/space-meeting.js +76 -3
  324. package/test/unit/spec/annotation/index.ts +418 -0
  325. package/test/unit/spec/breakouts/breakout.ts +118 -28
  326. package/test/unit/spec/breakouts/events.ts +89 -0
  327. package/test/unit/spec/breakouts/index.ts +1349 -114
  328. package/test/unit/spec/breakouts/utils.js +52 -1
  329. package/test/unit/spec/common/queue.js +31 -2
  330. package/test/unit/spec/controls-options-manager/index.js +163 -0
  331. package/test/unit/spec/controls-options-manager/util.js +576 -60
  332. package/test/unit/spec/fixture/locus.js +1 -0
  333. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  334. package/test/unit/spec/interpretation/collection.ts +15 -0
  335. package/test/unit/spec/interpretation/index.ts +625 -0
  336. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  337. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  338. package/test/unit/spec/locus-info/index.js +1363 -37
  339. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  340. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  341. package/test/unit/spec/locus-info/mediaSharesUtils.ts +41 -0
  342. package/test/unit/spec/locus-info/parser.js +116 -35
  343. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  344. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  345. package/test/unit/spec/media/index.ts +173 -81
  346. package/test/unit/spec/media/properties.ts +2 -2
  347. package/test/unit/spec/meeting/in-meeting-actions.ts +85 -3
  348. package/test/unit/spec/meeting/index.js +6821 -2172
  349. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  350. package/test/unit/spec/meeting/muteState.js +402 -212
  351. package/test/unit/spec/meeting/request.js +473 -54
  352. package/test/unit/spec/meeting/utils.js +773 -67
  353. package/test/unit/spec/meeting-info/index.js +300 -0
  354. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  355. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  356. package/test/unit/spec/meetings/collection.js +26 -0
  357. package/test/unit/spec/meetings/index.js +1415 -213
  358. package/test/unit/spec/meetings/utils.js +229 -2
  359. package/test/unit/spec/member/index.js +61 -6
  360. package/test/unit/spec/member/util.js +510 -34
  361. package/test/unit/spec/members/index.js +432 -1
  362. package/test/unit/spec/members/request.js +206 -27
  363. package/test/unit/spec/members/utils.js +210 -0
  364. package/test/unit/spec/metrics/index.js +1 -50
  365. package/test/unit/spec/multistream/mediaRequestManager.ts +781 -114
  366. package/test/unit/spec/multistream/receiveSlot.ts +9 -1
  367. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  368. package/test/unit/spec/multistream/remoteMedia.ts +2 -0
  369. package/test/unit/spec/multistream/remoteMediaGroup.ts +345 -0
  370. package/test/unit/spec/multistream/remoteMediaManager.ts +525 -0
  371. package/test/unit/spec/multistream/sendSlotManager.ts +274 -0
  372. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  373. package/test/unit/spec/reachability/index.ts +551 -14
  374. package/test/unit/spec/reachability/request.js +3 -1
  375. package/test/unit/spec/reachability/util.ts +40 -0
  376. package/test/unit/spec/reconnection-manager/index.js +171 -11
  377. package/test/unit/spec/recording-controller/index.js +294 -218
  378. package/test/unit/spec/recording-controller/util.js +223 -96
  379. package/test/unit/spec/roap/index.ts +180 -83
  380. package/test/unit/spec/roap/request.ts +100 -62
  381. package/test/unit/spec/roap/turnDiscovery.ts +388 -96
  382. package/test/unit/spec/rtcMetrics/index.ts +122 -0
  383. package/test/unit/spec/stats-analyzer/index.js +1252 -12
  384. package/test/unit/spec/webinar/collection.ts +13 -0
  385. package/test/unit/spec/webinar/index.ts +60 -0
  386. package/test/utils/integrationTestUtils.js +46 -0
  387. package/test/utils/testUtils.js +0 -57
  388. package/test/utils/webex-test-users.js +12 -4
  389. package/dist/metrics/config.js +0 -289
  390. package/dist/metrics/config.js.map +0 -1
  391. package/dist/types/metrics/config.d.ts +0 -169
  392. package/src/index.js +0 -18
  393. package/src/metrics/config.ts +0 -485
@@ -3,16 +3,58 @@
3
3
  */
4
4
 
5
5
  /* eslint-disable class-methods-use-this */
6
- /* globals window */
7
- import _ from 'lodash';
6
+ import {mapValues} from 'lodash';
8
7
 
9
8
  import LoggerProxy from '../common/logs/logger-proxy';
10
- import {ICE_GATHERING_STATE, CONNECTION_STATE, REACHABILITY} from '../constants';
9
+ import MeetingUtil from '../meeting/util';
10
+
11
+ import {REACHABILITY} from '../constants';
12
+
13
+ import ReachabilityRequest, {ClusterList} from './request';
14
+ import {
15
+ ClusterReachability,
16
+ ClusterReachabilityResult,
17
+ TransportResult,
18
+ } from './clusterReachability';
19
+
20
+ export type ReachabilityMetrics = {
21
+ reachability_public_udp_success: number;
22
+ reachability_public_udp_failed: number;
23
+ reachability_public_tcp_success: number;
24
+ reachability_public_tcp_failed: number;
25
+ reachability_vmn_udp_success: number;
26
+ reachability_vmn_udp_failed: number;
27
+ reachability_vmn_tcp_success: number;
28
+ reachability_vmn_tcp_failed: number;
29
+ };
11
30
 
12
- import ReachabilityRequest from './request';
13
-
14
- const DEFAULT_TIMEOUT = 3000;
15
- const VIDEO_MESH_TIMEOUT = 1000;
31
+ /**
32
+ * This is the type that matches what backend expects us to send to them. It is a bit weird, because
33
+ * it uses strings instead of booleans and numbers, but that's what they require.
34
+ */
35
+ export type TransportResultForBackend = {
36
+ reachable?: 'true' | 'false';
37
+ latencyInMilliseconds?: string;
38
+ clientMediaIPs?: string[];
39
+ untested?: 'true';
40
+ };
41
+
42
+ export type ReachabilityResultForBackend = {
43
+ udp: TransportResultForBackend;
44
+ tcp: TransportResultForBackend;
45
+ xtls: TransportResultForBackend;
46
+ };
47
+
48
+ // this is the type that is required by the backend when we send them reachability results
49
+ export type ReachabilityResultsForBackend = Record<string, ReachabilityResultForBackend>;
50
+
51
+ // this is the type used by Reachability class internally and stored in local storage
52
+ export type ReachabilityResults = Record<
53
+ string,
54
+ ClusterReachabilityResult & {
55
+ isVideoMesh?: boolean;
56
+ }
57
+ >;
16
58
 
17
59
  /**
18
60
  * @class Reachability
@@ -21,8 +63,10 @@ const VIDEO_MESH_TIMEOUT = 1000;
21
63
  export default class Reachability {
22
64
  namespace = REACHABILITY.namespace;
23
65
  webex: object;
24
- reachabilityRequest: any;
25
- clusterLatencyResults: any;
66
+ reachabilityRequest: ReachabilityRequest;
67
+ clusterReachability: {
68
+ [key: string]: ClusterReachability;
69
+ };
26
70
 
27
71
  /**
28
72
  * Creates an instance of Reachability.
@@ -41,38 +85,24 @@ export default class Reachability {
41
85
  */
42
86
  this.reachabilityRequest = new ReachabilityRequest(this.webex);
43
87
 
44
- /**
45
- * internal object of clusters latency results
46
- * @instance
47
- * @type {object}
48
- * @private
49
- * @memberof Reachability
50
- */
51
- this.clusterLatencyResults = {};
88
+ this.clusterReachability = {};
52
89
  }
53
90
 
54
91
  /**
55
- * fetches reachability data
56
- * @returns {Object} reachability data
92
+ * Gets a list of media clusters from the backend and performs reachability checks on all the clusters
93
+ * @returns {Promise<ReachabilityResults>} reachability results
57
94
  * @public
58
- * @async
59
95
  * @memberof Reachability
60
96
  */
61
- public async gatherReachability() {
62
- this.setup();
63
-
64
- // Remove stored reachability results to ensure no stale data
65
- // @ts-ignore
66
- await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageResult);
67
- // @ts-ignore
68
- await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageJoinCookie);
69
-
97
+ public async gatherReachability(): Promise<ReachabilityResults> {
70
98
  // Fetch clusters and measure latency
71
99
  try {
72
- const {clusters, joinCookie} = await this.reachabilityRequest.getClusters();
100
+ const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(
101
+ MeetingUtil.getIpVersion(this.webex)
102
+ );
73
103
 
74
104
  // Perform Reachability Check
75
- const results = await this.performReachabilityCheck(clusters);
105
+ const results = await this.performReachabilityChecks(clusters);
76
106
 
77
107
  // @ts-ignore
78
108
  await this.webex.boundedStorage.put(
@@ -92,145 +122,166 @@ export default class Reachability {
92
122
  );
93
123
 
94
124
  return results;
95
- } catch (getClusterError) {
96
- LoggerProxy.logger.error(
97
- `Reachability:index#gatherReachability --> Error in calling getClusters(): ${getClusterError}`
98
- );
125
+ } catch (error) {
126
+ LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error:`, error);
99
127
 
100
128
  return {};
101
129
  }
102
130
  }
103
131
 
104
132
  /**
105
- * fetches reachability data and checks for cluster reachability
106
- * @returns {boolean}
107
- * @public
108
- * @memberof Reachability
133
+ * Returns statistics about last reachability results. The returned value is an object
134
+ * with a flat list of properties so that it can be easily sent with metrics
135
+ *
136
+ * @returns {Promise} Promise with metrics values, it never rejects/throws.
109
137
  */
110
- async isAnyClusterReachable() {
111
- let reachable = false;
112
- // @ts-ignore
113
- const reachabilityData = await this.webex.boundedStorage
114
- .get(this.namespace, REACHABILITY.localStorageResult)
115
- .catch(() => {});
116
-
117
- if (reachabilityData) {
118
- try {
119
- const reachabilityResults = JSON.parse(reachabilityData);
138
+ async getReachabilityMetrics(): Promise<ReachabilityMetrics> {
139
+ const stats: ReachabilityMetrics = {
140
+ reachability_public_udp_success: 0,
141
+ reachability_public_udp_failed: 0,
142
+ reachability_public_tcp_success: 0,
143
+ reachability_public_tcp_failed: 0,
144
+ reachability_vmn_udp_success: 0,
145
+ reachability_vmn_udp_failed: 0,
146
+ reachability_vmn_tcp_success: 0,
147
+ reachability_vmn_tcp_failed: 0,
148
+ };
120
149
 
121
- reachable = Object.values(reachabilityResults).some(
122
- (result: any) => result.udp?.reachable === 'true' || result.tcp?.reachable === 'true'
123
- );
124
- } catch (e) {
125
- LoggerProxy.logger.error(
126
- `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`
127
- );
150
+ const updateStats = (clusterType: 'public' | 'vmn', result: ClusterReachabilityResult) => {
151
+ if (result.udp && result.udp.result !== 'untested') {
152
+ const outcome = result.udp.result === 'reachable' ? 'success' : 'failed';
153
+ stats[`reachability_${clusterType}_udp_${outcome}`] += 1;
154
+ }
155
+ if (result.tcp && result.tcp.result !== 'untested') {
156
+ const outcome = result.tcp.result === 'reachable' ? 'success' : 'failed';
157
+ stats[`reachability_${clusterType}_tcp_${outcome}`] += 1;
128
158
  }
159
+ };
160
+
161
+ try {
162
+ // @ts-ignore
163
+ const resultsJson = await this.webex.boundedStorage.get(
164
+ REACHABILITY.namespace,
165
+ REACHABILITY.localStorageResult
166
+ );
167
+
168
+ const results: ReachabilityResults = JSON.parse(resultsJson);
169
+
170
+ Object.values(results).forEach((result) => {
171
+ updateStats(result.isVideoMesh ? 'vmn' : 'public', result);
172
+ });
173
+ } catch (e) {
174
+ // empty storage, that's ok
175
+ LoggerProxy.logger.warn(
176
+ 'Roap:request#getReachabilityMetrics --> Error parsing reachability data: ',
177
+ e
178
+ );
129
179
  }
130
180
 
131
- return reachable;
181
+ return stats;
132
182
  }
133
183
 
134
184
  /**
135
- * Generate peerConnection config settings
136
- * @param {object} cluster
137
- * @returns {object} peerConnectionConfig
138
- * @private
139
- * @memberof Reachability
185
+ * Maps our internal transport result to the format that backend expects
186
+ * @param {TransportResult} transportResult
187
+ * @returns {TransportResultForBackend}
140
188
  */
141
- private buildPeerConnectionConfig(cluster: any) {
142
- const iceServers = _.uniq([...cluster.udp, ...cluster.tcp]).map((url) => ({
143
- username: '',
144
- credential: '',
145
- urls: [url],
146
- }));
147
-
148
- return {
149
- iceServers: [...iceServers],
150
- iceCandidatePoolSize: '0',
151
- iceTransportPolicy: 'all',
152
- };
189
+ private mapTransportResultToBackendDataFormat(
190
+ transportResult: TransportResult
191
+ ): TransportResultForBackend {
192
+ const output: TransportResultForBackend = {};
193
+
194
+ for (const [key, value] of Object.entries(transportResult)) {
195
+ switch (key) {
196
+ case 'result':
197
+ switch (value) {
198
+ case 'reachable':
199
+ output.reachable = 'true';
200
+ break;
201
+ case 'unreachable':
202
+ output.reachable = 'false';
203
+ break;
204
+ case 'untested':
205
+ output.untested = 'true';
206
+ break;
207
+ }
208
+ break;
209
+ case 'latencyInMilliseconds':
210
+ output.latencyInMilliseconds = value.toString();
211
+ break;
212
+ default:
213
+ output[key] = value;
214
+ }
215
+ }
216
+
217
+ return output;
153
218
  }
154
219
 
155
220
  /**
156
- * Creates an RTCPeerConnection
157
- * @param {object} cluster
158
- * @returns {RTCPeerConnection} peerConnection
159
- * @private
160
- * @memberof Reachability
221
+ * Reachability results as an object in the format that backend expects
222
+ *
223
+ * @returns {any} reachability results that need to be sent to the backend
161
224
  */
162
- private createPeerConnection(cluster: any) {
163
- const {key, config} = cluster;
225
+ async getReachabilityResults(): Promise<ReachabilityResultsForBackend | undefined> {
226
+ let results: ReachabilityResultsForBackend;
164
227
 
165
228
  try {
166
- const peerConnection = new window.RTCPeerConnection(config);
167
-
168
229
  // @ts-ignore
169
- peerConnection.key = key;
170
-
171
- return peerConnection;
172
- } catch (peerConnectionError) {
173
- LoggerProxy.logger.log(
174
- `Reachability:index#createPeerConnection --> Error creating peerConnection: ${peerConnectionError}`
230
+ const resultsJson = await this.webex.boundedStorage.get(
231
+ REACHABILITY.namespace,
232
+ REACHABILITY.localStorageResult
175
233
  );
176
234
 
177
- return null;
235
+ const allClusterResults: ReachabilityResults = JSON.parse(resultsJson);
236
+
237
+ results = mapValues(allClusterResults, (clusterResult) => ({
238
+ udp: this.mapTransportResultToBackendDataFormat(clusterResult.udp || {result: 'untested'}),
239
+ tcp: this.mapTransportResultToBackendDataFormat(clusterResult.tcp || {result: 'untested'}),
240
+ xtls: this.mapTransportResultToBackendDataFormat(
241
+ clusterResult.xtls || {result: 'untested'}
242
+ ),
243
+ }));
244
+ } catch (e) {
245
+ // empty storage, that's ok
246
+ LoggerProxy.logger.warn(
247
+ 'Roap:request#attachReachabilityData --> Error parsing reachability data: ',
248
+ e
249
+ );
178
250
  }
179
- }
180
-
181
- /**
182
- * Gets total elapsed time
183
- * @param {RTCPeerConnection} peerConnection
184
- * @returns {Number} Milliseconds
185
- * @private
186
- * @memberof Reachability
187
- */
188
- private getElapsedTime(peerConnection: any) {
189
- const startTime = peerConnection.begin;
190
-
191
- delete peerConnection.begin;
192
251
 
193
- return Date.now() - startTime;
252
+ return results;
194
253
  }
195
254
 
196
255
  /**
197
- * creates offer and generates localSDP
198
- * @param {object} clusterList cluster List
199
- * @returns {Promise} Reachability latency results
200
- * @private
256
+ * fetches reachability data and checks for cluster reachability
257
+ * @returns {boolean}
258
+ * @public
201
259
  * @memberof Reachability
202
260
  */
203
- private getLocalSDPForClusters(clusterList: object) {
204
- let clusters: any[] = [...Object.keys(clusterList)];
261
+ async isAnyPublicClusterReachable() {
262
+ let reachable = false;
263
+ // @ts-ignore
264
+ const reachabilityData = await this.webex.boundedStorage
265
+ .get(this.namespace, REACHABILITY.localStorageResult)
266
+ .catch(() => {});
205
267
 
206
- clusters = clusters.map(async (key) => {
207
- const cluster = clusterList[key];
208
- const config = this.buildPeerConnectionConfig(cluster);
209
- const peerConnection = this.createPeerConnection({key, config});
210
- const description = await peerConnection.createOffer({offerToReceiveAudio: true});
268
+ if (reachabilityData) {
269
+ try {
270
+ const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);
211
271
 
212
- // @ts-ignore
213
- peerConnection.begin = Date.now();
214
- peerConnection.setLocalDescription(description);
215
-
216
- return this.iceGatheringState(
217
- peerConnection,
218
- cluster.isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT
219
- ).catch((iceGatheringStateError) => {
220
- LoggerProxy.logger.log(
221
- `Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ${iceGatheringStateError}`
272
+ reachable = Object.values(reachabilityResults).some(
273
+ (result) =>
274
+ !result.isVideoMesh &&
275
+ (result.udp?.result === 'reachable' || result.tcp?.result === 'reachable')
222
276
  );
223
- });
224
- });
225
-
226
- return Promise.all(clusters)
227
- .then(this.parseIceResultsToReachabilityResults)
228
- .then((reachabilityLatencyResults) => {
229
- this.logUnreachableClusters();
277
+ } catch (e) {
278
+ LoggerProxy.logger.error(
279
+ `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`
280
+ );
281
+ }
282
+ }
230
283
 
231
- // return results
232
- return reachabilityLatencyResults;
233
- });
284
+ return reachable;
234
285
  }
235
286
 
236
287
  /**
@@ -239,126 +290,23 @@ export default class Reachability {
239
290
  * @private
240
291
  * @memberof Reachability
241
292
  */
242
- private getUnreachablClusters() {
293
+ private getUnreachableClusters(): Array<{name: string; protocol: string}> {
243
294
  const unreachableList = [];
244
- const clusters = this.clusterLatencyResults;
245
295
 
246
- Object.keys(clusters).forEach((key) => {
247
- const cluster = clusters[key];
296
+ Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {
297
+ const result = clusterReachability.getResult();
248
298
 
249
- if (cluster.unreachable && !cluster.reachable) {
250
- unreachableList.push(key);
299
+ if (result.udp.result === 'unreachable') {
300
+ unreachableList.push({name: key, protocol: 'udp'});
301
+ }
302
+ if (result.tcp.result === 'unreachable') {
303
+ unreachableList.push({name: key, protocol: 'tcp'});
251
304
  }
252
305
  });
253
306
 
254
307
  return unreachableList;
255
308
  }
256
309
 
257
- /**
258
- * Attach an event handler for the icegatheringstatechange
259
- * event and measure latency.
260
- * @param {RTCPeerConnection} peerConnection
261
- * @returns {undefined}
262
- * @private
263
- * @memberof Reachability
264
- */
265
- private handleIceGatheringStateChange(peerConnection: RTCPeerConnection) {
266
- peerConnection.onicegatheringstatechange = () => {
267
- const {COMPLETE} = ICE_GATHERING_STATE;
268
-
269
- if (peerConnection.iceConnectionState === COMPLETE) {
270
- const elapsed = this.getElapsedTime(peerConnection);
271
-
272
- // @ts-ignore
273
- LoggerProxy.logger.log(
274
- // @ts-ignore
275
- `Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`,
276
- elapsed
277
- );
278
- this.setLatencyAndClose(peerConnection, elapsed);
279
- }
280
- };
281
- }
282
-
283
- /**
284
- * Attach an event handler for the icecandidate
285
- * event and measure latency.
286
- * @param {RTCPeerConnection} peerConnection
287
- * @returns {undefined}
288
- * @private
289
- * @memberof Reachability
290
- */
291
- private handleOnIceCandidate(peerConnection: RTCPeerConnection) {
292
- peerConnection.onicecandidate = (e) => {
293
- const SERVER_REFLEXIVE = 'srflx';
294
-
295
- if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {
296
- const elapsed = this.getElapsedTime(peerConnection);
297
-
298
- LoggerProxy.logger.log(
299
- // @ts-ignore
300
- `Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`,
301
- elapsed
302
- );
303
- this.setLatencyAndClose(peerConnection, elapsed);
304
- }
305
- };
306
- }
307
-
308
- /**
309
- * An event handler on an RTCPeerConnection when the state of the ICE
310
- * candidate gathering process changes. Used to measure connection
311
- * speed.
312
- * @private
313
- * @param {RTCPeerConnection} peerConnection
314
- * @param {number} timeout
315
- * @returns {Promise}
316
- */
317
- private iceGatheringState(peerConnection: RTCPeerConnection, timeout: number) {
318
- const ELAPSED = 'elapsed';
319
-
320
- return new Promise((resolve) => {
321
- const peerConnectionProxy = new window.Proxy(peerConnection, {
322
- get(target, property) {
323
- const targetMember = target[property];
324
-
325
- if (typeof targetMember === 'function') {
326
- return targetMember.bind(target);
327
- }
328
-
329
- return targetMember;
330
- },
331
- set: (target, property, value) => {
332
- // only intercept elapsed property
333
- if (property === ELAPSED) {
334
- // @ts-ignore
335
- resolve({clusterId: peerConnection.key, elapsed: value});
336
-
337
- return true;
338
- }
339
-
340
- // pass thru
341
- return window.Reflect.set(target, property, value);
342
- },
343
- });
344
-
345
- // Using peerConnection proxy so handle functions below
346
- // won't be coupled to our promise implementation
347
- this.handleIceGatheringStateChange(peerConnectionProxy);
348
- this.handleOnIceCandidate(peerConnectionProxy);
349
-
350
- // Set maximum timeout
351
- window.setTimeout(() => {
352
- const {CLOSED} = CONNECTION_STATE;
353
-
354
- // Close any open peerConnections
355
- if (peerConnectionProxy.connectionState !== CLOSED) {
356
- this.setLatencyAndClose(peerConnectionProxy, null);
357
- }
358
- }, timeout);
359
- });
360
- }
361
-
362
310
  /**
363
311
  * Make a log of unreachable clusters.
364
312
  * @returns {undefined}
@@ -366,123 +314,58 @@ export default class Reachability {
366
314
  * @memberof Reachability
367
315
  */
368
316
  private logUnreachableClusters() {
369
- const list = this.getUnreachablClusters();
317
+ const list = this.getUnreachableClusters();
370
318
 
371
- list.forEach((cluster) => {
319
+ list.forEach(({name, protocol}) => {
372
320
  LoggerProxy.logger.log(
373
- `Reachability:index#logUnreachableClusters --> No ice candidate for ${cluster}.`
321
+ `Reachability:index#logUnreachableClusters --> failed to reach ${name} over ${protocol}`
374
322
  );
375
323
  });
376
324
  }
377
325
 
378
326
  /**
379
- * Calculates time to establish connection
380
- * @param {array} iceResults iceResults
381
- * @returns {object} reachabilityMap
382
- * @private
383
- * @memberof Reachability
327
+ * Performs reachability checks for all clusters
328
+ * @param {ClusterList} clusterList
329
+ * @returns {Promise<ReachabilityResults>} reachability check results
384
330
  */
385
- private parseIceResultsToReachabilityResults(iceResults: Array<any>) {
386
- const reachabilityMap = {};
387
-
388
- iceResults.forEach(({clusterId, elapsed}) => {
389
- let latencyResult;
390
-
391
- if (elapsed === null) {
392
- latencyResult = {reachable: 'false'};
393
- } else {
394
- latencyResult = {
395
- reachable: 'true',
396
- latencyInMilliseconds: elapsed.toString(),
397
- };
398
- }
399
-
400
- reachabilityMap[clusterId] = {
401
- udp: latencyResult,
402
- tcp: latencyResult,
403
- };
404
- });
405
-
406
- return reachabilityMap;
407
- }
331
+ private async performReachabilityChecks(clusterList: ClusterList): Promise<ReachabilityResults> {
332
+ const results: ReachabilityResults = {};
408
333
 
409
- /**
410
- * fetches reachability data
411
- * @param {object} clusterList
412
- * @returns {Promise<localSDPData>} reachability check results
413
- * @private
414
- * @memberof Reachability
415
- */
416
- private performReachabilityCheck(clusterList: object) {
417
334
  if (!clusterList || !Object.keys(clusterList).length) {
418
- return Promise.resolve({});
335
+ return Promise.resolve(results);
419
336
  }
420
337
 
421
- return new Promise((resolve) => {
422
- this.getLocalSDPForClusters(clusterList)
423
- .then((localSDPData) => {
424
- if (!localSDPData || !Object.keys(localSDPData).length) {
425
- // TODO: handle the error condition properly and try retry
426
- LoggerProxy.logger.log(
427
- 'Reachability:index#performReachabilityCheck --> Local SDP is empty or has missing elements..returning'
428
- );
429
- resolve({});
430
- } else {
431
- resolve(localSDPData);
432
- }
433
- })
434
- .catch((error) => {
435
- LoggerProxy.logger.error(
436
- `Reachability:index#performReachabilityCheck --> Error in getLocalSDPForClusters: ${error}`
437
- );
438
- resolve({});
439
- });
440
- });
441
- }
338
+ LoggerProxy.logger.log(
339
+ `Reachability:index#performReachabilityChecks --> doing UDP${
340
+ // @ts-ignore
341
+ this.webex.config.meetings.experimental.enableTcpReachability ? ' and TCP' : ''
342
+ } reachability checks`
343
+ );
442
344
 
443
- /**
444
- * Records latency and closes the peerConnection
445
- * @param {RTCPeerConnection} peerConnection
446
- * @param {number} elapsed Latency in milliseconds
447
- * @returns {undefined}
448
- * @private
449
- * @memberof Reachability
450
- */
451
- private setLatencyAndClose(peerConnection: RTCPeerConnection, elapsed: number) {
452
- const REACHABLE = 'reachable';
453
- const UNREACHABLE = 'unreachable';
454
- const {CLOSED} = CONNECTION_STATE;
455
- // @ts-ignore
456
- const {key} = peerConnection;
457
- const resultKey = elapsed === null ? UNREACHABLE : REACHABLE;
458
- const intialState = {[REACHABLE]: 0, [UNREACHABLE]: 0};
345
+ const clusterReachabilityChecks = Object.keys(clusterList).map((key) => {
346
+ const cluster = clusterList[key];
459
347
 
460
- if (peerConnection.connectionState === CLOSED) {
461
- LoggerProxy.logger.log(
462
- `Reachability:index#setLatencyAndClose --> Attempting to set latency of ${elapsed} on closed peerConnection.`
463
- );
348
+ // Linus doesn't support TCP reachability checks on video mesh nodes
349
+ const includeTcpReachability =
350
+ // @ts-ignore
351
+ this.webex.config.meetings.experimental.enableTcpReachability && !cluster.isVideoMesh;
464
352
 
465
- return;
466
- }
353
+ if (!includeTcpReachability) {
354
+ cluster.tcp = [];
355
+ }
467
356
 
468
- this.clusterLatencyResults[key] = this.clusterLatencyResults[key] || intialState;
469
- this.clusterLatencyResults[key][resultKey] += 1;
357
+ this.clusterReachability[key] = new ClusterReachability(key, cluster);
470
358
 
471
- // Set to null in case this fired from
472
- // an event other than onIceCandidate
473
- peerConnection.onicecandidate = null;
474
- peerConnection.close();
475
- // @ts-ignore
476
- peerConnection.elapsed = elapsed;
477
- }
359
+ return this.clusterReachability[key].start().then((result) => {
360
+ results[key] = result;
361
+ results[key].isVideoMesh = cluster.isVideoMesh;
362
+ });
363
+ });
478
364
 
479
- /**
480
- * utility function
481
- * @returns {undefined}
482
- * @private
483
- * @memberof Reachability
484
- */
485
- private setup() {
486
- this.clusterLatencyResults = {};
365
+ await Promise.all(clusterReachabilityChecks);
366
+
367
+ this.logUnreachableClusters();
368
+
369
+ return results;
487
370
  }
488
371
  }