@webex/plugin-meetings 2.60.1-next.9 → 2.60.2

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