@webex/plugin-meetings 2.59.8 → 2.60.0-next.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 (528) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +41 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +357 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +215 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +22 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +51 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +44 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1047 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +77 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +64 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/browser-detection.js +2 -3
  23. package/dist/common/browser-detection.js.map +1 -1
  24. package/dist/common/collection.js +3 -4
  25. package/dist/common/collection.js.map +1 -1
  26. package/dist/common/config.js +1 -2
  27. package/dist/common/config.js.map +1 -1
  28. package/dist/common/errors/captcha-error.js +1 -2
  29. package/dist/common/errors/captcha-error.js.map +1 -1
  30. package/dist/common/errors/intent-to-join.js +1 -2
  31. package/dist/common/errors/intent-to-join.js.map +1 -1
  32. package/dist/common/errors/join-meeting.js +1 -2
  33. package/dist/common/errors/join-meeting.js.map +1 -1
  34. package/dist/common/errors/media.js +1 -2
  35. package/dist/common/errors/media.js.map +1 -1
  36. package/dist/common/errors/no-meeting-info.js +50 -0
  37. package/dist/common/errors/no-meeting-info.js.map +1 -0
  38. package/dist/common/errors/parameter.js +3 -4
  39. package/dist/common/errors/parameter.js.map +1 -1
  40. package/dist/common/errors/password-error.js +1 -2
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +1 -2
  43. package/dist/common/errors/permission.js.map +1 -1
  44. package/dist/common/errors/reclaim-host-role-errors.js +154 -0
  45. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  46. package/dist/common/errors/reconnection-in-progress.js +1 -2
  47. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  48. package/dist/common/errors/reconnection.js +1 -2
  49. package/dist/common/errors/reconnection.js.map +1 -1
  50. package/dist/common/errors/stats.js +1 -2
  51. package/dist/common/errors/stats.js.map +1 -1
  52. package/dist/common/errors/webex-errors.js +48 -28
  53. package/dist/common/errors/webex-errors.js.map +1 -1
  54. package/dist/common/errors/webex-meetings-error.js +1 -2
  55. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  56. package/dist/common/events/events-scope.js +1 -2
  57. package/dist/common/events/events-scope.js.map +1 -1
  58. package/dist/common/events/events.js +1 -2
  59. package/dist/common/events/events.js.map +1 -1
  60. package/dist/common/events/trigger-proxy.js +1 -2
  61. package/dist/common/events/trigger-proxy.js.map +1 -1
  62. package/dist/common/events/util.js +1 -2
  63. package/dist/common/events/util.js.map +1 -1
  64. package/dist/common/logs/logger-config.js +1 -2
  65. package/dist/common/logs/logger-config.js.map +1 -1
  66. package/dist/common/logs/logger-proxy.js +2 -3
  67. package/dist/common/logs/logger-proxy.js.map +1 -1
  68. package/dist/common/logs/request.js +8 -5
  69. package/dist/common/logs/request.js.map +1 -1
  70. package/dist/common/queue.js +22 -9
  71. package/dist/common/queue.js.map +1 -1
  72. package/dist/config.js +8 -11
  73. package/dist/config.js.map +1 -1
  74. package/dist/constants.js +437 -435
  75. package/dist/constants.js.map +1 -1
  76. package/dist/controls-options-manager/constants.js +3 -6
  77. package/dist/controls-options-manager/constants.js.map +1 -1
  78. package/dist/controls-options-manager/enums.js +15 -6
  79. package/dist/controls-options-manager/enums.js.map +1 -1
  80. package/dist/controls-options-manager/index.js +127 -38
  81. package/dist/controls-options-manager/index.js.map +1 -1
  82. package/dist/controls-options-manager/types.js +7 -0
  83. package/dist/controls-options-manager/types.js.map +1 -0
  84. package/dist/controls-options-manager/util.js +309 -19
  85. package/dist/controls-options-manager/util.js.map +1 -1
  86. package/dist/index.js +116 -4
  87. package/dist/index.js.map +1 -1
  88. package/dist/interpretation/collection.js +22 -0
  89. package/dist/interpretation/collection.js.map +1 -0
  90. package/dist/interpretation/index.js +365 -0
  91. package/dist/interpretation/index.js.map +1 -0
  92. package/dist/interpretation/siLanguage.js +24 -0
  93. package/dist/interpretation/siLanguage.js.map +1 -0
  94. package/dist/locus-info/controlsUtils.js +100 -11
  95. package/dist/locus-info/controlsUtils.js.map +1 -1
  96. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  97. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  98. package/dist/locus-info/fullState.js +1 -2
  99. package/dist/locus-info/fullState.js.map +1 -1
  100. package/dist/locus-info/hostUtils.js +1 -2
  101. package/dist/locus-info/hostUtils.js.map +1 -1
  102. package/dist/locus-info/index.js +425 -84
  103. package/dist/locus-info/index.js.map +1 -1
  104. package/dist/locus-info/infoUtils.js +13 -5
  105. package/dist/locus-info/infoUtils.js.map +1 -1
  106. package/dist/locus-info/mediaSharesUtils.js +58 -3
  107. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  108. package/dist/locus-info/parser.js +253 -80
  109. package/dist/locus-info/parser.js.map +1 -1
  110. package/dist/locus-info/selfUtils.js +97 -13
  111. package/dist/locus-info/selfUtils.js.map +1 -1
  112. package/dist/media/index.js +106 -319
  113. package/dist/media/index.js.map +1 -1
  114. package/dist/media/properties.js +96 -153
  115. package/dist/media/properties.js.map +1 -1
  116. package/dist/media/util.js +1 -22
  117. package/dist/media/util.js.map +1 -1
  118. package/dist/mediaQualityMetrics/config.js +498 -493
  119. package/dist/mediaQualityMetrics/config.js.map +1 -1
  120. package/dist/meeting/in-meeting-actions.js +92 -3
  121. package/dist/meeting/in-meeting-actions.js.map +1 -1
  122. package/dist/meeting/index.js +4628 -2971
  123. package/dist/meeting/index.js.map +1 -1
  124. package/dist/meeting/locusMediaRequest.js +291 -0
  125. package/dist/meeting/locusMediaRequest.js.map +1 -0
  126. package/dist/meeting/muteState.js +224 -133
  127. package/dist/meeting/muteState.js.map +1 -1
  128. package/dist/meeting/request.js +297 -199
  129. package/dist/meeting/request.js.map +1 -1
  130. package/dist/meeting/request.type.js +7 -0
  131. package/dist/meeting/request.type.js.map +1 -0
  132. package/dist/meeting/state.js +1 -2
  133. package/dist/meeting/state.js.map +1 -1
  134. package/dist/meeting/util.js +605 -435
  135. package/dist/meeting/util.js.map +1 -1
  136. package/dist/meeting-info/collection.js +3 -4
  137. package/dist/meeting-info/collection.js.map +1 -1
  138. package/dist/meeting-info/index.js +74 -7
  139. package/dist/meeting-info/index.js.map +1 -1
  140. package/dist/meeting-info/meeting-info-v2.js +200 -63
  141. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  142. package/dist/meeting-info/request.js +1 -2
  143. package/dist/meeting-info/request.js.map +1 -1
  144. package/dist/meeting-info/util.js +2 -3
  145. package/dist/meeting-info/util.js.map +1 -1
  146. package/dist/meeting-info/utilv2.js +39 -41
  147. package/dist/meeting-info/utilv2.js.map +1 -1
  148. package/dist/meetings/collection.js +42 -4
  149. package/dist/meetings/collection.js.map +1 -1
  150. package/dist/meetings/index.js +477 -123
  151. package/dist/meetings/index.js.map +1 -1
  152. package/dist/meetings/meetings.types.js +7 -0
  153. package/dist/meetings/meetings.types.js.map +1 -0
  154. package/dist/meetings/request.js +4 -3
  155. package/dist/meetings/request.js.map +1 -1
  156. package/dist/meetings/util.js +107 -6
  157. package/dist/meetings/util.js.map +1 -1
  158. package/dist/member/index.js +54 -2
  159. package/dist/member/index.js.map +1 -1
  160. package/dist/member/member.types.js +3 -4
  161. package/dist/member/member.types.js.map +1 -1
  162. package/dist/member/types.js +23 -0
  163. package/dist/member/types.js.map +1 -0
  164. package/dist/member/util.js +131 -29
  165. package/dist/member/util.js.map +1 -1
  166. package/dist/members/collection.js +11 -2
  167. package/dist/members/collection.js.map +1 -1
  168. package/dist/members/index.js +174 -10
  169. package/dist/members/index.js.map +1 -1
  170. package/dist/members/request.js +108 -41
  171. package/dist/members/request.js.map +1 -1
  172. package/dist/members/types.js +14 -0
  173. package/dist/members/types.js.map +1 -0
  174. package/dist/members/util.js +327 -234
  175. package/dist/members/util.js.map +1 -1
  176. package/dist/metrics/constants.js +15 -9
  177. package/dist/metrics/constants.js.map +1 -1
  178. package/dist/metrics/index.js +4 -452
  179. package/dist/metrics/index.js.map +1 -1
  180. package/dist/multistream/mediaRequestManager.js +344 -0
  181. package/dist/multistream/mediaRequestManager.js.map +1 -0
  182. package/dist/multistream/receiveSlot.js +200 -0
  183. package/dist/multistream/receiveSlot.js.map +1 -0
  184. package/dist/multistream/receiveSlotManager.js +174 -0
  185. package/dist/multistream/receiveSlotManager.js.map +1 -0
  186. package/dist/multistream/remoteMedia.js +268 -0
  187. package/dist/multistream/remoteMedia.js.map +1 -0
  188. package/dist/multistream/remoteMediaGroup.js +267 -0
  189. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  190. package/dist/multistream/remoteMediaManager.js +1211 -0
  191. package/dist/multistream/remoteMediaManager.js.map +1 -0
  192. package/dist/multistream/sendSlotManager.js +236 -0
  193. package/dist/multistream/sendSlotManager.js.map +1 -0
  194. package/dist/networkQualityMonitor/index.js +5 -4
  195. package/dist/networkQualityMonitor/index.js.map +1 -1
  196. package/dist/personal-meeting-room/index.js +2 -3
  197. package/dist/personal-meeting-room/index.js.map +1 -1
  198. package/dist/personal-meeting-room/request.js +2 -3
  199. package/dist/personal-meeting-room/request.js.map +1 -1
  200. package/dist/personal-meeting-room/util.js +1 -2
  201. package/dist/personal-meeting-room/util.js.map +1 -1
  202. package/dist/reachability/index.js +265 -72
  203. package/dist/reachability/index.js.map +1 -1
  204. package/dist/reachability/request.js +18 -10
  205. package/dist/reachability/request.js.map +1 -1
  206. package/dist/reactions/constants.js +12 -0
  207. package/dist/reactions/constants.js.map +1 -0
  208. package/dist/reactions/reactions.js +4 -6
  209. package/dist/reactions/reactions.js.map +1 -1
  210. package/dist/reactions/reactions.type.js +21 -23
  211. package/dist/reactions/reactions.type.js.map +1 -1
  212. package/dist/reconnection-manager/index.js +281 -229
  213. package/dist/reconnection-manager/index.js.map +1 -1
  214. package/dist/recording-controller/enums.js +4 -5
  215. package/dist/recording-controller/enums.js.map +1 -1
  216. package/dist/recording-controller/index.js +57 -46
  217. package/dist/recording-controller/index.js.map +1 -1
  218. package/dist/recording-controller/util.js +10 -10
  219. package/dist/recording-controller/util.js.map +1 -1
  220. package/dist/roap/index.js +101 -235
  221. package/dist/roap/index.js.map +1 -1
  222. package/dist/roap/request.js +126 -180
  223. package/dist/roap/request.js.map +1 -1
  224. package/dist/roap/turnDiscovery.js +115 -105
  225. package/dist/roap/turnDiscovery.js.map +1 -1
  226. package/dist/rtcMetrics/constants.js +11 -0
  227. package/dist/rtcMetrics/constants.js.map +1 -0
  228. package/dist/rtcMetrics/index.js +140 -0
  229. package/dist/rtcMetrics/index.js.map +1 -0
  230. package/dist/statsAnalyzer/global.js +2 -85
  231. package/dist/statsAnalyzer/global.js.map +1 -1
  232. package/dist/statsAnalyzer/index.js +402 -424
  233. package/dist/statsAnalyzer/index.js.map +1 -1
  234. package/dist/statsAnalyzer/mqaUtil.js +117 -83
  235. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  236. package/dist/transcription/index.js +1 -2
  237. package/dist/transcription/index.js.map +1 -1
  238. package/dist/webinar/collection.js +43 -0
  239. package/dist/webinar/collection.js.map +1 -0
  240. package/dist/webinar/index.js +68 -0
  241. package/dist/webinar/index.js.map +1 -0
  242. package/package.json +34 -25
  243. package/src/annotation/annotation.types.ts +50 -0
  244. package/src/annotation/constants.ts +36 -0
  245. package/src/annotation/index.ts +328 -0
  246. package/src/breakouts/README.md +220 -0
  247. package/src/breakouts/breakout.ts +188 -0
  248. package/src/breakouts/collection.ts +19 -0
  249. package/src/breakouts/edit-lock-error.ts +25 -0
  250. package/src/breakouts/events.ts +56 -0
  251. package/src/breakouts/index.ts +925 -0
  252. package/src/breakouts/request.ts +55 -0
  253. package/src/breakouts/utils.ts +57 -0
  254. package/src/common/errors/no-meeting-info.ts +24 -0
  255. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  256. package/src/common/errors/webex-errors.ts +36 -12
  257. package/src/common/logs/logger-proxy.ts +1 -1
  258. package/src/common/logs/request.ts +5 -1
  259. package/src/common/queue.ts +22 -8
  260. package/src/config.ts +5 -7
  261. package/src/constants.ts +271 -93
  262. package/src/controls-options-manager/enums.ts +12 -0
  263. package/src/controls-options-manager/index.ts +116 -21
  264. package/src/controls-options-manager/types.ts +59 -0
  265. package/src/controls-options-manager/util.ts +294 -14
  266. package/src/index.ts +40 -0
  267. package/src/interpretation/README.md +60 -0
  268. package/src/interpretation/collection.ts +19 -0
  269. package/src/interpretation/index.ts +332 -0
  270. package/src/interpretation/siLanguage.ts +18 -0
  271. package/src/locus-info/controlsUtils.ts +110 -0
  272. package/src/locus-info/index.ts +449 -61
  273. package/src/locus-info/infoUtils.ts +14 -2
  274. package/src/locus-info/mediaSharesUtils.ts +64 -0
  275. package/src/locus-info/parser.ts +258 -47
  276. package/src/locus-info/selfUtils.ts +85 -2
  277. package/src/media/index.ts +153 -370
  278. package/src/media/properties.ts +106 -136
  279. package/src/media/util.ts +0 -21
  280. package/src/mediaQualityMetrics/config.ts +379 -377
  281. package/src/meeting/in-meeting-actions.ts +172 -0
  282. package/src/meeting/index.ts +3861 -2504
  283. package/src/meeting/locusMediaRequest.ts +313 -0
  284. package/src/meeting/muteState.ts +224 -138
  285. package/src/meeting/request.ts +207 -127
  286. package/src/meeting/request.type.ts +13 -0
  287. package/src/meeting/util.ts +590 -423
  288. package/src/meeting-info/index.ts +81 -8
  289. package/src/meeting-info/meeting-info-v2.ts +163 -13
  290. package/src/meeting-info/util.ts +1 -1
  291. package/src/meeting-info/utilv2.ts +28 -28
  292. package/src/meetings/collection.ts +33 -0
  293. package/src/meetings/index.ts +477 -124
  294. package/src/meetings/meetings.types.ts +12 -0
  295. package/src/meetings/request.ts +2 -0
  296. package/src/meetings/util.ts +116 -5
  297. package/src/member/index.ts +52 -1
  298. package/src/member/types.ts +38 -0
  299. package/src/member/util.ts +139 -28
  300. package/src/members/collection.ts +8 -0
  301. package/src/members/index.ts +196 -7
  302. package/src/members/request.ts +97 -17
  303. package/src/members/types.ts +29 -0
  304. package/src/members/util.ts +333 -240
  305. package/src/metrics/constants.ts +13 -6
  306. package/src/metrics/index.ts +1 -471
  307. package/src/multistream/mediaRequestManager.ts +440 -0
  308. package/src/multistream/receiveSlot.ts +184 -0
  309. package/src/multistream/receiveSlotManager.ts +166 -0
  310. package/src/multistream/remoteMedia.ts +254 -0
  311. package/src/multistream/remoteMediaGroup.ts +284 -0
  312. package/src/multistream/remoteMediaManager.ts +1145 -0
  313. package/src/multistream/sendSlotManager.ts +170 -0
  314. package/src/networkQualityMonitor/index.ts +6 -6
  315. package/src/reachability/index.ts +238 -45
  316. package/src/reachability/request.ts +17 -8
  317. package/src/reactions/constants.ts +4 -0
  318. package/src/reactions/reactions.ts +4 -4
  319. package/src/reactions/reactions.type.ts +30 -4
  320. package/src/reconnection-manager/index.ts +167 -154
  321. package/src/recording-controller/index.ts +20 -3
  322. package/src/recording-controller/util.ts +26 -9
  323. package/src/roap/index.ts +98 -241
  324. package/src/roap/request.ts +74 -148
  325. package/src/roap/turnDiscovery.ts +62 -56
  326. package/src/rtcMetrics/constants.ts +3 -0
  327. package/src/rtcMetrics/index.ts +124 -0
  328. package/src/statsAnalyzer/global.ts +1 -84
  329. package/src/statsAnalyzer/index.ts +470 -522
  330. package/src/statsAnalyzer/mqaUtil.ts +117 -112
  331. package/src/webinar/collection.ts +31 -0
  332. package/src/webinar/index.ts +62 -0
  333. package/test/integration/spec/converged-space-meetings.js +233 -0
  334. package/test/integration/spec/journey.js +320 -264
  335. package/test/integration/spec/space-meeting.js +77 -4
  336. package/test/unit/spec/annotation/index.ts +418 -0
  337. package/test/unit/spec/breakouts/breakout.ts +237 -0
  338. package/test/unit/spec/breakouts/collection.ts +15 -0
  339. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  340. package/test/unit/spec/breakouts/events.ts +89 -0
  341. package/test/unit/spec/breakouts/index.ts +1790 -0
  342. package/test/unit/spec/breakouts/request.ts +104 -0
  343. package/test/unit/spec/breakouts/utils.js +72 -0
  344. package/test/unit/spec/common/queue.js +31 -2
  345. package/test/unit/spec/controls-options-manager/index.js +163 -0
  346. package/test/unit/spec/controls-options-manager/util.js +576 -60
  347. package/test/unit/spec/fixture/locus.js +1 -0
  348. package/test/unit/spec/interpretation/collection.ts +15 -0
  349. package/test/unit/spec/interpretation/index.ts +589 -0
  350. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  351. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  352. package/test/unit/spec/locus-info/index.js +1390 -16
  353. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  354. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  355. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  356. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  357. package/test/unit/spec/locus-info/parser.js +116 -35
  358. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  359. package/test/unit/spec/media/index.ts +274 -0
  360. package/test/unit/spec/media/properties.ts +75 -84
  361. package/test/unit/spec/meeting/in-meeting-actions.ts +84 -0
  362. package/test/unit/spec/meeting/index.js +8269 -3145
  363. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  364. package/test/unit/spec/meeting/muteState.js +409 -213
  365. package/test/unit/spec/meeting/request.js +512 -42
  366. package/test/unit/spec/meeting/utils.js +741 -24
  367. package/test/unit/spec/meeting-info/index.js +300 -0
  368. package/test/unit/spec/meeting-info/meetinginfov2.js +527 -5
  369. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  370. package/test/unit/spec/meetings/collection.js +26 -0
  371. package/test/unit/spec/meetings/index.js +1201 -210
  372. package/test/unit/spec/meetings/utils.js +202 -2
  373. package/test/unit/spec/member/index.js +38 -8
  374. package/test/unit/spec/member/util.js +499 -29
  375. package/test/unit/spec/members/index.js +597 -3
  376. package/test/unit/spec/members/request.js +206 -27
  377. package/test/unit/spec/members/utils.js +210 -0
  378. package/test/unit/spec/metrics/index.js +1 -50
  379. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  380. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  381. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  382. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  383. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  384. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  385. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  386. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  387. package/test/unit/spec/reachability/index.ts +598 -24
  388. package/test/unit/spec/reachability/request.js +68 -0
  389. package/test/unit/spec/reconnection-manager/index.js +145 -22
  390. package/test/unit/spec/recording-controller/index.js +293 -218
  391. package/test/unit/spec/recording-controller/util.js +223 -96
  392. package/test/unit/spec/roap/index.ts +200 -76
  393. package/test/unit/spec/roap/request.ts +232 -0
  394. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  395. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  396. package/test/unit/spec/stats-analyzer/index.js +188 -174
  397. package/test/unit/spec/webinar/collection.ts +13 -0
  398. package/test/unit/spec/webinar/index.ts +60 -0
  399. package/test/utils/constants.js +9 -0
  400. package/test/utils/integrationTestUtils.js +46 -0
  401. package/test/utils/testUtils.js +0 -45
  402. package/test/utils/webex-config.js +4 -0
  403. package/test/utils/webex-test-users.js +7 -3
  404. package/dist/common/browser-detection.d.ts +0 -9
  405. package/dist/common/collection.d.ts +0 -48
  406. package/dist/common/config.d.ts +0 -2
  407. package/dist/common/errors/captcha-error.d.ts +0 -15
  408. package/dist/common/errors/intent-to-join.d.ts +0 -16
  409. package/dist/common/errors/join-meeting.d.ts +0 -17
  410. package/dist/common/errors/media.d.ts +0 -15
  411. package/dist/common/errors/parameter.d.ts +0 -15
  412. package/dist/common/errors/password-error.d.ts +0 -15
  413. package/dist/common/errors/permission.d.ts +0 -14
  414. package/dist/common/errors/reconnection-in-progress.d.ts +0 -9
  415. package/dist/common/errors/reconnection.d.ts +0 -15
  416. package/dist/common/errors/stats.d.ts +0 -15
  417. package/dist/common/errors/webex-errors.d.ts +0 -81
  418. package/dist/common/errors/webex-meetings-error.d.ts +0 -20
  419. package/dist/common/events/events-scope.d.ts +0 -17
  420. package/dist/common/events/events.d.ts +0 -12
  421. package/dist/common/events/trigger-proxy.d.ts +0 -2
  422. package/dist/common/events/util.d.ts +0 -2
  423. package/dist/common/logs/logger-config.d.ts +0 -2
  424. package/dist/common/logs/logger-proxy.d.ts +0 -2
  425. package/dist/common/logs/request.d.ts +0 -34
  426. package/dist/common/queue.d.ts +0 -32
  427. package/dist/config.d.ts +0 -73
  428. package/dist/constants.d.ts +0 -926
  429. package/dist/controls-options-manager/constants.d.ts +0 -4
  430. package/dist/controls-options-manager/enums.d.ts +0 -5
  431. package/dist/controls-options-manager/index.d.ts +0 -120
  432. package/dist/controls-options-manager/util.d.ts +0 -7
  433. package/dist/index.d.ts +0 -4
  434. package/dist/locus-info/controlsUtils.d.ts +0 -2
  435. package/dist/locus-info/embeddedAppsUtils.d.ts +0 -2
  436. package/dist/locus-info/fullState.d.ts +0 -2
  437. package/dist/locus-info/hostUtils.d.ts +0 -2
  438. package/dist/locus-info/index.d.ts +0 -269
  439. package/dist/locus-info/infoUtils.d.ts +0 -2
  440. package/dist/locus-info/mediaSharesUtils.d.ts +0 -2
  441. package/dist/locus-info/parser.d.ts +0 -212
  442. package/dist/locus-info/selfUtils.d.ts +0 -2
  443. package/dist/media/index.d.ts +0 -32
  444. package/dist/media/properties.d.ts +0 -108
  445. package/dist/media/util.d.ts +0 -2
  446. package/dist/mediaQualityMetrics/config.d.ts +0 -233
  447. package/dist/meeting/effectsState.d.ts +0 -42
  448. package/dist/meeting/effectsState.js +0 -260
  449. package/dist/meeting/effectsState.js.map +0 -1
  450. package/dist/meeting/in-meeting-actions.d.ts +0 -79
  451. package/dist/meeting/index.d.ts +0 -1622
  452. package/dist/meeting/muteState.d.ts +0 -116
  453. package/dist/meeting/request.d.ts +0 -255
  454. package/dist/meeting/state.d.ts +0 -9
  455. package/dist/meeting/util.d.ts +0 -2
  456. package/dist/meeting-info/collection.d.ts +0 -20
  457. package/dist/meeting-info/index.d.ts +0 -57
  458. package/dist/meeting-info/meeting-info-v2.d.ts +0 -93
  459. package/dist/meeting-info/request.d.ts +0 -22
  460. package/dist/meeting-info/util.d.ts +0 -2
  461. package/dist/meeting-info/utilv2.d.ts +0 -2
  462. package/dist/meetings/collection.d.ts +0 -23
  463. package/dist/meetings/index.d.ts +0 -296
  464. package/dist/meetings/request.d.ts +0 -27
  465. package/dist/meetings/util.d.ts +0 -18
  466. package/dist/member/index.d.ts +0 -147
  467. package/dist/member/member.types.d.ts +0 -11
  468. package/dist/member/util.d.ts +0 -2
  469. package/dist/members/collection.d.ts +0 -24
  470. package/dist/members/index.d.ts +0 -298
  471. package/dist/members/request.d.ts +0 -50
  472. package/dist/members/util.d.ts +0 -2
  473. package/dist/metrics/config.d.ts +0 -169
  474. package/dist/metrics/config.js +0 -289
  475. package/dist/metrics/config.js.map +0 -1
  476. package/dist/metrics/constants.d.ts +0 -59
  477. package/dist/metrics/index.d.ts +0 -152
  478. package/dist/networkQualityMonitor/index.d.ts +0 -70
  479. package/dist/peer-connection-manager/index.d.ts +0 -6
  480. package/dist/peer-connection-manager/index.js +0 -671
  481. package/dist/peer-connection-manager/index.js.map +0 -1
  482. package/dist/peer-connection-manager/util.d.ts +0 -6
  483. package/dist/peer-connection-manager/util.js +0 -110
  484. package/dist/peer-connection-manager/util.js.map +0 -1
  485. package/dist/personal-meeting-room/index.d.ts +0 -47
  486. package/dist/personal-meeting-room/request.d.ts +0 -14
  487. package/dist/personal-meeting-room/util.d.ts +0 -2
  488. package/dist/reachability/index.d.ts +0 -139
  489. package/dist/reachability/request.d.ts +0 -35
  490. package/dist/reactions/reactions.d.ts +0 -4
  491. package/dist/reactions/reactions.type.d.ts +0 -32
  492. package/dist/reconnection-manager/index.d.ts +0 -112
  493. package/dist/recording-controller/enums.d.ts +0 -7
  494. package/dist/recording-controller/index.d.ts +0 -193
  495. package/dist/recording-controller/util.d.ts +0 -13
  496. package/dist/roap/collection.d.ts +0 -10
  497. package/dist/roap/collection.js +0 -63
  498. package/dist/roap/collection.js.map +0 -1
  499. package/dist/roap/handler.d.ts +0 -47
  500. package/dist/roap/handler.js +0 -279
  501. package/dist/roap/handler.js.map +0 -1
  502. package/dist/roap/index.d.ts +0 -116
  503. package/dist/roap/request.d.ts +0 -35
  504. package/dist/roap/state.d.ts +0 -9
  505. package/dist/roap/state.js +0 -127
  506. package/dist/roap/state.js.map +0 -1
  507. package/dist/roap/turnDiscovery.d.ts +0 -81
  508. package/dist/roap/util.d.ts +0 -2
  509. package/dist/roap/util.js +0 -76
  510. package/dist/roap/util.js.map +0 -1
  511. package/dist/statsAnalyzer/global.d.ts +0 -118
  512. package/dist/statsAnalyzer/index.d.ts +0 -193
  513. package/dist/statsAnalyzer/mqaUtil.d.ts +0 -22
  514. package/dist/transcription/index.d.ts +0 -64
  515. package/src/index.js +0 -15
  516. package/src/meeting/effectsState.ts +0 -209
  517. package/src/metrics/config.ts +0 -485
  518. package/src/peer-connection-manager/index.ts +0 -847
  519. package/src/peer-connection-manager/util.ts +0 -119
  520. package/src/roap/collection.ts +0 -62
  521. package/src/roap/handler.ts +0 -294
  522. package/src/roap/state.ts +0 -156
  523. package/src/roap/util.ts +0 -100
  524. package/test/unit/spec/meeting/effectsState.js +0 -281
  525. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  526. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  527. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  528. package/test/unit/spec/roap/util.js +0 -30
