@webex/plugin-meetings 3.0.0-beta.4 → 3.0.0-beta.400

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 (629) hide show
  1. package/README.md +58 -8
  2. package/UPGRADING.md +9 -9
  3. package/browsers.js +19 -24
  4. package/dist/annotation/annotation.types.js +7 -0
  5. package/dist/annotation/annotation.types.js.map +1 -0
  6. package/dist/annotation/constants.js +49 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +342 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +216 -0
  11. package/dist/breakouts/breakout.js.map +1 -0
  12. package/dist/breakouts/collection.js +23 -0
  13. package/dist/breakouts/collection.js.map +1 -0
  14. package/dist/breakouts/edit-lock-error.js +52 -0
  15. package/dist/breakouts/edit-lock-error.js.map +1 -0
  16. package/dist/breakouts/events.js +45 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +1048 -0
  19. package/dist/breakouts/index.js.map +1 -0
  20. package/dist/breakouts/request.js +78 -0
  21. package/dist/breakouts/request.js.map +1 -0
  22. package/dist/breakouts/utils.js +67 -0
  23. package/dist/breakouts/utils.js.map +1 -0
  24. package/dist/common/browser-detection.js +1 -20
  25. package/dist/common/browser-detection.js.map +1 -1
  26. package/dist/common/collection.js +5 -20
  27. package/dist/common/collection.js.map +1 -1
  28. package/dist/common/config.js +0 -7
  29. package/dist/common/config.js.map +1 -1
  30. package/dist/common/errors/captcha-error.js +10 -24
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +11 -24
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +12 -25
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +10 -24
  37. package/dist/common/errors/media.js.map +1 -1
  38. package/dist/common/errors/no-meeting-info.js +51 -0
  39. package/dist/common/errors/no-meeting-info.js.map +1 -0
  40. package/dist/common/errors/parameter.js +5 -33
  41. package/dist/common/errors/parameter.js.map +1 -1
  42. package/dist/common/errors/password-error.js +10 -24
  43. package/dist/common/errors/password-error.js.map +1 -1
  44. package/dist/common/errors/permission.js +9 -23
  45. package/dist/common/errors/permission.js.map +1 -1
  46. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  47. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  48. package/dist/common/errors/reconnection-in-progress.js +0 -17
  49. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  50. package/dist/common/errors/reconnection.js +10 -24
  51. package/dist/common/errors/reconnection.js.map +1 -1
  52. package/dist/common/errors/stats.js +10 -24
  53. package/dist/common/errors/stats.js.map +1 -1
  54. package/dist/common/errors/webex-errors.js +54 -48
  55. package/dist/common/errors/webex-errors.js.map +1 -1
  56. package/dist/common/errors/webex-meetings-error.js +5 -25
  57. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  58. package/dist/common/events/events-scope.js +0 -22
  59. package/dist/common/events/events-scope.js.map +1 -1
  60. package/dist/common/events/events.js +0 -23
  61. package/dist/common/events/events.js.map +1 -1
  62. package/dist/common/events/trigger-proxy.js +0 -12
  63. package/dist/common/events/trigger-proxy.js.map +1 -1
  64. package/dist/common/events/util.js +0 -15
  65. package/dist/common/events/util.js.map +1 -1
  66. package/dist/common/logs/logger-config.js +0 -4
  67. package/dist/common/logs/logger-config.js.map +1 -1
  68. package/dist/common/logs/logger-proxy.js +1 -8
  69. package/dist/common/logs/logger-proxy.js.map +1 -1
  70. package/dist/common/logs/request.js +41 -60
  71. package/dist/common/logs/request.js.map +1 -1
  72. package/dist/common/queue.js +28 -23
  73. package/dist/common/queue.js.map +1 -1
  74. package/dist/config.js +11 -15
  75. package/dist/config.js.map +1 -1
  76. package/dist/constants.js +347 -74
  77. package/dist/constants.js.map +1 -1
  78. package/dist/controls-options-manager/constants.js +14 -0
  79. package/dist/controls-options-manager/constants.js.map +1 -0
  80. package/dist/controls-options-manager/enums.js +27 -0
  81. package/dist/controls-options-manager/enums.js.map +1 -0
  82. package/dist/controls-options-manager/index.js +297 -0
  83. package/dist/controls-options-manager/index.js.map +1 -0
  84. package/dist/controls-options-manager/types.js +7 -0
  85. package/dist/controls-options-manager/types.js.map +1 -0
  86. package/dist/controls-options-manager/util.js +319 -0
  87. package/dist/controls-options-manager/util.js.map +1 -0
  88. package/dist/index.js +125 -18
  89. package/dist/index.js.map +1 -1
  90. package/dist/interceptors/index.js +15 -0
  91. package/dist/interceptors/index.js.map +1 -0
  92. package/dist/interceptors/locusRetry.js +93 -0
  93. package/dist/interceptors/locusRetry.js.map +1 -0
  94. package/dist/interpretation/collection.js +23 -0
  95. package/dist/interpretation/collection.js.map +1 -0
  96. package/dist/interpretation/index.js +380 -0
  97. package/dist/interpretation/index.js.map +1 -0
  98. package/dist/interpretation/siLanguage.js +25 -0
  99. package/dist/interpretation/siLanguage.js.map +1 -0
  100. package/dist/locus-info/controlsUtils.js +101 -29
  101. package/dist/locus-info/controlsUtils.js.map +1 -1
  102. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  103. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  104. package/dist/locus-info/fullState.js +0 -15
  105. package/dist/locus-info/fullState.js.map +1 -1
  106. package/dist/locus-info/hostUtils.js +4 -12
  107. package/dist/locus-info/hostUtils.js.map +1 -1
  108. package/dist/locus-info/index.js +564 -246
  109. package/dist/locus-info/index.js.map +1 -1
  110. package/dist/locus-info/infoUtils.js +10 -38
  111. package/dist/locus-info/infoUtils.js.map +1 -1
  112. package/dist/locus-info/mediaSharesUtils.js +82 -38
  113. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  114. package/dist/locus-info/parser.js +314 -163
  115. package/dist/locus-info/parser.js.map +1 -1
  116. package/dist/locus-info/selfUtils.js +110 -92
  117. package/dist/locus-info/selfUtils.js.map +1 -1
  118. package/dist/media/index.js +107 -231
  119. package/dist/media/index.js.map +1 -1
  120. package/dist/media/properties.js +137 -222
  121. package/dist/media/properties.js.map +1 -1
  122. package/dist/media/util.js +2 -9
  123. package/dist/media/util.js.map +1 -1
  124. package/dist/mediaQualityMetrics/config.js +316 -501
  125. package/dist/mediaQualityMetrics/config.js.map +1 -1
  126. package/dist/meeting/in-meeting-actions.js +97 -14
  127. package/dist/meeting/in-meeting-actions.js.map +1 -1
  128. package/dist/meeting/index.js +5311 -3871
  129. package/dist/meeting/index.js.map +1 -1
  130. package/dist/meeting/locusMediaRequest.js +292 -0
  131. package/dist/meeting/locusMediaRequest.js.map +1 -0
  132. package/dist/meeting/muteState.js +260 -183
  133. package/dist/meeting/muteState.js.map +1 -1
  134. package/dist/meeting/request.js +421 -347
  135. package/dist/meeting/request.js.map +1 -1
  136. package/dist/meeting/request.type.js +7 -0
  137. package/dist/meeting/request.type.js.map +1 -0
  138. package/dist/meeting/state.js +21 -31
  139. package/dist/meeting/state.js.map +1 -1
  140. package/dist/meeting/util.js +672 -585
  141. package/dist/meeting/util.js.map +1 -1
  142. package/dist/meeting/voicea-meeting.js +172 -0
  143. package/dist/meeting/voicea-meeting.js.map +1 -0
  144. package/dist/meeting-info/collection.js +6 -25
  145. package/dist/meeting-info/collection.js.map +1 -1
  146. package/dist/meeting-info/index.js +87 -39
  147. package/dist/meeting-info/index.js.map +1 -1
  148. package/dist/meeting-info/meeting-info-v2.js +352 -283
  149. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  150. package/dist/meeting-info/request.js +3 -15
  151. package/dist/meeting-info/request.js.map +1 -1
  152. package/dist/meeting-info/util.js +99 -183
  153. package/dist/meeting-info/util.js.map +1 -1
  154. package/dist/meeting-info/utilv2.js +147 -234
  155. package/dist/meeting-info/utilv2.js.map +1 -1
  156. package/dist/meetings/collection.js +43 -19
  157. package/dist/meetings/collection.js.map +1 -1
  158. package/dist/meetings/index.js +895 -600
  159. package/dist/meetings/index.js.map +1 -1
  160. package/dist/meetings/meetings.types.js +7 -0
  161. package/dist/meetings/meetings.types.js.map +1 -0
  162. package/dist/meetings/request.js +26 -41
  163. package/dist/meetings/request.js.map +1 -1
  164. package/dist/meetings/util.js +184 -157
  165. package/dist/meetings/util.js.map +1 -1
  166. package/dist/member/index.js +134 -85
  167. package/dist/member/index.js.map +1 -1
  168. package/dist/member/types.js +25 -0
  169. package/dist/member/types.js.map +1 -0
  170. package/dist/member/util.js +158 -88
  171. package/dist/member/util.js.map +1 -1
  172. package/dist/members/collection.js +13 -12
  173. package/dist/members/collection.js.map +1 -1
  174. package/dist/members/index.js +194 -204
  175. package/dist/members/index.js.map +1 -1
  176. package/dist/members/request.js +113 -68
  177. package/dist/members/request.js.map +1 -1
  178. package/dist/members/types.js +15 -0
  179. package/dist/members/types.js.map +1 -0
  180. package/dist/members/util.js +324 -259
  181. package/dist/members/util.js.map +1 -1
  182. package/dist/metrics/constants.js +19 -7
  183. package/dist/metrics/constants.js.map +1 -1
  184. package/dist/metrics/index.js +11 -558
  185. package/dist/metrics/index.js.map +1 -1
  186. package/dist/multistream/mediaRequestManager.js +263 -50
  187. package/dist/multistream/mediaRequestManager.js.map +1 -1
  188. package/dist/multistream/receiveSlot.js +58 -65
  189. package/dist/multistream/receiveSlot.js.map +1 -1
  190. package/dist/multistream/receiveSlotManager.js +76 -95
  191. package/dist/multistream/receiveSlotManager.js.map +1 -1
  192. package/dist/multistream/remoteMedia.js +62 -76
  193. package/dist/multistream/remoteMedia.js.map +1 -1
  194. package/dist/multistream/remoteMediaGroup.js +82 -45
  195. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  196. package/dist/multistream/remoteMediaManager.js +657 -448
  197. package/dist/multistream/remoteMediaManager.js.map +1 -1
  198. package/dist/multistream/sendSlotManager.js +255 -0
  199. package/dist/multistream/sendSlotManager.js.map +1 -0
  200. package/dist/networkQualityMonitor/index.js +40 -59
  201. package/dist/networkQualityMonitor/index.js.map +1 -1
  202. package/dist/personal-meeting-room/index.js +21 -45
  203. package/dist/personal-meeting-room/index.js.map +1 -1
  204. package/dist/personal-meeting-room/request.js +1 -31
  205. package/dist/personal-meeting-room/request.js.map +1 -1
  206. package/dist/personal-meeting-room/util.js +0 -13
  207. package/dist/personal-meeting-room/util.js.map +1 -1
  208. package/dist/reachability/clusterReachability.js +356 -0
  209. package/dist/reachability/clusterReachability.js.map +1 -0
  210. package/dist/reachability/index.js +297 -460
  211. package/dist/reachability/index.js.map +1 -1
  212. package/dist/reachability/request.js +20 -26
  213. package/dist/reachability/request.js.map +1 -1
  214. package/dist/reachability/util.js +29 -0
  215. package/dist/reachability/util.js.map +1 -0
  216. package/dist/reactions/constants.js +13 -0
  217. package/dist/reactions/constants.js.map +1 -0
  218. package/dist/reactions/reactions.js +109 -0
  219. package/dist/reactions/reactions.js.map +1 -0
  220. package/dist/reactions/reactions.type.js +36 -0
  221. package/dist/reactions/reactions.type.js.map +1 -0
  222. package/dist/reconnection-manager/index.js +413 -483
  223. package/dist/reconnection-manager/index.js.map +1 -1
  224. package/dist/recording-controller/enums.js +17 -0
  225. package/dist/recording-controller/enums.js.map +1 -0
  226. package/dist/recording-controller/index.js +362 -0
  227. package/dist/recording-controller/index.js.map +1 -0
  228. package/dist/recording-controller/util.js +64 -0
  229. package/dist/recording-controller/util.js.map +1 -0
  230. package/dist/roap/index.js +102 -86
  231. package/dist/roap/index.js.map +1 -1
  232. package/dist/roap/request.js +131 -135
  233. package/dist/roap/request.js.map +1 -1
  234. package/dist/roap/turnDiscovery.js +437 -116
  235. package/dist/roap/turnDiscovery.js.map +1 -1
  236. package/dist/rtcMetrics/constants.js +12 -0
  237. package/dist/rtcMetrics/constants.js.map +1 -0
  238. package/dist/rtcMetrics/index.js +179 -0
  239. package/dist/rtcMetrics/index.js.map +1 -0
  240. package/dist/statsAnalyzer/global.js +1 -95
  241. package/dist/statsAnalyzer/global.js.map +1 -1
  242. package/dist/statsAnalyzer/index.js +557 -583
  243. package/dist/statsAnalyzer/index.js.map +1 -1
  244. package/dist/statsAnalyzer/mqaUtil.js +326 -130
  245. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  246. package/dist/transcription/index.js +22 -47
  247. package/dist/transcription/index.js.map +1 -1
  248. package/dist/types/annotation/annotation.types.d.ts +42 -0
  249. package/dist/types/annotation/constants.d.ts +31 -0
  250. package/dist/types/annotation/index.d.ts +117 -0
  251. package/dist/types/breakouts/breakout.d.ts +8 -0
  252. package/dist/types/breakouts/collection.d.ts +5 -0
  253. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  254. package/dist/types/breakouts/events.d.ts +8 -0
  255. package/dist/types/breakouts/index.d.ts +5 -0
  256. package/dist/types/breakouts/request.d.ts +22 -0
  257. package/dist/types/breakouts/utils.d.ts +15 -0
  258. package/dist/types/common/browser-detection.d.ts +9 -0
  259. package/dist/types/common/collection.d.ts +48 -0
  260. package/dist/types/common/config.d.ts +2 -0
  261. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  262. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  263. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  264. package/dist/types/common/errors/media.d.ts +15 -0
  265. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  266. package/dist/types/common/errors/parameter.d.ts +15 -0
  267. package/dist/types/common/errors/password-error.d.ts +15 -0
  268. package/dist/types/common/errors/permission.d.ts +14 -0
  269. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  270. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  271. package/dist/types/common/errors/reconnection.d.ts +15 -0
  272. package/dist/types/common/errors/stats.d.ts +15 -0
  273. package/dist/types/common/errors/webex-errors.d.ts +93 -0
  274. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  275. package/dist/types/common/events/events-scope.d.ts +17 -0
  276. package/dist/types/common/events/events.d.ts +12 -0
  277. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  278. package/dist/types/common/events/util.d.ts +2 -0
  279. package/dist/types/common/logs/logger-config.d.ts +2 -0
  280. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  281. package/dist/types/common/logs/request.d.ts +36 -0
  282. package/dist/types/common/queue.d.ts +34 -0
  283. package/dist/types/config.d.ts +72 -0
  284. package/dist/types/constants.d.ts +1088 -0
  285. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  286. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  287. package/dist/types/controls-options-manager/index.d.ts +136 -0
  288. package/dist/types/controls-options-manager/types.d.ts +43 -0
  289. package/dist/types/controls-options-manager/util.d.ts +1 -0
  290. package/dist/types/index.d.ts +7 -0
  291. package/dist/types/interceptors/index.d.ts +2 -0
  292. package/dist/types/interceptors/locusRetry.d.ts +27 -0
  293. package/dist/types/interpretation/collection.d.ts +5 -0
  294. package/dist/types/interpretation/index.d.ts +5 -0
  295. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  296. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  297. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  298. package/dist/types/locus-info/fullState.d.ts +2 -0
  299. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  300. package/dist/types/locus-info/index.d.ts +322 -0
  301. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  302. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  303. package/dist/types/locus-info/parser.d.ts +272 -0
  304. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  305. package/dist/types/media/index.d.ts +34 -0
  306. package/dist/types/media/properties.d.ts +93 -0
  307. package/dist/types/media/util.d.ts +2 -0
  308. package/dist/types/mediaQualityMetrics/config.d.ts +241 -0
  309. package/dist/types/meeting/in-meeting-actions.d.ts +167 -0
  310. package/dist/types/meeting/index.d.ts +1824 -0
  311. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  312. package/dist/types/meeting/muteState.d.ts +178 -0
  313. package/dist/types/meeting/request.d.ts +293 -0
  314. package/dist/types/meeting/request.type.d.ts +11 -0
  315. package/dist/types/meeting/state.d.ts +9 -0
  316. package/dist/types/meeting/util.d.ts +118 -0
  317. package/dist/types/meeting/voicea-meeting.d.ts +16 -0
  318. package/dist/types/meeting-info/collection.d.ts +20 -0
  319. package/dist/types/meeting-info/index.d.ts +69 -0
  320. package/dist/types/meeting-info/meeting-info-v2.d.ts +123 -0
  321. package/dist/types/meeting-info/request.d.ts +22 -0
  322. package/dist/types/meeting-info/util.d.ts +2 -0
  323. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  324. package/dist/types/meetings/collection.d.ts +40 -0
  325. package/dist/types/meetings/index.d.ts +389 -0
  326. package/dist/types/meetings/meetings.types.d.ts +4 -0
  327. package/dist/types/meetings/request.d.ts +27 -0
  328. package/dist/types/meetings/util.d.ts +18 -0
  329. package/dist/types/member/index.d.ts +160 -0
  330. package/dist/types/member/types.d.ts +32 -0
  331. package/dist/types/member/util.d.ts +2 -0
  332. package/dist/types/members/collection.d.ts +29 -0
  333. package/dist/types/members/index.d.ts +353 -0
  334. package/dist/types/members/request.d.ts +114 -0
  335. package/dist/types/members/types.d.ts +25 -0
  336. package/dist/types/members/util.d.ts +215 -0
  337. package/dist/types/metrics/constants.d.ts +70 -0
  338. package/dist/types/metrics/index.d.ts +45 -0
  339. package/dist/types/multistream/mediaRequestManager.d.ts +120 -0
  340. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  341. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  342. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  343. package/dist/types/multistream/remoteMediaGroup.d.ts +49 -0
  344. package/dist/types/multistream/remoteMediaManager.d.ts +301 -0
  345. package/dist/types/multistream/sendSlotManager.d.ts +70 -0
  346. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  347. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  348. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  349. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  350. package/dist/types/reachability/clusterReachability.d.ts +109 -0
  351. package/dist/types/reachability/index.d.ts +105 -0
  352. package/dist/types/reachability/request.d.ts +39 -0
  353. package/dist/types/reachability/util.d.ts +8 -0
  354. package/dist/types/reactions/constants.d.ts +3 -0
  355. package/dist/types/reactions/reactions.d.ts +4 -0
  356. package/dist/types/reactions/reactions.type.d.ts +52 -0
  357. package/dist/types/reconnection-manager/index.d.ts +136 -0
  358. package/dist/types/recording-controller/enums.d.ts +7 -0
  359. package/dist/types/recording-controller/index.d.ts +207 -0
  360. package/dist/types/recording-controller/util.d.ts +14 -0
  361. package/dist/types/roap/index.d.ts +86 -0
  362. package/dist/types/roap/request.d.ts +39 -0
  363. package/dist/types/roap/turnDiscovery.d.ts +155 -0
  364. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  365. package/dist/types/rtcMetrics/index.d.ts +61 -0
  366. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  367. package/dist/types/statsAnalyzer/index.d.ts +217 -0
  368. package/dist/types/statsAnalyzer/mqaUtil.d.ts +48 -0
  369. package/dist/types/transcription/index.d.ts +64 -0
  370. package/dist/types/webinar/collection.d.ts +16 -0
  371. package/dist/types/webinar/index.d.ts +5 -0
  372. package/dist/webinar/collection.js +44 -0
  373. package/dist/webinar/collection.js.map +1 -0
  374. package/dist/webinar/index.js +69 -0
  375. package/dist/webinar/index.js.map +1 -0
  376. package/internal-README.md +7 -6
  377. package/package.json +30 -21
  378. package/src/annotation/annotation.types.ts +50 -0
  379. package/src/annotation/constants.ts +36 -0
  380. package/src/annotation/index.ts +328 -0
  381. package/src/breakouts/README.md +220 -0
  382. package/src/breakouts/breakout.ts +188 -0
  383. package/src/breakouts/collection.ts +19 -0
  384. package/src/breakouts/edit-lock-error.ts +25 -0
  385. package/src/breakouts/events.ts +56 -0
  386. package/src/breakouts/index.ts +925 -0
  387. package/src/breakouts/request.ts +55 -0
  388. package/src/breakouts/utils.ts +57 -0
  389. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  390. package/src/common/collection.ts +9 -7
  391. package/src/common/{config.js → config.ts} +1 -1
  392. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  393. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  394. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  395. package/src/common/errors/{media.js → media.ts} +11 -7
  396. package/src/common/errors/no-meeting-info.ts +24 -0
  397. package/src/common/errors/parameter.ts +11 -7
  398. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  399. package/src/common/errors/{permission.js → permission.ts} +10 -6
  400. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  401. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  402. package/src/common/errors/{stats.js → stats.ts} +11 -7
  403. package/src/common/errors/{webex-errors.js → webex-errors.ts} +51 -8
  404. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  405. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  406. package/src/common/events/{events.js → events.ts} +5 -1
  407. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  408. package/src/common/events/{util.js → util.ts} +2 -3
  409. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  410. package/src/common/logs/logger-proxy.ts +44 -0
  411. package/src/common/logs/{request.js → request.ts} +26 -9
  412. package/src/common/queue.ts +22 -9
  413. package/src/{config.js → config.ts} +19 -21
  414. package/src/constants.ts +296 -27
  415. package/src/controls-options-manager/constants.ts +5 -0
  416. package/src/controls-options-manager/enums.ts +18 -0
  417. package/src/controls-options-manager/index.ts +278 -0
  418. package/src/controls-options-manager/types.ts +59 -0
  419. package/src/controls-options-manager/util.ts +300 -0
  420. package/src/index.ts +45 -0
  421. package/src/interceptors/index.ts +3 -0
  422. package/src/interceptors/locusRetry.ts +67 -0
  423. package/src/interpretation/README.md +60 -0
  424. package/src/interpretation/collection.ts +19 -0
  425. package/src/interpretation/index.ts +349 -0
  426. package/src/interpretation/siLanguage.ts +18 -0
  427. package/src/locus-info/controlsUtils.ts +222 -0
  428. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  429. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  430. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  431. package/src/locus-info/{index.js → index.ts} +561 -119
  432. package/src/locus-info/{infoUtils.js → infoUtils.ts} +29 -10
  433. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +97 -17
  434. package/src/locus-info/{parser.js → parser.ts} +303 -104
  435. package/src/locus-info/{selfUtils.js → selfUtils.ts} +199 -68
  436. package/src/media/index.ts +460 -0
  437. package/src/media/properties.ts +283 -0
  438. package/src/media/{util.js → util.ts} +2 -2
  439. package/src/mediaQualityMetrics/config.ts +249 -0
  440. package/src/meeting/in-meeting-actions.ts +199 -3
  441. package/src/meeting/index.ts +8494 -0
  442. package/src/meeting/locusMediaRequest.ts +313 -0
  443. package/src/meeting/muteState.ts +465 -0
  444. package/src/meeting/request.ts +912 -0
  445. package/src/meeting/request.type.ts +13 -0
  446. package/src/meeting/{state.js → state.ts} +50 -35
  447. package/src/meeting/util.ts +799 -0
  448. package/src/meeting/voicea-meeting.ts +122 -0
  449. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  450. package/src/meeting-info/index.ts +210 -0
  451. package/src/meeting-info/meeting-info-v2.ts +423 -0
  452. package/src/meeting-info/{request.js → request.ts} +14 -4
  453. package/src/meeting-info/{util.js → util.ts} +70 -58
  454. package/src/meeting-info/{utilv2.js → utilv2.ts} +99 -82
  455. package/src/meetings/collection.ts +76 -0
  456. package/src/meetings/index.ts +1539 -0
  457. package/src/meetings/meetings.types.ts +12 -0
  458. package/src/meetings/{request.js → request.ts} +34 -25
  459. package/src/meetings/{util.js → util.ts} +133 -38
  460. package/src/member/{index.js → index.ts} +159 -56
  461. package/src/member/types.ts +38 -0
  462. package/src/member/util.ts +397 -0
  463. package/src/members/{collection.js → collection.ts} +10 -2
  464. package/src/members/{index.js → index.ts} +351 -146
  465. package/src/members/request.ts +255 -0
  466. package/src/members/types.ts +29 -0
  467. package/src/members/util.ts +353 -0
  468. package/src/metrics/{constants.js → constants.ts} +17 -6
  469. package/src/metrics/index.ts +73 -0
  470. package/src/multistream/mediaRequestManager.ts +341 -64
  471. package/src/multistream/receiveSlot.ts +69 -26
  472. package/src/multistream/receiveSlotManager.ts +66 -42
  473. package/src/multistream/remoteMedia.ts +40 -5
  474. package/src/multistream/remoteMediaGroup.ts +82 -3
  475. package/src/multistream/remoteMediaManager.ts +401 -81
  476. package/src/multistream/sendSlotManager.ts +199 -0
  477. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  478. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  479. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  480. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  481. package/src/reachability/clusterReachability.ts +320 -0
  482. package/src/reachability/index.ts +371 -0
  483. package/src/reachability/request.ts +50 -35
  484. package/src/reachability/util.ts +24 -0
  485. package/src/reactions/constants.ts +4 -0
  486. package/src/reactions/reactions.ts +104 -0
  487. package/src/reactions/reactions.type.ts +62 -0
  488. package/src/reconnection-manager/index.ts +643 -0
  489. package/src/recording-controller/enums.ts +8 -0
  490. package/src/recording-controller/index.ts +332 -0
  491. package/src/recording-controller/util.ts +75 -0
  492. package/src/roap/index.ts +288 -0
  493. package/src/roap/request.ts +153 -0
  494. package/src/roap/turnDiscovery.ts +374 -70
  495. package/src/rtcMetrics/constants.ts +3 -0
  496. package/src/rtcMetrics/index.ts +166 -0
  497. package/src/statsAnalyzer/global.ts +37 -0
  498. package/src/statsAnalyzer/index.ts +1275 -0
  499. package/src/statsAnalyzer/mqaUtil.ts +440 -0
  500. package/src/transcription/{index.js → index.ts} +46 -39
  501. package/src/webinar/collection.ts +31 -0
  502. package/src/webinar/index.ts +62 -0
  503. package/test/integration/spec/converged-space-meetings.js +233 -0
  504. package/test/integration/spec/journey.js +791 -531
  505. package/test/integration/spec/space-meeting.js +391 -204
  506. package/test/integration/spec/transcription.js +7 -8
  507. package/test/unit/spec/annotation/index.ts +418 -0
  508. package/test/unit/spec/breakouts/breakout.ts +238 -0
  509. package/test/unit/spec/breakouts/collection.ts +15 -0
  510. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  511. package/test/unit/spec/breakouts/events.ts +89 -0
  512. package/test/unit/spec/breakouts/index.ts +1793 -0
  513. package/test/unit/spec/breakouts/request.ts +104 -0
  514. package/test/unit/spec/breakouts/utils.js +72 -0
  515. package/test/unit/spec/common/browser-detection.js +9 -28
  516. package/test/unit/spec/common/queue.js +31 -2
  517. package/test/unit/spec/controls-options-manager/index.js +287 -0
  518. package/test/unit/spec/controls-options-manager/util.js +582 -0
  519. package/test/unit/spec/fixture/locus.js +93 -90
  520. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  521. package/test/unit/spec/interpretation/collection.ts +15 -0
  522. package/test/unit/spec/interpretation/index.ts +625 -0
  523. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  524. package/test/unit/spec/locus-info/controlsUtils.js +325 -32
  525. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  526. package/test/unit/spec/locus-info/index.js +1458 -21
  527. package/test/unit/spec/locus-info/infoUtils.js +71 -40
  528. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  529. package/test/unit/spec/locus-info/lib/SeqCmp.json +529 -685
  530. package/test/unit/spec/locus-info/mediaSharesUtils.ts +41 -0
  531. package/test/unit/spec/locus-info/parser.js +119 -44
  532. package/test/unit/spec/locus-info/selfConstant.js +120 -103
  533. package/test/unit/spec/locus-info/selfUtils.js +291 -12
  534. package/test/unit/spec/media/index.ts +194 -111
  535. package/test/unit/spec/media/properties.ts +11 -11
  536. package/test/unit/spec/meeting/in-meeting-actions.ts +96 -3
  537. package/test/unit/spec/meeting/index.js +8616 -1921
  538. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  539. package/test/unit/spec/meeting/muteState.js +568 -207
  540. package/test/unit/spec/meeting/request.js +602 -82
  541. package/test/unit/spec/meeting/utils.js +867 -179
  542. package/test/unit/spec/meeting/voicea-meeting.ts +266 -0
  543. package/test/unit/spec/meeting-info/index.js +300 -0
  544. package/test/unit/spec/meeting-info/meetinginfov2.js +631 -78
  545. package/test/unit/spec/meeting-info/request.js +7 -9
  546. package/test/unit/spec/meeting-info/util.js +11 -12
  547. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  548. package/test/unit/spec/meetings/collection.js +27 -1
  549. package/test/unit/spec/meetings/index.js +1826 -374
  550. package/test/unit/spec/meetings/utils.js +243 -14
  551. package/test/unit/spec/member/index.js +61 -7
  552. package/test/unit/spec/member/util.js +526 -26
  553. package/test/unit/spec/members/index.js +536 -55
  554. package/test/unit/spec/members/request.js +228 -40
  555. package/test/unit/spec/members/utils.js +217 -4
  556. package/test/unit/spec/metrics/index.js +13 -68
  557. package/test/unit/spec/multistream/mediaRequestManager.ts +1032 -110
  558. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  559. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  560. package/test/unit/spec/multistream/remoteMedia.ts +40 -2
  561. package/test/unit/spec/multistream/remoteMediaGroup.ts +350 -5
  562. package/test/unit/spec/multistream/remoteMediaManager.ts +937 -65
  563. package/test/unit/spec/multistream/sendSlotManager.ts +274 -0
  564. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  565. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  566. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  567. package/test/unit/spec/reachability/index.ts +606 -26
  568. package/test/unit/spec/reachability/request.js +68 -0
  569. package/test/unit/spec/reachability/util.ts +40 -0
  570. package/test/unit/spec/reconnection-manager/index.js +222 -34
  571. package/test/unit/spec/recording-controller/index.js +306 -0
  572. package/test/unit/spec/recording-controller/util.js +229 -0
  573. package/test/unit/spec/roap/index.ts +238 -82
  574. package/test/unit/spec/roap/request.ts +255 -0
  575. package/test/unit/spec/roap/turnDiscovery.ts +707 -110
  576. package/test/unit/spec/rtcMetrics/index.ts +122 -0
  577. package/test/unit/spec/stats-analyzer/index.js +1331 -62
  578. package/test/unit/spec/webinar/collection.ts +13 -0
  579. package/test/unit/spec/webinar/index.ts +60 -0
  580. package/test/utils/cmr.js +44 -42
  581. package/test/utils/constants.js +9 -0
  582. package/test/utils/integrationTestUtils.js +46 -0
  583. package/test/utils/testUtils.js +63 -99
  584. package/test/utils/webex-config.js +22 -18
  585. package/test/utils/webex-test-users.js +65 -50
  586. package/tsconfig.json +6 -0
  587. package/dist/media/internal-media-core-wrapper.js +0 -22
  588. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  589. package/dist/meeting/effectsState.js +0 -327
  590. package/dist/meeting/effectsState.js.map +0 -1
  591. package/dist/metrics/config.js +0 -301
  592. package/dist/metrics/config.js.map +0 -1
  593. package/dist/multistream/multistreamMedia.js +0 -116
  594. package/dist/multistream/multistreamMedia.js.map +0 -1
  595. package/dist/peer-connection-manager/util.js +0 -124
  596. package/dist/peer-connection-manager/util.js.map +0 -1
  597. package/src/common/logs/logger-proxy.js +0 -33
  598. package/src/index.js +0 -15
  599. package/src/locus-info/controlsUtils.js +0 -102
  600. package/src/media/index.js +0 -459
  601. package/src/media/internal-media-core-wrapper.ts +0 -9
  602. package/src/media/properties.js +0 -289
  603. package/src/mediaQualityMetrics/config.js +0 -382
  604. package/src/meeting/effectsState.js +0 -205
  605. package/src/meeting/index.js +0 -6284
  606. package/src/meeting/muteState.js +0 -318
  607. package/src/meeting/request.js +0 -684
  608. package/src/meeting/util.js +0 -506
  609. package/src/meeting-info/index.js +0 -131
  610. package/src/meeting-info/meeting-info-v2.js +0 -255
  611. package/src/meetings/collection.js +0 -40
  612. package/src/meetings/index.js +0 -1015
  613. package/src/member/util.js +0 -254
  614. package/src/members/request.js +0 -131
  615. package/src/members/util.js +0 -258
  616. package/src/metrics/config.js +0 -324
  617. package/src/metrics/index.js +0 -530
  618. package/src/multistream/multistreamMedia.ts +0 -92
  619. package/src/peer-connection-manager/util.ts +0 -117
  620. package/src/reachability/index.js +0 -464
  621. package/src/reconnection-manager/index.js +0 -519
  622. package/src/roap/index.js +0 -220
  623. package/src/roap/request.js +0 -127
  624. package/src/statsAnalyzer/global.js +0 -133
  625. package/src/statsAnalyzer/index.js +0 -1006
  626. package/src/statsAnalyzer/mqaUtil.js +0 -173
  627. package/test/unit/spec/meeting/effectsState.js +0 -291
  628. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  629. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -1,11 +1,14 @@
