@webex/plugin-meetings 2.59.8 → 2.60.0-next.10

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 (517) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.d.ts +42 -0
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.d.ts +31 -0
  6. package/dist/annotation/constants.js +41 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.d.ts +117 -0
  9. package/dist/annotation/index.js +357 -0
  10. package/dist/annotation/index.js.map +1 -0
  11. package/dist/breakouts/breakout.d.ts +8 -0
  12. package/dist/breakouts/breakout.js +215 -0
  13. package/dist/breakouts/breakout.js.map +1 -0
  14. package/dist/breakouts/collection.d.ts +5 -0
  15. package/dist/breakouts/collection.js +22 -0
  16. package/dist/breakouts/collection.js.map +1 -0
  17. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  18. package/dist/breakouts/edit-lock-error.js +51 -0
  19. package/dist/breakouts/edit-lock-error.js.map +1 -0
  20. package/dist/breakouts/events.d.ts +8 -0
  21. package/dist/breakouts/events.js +44 -0
  22. package/dist/breakouts/events.js.map +1 -0
  23. package/dist/breakouts/index.d.ts +5 -0
  24. package/dist/breakouts/index.js +1047 -0
  25. package/dist/breakouts/index.js.map +1 -0
  26. package/dist/breakouts/request.d.ts +22 -0
  27. package/dist/breakouts/request.js +77 -0
  28. package/dist/breakouts/request.js.map +1 -0
  29. package/dist/breakouts/utils.d.ts +15 -0
  30. package/dist/breakouts/utils.js +64 -0
  31. package/dist/breakouts/utils.js.map +1 -0
  32. package/dist/common/browser-detection.js +2 -3
  33. package/dist/common/browser-detection.js.map +1 -1
  34. package/dist/common/collection.js +3 -4
  35. package/dist/common/collection.js.map +1 -1
  36. package/dist/common/config.js +1 -2
  37. package/dist/common/config.js.map +1 -1
  38. package/dist/common/errors/captcha-error.js +1 -2
  39. package/dist/common/errors/captcha-error.js.map +1 -1
  40. package/dist/common/errors/intent-to-join.js +1 -2
  41. package/dist/common/errors/intent-to-join.js.map +1 -1
  42. package/dist/common/errors/join-meeting.js +1 -2
  43. package/dist/common/errors/join-meeting.js.map +1 -1
  44. package/dist/common/errors/media.js +1 -2
  45. package/dist/common/errors/media.js.map +1 -1
  46. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  47. package/dist/common/errors/no-meeting-info.js +50 -0
  48. package/dist/common/errors/no-meeting-info.js.map +1 -0
  49. package/dist/common/errors/parameter.js +3 -4
  50. package/dist/common/errors/parameter.js.map +1 -1
  51. package/dist/common/errors/password-error.js +1 -2
  52. package/dist/common/errors/password-error.js.map +1 -1
  53. package/dist/common/errors/permission.js +1 -2
  54. package/dist/common/errors/permission.js.map +1 -1
  55. package/dist/common/errors/reclaim-host-role-errors.d.ts +60 -0
  56. package/dist/common/errors/reclaim-host-role-errors.js +154 -0
  57. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  58. package/dist/common/errors/reconnection-in-progress.js +1 -2
  59. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  60. package/dist/common/errors/reconnection.js +1 -2
  61. package/dist/common/errors/reconnection.js.map +1 -1
  62. package/dist/common/errors/stats.js +1 -2
  63. package/dist/common/errors/stats.js.map +1 -1
  64. package/dist/common/errors/webex-errors.d.ts +20 -8
  65. package/dist/common/errors/webex-errors.js +48 -28
  66. package/dist/common/errors/webex-errors.js.map +1 -1
  67. package/dist/common/errors/webex-meetings-error.js +1 -2
  68. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  69. package/dist/common/events/events-scope.js +1 -2
  70. package/dist/common/events/events-scope.js.map +1 -1
  71. package/dist/common/events/events.js +1 -2
  72. package/dist/common/events/events.js.map +1 -1
  73. package/dist/common/events/trigger-proxy.js +1 -2
  74. package/dist/common/events/trigger-proxy.js.map +1 -1
  75. package/dist/common/events/util.js +1 -2
  76. package/dist/common/events/util.js.map +1 -1
  77. package/dist/common/logs/logger-config.js +1 -2
  78. package/dist/common/logs/logger-config.js.map +1 -1
  79. package/dist/common/logs/logger-proxy.js +2 -3
  80. package/dist/common/logs/logger-proxy.js.map +1 -1
  81. package/dist/common/logs/request.d.ts +3 -1
  82. package/dist/common/logs/request.js +8 -5
  83. package/dist/common/logs/request.js.map +1 -1
  84. package/dist/common/queue.d.ts +9 -7
  85. package/dist/common/queue.js +22 -9
  86. package/dist/common/queue.js.map +1 -1
  87. package/dist/config.d.ts +5 -7
  88. package/dist/config.js +8 -11
  89. package/dist/config.js.map +1 -1
  90. package/dist/constants.d.ts +243 -97
  91. package/dist/constants.js +437 -435
  92. package/dist/constants.js.map +1 -1
  93. package/dist/controls-options-manager/constants.js +3 -6
  94. package/dist/controls-options-manager/constants.js.map +1 -1
  95. package/dist/controls-options-manager/enums.d.ts +11 -1
  96. package/dist/controls-options-manager/enums.js +15 -6
  97. package/dist/controls-options-manager/enums.js.map +1 -1
  98. package/dist/controls-options-manager/index.d.ts +17 -1
  99. package/dist/controls-options-manager/index.js +127 -38
  100. package/dist/controls-options-manager/index.js.map +1 -1
  101. package/dist/controls-options-manager/types.d.ts +43 -0
  102. package/dist/controls-options-manager/types.js +7 -0
  103. package/dist/controls-options-manager/types.js.map +1 -0
  104. package/dist/controls-options-manager/util.d.ts +1 -7
  105. package/dist/controls-options-manager/util.js +309 -19
  106. package/dist/controls-options-manager/util.js.map +1 -1
  107. package/dist/index.d.ts +6 -3
  108. package/dist/index.js +116 -4
  109. package/dist/index.js.map +1 -1
  110. package/dist/interpretation/collection.d.ts +5 -0
  111. package/dist/interpretation/collection.js +22 -0
  112. package/dist/interpretation/collection.js.map +1 -0
  113. package/dist/interpretation/index.d.ts +5 -0
  114. package/dist/interpretation/index.js +365 -0
  115. package/dist/interpretation/index.js.map +1 -0
  116. package/dist/interpretation/siLanguage.d.ts +5 -0
  117. package/dist/interpretation/siLanguage.js +24 -0
  118. package/dist/interpretation/siLanguage.js.map +1 -0
  119. package/dist/locus-info/controlsUtils.js +100 -11
  120. package/dist/locus-info/controlsUtils.js.map +1 -1
  121. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  122. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  123. package/dist/locus-info/fullState.js +1 -2
  124. package/dist/locus-info/fullState.js.map +1 -1
  125. package/dist/locus-info/hostUtils.js +1 -2
  126. package/dist/locus-info/hostUtils.js.map +1 -1
  127. package/dist/locus-info/index.d.ts +57 -4
  128. package/dist/locus-info/index.js +425 -84
  129. package/dist/locus-info/index.js.map +1 -1
  130. package/dist/locus-info/infoUtils.js +13 -5
  131. package/dist/locus-info/infoUtils.js.map +1 -1
  132. package/dist/locus-info/mediaSharesUtils.js +58 -3
  133. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  134. package/dist/locus-info/parser.d.ts +66 -6
  135. package/dist/locus-info/parser.js +253 -80
  136. package/dist/locus-info/parser.js.map +1 -1
  137. package/dist/locus-info/selfUtils.js +97 -13
  138. package/dist/locus-info/selfUtils.js.map +1 -1
  139. package/dist/media/index.d.ts +2 -0
  140. package/dist/media/index.js +107 -319
  141. package/dist/media/index.js.map +1 -1
  142. package/dist/media/properties.d.ts +38 -53
  143. package/dist/media/properties.js +96 -153
  144. package/dist/media/properties.js.map +1 -1
  145. package/dist/media/util.js +1 -22
  146. package/dist/media/util.js.map +1 -1
  147. package/dist/mediaQualityMetrics/config.d.ts +234 -230
  148. package/dist/mediaQualityMetrics/config.js +302 -498
  149. package/dist/mediaQualityMetrics/config.js.map +1 -1
  150. package/dist/meeting/in-meeting-actions.d.ts +88 -0
  151. package/dist/meeting/in-meeting-actions.js +94 -3
  152. package/dist/meeting/in-meeting-actions.js.map +1 -1
  153. package/dist/meeting/index.d.ts +591 -494
  154. package/dist/meeting/index.js +4728 -2990
  155. package/dist/meeting/index.js.map +1 -1
  156. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  157. package/dist/meeting/locusMediaRequest.js +291 -0
  158. package/dist/meeting/locusMediaRequest.js.map +1 -0
  159. package/dist/meeting/muteState.d.ts +93 -25
  160. package/dist/meeting/muteState.js +224 -133
  161. package/dist/meeting/muteState.js.map +1 -1
  162. package/dist/meeting/request.d.ts +82 -47
  163. package/dist/meeting/request.js +297 -199
  164. package/dist/meeting/request.js.map +1 -1
  165. package/dist/meeting/request.type.d.ts +11 -0
  166. package/dist/meeting/request.type.js +7 -0
  167. package/dist/meeting/request.type.js.map +1 -0
  168. package/dist/meeting/state.js +1 -2
  169. package/dist/meeting/state.js.map +1 -1
  170. package/dist/meeting/util.d.ts +102 -1
  171. package/dist/meeting/util.js +605 -435
  172. package/dist/meeting/util.js.map +1 -1
  173. package/dist/meeting-info/collection.js +3 -4
  174. package/dist/meeting-info/collection.js.map +1 -1
  175. package/dist/meeting-info/index.d.ts +13 -1
  176. package/dist/meeting-info/index.js +74 -7
  177. package/dist/meeting-info/index.js.map +1 -1
  178. package/dist/meeting-info/meeting-info-v2.d.ts +31 -1
  179. package/dist/meeting-info/meeting-info-v2.js +200 -63
  180. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  181. package/dist/meeting-info/request.js +1 -2
  182. package/dist/meeting-info/request.js.map +1 -1
  183. package/dist/meeting-info/util.js +2 -3
  184. package/dist/meeting-info/util.js.map +1 -1
  185. package/dist/meeting-info/utilv2.js +39 -41
  186. package/dist/meeting-info/utilv2.js.map +1 -1
  187. package/dist/meetings/collection.d.ts +17 -0
  188. package/dist/meetings/collection.js +42 -4
  189. package/dist/meetings/collection.js.map +1 -1
  190. package/dist/meetings/index.d.ts +103 -21
  191. package/dist/meetings/index.js +486 -124
  192. package/dist/meetings/index.js.map +1 -1
  193. package/dist/meetings/meetings.types.d.ts +4 -0
  194. package/dist/meetings/meetings.types.js +7 -0
  195. package/dist/meetings/meetings.types.js.map +1 -0
  196. package/dist/meetings/request.js +4 -3
  197. package/dist/meetings/request.js.map +1 -1
  198. package/dist/meetings/util.js +107 -6
  199. package/dist/meetings/util.js.map +1 -1
  200. package/dist/member/index.d.ts +14 -1
  201. package/dist/member/index.js +54 -2
  202. package/dist/member/index.js.map +1 -1
  203. package/dist/member/member.types.js +3 -4
  204. package/dist/member/member.types.js.map +1 -1
  205. package/dist/member/types.d.ts +32 -0
  206. package/dist/member/types.js +23 -0
  207. package/dist/member/types.js.map +1 -0
  208. package/dist/member/util.js +131 -29
  209. package/dist/member/util.js.map +1 -1
  210. package/dist/members/collection.d.ts +5 -0
  211. package/dist/members/collection.js +11 -2
  212. package/dist/members/collection.js.map +1 -1
  213. package/dist/members/index.d.ts +57 -2
  214. package/dist/members/index.js +174 -10
  215. package/dist/members/index.js.map +1 -1
  216. package/dist/members/request.d.ts +73 -9
  217. package/dist/members/request.js +108 -41
  218. package/dist/members/request.js.map +1 -1
  219. package/dist/members/types.d.ts +25 -0
  220. package/dist/members/types.js +14 -0
  221. package/dist/members/types.js.map +1 -0
  222. package/dist/members/util.d.ts +214 -1
  223. package/dist/members/util.js +327 -234
  224. package/dist/members/util.js.map +1 -1
  225. package/dist/metrics/constants.d.ts +15 -6
  226. package/dist/metrics/constants.js +17 -9
  227. package/dist/metrics/constants.js.map +1 -1
  228. package/dist/metrics/index.d.ts +4 -111
  229. package/dist/metrics/index.js +4 -452
  230. package/dist/metrics/index.js.map +1 -1
  231. package/dist/multistream/mediaRequestManager.d.ts +118 -0
  232. package/dist/multistream/mediaRequestManager.js +344 -0
  233. package/dist/multistream/mediaRequestManager.js.map +1 -0
  234. package/dist/multistream/receiveSlot.d.ts +68 -0
  235. package/dist/multistream/receiveSlot.js +200 -0
  236. package/dist/multistream/receiveSlot.js.map +1 -0
  237. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  238. package/dist/multistream/receiveSlotManager.js +174 -0
  239. package/dist/multistream/receiveSlotManager.js.map +1 -0
  240. package/dist/multistream/remoteMedia.d.ts +72 -0
  241. package/dist/multistream/remoteMedia.js +268 -0
  242. package/dist/multistream/remoteMedia.js.map +1 -0
  243. package/dist/multistream/remoteMediaGroup.d.ts +47 -0
  244. package/dist/multistream/remoteMediaGroup.js +267 -0
  245. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  246. package/dist/multistream/remoteMediaManager.d.ts +285 -0
  247. package/dist/multistream/remoteMediaManager.js +1211 -0
  248. package/dist/multistream/remoteMediaManager.js.map +1 -0
  249. package/dist/multistream/sendSlotManager.d.ts +61 -0
  250. package/dist/multistream/sendSlotManager.js +236 -0
  251. package/dist/multistream/sendSlotManager.js.map +1 -0
  252. package/dist/networkQualityMonitor/index.js +5 -4
  253. package/dist/networkQualityMonitor/index.js.map +1 -1
  254. package/dist/personal-meeting-room/index.js +2 -3
  255. package/dist/personal-meeting-room/index.js.map +1 -1
  256. package/dist/personal-meeting-room/request.js +2 -3
  257. package/dist/personal-meeting-room/request.js.map +1 -1
  258. package/dist/personal-meeting-room/util.js +1 -2
  259. package/dist/personal-meeting-room/util.js.map +1 -1
  260. package/dist/reachability/index.d.ts +62 -7
  261. package/dist/reachability/index.js +265 -72
  262. package/dist/reachability/index.js.map +1 -1
  263. package/dist/reachability/request.d.ts +7 -3
  264. package/dist/reachability/request.js +18 -10
  265. package/dist/reachability/request.js.map +1 -1
  266. package/dist/reactions/constants.d.ts +3 -0
  267. package/dist/reactions/constants.js +12 -0
  268. package/dist/reactions/constants.js.map +1 -0
  269. package/dist/reactions/reactions.d.ts +2 -2
  270. package/dist/reactions/reactions.js +4 -6
  271. package/dist/reactions/reactions.js.map +1 -1
  272. package/dist/reactions/reactions.type.d.ts +23 -3
  273. package/dist/reactions/reactions.type.js +21 -23
  274. package/dist/reactions/reactions.type.js.map +1 -1
  275. package/dist/reconnection-manager/index.d.ts +32 -8
  276. package/dist/reconnection-manager/index.js +282 -231
  277. package/dist/reconnection-manager/index.js.map +1 -1
  278. package/dist/recording-controller/enums.js +4 -5
  279. package/dist/recording-controller/enums.js.map +1 -1
  280. package/dist/recording-controller/index.d.ts +15 -1
  281. package/dist/recording-controller/index.js +57 -46
  282. package/dist/recording-controller/index.js.map +1 -1
  283. package/dist/recording-controller/util.d.ts +5 -4
  284. package/dist/recording-controller/util.js +10 -10
  285. package/dist/recording-controller/util.js.map +1 -1
  286. package/dist/roap/index.d.ts +9 -47
  287. package/dist/roap/index.js +101 -235
  288. package/dist/roap/index.js.map +1 -1
  289. package/dist/roap/request.d.ts +18 -12
  290. package/dist/roap/request.js +126 -180
  291. package/dist/roap/request.js.map +1 -1
  292. package/dist/roap/turnDiscovery.d.ts +27 -16
  293. package/dist/roap/turnDiscovery.js +115 -105
  294. package/dist/roap/turnDiscovery.js.map +1 -1
  295. package/dist/rtcMetrics/constants.d.ts +4 -0
  296. package/dist/rtcMetrics/constants.js +11 -0
  297. package/dist/rtcMetrics/constants.js.map +1 -0
  298. package/dist/rtcMetrics/index.d.ts +54 -0
  299. package/dist/rtcMetrics/index.js +140 -0
  300. package/dist/rtcMetrics/index.js.map +1 -0
  301. package/dist/statsAnalyzer/global.d.ts +1 -83
  302. package/dist/statsAnalyzer/global.js +2 -85
  303. package/dist/statsAnalyzer/global.js.map +1 -1
  304. package/dist/statsAnalyzer/index.d.ts +28 -30
  305. package/dist/statsAnalyzer/index.js +374 -509
  306. package/dist/statsAnalyzer/index.js.map +1 -1
  307. package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
  308. package/dist/statsAnalyzer/mqaUtil.js +116 -83
  309. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  310. package/dist/transcription/index.js +1 -2
  311. package/dist/transcription/index.js.map +1 -1
  312. package/dist/webinar/collection.d.ts +16 -0
  313. package/dist/webinar/collection.js +43 -0
  314. package/dist/webinar/collection.js.map +1 -0
  315. package/dist/webinar/index.d.ts +5 -0
  316. package/dist/webinar/index.js +68 -0
  317. package/dist/webinar/index.js.map +1 -0
  318. package/package.json +35 -26
  319. package/src/annotation/annotation.types.ts +50 -0
  320. package/src/annotation/constants.ts +36 -0
  321. package/src/annotation/index.ts +328 -0
  322. package/src/breakouts/README.md +220 -0
  323. package/src/breakouts/breakout.ts +188 -0
  324. package/src/breakouts/collection.ts +19 -0
  325. package/src/breakouts/edit-lock-error.ts +25 -0
  326. package/src/breakouts/events.ts +56 -0
  327. package/src/breakouts/index.ts +925 -0
  328. package/src/breakouts/request.ts +55 -0
  329. package/src/breakouts/utils.ts +57 -0
  330. package/src/common/errors/no-meeting-info.ts +24 -0
  331. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  332. package/src/common/errors/webex-errors.ts +36 -12
  333. package/src/common/logs/logger-proxy.ts +1 -1
  334. package/src/common/logs/request.ts +5 -1
  335. package/src/common/queue.ts +22 -8
  336. package/src/config.ts +5 -7
  337. package/src/constants.ts +271 -93
  338. package/src/controls-options-manager/enums.ts +12 -0
  339. package/src/controls-options-manager/index.ts +116 -21
  340. package/src/controls-options-manager/types.ts +59 -0
  341. package/src/controls-options-manager/util.ts +294 -14
  342. package/src/index.ts +40 -0
  343. package/src/interpretation/README.md +60 -0
  344. package/src/interpretation/collection.ts +19 -0
  345. package/src/interpretation/index.ts +332 -0
  346. package/src/interpretation/siLanguage.ts +18 -0
  347. package/src/locus-info/controlsUtils.ts +110 -0
  348. package/src/locus-info/index.ts +449 -61
  349. package/src/locus-info/infoUtils.ts +14 -2
  350. package/src/locus-info/mediaSharesUtils.ts +64 -0
  351. package/src/locus-info/parser.ts +258 -47
  352. package/src/locus-info/selfUtils.ts +85 -2
  353. package/src/media/index.ts +153 -370
  354. package/src/media/properties.ts +106 -136
  355. package/src/media/util.ts +0 -21
  356. package/src/mediaQualityMetrics/config.ts +244 -377
  357. package/src/meeting/in-meeting-actions.ts +176 -0
  358. package/src/meeting/index.ts +3895 -2448
  359. package/src/meeting/locusMediaRequest.ts +313 -0
  360. package/src/meeting/muteState.ts +224 -138
  361. package/src/meeting/request.ts +207 -127
  362. package/src/meeting/request.type.ts +13 -0
  363. package/src/meeting/util.ts +590 -423
  364. package/src/meeting-info/index.ts +81 -8
  365. package/src/meeting-info/meeting-info-v2.ts +163 -13
  366. package/src/meeting-info/util.ts +1 -1
  367. package/src/meeting-info/utilv2.ts +28 -28
  368. package/src/meetings/collection.ts +33 -0
  369. package/src/meetings/index.ts +486 -126
  370. package/src/meetings/meetings.types.ts +12 -0
  371. package/src/meetings/request.ts +2 -0
  372. package/src/meetings/util.ts +116 -5
  373. package/src/member/index.ts +52 -1
  374. package/src/member/types.ts +38 -0
  375. package/src/member/util.ts +139 -28
  376. package/src/members/collection.ts +8 -0
  377. package/src/members/index.ts +196 -7
  378. package/src/members/request.ts +97 -17
  379. package/src/members/types.ts +29 -0
  380. package/src/members/util.ts +333 -240
  381. package/src/metrics/constants.ts +15 -6
  382. package/src/metrics/index.ts +1 -471
  383. package/src/multistream/mediaRequestManager.ts +440 -0
  384. package/src/multistream/receiveSlot.ts +184 -0
  385. package/src/multistream/receiveSlotManager.ts +166 -0
  386. package/src/multistream/remoteMedia.ts +254 -0
  387. package/src/multistream/remoteMediaGroup.ts +284 -0
  388. package/src/multistream/remoteMediaManager.ts +1145 -0
  389. package/src/multistream/sendSlotManager.ts +170 -0
  390. package/src/networkQualityMonitor/index.ts +6 -6
  391. package/src/reachability/index.ts +238 -45
  392. package/src/reachability/request.ts +17 -8
  393. package/src/reactions/constants.ts +4 -0
  394. package/src/reactions/reactions.ts +4 -4
  395. package/src/reactions/reactions.type.ts +30 -4
  396. package/src/reconnection-manager/index.ts +168 -156
  397. package/src/recording-controller/index.ts +20 -3
  398. package/src/recording-controller/util.ts +26 -9
  399. package/src/roap/index.ts +98 -241
  400. package/src/roap/request.ts +74 -148
  401. package/src/roap/turnDiscovery.ts +62 -56
  402. package/src/rtcMetrics/constants.ts +3 -0
  403. package/src/rtcMetrics/index.ts +124 -0
  404. package/src/statsAnalyzer/global.ts +1 -84
  405. package/src/statsAnalyzer/index.ts +413 -642
  406. package/src/statsAnalyzer/mqaUtil.ts +111 -114
  407. package/src/webinar/collection.ts +31 -0
  408. package/src/webinar/index.ts +62 -0
  409. package/test/integration/spec/converged-space-meetings.js +233 -0
  410. package/test/integration/spec/journey.js +320 -264
  411. package/test/integration/spec/space-meeting.js +77 -4
  412. package/test/unit/spec/annotation/index.ts +418 -0
  413. package/test/unit/spec/breakouts/breakout.ts +237 -0
  414. package/test/unit/spec/breakouts/collection.ts +15 -0
  415. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  416. package/test/unit/spec/breakouts/events.ts +89 -0
  417. package/test/unit/spec/breakouts/index.ts +1790 -0
  418. package/test/unit/spec/breakouts/request.ts +104 -0
  419. package/test/unit/spec/breakouts/utils.js +72 -0
  420. package/test/unit/spec/common/queue.js +31 -2
  421. package/test/unit/spec/controls-options-manager/index.js +163 -0
  422. package/test/unit/spec/controls-options-manager/util.js +576 -60
  423. package/test/unit/spec/fixture/locus.js +1 -0
  424. package/test/unit/spec/interpretation/collection.ts +15 -0
  425. package/test/unit/spec/interpretation/index.ts +589 -0
  426. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  427. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  428. package/test/unit/spec/locus-info/index.js +1390 -16
  429. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  430. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  431. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  432. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  433. package/test/unit/spec/locus-info/parser.js +116 -35
  434. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  435. package/test/unit/spec/media/index.ts +290 -0
  436. package/test/unit/spec/media/properties.ts +75 -84
  437. package/test/unit/spec/meeting/in-meeting-actions.ts +86 -0
  438. package/test/unit/spec/meeting/index.js +8181 -2770
  439. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  440. package/test/unit/spec/meeting/muteState.js +409 -213
  441. package/test/unit/spec/meeting/request.js +512 -42
  442. package/test/unit/spec/meeting/utils.js +741 -24
  443. package/test/unit/spec/meeting-info/index.js +300 -0
  444. package/test/unit/spec/meeting-info/meetinginfov2.js +527 -5
  445. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  446. package/test/unit/spec/meetings/collection.js +26 -0
  447. package/test/unit/spec/meetings/index.js +1284 -217
  448. package/test/unit/spec/meetings/utils.js +202 -2
  449. package/test/unit/spec/member/index.js +38 -8
  450. package/test/unit/spec/member/util.js +499 -29
  451. package/test/unit/spec/members/index.js +597 -3
  452. package/test/unit/spec/members/request.js +206 -27
  453. package/test/unit/spec/members/utils.js +210 -0
  454. package/test/unit/spec/metrics/index.js +1 -50
  455. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  456. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  457. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  458. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  459. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  460. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  461. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  462. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  463. package/test/unit/spec/reachability/index.ts +598 -24
  464. package/test/unit/spec/reachability/request.js +68 -0
  465. package/test/unit/spec/reconnection-manager/index.js +162 -24
  466. package/test/unit/spec/recording-controller/index.js +293 -218
  467. package/test/unit/spec/recording-controller/util.js +223 -96
  468. package/test/unit/spec/roap/index.ts +200 -76
  469. package/test/unit/spec/roap/request.ts +232 -0
  470. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  471. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  472. package/test/unit/spec/stats-analyzer/index.js +188 -174
  473. package/test/unit/spec/webinar/collection.ts +13 -0
  474. package/test/unit/spec/webinar/index.ts +60 -0
  475. package/test/utils/constants.js +9 -0
  476. package/test/utils/integrationTestUtils.js +46 -0
  477. package/test/utils/testUtils.js +0 -45
  478. package/test/utils/webex-config.js +4 -0
  479. package/test/utils/webex-test-users.js +7 -3
  480. package/dist/meeting/effectsState.d.ts +0 -42
  481. package/dist/meeting/effectsState.js +0 -260
  482. package/dist/meeting/effectsState.js.map +0 -1
  483. package/dist/metrics/config.d.ts +0 -169
  484. package/dist/metrics/config.js +0 -289
  485. package/dist/metrics/config.js.map +0 -1
  486. package/dist/peer-connection-manager/index.d.ts +0 -6
  487. package/dist/peer-connection-manager/index.js +0 -671
  488. package/dist/peer-connection-manager/index.js.map +0 -1
  489. package/dist/peer-connection-manager/util.d.ts +0 -6
  490. package/dist/peer-connection-manager/util.js +0 -110
  491. package/dist/peer-connection-manager/util.js.map +0 -1
  492. package/dist/roap/collection.d.ts +0 -10
  493. package/dist/roap/collection.js +0 -63
  494. package/dist/roap/collection.js.map +0 -1
  495. package/dist/roap/handler.d.ts +0 -47
  496. package/dist/roap/handler.js +0 -279
  497. package/dist/roap/handler.js.map +0 -1
  498. package/dist/roap/state.d.ts +0 -9
  499. package/dist/roap/state.js +0 -127
  500. package/dist/roap/state.js.map +0 -1
  501. package/dist/roap/util.d.ts +0 -2
  502. package/dist/roap/util.js +0 -76
  503. package/dist/roap/util.js.map +0 -1
  504. package/src/index.js +0 -15
  505. package/src/meeting/effectsState.ts +0 -209
  506. package/src/metrics/config.ts +0 -485
  507. package/src/peer-connection-manager/index.ts +0 -847
  508. package/src/peer-connection-manager/util.ts +0 -119
  509. package/src/roap/collection.ts +0 -62
  510. package/src/roap/handler.ts +0 -294
  511. package/src/roap/state.ts +0 -156
  512. package/src/roap/util.ts +0 -100
  513. package/test/unit/spec/meeting/effectsState.js +0 -281
  514. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  515. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  516. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  517. 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;