@@ -0,0 +1,170 @@
1
+ import {
2
+ SendSlot,
3
+ MediaType,
4
+ LocalStream,
5
+ MultistreamRoapMediaConnection,
6
+ } from '@webex/internal-media-core';
7
+
8
+ export default class SendSlotManager {
9
+ private readonly slots: Map<MediaType, SendSlot> = new Map();
10
+ private readonly LoggerProxy: any;
11
+
12
+ constructor(LoggerProxy: any) {
13
+ this.LoggerProxy = LoggerProxy;
14
+ }
15
+
16
+ /**
17
+ * This method is used to create a sendSlot for the given mediaType and returns the created sendSlot
18
+ * @param {MultistreamRoapMediaConnection} mediaConnection MultistreamRoapMediaConnection for which a sendSlot needs to be created
19
+ * @param {MediaType} mediaType MediaType for which a sendSlot needs to be created (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)
20
+ * @param {boolean} active This is optional boolean to set the active state of the sendSlot. Default is true
21
+ * @returns {SendSlot} slot The created sendSlot
22
+ */
23
+ public createSlot(
24
+ mediaConnection: MultistreamRoapMediaConnection,
25
+ mediaType: MediaType,
26
+ active = true
27
+ ): SendSlot {
28
+ if (this.slots.has(mediaType)) {
29
+ throw new Error(`Slot for ${mediaType} already exists`);
30
+ }
31
+
32
+ const slot: SendSlot = mediaConnection.createSendSlot(mediaType, active);
33
+
34
+ this.slots.set(mediaType, slot);
35
+
36
+ this.LoggerProxy.logger.info(
37
+ `SendSlotsManager->createSlot#Created slot for ${mediaType} with active ${active}`
38
+ );
39
+
40
+ return slot;
41
+ }
42
+
43
+ /**
44
+ * This method is used to retrieve the sendSlot for the given mediaType
45
+ * @param {MediaType} mediaType of which the slot needs to be retrieved
46
+ * @returns {SendSlot}
47
+ */
48
+ public getSlot(mediaType: MediaType): SendSlot {
49
+ const slot = this.slots.get(mediaType);
50
+
51
+ if (!slot) {
52
+ throw new Error(`Slot for ${mediaType} does not exist`);
53
+ }
54
+
55
+ return slot;
56
+ }
57
+
58
+ /**
59
+ * This method publishes the given stream to the sendSlot for the given mediaType
60
+ * @param {MediaType} mediaType MediaType of the sendSlot to which a stream needs to be published (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)
61
+ * @param {LocalStream} stream LocalStream to be published
62
+ * @returns {Promise<void>}
63
+ */
64
+ public async publishStream(mediaType: MediaType, stream: LocalStream): Promise<void> {
65
+ const slot = this.slots.get(mediaType);
66
+
67
+ if (!slot) {
68
+ throw new Error(`Slot for ${mediaType} does not exist`);
69
+ }
70
+
71
+ await slot.publishStream(stream);
72
+
73
+ this.LoggerProxy.logger.info(
74
+ `SendSlotsManager->publishStream#Published stream for ${mediaType} and stream with label ${stream.label} and muted ${stream.muted}`
75
+ );
76
+ }
77
+
78
+ /**
79
+ * This method unpublishes the stream from the sendSlot of the given mediaType
80
+ * @param {MediaType} mediaType MediaType of the sendSlot from which a stream needs to be unpublished (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)
81
+ * @returns {Promise<void>}
82
+ */
83
+ public async unpublishStream(mediaType: MediaType): Promise<void> {
84
+ const slot = this.slots.get(mediaType);
85
+
86
+ if (!slot) {
87
+ throw new Error(`Slot for ${mediaType} does not exist`);
88
+ }
89
+
90
+ await slot.unpublishStream();
91
+
92
+ this.LoggerProxy.logger.info(
93
+ `SendSlotsManager->unpublishStream#Unpublished stream for ${mediaType}`
94
+ );
95
+ }
96
+
97
+ /**
98
+ * This method is used to set the active state of the sendSlot for the given mediaType
99
+ * @param {MediaType} mediaType The MediaType of the sendSlot for which the active state needs to be set (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)
100
+ * @param {boolean} active The boolean to set the active state of the sendSlot. Default is true
101
+ * @returns {void}
102
+ */
103
+ public setActive(mediaType: MediaType, active = true): void {
104
+ const slot = this.slots.get(mediaType);
105
+
106
+ if (!slot) {
107
+ throw new Error(`Slot for ${mediaType} does not exist`);
108
+ }
109
+
110
+ slot.active = active;
111
+
112
+ this.LoggerProxy.logger.info(
113
+ `SendSlotsManager->setActive#Set active for ${mediaType} to ${active}`
114
+ );
115
+ }
116
+
117
+ /**
118
+ * This method is used to set the codec parameters for the sendSlot of the given mediaType
119
+ * @param {MediaType} mediaType MediaType of the sendSlot for which the codec parameters needs to be set (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)
120
+ * @param {Object} codecParameters
121
+ * @returns {Promise<void>}
122
+ */
123
+ public async setCodecParameters(
124
+ mediaType: MediaType,
125
+ codecParameters: {
126
+ [key: string]: string | undefined; // As per ts-sdp undefined is considered as a valid value to be used for codec parameters
127
+ }
128
+ ): Promise<void> {
129
+ // These codec parameter changes underneath are SDP value changes that are taken care by WCME automatically. So no need for any change in streams from the web sdk side
130
+ const slot = this.slots.get(mediaType);
131
+
132
+ if (!slot) {
133
+ throw new Error(`Slot for ${mediaType} does not exist`);
134
+ }
135
+
136
+ await slot.setCodecParameters(codecParameters);
137
+
138
+ this.LoggerProxy.logger.info(
139
+ `SendSlotsManager->setCodecParameters#Set codec parameters for ${mediaType} to ${codecParameters}`
140
+ );
141
+ }
142
+
143
+ /**
144
+ * This method is used to delete the codec parameters for the sendSlot of the given mediaType
145
+ * @param {MediaType} mediaType MediaType of the sendSlot for which the codec parameters needs to be deleted (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)
146
+ * @param {Array<String>} parameters Array of keys of the codec parameters to be deleted
147
+ * @returns {Promise<void>}
148
+ */
149
+ public async deleteCodecParameters(mediaType: MediaType, parameters: string[]): Promise<void> {
150
+ const slot = this.slots.get(mediaType);
151
+
152
+ if (!slot) {
153
+ throw new Error(`Slot for ${mediaType} does not exist`);
154
+ }
155
+
156
+ await slot.deleteCodecParameters(parameters);
157
+
158
+ this.LoggerProxy.logger.info(
159
+ `SendSlotsManager->deleteCodecParameters#Deleted the following codec parameters -> ${parameters} for ${mediaType}`
160
+ );
161
+ }
162
+
163
+ /**
164
+ * This method is used to reset the SendSlotsManager by deleting all the sendSlots
165
+ * @returns {undefined}
166
+ */
167
+ public reset(): void {
168
+ this.slots.clear();
169
+ }
170
+ }
@@ -1,5 +1,5 @@
1
1
  import EventsScope from '../common/events/events-scope';