1
+ // @ts-ignore - Types not available for @webex/common
1
2
  import {Defer} from '@webex/common';
2
3
 
3
4
  import Metrics from '../metrics';
4
5
  import BEHAVIORAL_METRICS from '../metrics/constants';
5
6
  import LoggerProxy from '../common/logs/logger-proxy';
6
- import {ROAP} from '../constants';
7
+ import {ROAP, Enum} from '../constants';
7
8
 
8
9
  import RoapRequest from './request';
10
+ import Meeting from '../meeting';
11
+ import MeetingUtil from '../meeting/util';
9
12
 
10
13
  const TURN_DISCOVERY_TIMEOUT = 10; // in seconds
11
14
 
@@ -15,6 +18,28 @@ const TURN_DISCOVERY_TIMEOUT = 10; // in seconds
15
18
  // and do the SDP offer with seq=1
16
19
  const TURN_DISCOVERY_SEQ = 0;
17
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
+
18
43
  /**
19
44
  * Handles the process of finding out TURN server information from Linus.
20
45
  * This is achieved by sending a TURN_DISCOVERY_REQUEST.
@@ -24,11 +49,7 @@ export default class TurnDiscovery {
24
49
 
25
50
  private defer?: Defer; // used for waiting for the response
26
51
 
27
- private turnInfo: {
28
- url: string;
29
- username: string;
30
- password: string;
31
- };
52
+ private turnInfo: TurnServerInfo;
32
53
 
33
54
  private responseTimer?: ReturnType<typeof setTimeout>;
34
55
 
@@ -46,7 +67,6 @@ export default class TurnDiscovery {
46
67
  };
47
68
  }
48
69
 
49
-
50
70
  /**
51
71
  * waits for TURN_DISCOVERY_RESPONSE message to arrive
52
72
  *
@@ -54,43 +74,65 @@ export default class TurnDiscovery {
54
74
  * @private
55
75
  * @memberof Roap
56
76
  */
