@webex/plugin-meetings 3.0.0-beta.41 → 3.0.0-beta.410

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 (398) hide show
  1. package/README.md +58 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +94 -15
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/events.js +45 -0
  11. package/dist/breakouts/events.js.map +1 -0
  12. package/dist/breakouts/index.js +625 -123
  13. package/dist/breakouts/index.js.map +1 -1
  14. package/dist/breakouts/utils.js +27 -8
  15. package/dist/breakouts/utils.js.map +1 -1
  16. package/dist/common/errors/no-meeting-info.js +51 -0
  17. package/dist/common/errors/no-meeting-info.js.map +1 -0
  18. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  19. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +48 -7
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/logs/request.js +5 -1
  25. package/dist/common/logs/request.js.map +1 -1
  26. package/dist/common/queue.js +24 -9
  27. package/dist/common/queue.js.map +1 -1
  28. package/dist/config.js +6 -10
  29. package/dist/config.js.map +1 -1
  30. package/dist/constants.js +247 -34
  31. package/dist/constants.js.map +1 -1
  32. package/dist/controls-options-manager/enums.js +14 -2
  33. package/dist/controls-options-manager/enums.js.map +1 -1
  34. package/dist/controls-options-manager/index.js +109 -15
  35. package/dist/controls-options-manager/index.js.map +1 -1
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +309 -18
  39. package/dist/controls-options-manager/util.js.map +1 -1
  40. package/dist/index.js +116 -2
  41. package/dist/index.js.map +1 -1
  42. package/dist/interceptors/index.js +15 -0
  43. package/dist/interceptors/index.js.map +1 -0
  44. package/dist/interceptors/locusRetry.js +93 -0
  45. package/dist/interceptors/locusRetry.js.map +1 -0
  46. package/dist/interpretation/collection.js +23 -0
  47. package/dist/interpretation/collection.js.map +1 -0
  48. package/dist/interpretation/index.js +380 -0
  49. package/dist/interpretation/index.js.map +1 -0
  50. package/dist/interpretation/siLanguage.js +25 -0
  51. package/dist/interpretation/siLanguage.js.map +1 -0
  52. package/dist/locus-info/controlsUtils.js +91 -2
  53. package/dist/locus-info/controlsUtils.js.map +1 -1
  54. package/dist/locus-info/index.js +386 -62
  55. package/dist/locus-info/index.js.map +1 -1
  56. package/dist/locus-info/infoUtils.js +7 -1
  57. package/dist/locus-info/infoUtils.js.map +1 -1
  58. package/dist/locus-info/mediaSharesUtils.js +71 -1
  59. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  60. package/dist/locus-info/parser.js +249 -72
  61. package/dist/locus-info/parser.js.map +1 -1
  62. package/dist/locus-info/selfUtils.js +89 -14
  63. package/dist/locus-info/selfUtils.js.map +1 -1
  64. package/dist/media/index.js +65 -102
  65. package/dist/media/index.js.map +1 -1
  66. package/dist/media/properties.js +73 -124
  67. package/dist/media/properties.js.map +1 -1
  68. package/dist/mediaQualityMetrics/config.js +135 -330
  69. package/dist/mediaQualityMetrics/config.js.map +1 -1
  70. package/dist/meeting/in-meeting-actions.js +86 -2
  71. package/dist/meeting/in-meeting-actions.js.map +1 -1
  72. package/dist/meeting/index.js +4531 -2994
  73. package/dist/meeting/index.js.map +1 -1
  74. package/dist/meeting/locusMediaRequest.js +292 -0
  75. package/dist/meeting/locusMediaRequest.js.map +1 -0
  76. package/dist/meeting/muteState.js +236 -136
  77. package/dist/meeting/muteState.js.map +1 -1
  78. package/dist/meeting/request.js +189 -155
  79. package/dist/meeting/request.js.map +1 -1
  80. package/dist/meeting/util.js +676 -417
  81. package/dist/meeting/util.js.map +1 -1
  82. package/dist/meeting/voicea-meeting.js +172 -0
  83. package/dist/meeting/voicea-meeting.js.map +1 -0
  84. package/dist/meeting-info/index.js +73 -7
  85. package/dist/meeting-info/index.js.map +1 -1
  86. package/dist/meeting-info/meeting-info-v2.js +201 -57
  87. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  88. package/dist/meeting-info/util.js +8 -7
  89. package/dist/meeting-info/util.js.map +1 -1
  90. package/dist/meeting-info/utilv2.js +44 -40
  91. package/dist/meeting-info/utilv2.js.map +1 -1
  92. package/dist/meetings/collection.js +39 -0
  93. package/dist/meetings/collection.js.map +1 -1
  94. package/dist/meetings/index.js +484 -119
  95. package/dist/meetings/index.js.map +1 -1
  96. package/dist/meetings/meetings.types.js +7 -0
  97. package/dist/meetings/meetings.types.js.map +1 -0
  98. package/dist/meetings/request.js +2 -0
  99. package/dist/meetings/request.js.map +1 -1
  100. package/dist/meetings/util.js +73 -7
  101. package/dist/meetings/util.js.map +1 -1
  102. package/dist/member/index.js +57 -0
  103. package/dist/member/index.js.map +1 -1
  104. package/dist/member/types.js +25 -0
  105. package/dist/member/types.js.map +1 -0
  106. package/dist/member/util.js +132 -25
  107. package/dist/member/util.js.map +1 -1
  108. package/dist/members/collection.js +10 -0
  109. package/dist/members/collection.js.map +1 -1
  110. package/dist/members/index.js +100 -5
  111. package/dist/members/index.js.map +1 -1
  112. package/dist/members/request.js +106 -38
  113. package/dist/members/request.js.map +1 -1
  114. package/dist/members/types.js +15 -0
  115. package/dist/members/types.js.map +1 -0
  116. package/dist/members/util.js +326 -232
  117. package/dist/members/util.js.map +1 -1
  118. package/dist/metrics/constants.js +18 -1
  119. package/dist/metrics/constants.js.map +1 -1
  120. package/dist/metrics/index.js +1 -446
  121. package/dist/metrics/index.js.map +1 -1
  122. package/dist/multistream/mediaRequestManager.js +223 -32
  123. package/dist/multistream/mediaRequestManager.js.map +1 -1
  124. package/dist/multistream/receiveSlot.js +10 -0
  125. package/dist/multistream/receiveSlot.js.map +1 -1
  126. package/dist/multistream/receiveSlotManager.js +39 -36
  127. package/dist/multistream/receiveSlotManager.js.map +1 -1
  128. package/dist/multistream/remoteMedia.js +3 -1
  129. package/dist/multistream/remoteMedia.js.map +1 -1
  130. package/dist/multistream/remoteMediaGroup.js +76 -5
  131. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  132. package/dist/multistream/remoteMediaManager.js +366 -104
  133. package/dist/multistream/remoteMediaManager.js.map +1 -1
  134. package/dist/multistream/sendSlotManager.js +255 -0
  135. package/dist/multistream/sendSlotManager.js.map +1 -0
  136. package/dist/reachability/clusterReachability.js +356 -0
  137. package/dist/reachability/clusterReachability.js.map +1 -0
  138. package/dist/reachability/index.js +263 -390
  139. package/dist/reachability/index.js.map +1 -1
  140. package/dist/reachability/request.js +6 -4
  141. package/dist/reachability/request.js.map +1 -1
  142. package/dist/reachability/util.js +29 -0
  143. package/dist/reachability/util.js.map +1 -0
  144. package/dist/reconnection-manager/index.js +266 -202
  145. package/dist/reconnection-manager/index.js.map +1 -1
  146. package/dist/recording-controller/index.js +21 -2
  147. package/dist/recording-controller/index.js.map +1 -1
  148. package/dist/recording-controller/util.js +9 -8
  149. package/dist/recording-controller/util.js.map +1 -1
  150. package/dist/roap/index.js +66 -28
  151. package/dist/roap/index.js.map +1 -1
  152. package/dist/roap/request.js +48 -64
  153. package/dist/roap/request.js.map +1 -1
  154. package/dist/roap/turnDiscovery.js +407 -79
  155. package/dist/roap/turnDiscovery.js.map +1 -1
  156. package/dist/rtcMetrics/constants.js +12 -0
  157. package/dist/rtcMetrics/constants.js.map +1 -0
  158. package/dist/rtcMetrics/index.js +179 -0
  159. package/dist/rtcMetrics/index.js.map +1 -0
  160. package/dist/statsAnalyzer/index.js +389 -304
  161. package/dist/statsAnalyzer/index.js.map +1 -1
  162. package/dist/statsAnalyzer/mqaUtil.js +296 -156
  163. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  164. package/dist/types/annotation/annotation.types.d.ts +42 -0
  165. package/dist/types/annotation/constants.d.ts +31 -0
  166. package/dist/types/annotation/index.d.ts +117 -0
  167. package/dist/types/breakouts/events.d.ts +8 -0
  168. package/dist/types/breakouts/utils.d.ts +9 -2
  169. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  170. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  171. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  172. package/dist/types/common/logs/request.d.ts +2 -0
  173. package/dist/types/common/queue.d.ts +9 -7
  174. package/dist/types/config.d.ts +2 -7
  175. package/dist/types/constants.d.ts +204 -32
  176. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  177. package/dist/types/controls-options-manager/index.d.ts +17 -1
  178. package/dist/types/controls-options-manager/types.d.ts +43 -0
  179. package/dist/types/controls-options-manager/util.d.ts +1 -7
  180. package/dist/types/index.d.ts +6 -5
  181. package/dist/types/interceptors/index.d.ts +2 -0
  182. package/dist/types/interceptors/locusRetry.d.ts +27 -0
  183. package/dist/types/interpretation/collection.d.ts +5 -0
  184. package/dist/types/interpretation/index.d.ts +5 -0
  185. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  186. package/dist/types/locus-info/index.d.ts +57 -4
  187. package/dist/types/locus-info/parser.d.ts +66 -6
  188. package/dist/types/media/index.d.ts +2 -0
  189. package/dist/types/media/properties.d.ts +34 -49
  190. package/dist/types/mediaQualityMetrics/config.d.ts +99 -223
  191. package/dist/types/meeting/in-meeting-actions.d.ts +86 -2
  192. package/dist/types/meeting/index.d.ts +630 -505
  193. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  194. package/dist/types/meeting/muteState.d.ts +88 -26
  195. package/dist/types/meeting/request.d.ts +67 -43
  196. package/dist/types/meeting/util.d.ts +117 -1
  197. package/dist/types/meeting/voicea-meeting.d.ts +16 -0
  198. package/dist/types/meeting-info/index.d.ts +13 -1
  199. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  200. package/dist/types/meetings/collection.d.ts +17 -0
  201. package/dist/types/meetings/index.d.ts +113 -21
  202. package/dist/types/meetings/meetings.types.d.ts +4 -0
  203. package/dist/types/member/index.d.ts +14 -0
  204. package/dist/types/member/types.d.ts +32 -0
  205. package/dist/types/members/collection.d.ts +5 -0
  206. package/dist/types/members/index.d.ts +35 -2
  207. package/dist/types/members/request.d.ts +73 -9
  208. package/dist/types/members/types.d.ts +25 -0
  209. package/dist/types/members/util.d.ts +214 -1
  210. package/dist/types/metrics/constants.d.ts +17 -0
  211. package/dist/types/metrics/index.d.ts +4 -111
  212. package/dist/types/multistream/mediaRequestManager.d.ts +71 -3
  213. package/dist/types/multistream/receiveSlot.d.ts +7 -3
  214. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  215. package/dist/types/multistream/remoteMedia.d.ts +3 -31
  216. package/dist/types/multistream/remoteMediaGroup.d.ts +2 -9
  217. package/dist/types/multistream/remoteMediaManager.d.ts +61 -2
  218. package/dist/types/multistream/sendSlotManager.d.ts +69 -0
  219. package/dist/types/reachability/clusterReachability.d.ts +109 -0
  220. package/dist/types/reachability/index.d.ts +60 -95
  221. package/dist/types/reachability/request.d.ts +3 -1
  222. package/dist/types/reachability/util.d.ts +8 -0
  223. package/dist/types/reconnection-manager/index.d.ts +19 -0
  224. package/dist/types/recording-controller/index.d.ts +15 -1
  225. package/dist/types/recording-controller/util.d.ts +5 -4
  226. package/dist/types/roap/index.d.ts +11 -2
  227. package/dist/types/roap/request.d.ts +9 -8
  228. package/dist/types/roap/turnDiscovery.d.ts +90 -9
  229. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  230. package/dist/types/rtcMetrics/index.d.ts +61 -0
  231. package/dist/types/statsAnalyzer/index.d.ts +34 -12
  232. package/dist/types/statsAnalyzer/mqaUtil.d.ts +28 -4
  233. package/dist/types/webinar/collection.d.ts +16 -0
  234. package/dist/types/webinar/index.d.ts +5 -0
  235. package/dist/webinar/collection.js +44 -0
  236. package/dist/webinar/collection.js.map +1 -0
  237. package/dist/webinar/index.js +69 -0
  238. package/dist/webinar/index.js.map +1 -0
  239. package/package.json +22 -19
  240. package/src/annotation/annotation.types.ts +50 -0
  241. package/src/annotation/constants.ts +36 -0
  242. package/src/annotation/index.ts +328 -0
  243. package/src/breakouts/README.md +27 -6
  244. package/src/breakouts/breakout.ts +67 -9
  245. package/src/breakouts/events.ts +56 -0
  246. package/src/breakouts/index.ts +494 -73
  247. package/src/breakouts/utils.ts +26 -8
  248. package/src/common/errors/no-meeting-info.ts +24 -0
  249. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  250. package/src/common/errors/webex-errors.ts +44 -2
  251. package/src/common/logs/logger-proxy.ts +1 -1
  252. package/src/common/logs/request.ts +5 -1
  253. package/src/common/queue.ts +22 -8
  254. package/src/config.ts +6 -13
  255. package/src/constants.ts +234 -22
  256. package/src/controls-options-manager/enums.ts +12 -0
  257. package/src/controls-options-manager/index.ts +116 -21
  258. package/src/controls-options-manager/types.ts +59 -0
  259. package/src/controls-options-manager/util.ts +294 -14
  260. package/src/index.ts +45 -0
  261. package/src/interceptors/index.ts +3 -0
  262. package/src/interceptors/locusRetry.ts +67 -0
  263. package/src/interpretation/README.md +60 -0
  264. package/src/interpretation/collection.ts +19 -0
  265. package/src/interpretation/index.ts +349 -0
  266. package/src/interpretation/siLanguage.ts +18 -0
  267. package/src/locus-info/controlsUtils.ts +108 -0
  268. package/src/locus-info/index.ts +417 -59
  269. package/src/locus-info/infoUtils.ts +10 -2
  270. package/src/locus-info/mediaSharesUtils.ts +80 -0
  271. package/src/locus-info/parser.ts +258 -47
  272. package/src/locus-info/selfUtils.ts +81 -5
  273. package/src/media/index.ts +100 -108
  274. package/src/media/properties.ts +88 -117
  275. package/src/mediaQualityMetrics/config.ts +103 -238
  276. package/src/meeting/in-meeting-actions.ts +171 -3
  277. package/src/meeting/index.ts +3929 -2622
  278. package/src/meeting/locusMediaRequest.ts +313 -0
  279. package/src/meeting/muteState.ts +237 -136
  280. package/src/meeting/request.ts +173 -122
  281. package/src/meeting/util.ts +690 -395
  282. package/src/meeting/voicea-meeting.ts +122 -0
  283. package/src/meeting-info/index.ts +81 -8
  284. package/src/meeting-info/meeting-info-v2.ts +166 -16
  285. package/src/meeting-info/util.ts +13 -10
  286. package/src/meeting-info/utilv2.ts +47 -37
  287. package/src/meetings/collection.ts +33 -0
  288. package/src/meetings/index.ts +507 -127
  289. package/src/meetings/meetings.types.ts +12 -0
  290. package/src/meetings/request.ts +2 -0
  291. package/src/meetings/util.ts +81 -12
  292. package/src/member/index.ts +57 -0
  293. package/src/member/types.ts +38 -0
  294. package/src/member/util.ts +141 -25
  295. package/src/members/collection.ts +8 -0
  296. package/src/members/index.ts +133 -7
  297. package/src/members/request.ts +97 -17
  298. package/src/members/types.ts +29 -0
  299. package/src/members/util.ts +333 -240
  300. package/src/metrics/constants.ts +17 -0
  301. package/src/metrics/index.ts +1 -469
  302. package/src/multistream/mediaRequestManager.ts +271 -56
  303. package/src/multistream/receiveSlot.ts +11 -4
  304. package/src/multistream/receiveSlotManager.ts +34 -24
  305. package/src/multistream/remoteMedia.ts +5 -3
  306. package/src/multistream/remoteMediaGroup.ts +78 -0
  307. package/src/multistream/remoteMediaManager.ts +248 -45
  308. package/src/multistream/sendSlotManager.ts +198 -0
  309. package/src/reachability/clusterReachability.ts +320 -0
  310. package/src/reachability/index.ts +229 -346
  311. package/src/reachability/request.ts +8 -4
  312. package/src/reachability/util.ts +24 -0
  313. package/src/reconnection-manager/index.ts +128 -97
  314. package/src/recording-controller/index.ts +20 -3
  315. package/src/recording-controller/util.ts +26 -9
  316. package/src/roap/index.ts +76 -25
  317. package/src/roap/request.ts +48 -67
  318. package/src/roap/turnDiscovery.ts +331 -67
  319. package/src/rtcMetrics/constants.ts +3 -0
  320. package/src/rtcMetrics/index.ts +166 -0
  321. package/src/statsAnalyzer/index.ts +496 -419
  322. package/src/statsAnalyzer/mqaUtil.ts +317 -170
  323. package/src/webinar/collection.ts +31 -0
  324. package/src/webinar/index.ts +62 -0
  325. package/test/integration/spec/converged-space-meetings.js +60 -3
  326. package/test/integration/spec/journey.js +321 -262
  327. package/test/integration/spec/space-meeting.js +76 -3
  328. package/test/unit/spec/annotation/index.ts +418 -0
  329. package/test/unit/spec/breakouts/breakout.ts +119 -28
  330. package/test/unit/spec/breakouts/events.ts +89 -0
  331. package/test/unit/spec/breakouts/index.ts +1204 -118
  332. package/test/unit/spec/breakouts/utils.js +27 -2
  333. package/test/unit/spec/common/queue.js +31 -2
  334. package/test/unit/spec/controls-options-manager/index.js +163 -0
  335. package/test/unit/spec/controls-options-manager/util.js +576 -60
  336. package/test/unit/spec/fixture/locus.js +1 -0
  337. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  338. package/test/unit/spec/interpretation/collection.ts +15 -0
  339. package/test/unit/spec/interpretation/index.ts +625 -0
  340. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  341. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  342. package/test/unit/spec/locus-info/index.js +1372 -37
  343. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  344. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  345. package/test/unit/spec/locus-info/mediaSharesUtils.ts +41 -0
  346. package/test/unit/spec/locus-info/parser.js +116 -35
  347. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  348. package/test/unit/spec/locus-info/selfUtils.js +203 -17
  349. package/test/unit/spec/media/index.ts +178 -81
  350. package/test/unit/spec/media/properties.ts +2 -2
  351. package/test/unit/spec/meeting/in-meeting-actions.ts +85 -3
  352. package/test/unit/spec/meeting/index.js +7835 -2501
  353. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  354. package/test/unit/spec/meeting/muteState.js +549 -207
  355. package/test/unit/spec/meeting/request.js +494 -54
  356. package/test/unit/spec/meeting/utils.js +827 -74
  357. package/test/unit/spec/meeting/voicea-meeting.ts +266 -0
  358. package/test/unit/spec/meeting-info/index.js +300 -0
  359. package/test/unit/spec/meeting-info/meetinginfov2.js +535 -9
  360. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  361. package/test/unit/spec/meetings/collection.js +26 -0
  362. package/test/unit/spec/meetings/index.js +1489 -219
  363. package/test/unit/spec/meetings/utils.js +229 -2
  364. package/test/unit/spec/member/index.js +61 -6
  365. package/test/unit/spec/member/util.js +510 -34
  366. package/test/unit/spec/members/index.js +432 -1
  367. package/test/unit/spec/members/request.js +206 -27
  368. package/test/unit/spec/members/utils.js +210 -0
  369. package/test/unit/spec/metrics/index.js +2 -52
  370. package/test/unit/spec/multistream/mediaRequestManager.ts +782 -114
  371. package/test/unit/spec/multistream/receiveSlot.ts +9 -1
  372. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  373. package/test/unit/spec/multistream/remoteMedia.ts +2 -0
  374. package/test/unit/spec/multistream/remoteMediaGroup.ts +344 -0
  375. package/test/unit/spec/multistream/remoteMediaManager.ts +524 -0
  376. package/test/unit/spec/multistream/sendSlotManager.ts +274 -0
  377. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  378. package/test/unit/spec/reachability/index.ts +551 -14
  379. package/test/unit/spec/reachability/request.js +3 -1
  380. package/test/unit/spec/reachability/util.ts +40 -0
  381. package/test/unit/spec/reconnection-manager/index.js +171 -11
  382. package/test/unit/spec/recording-controller/index.js +293 -218
  383. package/test/unit/spec/recording-controller/util.js +223 -96
  384. package/test/unit/spec/roap/index.ts +233 -81
  385. package/test/unit/spec/roap/request.ts +100 -62
  386. package/test/unit/spec/roap/turnDiscovery.ts +682 -108
  387. package/test/unit/spec/rtcMetrics/index.ts +122 -0
  388. package/test/unit/spec/stats-analyzer/index.js +1431 -12
  389. package/test/unit/spec/webinar/collection.ts +13 -0
  390. package/test/unit/spec/webinar/index.ts +60 -0
  391. package/test/utils/integrationTestUtils.js +46 -0
  392. package/test/utils/testUtils.js +0 -57
  393. package/test/utils/webex-test-users.js +12 -4
  394. package/dist/metrics/config.js +0 -289
  395. package/dist/metrics/config.js.map +0 -1
  396. package/dist/types/metrics/config.d.ts +0 -169
  397. package/src/index.js +0 -18
  398. package/src/metrics/config.ts +0 -485