2
- import {EVENT_TRIGGERS, STATS} from '../constants';
2
+ import {EVENT_TRIGGERS} from '../constants';
3
3
 
4
4
  /**
5
5
  * Meeting - network quality event
@@ -49,11 +49,7 @@ export default class NetworkQualityMonitor extends EventsScope {
49
49
  });
50
50
  this.networkQualityScore = 1;
51
51
  this.networkQualityStatus = {
52
- [this.frequencyTypes.UPLINK]: {
53
- [STATS.VIDEO_CORRELATE]: {},
54
- [STATS.AUDIO_CORRELATE]: {},
55
- [STATS.SHARE_CORRELATE]: {},
56
- },
52
+ [this.frequencyTypes.UPLINK]: {},
57
53
  };
58
54
  this.mediaType = null;
59
55
  }
@@ -172,6 +168,10 @@ export default class NetworkQualityMonitor extends EventsScope {
172
168
  const determineIfUndefined = (value: number | undefined) =>
173
169
  typeof value === 'undefined' ? null : value;
174
170
 
171
+ if (!this.networkQualityStatus[UPLINK][mediaType]) {
172
+ this.networkQualityStatus[UPLINK][mediaType] = {};
173
+ }
174
+
175
175
  /**
176
176
  * Values for some browsers specifically Safari will be undefined we explicitly set to null
177
177
  * https://bugs.webkit.org/show_bug.cgi?id=206645
@@ -4,9 +4,11 @@
4
4
 
5
5
  /* eslint-disable class-methods-use-this */
