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