@@ -4,10 +4,11 @@ import {Defer} from '@webex/common';
4
4
  import Metrics from '../metrics';
5
5
  import BEHAVIORAL_METRICS from '../metrics/constants';
6
6
  import LoggerProxy from '../common/logs/logger-proxy';
7
- import {ROAP} from '../constants';
7
+ import {ROAP, Enum} from '../constants';
8
8
 
9
9
  import RoapRequest from './request';
10
10
  import Meeting from '../meeting';
11
+ import MeetingUtil from '../meeting/util';
11
12
 
12
13
  const TURN_DISCOVERY_TIMEOUT = 10; // in seconds
13
14
 
@@ -17,6 +18,28 @@ const TURN_DISCOVERY_TIMEOUT = 10; // in seconds
17
18
  // and do the SDP offer with seq=1
18
19
  const TURN_DISCOVERY_SEQ = 0;
19
20
 
21
+ const TurnDiscoverySkipReason = {
22
+ missingHttpResponse: 'missing http response', // when we asked for the TURN discovery response to be in the http response, but it wasn't there
23
+ reachability: 'reachability', // when udp reachability to public clusters is ok, so we don't need TURN (this doens't apply when joinWithMedia() is used)
24
+ alreadyInProgress: 'already in progress', // when we try to start TURN discovery while it's already in progress
25
+ } as const;
26
+
27
+ export type TurnDiscoverySkipReason =
28
+ | Enum<typeof TurnDiscoverySkipReason> // this is a kind of FYI, because in practice typescript will infer the type of TurnDiscoverySkipReason as a string
29
+ | string // used in case of errors, contains the error message
30
+ | undefined; // used when TURN discovery is not skipped
31
+
32
+ export type TurnServerInfo = {
33
+ url: string;
34
+ username: string;
35
+ password: string;
36
+ };
37
+
38
+ export type TurnDiscoveryResult = {
39
+ turnServerInfo?: TurnServerInfo;
40
+ turnDiscoverySkippedReason: TurnDiscoverySkipReason;
41
+ };
42
+
20
43
  /**
21
44
  * Handles the process of finding out TURN server information from Linus.
22
45
  * This is achieved by sending a TURN_DISCOVERY_REQUEST.
@@ -26,11 +49,7 @@ export default class TurnDiscovery {
26
49
 
27
50
  private defer?: Defer; // used for waiting for the response
28
51
 
29
- private turnInfo: {
30
- url: string;
31
- username: string;
32
- password: string;
33
- };
52
+ private turnInfo: TurnServerInfo;
34
53
 
35
54
  private responseTimer?: ReturnType<typeof setTimeout>;
36
55
 
@@ -55,7 +74,7 @@ export default class TurnDiscovery {
55
74
  * @private
56
75
  * @memberof Roap
57
76
  */