6
6
  /* globals window */
7
- import _ from 'lodash';
7
+ import {uniq, mapValues, pick} from 'lodash';
8
8
 
9
9
  import LoggerProxy from '../common/logs/logger-proxy';
10
+ import MeetingUtil from '../meeting/util';
11
+
10
12
  import {ICE_GATHERING_STATE, CONNECTION_STATE, REACHABILITY} from '../constants';
11
13
 
12
14
  import ReachabilityRequest from './request';
@@ -14,11 +16,56 @@ import ReachabilityRequest from './request';
14
16
  const DEFAULT_TIMEOUT = 3000;
15
17
  const VIDEO_MESH_TIMEOUT = 1000;
16
18
 
19
+ export type ReachabilityMetrics = {
20
+ reachability_public_udp_success: number;
21
+ reachability_public_udp_failed: number;
22
+ reachability_public_tcp_success: number;
23
+ reachability_public_tcp_failed: number;
24
+ reachability_vmn_udp_success: number;
25
+ reachability_vmn_udp_failed: number;
26
+ reachability_vmn_tcp_success: number;
27
+ reachability_vmn_tcp_failed: number;
28
+ };
29
+
30
+ // result for a specific transport protocol (like udp or tcp)
31
+ export type TransportResult = {
32
+ reachable?: 'true' | 'false';
33
+ latencyInMilliseconds?: string;
34
+ clientMediaIPs?: string[];
35
+ untested?: 'true';
36
+ };
37
+
38
+ // reachability result for a specifc media cluster
39
+ type ReachabilityResult = {
40
+ udp: TransportResult;
41
+ tcp: TransportResult;
42
+ xtls: {
43
+ untested: 'true';
44
+ };
45
+ };
46
+ // this is the type that is required by the backend when we send them reachability results
47
+ export type ReachabilityResults = Record<string, ReachabilityResult>;
48
+
49
+ // this is the type used by Reachability class internally and stored in local storage
50
+ type InternalReachabilityResults = Record<
51
+ string,
52
+ ReachabilityResult & {
53
+ isVideoMesh?: boolean;
54
+ }
55
+ >;
56
+
57
+ export type ICECandidateResult = {
58
+ clusterId: string;
59
+ isVideoMesh: boolean;
60
+ elapsed?: string | null;
61
+ publicIPs?: string[];
62
+ };
17
63
  /**
18
64
  * @class Reachability
19
65
  * @export
20
66
  */