57
- waitForTurnDiscoveryResponse() {
77
+ private waitForTurnDiscoveryResponse(): Promise<{isOkRequired: boolean}> {
58
78
  if (!this.defer) {
59
- LoggerProxy.logger.warn('Roap:turnDiscovery#waitForTurnDiscoveryResponse --> TURN discovery is not in progress');
79
+ LoggerProxy.logger.warn(
80
+ 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> TURN discovery is not in progress'
81
+ );
60
82
 
61
- return Promise.reject(new Error('waitForTurnDiscoveryResponse() called before sendRoapTurnDiscoveryRequest()'));
83
+ return Promise.reject(
84
+ new Error('waitForTurnDiscoveryResponse() called before sendRoapTurnDiscoveryRequest()')
85
+ );
62
86
  }
63
87
 
64
88
  const {defer} = this;
65
89
 
66
90
  this.responseTimer = setTimeout(() => {
67
- LoggerProxy.logger.warn(`Roap:turnDiscovery#waitForTurnDiscoveryResponse --> timeout! no response arrived within ${TURN_DISCOVERY_TIMEOUT} seconds`);
91
+ LoggerProxy.logger.warn(
92
+ `Roap:turnDiscovery#waitForTurnDiscoveryResponse --> timeout! no response arrived within ${TURN_DISCOVERY_TIMEOUT} seconds`
93
+ );
68
94
 
69
95
  defer.reject(new Error('Timed out waiting for TURN_DISCOVERY_RESPONSE'));
70
96
  }, TURN_DISCOVERY_TIMEOUT * 1000);
71
97
 
72
- LoggerProxy.logger.info('Roap:turnDiscovery#waitForTurnDiscoveryResponse --> waiting for TURN_DISCOVERY_RESPONSE...');
98
+ LoggerProxy.logger.info(
99
+ 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> waiting for TURN_DISCOVERY_RESPONSE...'
100
+ );
73
101
 
74
102
  return defer.promise;
75
103
  }
76
104
 
77
105
  /**
78
- * 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.
79
108
  *
80
109
  * @param {Object} roapMessage
110
+ * @param {string} from string to indicate how we got the response (used just for logging)
81
111
  * @returns {void}
82
112
  * @public
83
113
  * @memberof Roap
84
114
  */
85
- handleTurnDiscoveryResponse(roapMessage) {
115
+ public handleTurnDiscoveryResponse(roapMessage: any, from: string) {
86
116
  const {headers} = roapMessage;
87
117
 
88
118
  if (!this.defer) {
89
- LoggerProxy.logger.warn('Roap:turnDiscovery#handleTurnDiscoveryResponse --> unexpected TURN discovery response');
119
+ LoggerProxy.logger.warn(
120
+ `Roap:turnDiscovery#handleTurnDiscoveryResponse --> unexpected TURN discovery response ${from}`
121
+ );
90
122
 
91
123
  return;
92
124
  }
93
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
+
94
136
  const expectedHeaders = [
95
137
  {headerName: 'x-cisco-turn-url', field: 'url'},
96
138
  {headerName: 'x-cisco-turn-username', field: 'username'},
@@ -103,7 +145,9 @@ export default class TurnDiscovery {
103
145
  // check if it matches any of our expected headers
104
146
  expectedHeaders.forEach((expectedHeader) => {
105
147
  if (receivedHeader.startsWith(`${expectedHeader.headerName}=`)) {
106
- this.turnInfo[expectedHeader.field] = receivedHeader.substring(expectedHeader.headerName.length + 1);
148
+ this.turnInfo[expectedHeader.field] = receivedHeader.substring(
149
+ expectedHeader.headerName.length + 1
150
+ );
107
151
  foundHeaders += 1;
108
152
  }
109
153
  });
@@ -113,13 +157,211 @@ export default class TurnDiscovery {
113
157
  this.responseTimer = undefined;
114
158
 
115
159
  if (foundHeaders !== expectedHeaders.length) {
116
- LoggerProxy.logger.warn(`Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received: ${JSON.stringify(headers)}`);
117
- this.defer.reject(new Error(`TURN_DISCOVERY_RESPONSE missing some headers: ${JSON.stringify(headers)}`));
160
+ LoggerProxy.logger.warn(
161
+ `Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received ${from}: ${JSON.stringify(
162
+ headers
163
+ )}`
164
+ );
165
+ this.defer.reject(
166
+ new Error(
167
+ `TURN_DISCOVERY_RESPONSE ${from} missing some headers: ${JSON.stringify(headers)}`
168
+ )
169
+ );
170
+ } else {
171
+ LoggerProxy.logger.info(
172
+ `Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response ${from}, url=${this.turnInfo.url}`
173
+ );
174
+
175
+ this.defer.resolve({isOkRequired: !headers?.includes('noOkInTransaction')});
118
176
  }
119
- else {
120
- LoggerProxy.logger.info(`Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response, url=${this.turnInfo.url}`);
121
- this.defer.resolve();
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
+ };
122
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);
310
+ }
311
+ }
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;
123
365
  }
124
366
 
125
367
  /**
@@ -131,11 +373,19 @@ export default class TurnDiscovery {
131
373
  * @private
132
374
  * @memberof Roap
133
375
  */
134
- sendRoapTurnDiscoveryRequest(meeting, isReconnecting) {
376
+ private sendRoapTurnDiscoveryRequest(
377
+ meeting: Meeting,
378
+ isReconnecting: boolean
379
+ ): Promise<TurnDiscoveryResult> {
135
380
  if (this.defer) {
136
- LoggerProxy.logger.warn('Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress');
381
+ LoggerProxy.logger.warn(
382
+ 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress'
383
+ );
137
384
 
138
- return Promise.resolve();
385
+ return Promise.resolve({
386
+ turnServerInfo: undefined,
387
+ turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,
388
+ });
139
389
  }
140
390
 
141
391
  this.defer = new Defer();
@@ -144,24 +394,33 @@ export default class TurnDiscovery {
144
394
  messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,
145
395
  version: ROAP.ROAP_VERSION,
146
396
  seq: TURN_DISCOVERY_SEQ,
397
+ headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],
147
398
  };
148
399
 
149
- LoggerProxy.logger.info('Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> sending TURN_DISCOVERY_REQUEST');
400
+ LoggerProxy.logger.info(
401
+ 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> sending TURN_DISCOVERY_REQUEST'
402
+ );
150
403
 
151
404
  return this.roapRequest
152
405
  .sendRoap({
153
406
  roapMessage,
154
- correlationId: meeting.correlationId,
407
+ // @ts-ignore - Fix missing type
155
408
  locusSelfUrl: meeting.selfUrl,
409
+ // @ts-ignore - Fix missing type
156
410
  mediaId: isReconnecting ? '' : meeting.mediaId,
157
- audioMuted: meeting.isAudioMuted(),
158
- videoMuted: meeting.isVideoMuted(),
159
- meetingId: meeting.id
411
+ meetingId: meeting.id,
412
+ locusMediaRequest: meeting.locusMediaRequest,
413
+ // @ts-ignore - because of meeting.webex
414
+ ipVersion: MeetingUtil.getIpVersion(meeting.webex),
160
415
  })
161
- .then(({mediaConnections}) => {
416
+ .then(async (response) => {
417
+ const {mediaConnections} = response;
418
+
162
419
  if (mediaConnections) {
163
420
  meeting.updateMediaConnections(mediaConnections);
164
421
  }
422
+
423
+ return this.handleTurnDiscoveryHttpResponse(meeting, response);
165
424
  });
166
425
  }
167
426
 
@@ -172,8 +431,15 @@ export default class TurnDiscovery {
172
431
  * @param {Meeting} meeting
173
432
  * @returns {Promise}
174
433
  */
175
- sendRoapOK(meeting) {
176
- LoggerProxy.logger.info('Roap:turnDiscovery#sendRoapOK --> sending OK');
434
+ sendRoapOK(meeting: Meeting) {
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
+ });
177
443
 
178
444
  return this.roapRequest.sendRoap({
179
445
  roapMessage: {
@@ -181,15 +447,49 @@ export default class TurnDiscovery {
181
447
  version: ROAP.ROAP_VERSION,
182
448
  seq: TURN_DISCOVERY_SEQ,
183
449
  },
450
+ // @ts-ignore - fix type
184
451
  locusSelfUrl: meeting.selfUrl,
452
+ // @ts-ignore - fix type
185
453
  mediaId: meeting.mediaId,
186
- correlationId: meeting.correlationId,
187
- audioMuted: meeting.isAudioMuted(),
188
- videoMuted: meeting.isVideoMuted(),
189
- meetingId: meeting.id
454
+ meetingId: meeting.id,
455
+ locusMediaRequest: meeting.locusMediaRequest,
190
456
  });
191
457
  }
192
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
+
193
493
  /**
194
494
  * Retrieves TURN server information from the backend by doing
195
495
  * a roap message exchange:
@@ -203,49 +503,53 @@ export default class TurnDiscovery {
203
503
  * so it works fine no matter if TURN discovery is done or not.
204
504
  *
205
505
  * @param {Meeting} meeting
206
- * @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
207
507
  * media connection just after a reconnection
508
+ * @param {Boolean} [isForced]
208
509
  * @returns {Promise}
209
510
  */
210
- doTurnDiscovery(meeting, isReconnecting) {
211
- const isAnyClusterReachable = meeting.webex.meetings.reachability.isAnyClusterReachable();
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
+ }
212
521
 
213
- if (isAnyClusterReachable) {
214
- LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> reachability has not failed, skipping TURN discovery');
215
- return Promise.resolve({turnServerInfo: undefined, turnDiscoverySkippedReason: 'reachability'});
522
+ if (turnDiscoverySkippedReason) {
523
+ return {
524
+ turnServerInfo: undefined,
525
+ turnDiscoverySkippedReason,
526
+ };
216
527
  }
217
528
 
218
- if (!meeting.config.experimental.enableTurnDiscovery) {
219
- LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery disabled in config, skipping it');
529
+ try {
530
+ const turnDiscoveryResult = await this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting);
220
531
 
221
- return Promise.resolve({turnServerInfo: undefined, turnDiscoverySkippedReason: 'config'});
222
- }
532
+ if (
533
+ turnDiscoveryResult.turnDiscoverySkippedReason !==
534
+ TurnDiscoverySkipReason.missingHttpResponse
535
+ ) {
536
+ return turnDiscoveryResult;
537
+ }
223
538
 
224
- return this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting)
225
- .then(() => this.waitForTurnDiscoveryResponse())
226
- .then(() => this.sendRoapOK(meeting))
227
- .then(() => {
228
- 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();
229
541
 
230
- LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');
542
+ if (isOkRequired) {
543
+ await this.sendRoapOK(meeting);
544
+ }
231
545
 
232
- return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};
233
- })
234
- .catch((e) => {
235
- // we catch any errors and resolve with no turn information so that the normal call join flow can continue without TURN
236
- LoggerProxy.logger.info(`Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ${e}`);
237
-
238
- Metrics.sendBehavioralMetric(
239
- BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE,
240
- {
241
- correlation_id: meeting.correlationId,
242
- locus_id: meeting.locusUrl.split('/').pop(),
243
- reason: e.message,
244
- stack: e.stack
245
- }
246
- );
247
-
248
- return Promise.resolve({turnServerInfo: undefined, turnDiscoverySkippedReason: undefined});
249
- });
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
+ }
250
554
  }
251
555
  }
@@ -0,0 +1,3 @@
1
+ const RTC_METRICS = {APP_ID: 'FFB51ED5-4319-4C55-8303-B1F2FCCDE231'};
2
+
3
+ export {RTC_METRICS as default};