@webex/plugin-meetings 3.0.0-beta.34 → 3.0.0-beta.340

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