21
67
  export default class Reachability {
68
+ namespace = REACHABILITY.namespace;
22
69
  webex: object;
23
70
  reachabilityRequest: any;
24
71
  clusterLatencyResults: any;
@@ -57,28 +104,36 @@ export default class Reachability {
57
104
  * @async
58
105
  * @memberof Reachability
59
106
  */
60
- public async gatherReachability() {
107
+ public async gatherReachability(): Promise<InternalReachabilityResults> {
61
108
  this.setup();
62
109
 
63
110
  // 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
- }
111
+ // @ts-ignore
112
+ await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageResult);
113
+ // @ts-ignore
114
+ await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageJoinCookie);
73
115
 
74
116
  // Fetch clusters and measure latency
75
117
  try {
76
- const clusters = await this.reachabilityRequest.getClusters();
118
+ const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(
119
+ MeetingUtil.getIpVersion(this.webex)
120
+ );
77
121
 
78
122
  // Perform Reachability Check
79
123
  const results = await this.performReachabilityCheck(clusters);
80
124
 
81
- window.localStorage.setItem(REACHABILITY.localStorage, JSON.stringify(results));
125
+ // @ts-ignore
126
+ await this.webex.boundedStorage.put(
127
+ this.namespace,
128
+ REACHABILITY.localStorageResult,
129
+ JSON.stringify(results)
130
+ );
131
+ // @ts-ignore
132
+ await this.webex.boundedStorage.put(
133
+ this.namespace,
134
+ REACHABILITY.localStorageJoinCookie,
135
+ JSON.stringify(joinCookie)
136
+ );
82
137
 
83
138
  LoggerProxy.logger.log(
84
139
  'Reachability:index#gatherReachability --> Reachability checks completed'
@@ -94,22 +149,111 @@ export default class Reachability {
94
149
  }
95
150
  }
96
151
 
152
+ /**
153
+ * Returns statistics about last reachability results. The returned value is an object
154
+ * with a flat list of properties so that it can be easily sent with metrics
155
+ *
156
+ * @returns {Promise} Promise with metrics values, it never rejects/throws.
157
+ */
158
+ async getReachabilityMetrics(): Promise<ReachabilityMetrics> {
159
+ const stats: ReachabilityMetrics = {
160
+ reachability_public_udp_success: 0,
161
+ reachability_public_udp_failed: 0,
162
+ reachability_public_tcp_success: 0,
163
+ reachability_public_tcp_failed: 0,
164
+ reachability_vmn_udp_success: 0,
165
+ reachability_vmn_udp_failed: 0,
166
+ reachability_vmn_tcp_success: 0,
167
+ reachability_vmn_tcp_failed: 0,
168
+ };
169
+
170
+ const updateStats = (clusterType: 'public' | 'vmn', result: ReachabilityResult) => {
171
+ if (result.udp?.reachable) {
172
+ const outcome = result.udp.reachable === 'true' ? 'success' : 'failed';
173
+ stats[`reachability_${clusterType}_udp_${outcome}`] += 1;
174
+ }
175
+ if (result.tcp?.reachable) {
176
+ const outcome = result.tcp.reachable === 'true' ? 'success' : 'failed';
177
+ stats[`reachability_${clusterType}_tcp_${outcome}`] += 1;
178
+ }
179
+ };
180
+
181
+ try {
182
+ // @ts-ignore
183
+ const resultsJson = await this.webex.boundedStorage.get(
184
+ REACHABILITY.namespace,
185
+ REACHABILITY.localStorageResult
186
+ );
187
+
188
+ const internalResults: InternalReachabilityResults = JSON.parse(resultsJson);
189
+
190
+ Object.values(internalResults).forEach((result) => {
191
+ updateStats(result.isVideoMesh ? 'vmn' : 'public', result);
192
+ });
193
+ } catch (e) {
194
+ // empty storage, that's ok
195
+ LoggerProxy.logger.warn(
196
+ 'Roap:request#getReachabilityMetrics --> Error parsing reachability data: ',
197
+ e
198
+ );
199
+ }
200
+
201
+ return stats;
202
+ }
203
+
204
+ /**
205
+ * Reachability results as an object in the format that backend expects
206
+ *
207
+ * @returns {any} reachability results that need to be sent to the backend
208
+ */
209
+ async getReachabilityResults(): Promise<ReachabilityResults | undefined> {
210
+ let results: ReachabilityResults;
211
+
212
+ // these are the only props that backend needs in the reachability results:
213
+ const reachabilityResultsProps: Array<keyof ReachabilityResult> = ['udp', 'tcp', 'xtls'];
214
+
215
+ try {
216
+ // @ts-ignore
217
+ const resultsJson = await this.webex.boundedStorage.get(
218
+ REACHABILITY.namespace,
219
+ REACHABILITY.localStorageResult
220
+ );
221
+
222
+ const internalResults: InternalReachabilityResults = JSON.parse(resultsJson);
223
+
224
+ results = mapValues(internalResults, (result) => pick(result, reachabilityResultsProps));
225
+ } catch (e) {
226
+ // empty storage, that's ok
227
+ LoggerProxy.logger.warn(
228
+ 'Roap:request#attachReachabilityData --> Error parsing reachability data: ',
229
+ e
230
+ );
231
+ }
232
+
233
+ return results;
234
+ }
235
+
97
236
  /**
98
237
  * fetches reachability data and checks for cluster reachability
99
238
  * @returns {boolean}
100
239
  * @public
101
240
  * @memberof Reachability
102
241
  */
103
- isAnyClusterReachable() {
242
+ async isAnyPublicClusterReachable() {
104
243
  let reachable = false;
105
- const reachabilityData = window.localStorage.getItem(REACHABILITY.localStorage);
244
+ // @ts-ignore
245
+ const reachabilityData = await this.webex.boundedStorage
246
+ .get(this.namespace, REACHABILITY.localStorageResult)
247
+ .catch(() => {});
106
248
 
107
249
  if (reachabilityData) {
108
250
  try {
109
- const reachabilityResults = JSON.parse(reachabilityData);
251
+ const reachabilityResults: InternalReachabilityResults = JSON.parse(reachabilityData);
110
252
 
111
253
  reachable = Object.values(reachabilityResults).some(
112
- (result: any) => result.udp?.reachable === 'true' || result.tcp?.reachable === 'true'
254
+ (result) =>
255
+ !result.isVideoMesh &&
256
+ (result.udp?.reachable === 'true' || result.tcp?.reachable === 'true')
113
257
  );
114
258
  } catch (e) {
115
259
  LoggerProxy.logger.error(
@@ -129,7 +273,7 @@ export default class Reachability {
129
273
  * @memberof Reachability
130
274
  */
131
275
  private buildPeerConnectionConfig(cluster: any) {
132
- const iceServers = _.uniq([...cluster.udp, ...cluster.tcp]).map((url) => ({
276
+ const iceServers = uniq(cluster.udp).map((url) => ({
133
277
  username: '',
134
278
  credential: '',
135
279
  urls: [url],
@@ -190,7 +334,7 @@ export default class Reachability {
190
334
  * @private
191
335
  * @memberof Reachability
192
336
  */
193
- private getLocalSDPForClusters(clusterList: object) {
337
+ private getLocalSDPForClusters(clusterList: object): Promise<InternalReachabilityResults> {
194
338
  let clusters: any[] = [...Object.keys(clusterList)];
195
339
 
196
340
  clusters = clusters.map(async (key) => {
@@ -203,18 +347,17 @@ export default class Reachability {
203
347
  peerConnection.begin = Date.now();
204
348
  peerConnection.setLocalDescription(description);
205
349
 
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}`
212
- );
213
- });
350
+ return this.iceGatheringState(peerConnection, cluster.isVideoMesh).catch(
351
+ (iceGatheringStateError) => {
352
+ LoggerProxy.logger.log(
353
+ `Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ${iceGatheringStateError}`
354
+ );
355
+ }
356
+ );
214
357
  });
215
358
 
216
359
  return Promise.all(clusters)
217
- .then(this.parseIceResultsToReachabilityResults)
360
+ .then(this.parseIceResultsToInternalReachabilityResults)
218
361
  .then((reachabilityLatencyResults) => {
219
362
  this.logUnreachableClusters();
220
363
 
@@ -290,6 +433,8 @@ export default class Reachability {
290
433
  `Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`,
291
434
  elapsed
292
435
  );
436
+ // order is important
437
+ this.addPublicIP(peerConnection, e.candidate.address);
293
438
  this.setLatencyAndClose(peerConnection, elapsed);
294
439
  }
295
440
  };
@@ -301,14 +446,17 @@ export default class Reachability {
301
446
  * speed.
302
447
  * @private
303
448
  * @param {RTCPeerConnection} peerConnection
304
- * @param {number} timeout
449
+ * @param {boolean} isVideoMesh
305
450
  * @returns {Promise}
306
451
  */
307
- private iceGatheringState(peerConnection: RTCPeerConnection, timeout: number) {
452
+ private iceGatheringState(peerConnection: RTCPeerConnection, isVideoMesh: boolean) {
308
453
  const ELAPSED = 'elapsed';
309
454
 
310
- return new Promise((resolve) => {
455
+ const timeout = isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT;
456
+
457
+ return new Promise<ICECandidateResult>((resolve) => {
311
458
  const peerConnectionProxy = new window.Proxy(peerConnection, {
459
+ // eslint-disable-next-line require-jsdoc
312
460
  get(target, property) {
313
461
  const targetMember = target[property];
314
462
 
@@ -321,8 +469,14 @@ export default class Reachability {
321
469
  set: (target, property, value) => {
322
470
  // only intercept elapsed property
323
471
  if (property === ELAPSED) {
324
- // @ts-ignore
325
- resolve({clusterId: peerConnection.key, elapsed: value});
472
+ resolve({
473
+ // @ts-ignore
474
+ clusterId: peerConnection.key,
475
+ isVideoMesh,
476
+ // @ts-ignore
477
+ publicIPs: target.publicIPs,
478
+ elapsed: value,
479
+ });
326
480
 
327
481
  return true;
328
482
  }
@@ -343,6 +497,8 @@ export default class Reachability {
343
497
 
344
498
  // Close any open peerConnections
345
499
  if (peerConnectionProxy.connectionState !== CLOSED) {
500
+ // order is important
501
+ this.addPublicIP(peerConnectionProxy, null);
346
502
  this.setLatencyAndClose(peerConnectionProxy, null);
347
503
  }
348
504
  }, timeout);
@@ -367,29 +523,39 @@ export default class Reachability {
367
523
 
368
524
  /**
369
525
  * Calculates time to establish connection
370
- * @param {array} iceResults iceResults
526
+ * @param {Array<ICECandidateResult>} iceResults iceResults
371
527
  * @returns {object} reachabilityMap
372
- * @private
528
+ * @protected
373
529
  * @memberof Reachability
374
530
  */
375
- private parseIceResultsToReachabilityResults(iceResults: Array<any>) {
531
+ protected parseIceResultsToInternalReachabilityResults(
532
+ iceResults: Array<ICECandidateResult>
533
+ ): InternalReachabilityResults {
376
534
  const reachabilityMap = {};
377
535
 
378
- iceResults.forEach(({clusterId, elapsed}) => {
379
- let latencyResult;
536
+ iceResults.forEach(({clusterId, isVideoMesh, elapsed, publicIPs}) => {
537
+ const latencyResult = {};
380
538
 
381
- if (elapsed === null) {
382
- latencyResult = {reachable: 'false'};
539
+ if (!elapsed) {
540
+ Object.assign(latencyResult, {reachable: 'false'});
383
541
  } else {
384
- latencyResult = {
542
+ Object.assign(latencyResult, {
385
543
  reachable: 'true',
386
544
  latencyInMilliseconds: elapsed.toString(),
387
- };
545
+ });
546
+ }
547
+
548
+ if (publicIPs) {
549
+ Object.assign(latencyResult, {
550
+ clientMediaIPs: publicIPs,
551
+ });
388
552
  }
389
553
 
390
554
  reachabilityMap[clusterId] = {
391
555
  udp: latencyResult,
392
- tcp: latencyResult,
556
+ tcp: {untested: 'true'},
557
+ xtls: {untested: 'true'},
558
+ isVideoMesh,
393
559
  };
394
560
  });
395
561
 
@@ -399,11 +565,11 @@ export default class Reachability {
399
565
  /**
400
566
  * fetches reachability data
401
567
  * @param {object} clusterList
402
- * @returns {Promise<localSDPData>} reachability check results
568
+ * @returns {Promise<InternalReachabilityResults>} reachability check results
403
569
  * @private
404
570
  * @memberof Reachability
405
571
  */
406
- private performReachabilityCheck(clusterList: object) {
572
+ private performReachabilityCheck(clusterList: object): Promise<InternalReachabilityResults> {
407
573
  if (!clusterList || !Object.keys(clusterList).length) {
408
574
  return Promise.resolve({});
409
575
  }
@@ -430,6 +596,33 @@ export default class Reachability {
430
596
  });
431
597
  }
432
598
 
599
+ /**
600
+ * Adds public IP (client media IPs)
601
+ * @param {RTCPeerConnection} peerConnection
602
+ * @param {string} publicIP
603
+ * @returns {void}
604
+ */
605
+ protected addPublicIP(peerConnection: RTCPeerConnection, publicIP?: string | null) {
606
+ const modifiedPeerConnection: RTCPeerConnection & {publicIPs?: string[]} = peerConnection;
607
+ const {CLOSED} = CONNECTION_STATE;
608
+
609
+ if (modifiedPeerConnection.connectionState === CLOSED) {
610
+ LoggerProxy.logger.log(
611
+ `Reachability:index#addPublicIP --> Attempting to set publicIP of ${publicIP} on closed peerConnection.`
612
+ );
613
+ }
614
+
615
+ if (publicIP) {
616
+ if (modifiedPeerConnection.publicIPs) {
617
+ modifiedPeerConnection.publicIPs.push(publicIP);
618
+ } else {
619
+ modifiedPeerConnection.publicIPs = [publicIP];
620
+ }
621
+ } else {
622
+ modifiedPeerConnection.publicIPs = null;
623
+ }
624
+ }
625
+
433
626
  /**
434
627
  * Records latency and closes the peerConnection
435
628
  * @param {RTCPeerConnection} peerConnection
@@ -1,5 +1,5 @@
1
1
  import LoggerProxy from '../common/logs/logger-proxy';
2
- import {HTTP_VERBS, RESOURCE, API} from '../constants';
2
+ import {HTTP_VERBS, RESOURCE, API, IP_VERSION} from '../constants';
3
3
 
4
4
  export interface ClusterNode {
5
5
  isVideoMesh: boolean;
@@ -28,31 +28,40 @@ class ReachabilityRequest {
28
28
  }
29
29
 
30
30
  /**
31
- * gets the cluster information
31
+ * Gets the cluster information
32
32
  *
33
- * @param {boolean} includeVideoMesh whether to include the video mesh clusters in the result or not
33
+ * @param {IP_VERSION} ipVersion information about current ip network we're on
34
34
  * @returns {Promise}
35
35
  */
36
- getClusters = (): Promise<ClusterList> =>
36
+ getClusters = (ipVersion?: IP_VERSION): Promise<{clusters: ClusterList; joinCookie: any}> =>
37
37
  this.webex
38
38
  .request({
39
39
  method: HTTP_VERBS.GET,
40
40
  shouldRefreshAccessToken: false,
41
41
  api: API.CALLIOPEDISCOVERY,
42
42
  resource: RESOURCE.CLUSTERS,
43
+ qs: {
44
+ JCSupport: 1,
45
+ ipver: ipVersion,
46
+ },
43
47
  })
44
48
  .then((res) => {
45
- const {clusters} = res.body;
49
+ const {clusters, joinCookie} = res.body;
46
50
 
47
51
  Object.keys(clusters).forEach((key) => {
48
- clusters[key].isVideoMesh = res.body.clusterClasses?.hybridMedia?.includes(key);
52
+ clusters[key].isVideoMesh = !!res.body.clusterClasses?.hybridMedia?.includes(key);
49
53
  });
50
54
 
51
55
  LoggerProxy.logger.log(
52
- `Reachability:request#getClusters --> get clusters successful:${JSON.stringify(clusters)}`
56
+ `Reachability:request#getClusters --> get clusters (ipver=${ipVersion}) successful:${JSON.stringify(
57
+ clusters
58
+ )}`
53
59
  );
54
60
 
55
- return clusters;
61
+ return {
62
+ clusters,
63
+ joinCookie,
64
+ };
56
65
  });
57
66
 
58
67
  /**
@@ -0,0 +1,4 @@
1
+ // eslint-disable-next-line import/prefer-default-export
2
+ export const REACTION_RELAY_TYPES = {
3
+ REACTION: 'react',
4
+ } as const;