58
- private waitForTurnDiscoveryResponse() {
77
+ private waitForTurnDiscoveryResponse(): Promise<{isOkRequired: boolean}> {
59
78
  if (!this.defer) {
60
79
  LoggerProxy.logger.warn(
61
80
  'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> TURN discovery is not in progress'
@@ -84,25 +103,36 @@ export default class TurnDiscovery {
84
103
  }
85
104
 
86
105
  /**
87
- * handles TURN_DISCOVERY_RESPONSE roap message
106
+ * Handles TURN_DISCOVERY_RESPONSE roap message. Use it if the roap message comes over the websocket,
107
+ * otherwise use handleTurnDiscoveryHttpResponse() if it comes in the http response.
88
108
  *
89
109
  * @param {Object} roapMessage
110
+ * @param {string} from string to indicate how we got the response (used just for logging)
90
111
  * @returns {void}
91
112
  * @public
92
113
  * @memberof Roap
93
114
  */
94
- public handleTurnDiscoveryResponse(roapMessage: object) {
95
- // @ts-ignore - Fix missing type
115
+ public handleTurnDiscoveryResponse(roapMessage: any, from: string) {
96
116
  const {headers} = roapMessage;
97
117
 
98
118
  if (!this.defer) {
99
119
  LoggerProxy.logger.warn(
100
- 'Roap:turnDiscovery#handleTurnDiscoveryResponse --> unexpected TURN discovery response'
120
+ `Roap:turnDiscovery#handleTurnDiscoveryResponse --> unexpected TURN discovery response ${from}`
101
121
  );
102
122
 
103
123
  return;
104
124
  }
105
125
 
126
+ if (roapMessage.messageType !== ROAP.ROAP_TYPES.TURN_DISCOVERY_RESPONSE) {
127
+ this.defer.reject(
128
+ new Error(
129
+ `TURN_DISCOVERY_RESPONSE ${from} has unexpected messageType: ${JSON.stringify(
130
+ roapMessage
131
+ )}`
132
+ )
133
+ );
134
+ }
135
+
106
136
  const expectedHeaders = [
107
137
  {headerName: 'x-cisco-turn-url', field: 'url'},
108
138
  {headerName: 'x-cisco-turn-username', field: 'username'},
@@ -128,21 +158,212 @@ export default class TurnDiscovery {
128
158
 
129
159
  if (foundHeaders !== expectedHeaders.length) {
130
160
  LoggerProxy.logger.warn(
131
- `Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received: ${JSON.stringify(
161
+ `Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received ${from}: ${JSON.stringify(
132
162
  headers
133
163
  )}`
134
164
  );
135
165
  this.defer.reject(
136
- new Error(`TURN_DISCOVERY_RESPONSE missing some headers: ${JSON.stringify(headers)}`)
166
+ new Error(
167
+ `TURN_DISCOVERY_RESPONSE ${from} missing some headers: ${JSON.stringify(headers)}`
168
+ )
137
169
  );
138
170
  } else {
139
171
  LoggerProxy.logger.info(
140
- `Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response, url=${this.turnInfo.url}`
172
+ `Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response ${from}, url=${this.turnInfo.url}`
141
173
  );
142
- this.defer.resolve();
174
+
175
+ this.defer.resolve({isOkRequired: !headers?.includes('noOkInTransaction')});
176
+ }
177
+ }
178
+
179
+ /**
180
+ * Generates TURN_DISCOVERY_REQUEST roap message. When this method returns a roapMessage, it means that a TURN discovery process has started.
181
+ * It needs be ended by calling handleTurnDiscoveryHttpResponse() once you get a response from the backend. If you don't get any response
182
+ * or want to abort, you need to call abort().
183
+ *
184
+ * @param {Meeting} meeting
185
+ * @param {boolean} isForced
186
+ * @returns {Object}
187
+ */
188
+ public async generateTurnDiscoveryRequestMessage(
189
+ meeting: Meeting,
190
+ isForced: boolean
191
+ ): Promise<{roapMessage?: object; turnDiscoverySkippedReason: TurnDiscoverySkipReason}> {
192
+ if (this.defer) {
193
+ LoggerProxy.logger.warn(
194
+ 'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> TURN discovery already in progress'
195
+ );
196
+
197
+ return {
198
+ roapMessage: undefined,
199
+ turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,
200
+ };
201
+ }
202
+
203
+ let turnDiscoverySkippedReason: TurnDiscoverySkipReason;
204
+
205
+ if (!isForced) {
206
+ turnDiscoverySkippedReason = await this.getSkipReason(meeting);
207
+ }
208
+
209
+ if (turnDiscoverySkippedReason) {
210
+ return {roapMessage: undefined, turnDiscoverySkippedReason};
211
+ }
212
+
213
+ this.defer = new Defer();
214
+
215
+ const roapMessage = {
216
+ messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,
217
+ version: ROAP.ROAP_VERSION,
218
+ seq: TURN_DISCOVERY_SEQ,
219
+ headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],
220
+ };
221
+
222
+ LoggerProxy.logger.info(
223
+ 'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> generated TURN_DISCOVERY_REQUEST message'
224
+ );
225
+
226
+ return {roapMessage, turnDiscoverySkippedReason: undefined};
227
+ }
228
+
229
+ /**
230
+ * Handles any errors that occur during TURN discovery without re-throwing them.
231
+ *
232
+ * @param {Meeting} meeting
233
+ * @param {Error} error
234
+ * @returns {TurnDiscoveryResult}
235
+ */
236
+ private handleTurnDiscoveryFailure(meeting: Meeting, error: Error): TurnDiscoveryResult {
237
+ // we catch any errors and resolve with no turn information so that the normal call join flow can continue without TURN
238
+ LoggerProxy.logger.info(
239
+ `Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ${error}`
240
+ );
241
+
242
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE, {
243
+ correlation_id: meeting.correlationId,
244
+ locus_id: meeting.locusUrl.split('/').pop(),
245
+ reason: error.message,
246
+ stack: error.stack,
247
+ });
248
+
249
+ return {turnServerInfo: undefined, turnDiscoverySkippedReason: `failure: ${error.message}`};
250
+ }
251
+
252
+ /**
253
+ * Handles TURN_DISCOVERY_RESPONSE roap message that came in http response. If the response is not valid,
254
+ * it returns an object with turnServerInfo set to undefined. In that case you need to call abort()
255
+ * to end the TURN discovery process.
256
+ *
257
+ * @param {Meeting} meeting
258
+ * @param {Object|undefined} httpResponse can be undefined to indicate that we didn't get the response
259
+ * @returns {Promise<TurnDiscoveryResult>}
260
+ * @memberof Roap
261
+ */
262
+ public async handleTurnDiscoveryHttpResponse(
263
+ meeting: Meeting,
264
+ httpResponse?: object
265
+ ): Promise<TurnDiscoveryResult> {
266
+ if (!this.defer) {
267
+ LoggerProxy.logger.warn(
268
+ 'Roap:turnDiscovery#handleTurnDiscoveryHttpResponse --> unexpected http response, TURN discovery is not in progress'
269
+ );
270
+
271
+ throw new Error(
272
+ 'handleTurnDiscoveryHttpResponse() called before generateTurnDiscoveryRequestMessage()'
273
+ );
274
+ }
275
+
276
+ if (httpResponse === undefined) {
277
+ return {
278
+ turnServerInfo: undefined,
279
+ turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,
280
+ };
281
+ }
282
+
283
+ try {
284
+ const roapMessage = this.parseHttpTurnDiscoveryResponse(meeting, httpResponse);
285
+
286
+ if (!roapMessage) {
287
+ return {
288
+ turnServerInfo: undefined,
289
+ turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,
290
+ };
291
+ }
292
+
293
+ this.handleTurnDiscoveryResponse(roapMessage, 'in http response');
294
+
295
+ const {isOkRequired} = await this.defer.promise;
296
+
297
+ if (isOkRequired) {
298
+ await this.sendRoapOK(meeting);
299
+ }
300
+
301
+ this.defer = undefined;
302
+
303
+ LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');
304
+
305
+ return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};
306
+ } catch (error) {
307
+ this.abort();
308
+
309
+ return this.handleTurnDiscoveryFailure(meeting, error);
143
310
  }
144
311
  }
145
312
 
313
+ /**
314
+ * Aborts current TURN discovery. This method needs to be called if you called generateTurnDiscoveryRequestMessage(),
315
+ * but then never got any response from the server.
316
+ * @returns {void}
317
+ */
318
+ public abort() {
319
+ if (this.defer) {
320
+ this.defer.reject(new Error('TURN discovery aborted'));
321
+ this.defer = undefined;
322
+ }
323
+ }
324
+
325
+ /**
326
+ * Parses the TURN_DISCOVERY_RESPONSE roap message out of the http response
327
+ * and returns it.
328
+ *
329
+ * @param {Meeting} meeting
330
+ * @param {any} httpResponse
331
+ * @returns {any}
332
+ */
333
+ private parseHttpTurnDiscoveryResponse(
334
+ meeting: Meeting,
335
+ httpResponse: {mediaConnections?: Array<{remoteSdp?: string}>}
336
+ ) {
337
+ let turnDiscoveryResponse;
338
+
339
+ if (httpResponse.mediaConnections?.[0]?.remoteSdp) {
340
+ const remoteSdp = JSON.parse(httpResponse.mediaConnections[0].remoteSdp);
341
+
342
+ if (remoteSdp.roapMessage) {
343
+ // yes, it's misleading that remoteSdp actually contains a TURN discovery response, but that's how the backend works...
344
+ const {seq, messageType, errorType, errorCause, headers} = remoteSdp.roapMessage;
345
+
346
+ turnDiscoveryResponse = {
347
+ seq,
348
+ messageType,
349
+ errorType,
350
+ errorCause,
351
+ headers,
352
+ };
353
+ }
354
+ }
355
+
356
+ if (!turnDiscoveryResponse) {
357
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ROAP_HTTP_RESPONSE_MISSING, {
358
+ correlationId: meeting.correlationId,
359
+ messageType: 'TURN_DISCOVERY_RESPONSE',
360
+ isMultistream: meeting.isMultistream,
361
+ });
362
+ }
363
+
364
+ return turnDiscoveryResponse;
365
+ }
366
+
146
367
  /**
147
368
  * sends the TURN_DISCOVERY_REQUEST roap request
148
369
  *
@@ -152,13 +373,19 @@ export default class TurnDiscovery {
152
373
  * @private
153
374
  * @memberof Roap
154
375
  */
155
- sendRoapTurnDiscoveryRequest(meeting: Meeting, isReconnecting: boolean) {
376
+ private sendRoapTurnDiscoveryRequest(
377
+ meeting: Meeting,
378
+ isReconnecting: boolean
379
+ ): Promise<TurnDiscoveryResult> {
156
380
  if (this.defer) {
157
381
  LoggerProxy.logger.warn(
158
382
  'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress'
159
383
  );
160
384
 
161
- return Promise.resolve();
385
+ return Promise.resolve({
386
+ turnServerInfo: undefined,
387
+ turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,
388
+ });
162
389
  }
163
390
 
164
391
  this.defer = new Defer();
@@ -167,6 +394,7 @@ export default class TurnDiscovery {
167
394
  messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,
168
395
  version: ROAP.ROAP_VERSION,
169
396
  seq: TURN_DISCOVERY_SEQ,
397
+ headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],
170
398
  };
171
399
 
172
400
  LoggerProxy.logger.info(
@@ -176,20 +404,23 @@ export default class TurnDiscovery {
176
404
  return this.roapRequest
177
405
  .sendRoap({
178
406
  roapMessage,
179
- correlationId: meeting.correlationId,
180
407
  // @ts-ignore - Fix missing type
181
408
  locusSelfUrl: meeting.selfUrl,
182
409
  // @ts-ignore - Fix missing type
183
410
  mediaId: isReconnecting ? '' : meeting.mediaId,
184
- audioMuted: meeting.audio?.isLocallyMuted(),
185
- videoMuted: meeting.video?.isLocallyMuted(),
186
411
  meetingId: meeting.id,
187
- preferTranscoding: !meeting.isMultistream,
412
+ locusMediaRequest: meeting.locusMediaRequest,
413
+ // @ts-ignore - because of meeting.webex
414
+ ipVersion: MeetingUtil.getIpVersion(meeting.webex),
188
415
  })
189
- .then(({mediaConnections}) => {
416
+ .then(async (response) => {
417
+ const {mediaConnections} = response;
418
+
190
419
  if (mediaConnections) {
191
420
  meeting.updateMediaConnections(mediaConnections);
192
421
  }
422
+
423
+ return this.handleTurnDiscoveryHttpResponse(meeting, response);
193
424
  });
194
425
  }
195
426
 
@@ -201,7 +432,14 @@ export default class TurnDiscovery {
201
432
  * @returns {Promise}
202
433
  */
203
434
  sendRoapOK(meeting: Meeting) {
204
- LoggerProxy.logger.info('Roap:turnDiscovery#sendRoapOK --> sending OK');
435
+ LoggerProxy.logger.info(
436
+ 'Roap:turnDiscovery#sendRoapOK --> TURN discovery response requires OK, sending it...'
437
+ );
438
+
439
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_REQUIRES_OK, {
440
+ correlation_id: meeting.correlationId,
441
+ locus_id: meeting.locusUrl.split('/').pop(),
442
+ });
205
443
 
206
444
  return this.roapRequest.sendRoap({
207
445
  roapMessage: {
@@ -213,14 +451,45 @@ export default class TurnDiscovery {
213
451
  locusSelfUrl: meeting.selfUrl,
214
452
  // @ts-ignore - fix type
215
453
  mediaId: meeting.mediaId,
216
- correlationId: meeting.correlationId,
217
- audioMuted: meeting.audio?.isLocallyMuted(),
218
- videoMuted: meeting.video?.isLocallyMuted(),
219
454
  meetingId: meeting.id,
220
- preferTranscoding: !meeting.isMultistream,
455
+ locusMediaRequest: meeting.locusMediaRequest,
221
456
  });
222
457
  }
223
458
 
459
+ /**
460
+ * Gets the reason why reachability is skipped.
461
+ *
462
+ * @param {Meeting} meeting
463
+ * @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped
464
+ */
465
+ private async getSkipReason(meeting: Meeting): Promise<TurnDiscoverySkipReason> {
466
+ const isAnyPublicClusterReachable =
467
+ // @ts-ignore - fix type
468
+ await meeting.webex.meetings.reachability.isAnyPublicClusterReachable();
469
+
470
+ if (isAnyPublicClusterReachable) {
471
+ LoggerProxy.logger.info(
472
+ 'Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery'
473
+ );
474
+
475
+ return TurnDiscoverySkipReason.reachability;
476
+ }
477
+
478
+ return undefined;
479
+ }
480
+
481
+ /**
482
+ * Checks if TURN discovery is skipped.
483
+ *
484
+ * @param {Meeting} meeting
485
+ * @returns {Boolean} true if TURN discovery is being skipped, false if it is being done
486
+ */
487
+ async isSkipped(meeting) {
488
+ const skipReason = await this.getSkipReason(meeting);
489
+
490
+ return !!skipReason;
491
+ }
492
+
224
493
  /**
225
494
  * Retrieves TURN server information from the backend by doing
226
495
  * a roap message exchange:
@@ -234,58 +503,53 @@ export default class TurnDiscovery {
234
503
  * so it works fine no matter if TURN discovery is done or not.
235
504
  *
236
505
  * @param {Meeting} meeting
237
- * @param {Boolean} isReconnecting should be set to true if this is a new
506
+ * @param {Boolean} [isReconnecting] should be set to true if this is a new
238
507
  * media connection just after a reconnection
508
+ * @param {Boolean} [isForced]
239
509
  * @returns {Promise}
240
510
  */
241
- async doTurnDiscovery(meeting: Meeting, isReconnecting?: boolean) {
242
- // @ts-ignore - fix type
243
- const isAnyClusterReachable = await meeting.webex.meetings.reachability.isAnyClusterReachable();
244
-
245
- if (isAnyClusterReachable) {
246
- LoggerProxy.logger.info(
247
- 'Roap:turnDiscovery#doTurnDiscovery --> reachability has not failed, skipping TURN discovery'
248
- );
511
+ async doTurnDiscovery(
512
+ meeting: Meeting,
513
+ isReconnecting?: boolean,
514
+ isForced?: boolean
515
+ ): Promise<TurnDiscoveryResult> {
516
+ let turnDiscoverySkippedReason: TurnDiscoverySkipReason;
517
+
518
+ if (!isForced) {
519
+ turnDiscoverySkippedReason = await this.getSkipReason(meeting);
520
+ }
249
521
 
522
+ if (turnDiscoverySkippedReason) {
250
523
  return {
251
524
  turnServerInfo: undefined,
252
- turnDiscoverySkippedReason: 'reachability',
525
+ turnDiscoverySkippedReason,
253
526
  };
254
527
  }
255
528
 
256
- // @ts-ignore - fix type
257
- if (!meeting.config.experimental.enableTurnDiscovery) {
258
- LoggerProxy.logger.info(
259
- 'Roap:turnDiscovery#doTurnDiscovery --> TURN discovery disabled in config, skipping it'
260
- );
529
+ try {
530
+ const turnDiscoveryResult = await this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting);
261
531
 
262
- return {turnServerInfo: undefined, turnDiscoverySkippedReason: 'config'};
263
- }
532
+ if (
533
+ turnDiscoveryResult.turnDiscoverySkippedReason !==
534
+ TurnDiscoverySkipReason.missingHttpResponse
535
+ ) {
536
+ return turnDiscoveryResult;
537
+ }
264
538
 
265
- return this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting)
266
- .then(() => this.waitForTurnDiscoveryResponse())
267
- .then(() => this.sendRoapOK(meeting))
268
- .then(() => {
269
- this.defer = undefined;
539
+ // if we haven't got the response over http, we need to wait for it to come over the websocket via Mercury
540
+ const {isOkRequired} = await this.waitForTurnDiscoveryResponse();
270
541
 
271
- LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');
542
+ if (isOkRequired) {
543
+ await this.sendRoapOK(meeting);
544
+ }
272
545
 
273
- return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};
274
- })
275
- .catch((e) => {
276
- // we catch any errors and resolve with no turn information so that the normal call join flow can continue without TURN
277
- LoggerProxy.logger.info(
278
- `Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ${e}`
279
- );
280
-
281
- Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE, {
282
- correlation_id: meeting.correlationId,
283
- locus_id: meeting.locusUrl.split('/').pop(),
284
- reason: e.message,
285
- stack: e.stack,
286
- });
287
-
288
- return {turnServerInfo: undefined, turnDiscoverySkippedReason: undefined};
289
- });
546
+ this.defer = undefined;
547
+
548
+ LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');
549
+
550
+ return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};
551
+ } catch (e) {
552
+ return this.handleTurnDiscoveryFailure(meeting, e);
553
+ }
290
554
  }
291
555
  }
@@ -0,0 +1,3 @@
1
+ const RTC_METRICS = {APP_ID: 'FFB51ED5-4319-4C55-8303-B1F2FCCDE231'};
2
+
3
+ export {RTC_METRICS as default};