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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (539) hide show
  1. package/README.md +58 -8
  2. package/dist/annotation/annotation.types.d.ts +42 -0
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.d.ts +31 -0
  6. package/dist/annotation/constants.js +41 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.d.ts +117 -0
  9. package/dist/annotation/index.js +357 -0
  10. package/dist/annotation/index.js.map +1 -0
  11. package/dist/breakouts/breakout.d.ts +8 -0
  12. package/dist/breakouts/breakout.js +215 -0
  13. package/dist/breakouts/breakout.js.map +1 -0
  14. package/dist/breakouts/collection.d.ts +5 -0
  15. package/dist/breakouts/collection.js +22 -0
  16. package/dist/breakouts/collection.js.map +1 -0
  17. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  18. package/dist/breakouts/edit-lock-error.js +51 -0
  19. package/dist/breakouts/edit-lock-error.js.map +1 -0
  20. package/dist/breakouts/events.d.ts +8 -0
  21. package/dist/breakouts/events.js +44 -0
  22. package/dist/breakouts/events.js.map +1 -0
  23. package/dist/breakouts/index.d.ts +5 -0
  24. package/dist/breakouts/index.js +1047 -0
  25. package/dist/breakouts/index.js.map +1 -0
  26. package/dist/breakouts/request.d.ts +22 -0
  27. package/dist/breakouts/request.js +77 -0
  28. package/dist/breakouts/request.js.map +1 -0
  29. package/dist/breakouts/utils.d.ts +15 -0
  30. package/dist/breakouts/utils.js +64 -0
  31. package/dist/breakouts/utils.js.map +1 -0
  32. package/dist/common/browser-detection.js +2 -3
  33. package/dist/common/browser-detection.js.map +1 -1
  34. package/dist/common/collection.js +3 -4
  35. package/dist/common/collection.js.map +1 -1
  36. package/dist/common/config.js +1 -2
  37. package/dist/common/config.js.map +1 -1
  38. package/dist/common/errors/captcha-error.js +1 -2
  39. package/dist/common/errors/captcha-error.js.map +1 -1
  40. package/dist/common/errors/intent-to-join.js +1 -2
  41. package/dist/common/errors/intent-to-join.js.map +1 -1
  42. package/dist/common/errors/join-meeting.js +1 -2
  43. package/dist/common/errors/join-meeting.js.map +1 -1
  44. package/dist/common/errors/media.js +1 -2
  45. package/dist/common/errors/media.js.map +1 -1
  46. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  47. package/dist/common/errors/no-meeting-info.js +50 -0
  48. package/dist/common/errors/no-meeting-info.js.map +1 -0
  49. package/dist/common/errors/parameter.js +3 -4
  50. package/dist/common/errors/parameter.js.map +1 -1
  51. package/dist/common/errors/password-error.js +1 -2
  52. package/dist/common/errors/password-error.js.map +1 -1
  53. package/dist/common/errors/permission.js +1 -2
  54. package/dist/common/errors/permission.js.map +1 -1
  55. package/dist/common/errors/{reclaim-host-role-error.js → reclaim-host-role-errors.js} +7 -11
  56. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  57. package/dist/common/errors/reconnection-in-progress.js +1 -2
  58. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  59. package/dist/common/errors/reconnection.js +1 -2
  60. package/dist/common/errors/reconnection.js.map +1 -1
  61. package/dist/common/errors/stats.js +1 -2
  62. package/dist/common/errors/stats.js.map +1 -1
  63. package/dist/common/errors/webex-errors.d.ts +20 -8
  64. package/dist/common/errors/webex-errors.js +48 -28
  65. package/dist/common/errors/webex-errors.js.map +1 -1
  66. package/dist/common/errors/webex-meetings-error.js +1 -2
  67. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  68. package/dist/common/events/events-scope.js +1 -2
  69. package/dist/common/events/events-scope.js.map +1 -1
  70. package/dist/common/events/events.js +1 -2
  71. package/dist/common/events/events.js.map +1 -1
  72. package/dist/common/events/trigger-proxy.js +1 -2
  73. package/dist/common/events/trigger-proxy.js.map +1 -1
  74. package/dist/common/events/util.js +1 -2
  75. package/dist/common/events/util.js.map +1 -1
  76. package/dist/common/logs/logger-config.js +1 -2
  77. package/dist/common/logs/logger-config.js.map +1 -1
  78. package/dist/common/logs/logger-proxy.js +2 -3
  79. package/dist/common/logs/logger-proxy.js.map +1 -1
  80. package/dist/common/logs/request.d.ts +3 -1
  81. package/dist/common/logs/request.js +8 -5
  82. package/dist/common/logs/request.js.map +1 -1
  83. package/dist/common/queue.d.ts +9 -7
  84. package/dist/common/queue.js +22 -9
  85. package/dist/common/queue.js.map +1 -1
  86. package/dist/config.d.ts +6 -7
  87. package/dist/config.js +8 -10
  88. package/dist/config.js.map +1 -1
  89. package/dist/constants.d.ts +234 -100
  90. package/dist/constants.js +433 -444
  91. package/dist/constants.js.map +1 -1
  92. package/dist/controls-options-manager/constants.js +3 -6
  93. package/dist/controls-options-manager/constants.js.map +1 -1
  94. package/dist/controls-options-manager/enums.d.ts +11 -1
  95. package/dist/controls-options-manager/enums.js +15 -6
  96. package/dist/controls-options-manager/enums.js.map +1 -1
  97. package/dist/controls-options-manager/index.d.ts +17 -1
  98. package/dist/controls-options-manager/index.js +127 -38
  99. package/dist/controls-options-manager/index.js.map +1 -1
  100. package/dist/controls-options-manager/types.d.ts +43 -0
  101. package/dist/controls-options-manager/types.js +7 -0
  102. package/dist/controls-options-manager/types.js.map +1 -0
  103. package/dist/controls-options-manager/util.d.ts +1 -7
  104. package/dist/controls-options-manager/util.js +309 -19
  105. package/dist/controls-options-manager/util.js.map +1 -1
  106. package/dist/index.d.ts +6 -3
  107. package/dist/index.js +121 -5
  108. package/dist/index.js.map +1 -1
  109. package/dist/interceptors/index.d.ts +2 -0
  110. package/dist/interceptors/index.js +15 -0
  111. package/dist/interceptors/index.js.map +1 -0
  112. package/dist/interceptors/locusRetry.d.ts +27 -0
  113. package/dist/interceptors/locusRetry.js +94 -0
  114. package/dist/interceptors/locusRetry.js.map +1 -0
  115. package/dist/interpretation/collection.d.ts +5 -0
  116. package/dist/interpretation/collection.js +22 -0
  117. package/dist/interpretation/collection.js.map +1 -0
  118. package/dist/interpretation/index.d.ts +5 -0
  119. package/dist/interpretation/index.js +365 -0
  120. package/dist/interpretation/index.js.map +1 -0
  121. package/dist/interpretation/siLanguage.d.ts +5 -0
  122. package/dist/interpretation/siLanguage.js +24 -0
  123. package/dist/interpretation/siLanguage.js.map +1 -0
  124. package/dist/locus-info/controlsUtils.js +100 -11
  125. package/dist/locus-info/controlsUtils.js.map +1 -1
  126. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  127. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  128. package/dist/locus-info/fullState.js +1 -2
  129. package/dist/locus-info/fullState.js.map +1 -1
  130. package/dist/locus-info/hostUtils.js +1 -2
  131. package/dist/locus-info/hostUtils.js.map +1 -1
  132. package/dist/locus-info/index.d.ts +57 -4
  133. package/dist/locus-info/index.js +425 -84
  134. package/dist/locus-info/index.js.map +1 -1
  135. package/dist/locus-info/infoUtils.js +13 -5
  136. package/dist/locus-info/infoUtils.js.map +1 -1
  137. package/dist/locus-info/mediaSharesUtils.js +58 -3
  138. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  139. package/dist/locus-info/parser.d.ts +66 -6
  140. package/dist/locus-info/parser.js +253 -80
  141. package/dist/locus-info/parser.js.map +1 -1
  142. package/dist/locus-info/selfUtils.js +97 -13
  143. package/dist/locus-info/selfUtils.js.map +1 -1
  144. package/dist/media/index.d.ts +2 -0
  145. package/dist/media/index.js +107 -319
  146. package/dist/media/index.js.map +1 -1
  147. package/dist/media/properties.d.ts +38 -53
  148. package/dist/media/properties.js +96 -153
  149. package/dist/media/properties.js.map +1 -1
  150. package/dist/media/util.js +1 -22
  151. package/dist/media/util.js.map +1 -1
  152. package/dist/mediaQualityMetrics/config.d.ts +234 -230
  153. package/dist/mediaQualityMetrics/config.js +302 -498
  154. package/dist/mediaQualityMetrics/config.js.map +1 -1
  155. package/dist/meeting/in-meeting-actions.d.ts +88 -0
  156. package/dist/meeting/in-meeting-actions.js +94 -3
  157. package/dist/meeting/in-meeting-actions.js.map +1 -1
  158. package/dist/meeting/index.d.ts +705 -520
  159. package/dist/meeting/index.js +5047 -3089
  160. package/dist/meeting/index.js.map +1 -1
  161. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  162. package/dist/meeting/locusMediaRequest.js +291 -0
  163. package/dist/meeting/locusMediaRequest.js.map +1 -0
  164. package/dist/meeting/muteState.d.ts +93 -25
  165. package/dist/meeting/muteState.js +224 -133
  166. package/dist/meeting/muteState.js.map +1 -1
  167. package/dist/meeting/request.d.ts +82 -47
  168. package/dist/meeting/request.js +304 -199
  169. package/dist/meeting/request.js.map +1 -1
  170. package/dist/meeting/request.type.d.ts +11 -0
  171. package/dist/meeting/request.type.js +7 -0
  172. package/dist/meeting/request.type.js.map +1 -0
  173. package/dist/meeting/state.js +1 -2
  174. package/dist/meeting/state.js.map +1 -1
  175. package/dist/meeting/util.d.ts +118 -1
  176. package/dist/meeting/util.js +676 -435
  177. package/dist/meeting/util.js.map +1 -1
  178. package/dist/meeting/voicea-meeting.d.ts +20 -0
  179. package/dist/meeting/voicea-meeting.js +201 -0
  180. package/dist/meeting/voicea-meeting.js.map +1 -0
  181. package/dist/meeting-info/collection.js +3 -4
  182. package/dist/meeting-info/collection.js.map +1 -1
  183. package/dist/meeting-info/index.d.ts +13 -1
  184. package/dist/meeting-info/index.js +74 -7
  185. package/dist/meeting-info/index.js.map +1 -1
  186. package/dist/meeting-info/meeting-info-v2.d.ts +31 -1
  187. package/dist/meeting-info/meeting-info-v2.js +200 -63
  188. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  189. package/dist/meeting-info/request.js +1 -2
  190. package/dist/meeting-info/request.js.map +1 -1
  191. package/dist/meeting-info/util.js +2 -3
  192. package/dist/meeting-info/util.js.map +1 -1
  193. package/dist/meeting-info/utilv2.js +39 -41
  194. package/dist/meeting-info/utilv2.js.map +1 -1
  195. package/dist/meetings/collection.d.ts +17 -0
  196. package/dist/meetings/collection.js +42 -4
  197. package/dist/meetings/collection.js.map +1 -1
  198. package/dist/meetings/index.d.ts +114 -20
  199. package/dist/meetings/index.js +540 -126
  200. package/dist/meetings/index.js.map +1 -1
  201. package/dist/meetings/meetings.types.d.ts +4 -0
  202. package/dist/meetings/meetings.types.js +7 -0
  203. package/dist/meetings/meetings.types.js.map +1 -0
  204. package/dist/meetings/request.js +4 -3
  205. package/dist/meetings/request.js.map +1 -1
  206. package/dist/meetings/util.js +107 -6
  207. package/dist/meetings/util.js.map +1 -1
  208. package/dist/member/index.d.ts +13 -1
  209. package/dist/member/index.js +45 -2
  210. package/dist/member/index.js.map +1 -1
  211. package/dist/member/member.types.js +3 -4
  212. package/dist/member/member.types.js.map +1 -1
  213. package/dist/member/types.d.ts +32 -0
  214. package/dist/member/types.js +23 -0
  215. package/dist/member/types.js.map +1 -0
  216. package/dist/member/util.js +120 -29
  217. package/dist/member/util.js.map +1 -1
  218. package/dist/members/collection.d.ts +5 -0
  219. package/dist/members/collection.js +11 -2
  220. package/dist/members/collection.js.map +1 -1
  221. package/dist/members/index.d.ts +56 -11
  222. package/dist/members/index.js +174 -47
  223. package/dist/members/index.js.map +1 -1
  224. package/dist/members/request.d.ts +67 -11
  225. package/dist/members/request.js +102 -54
  226. package/dist/members/request.js.map +1 -1
  227. package/dist/members/types.js +3 -4
  228. package/dist/members/types.js.map +1 -1
  229. package/dist/members/util.d.ts +214 -1
  230. package/dist/members/util.js +327 -284
  231. package/dist/members/util.js.map +1 -1
  232. package/dist/metrics/constants.d.ts +15 -6
  233. package/dist/metrics/constants.js +17 -9
  234. package/dist/metrics/constants.js.map +1 -1
  235. package/dist/metrics/index.d.ts +4 -111
  236. package/dist/metrics/index.js +4 -452
  237. package/dist/metrics/index.js.map +1 -1
  238. package/dist/multistream/mediaRequestManager.d.ts +118 -0
  239. package/dist/multistream/mediaRequestManager.js +344 -0
  240. package/dist/multistream/mediaRequestManager.js.map +1 -0
  241. package/dist/multistream/receiveSlot.d.ts +68 -0
  242. package/dist/multistream/receiveSlot.js +200 -0
  243. package/dist/multistream/receiveSlot.js.map +1 -0
  244. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  245. package/dist/multistream/receiveSlotManager.js +174 -0
  246. package/dist/multistream/receiveSlotManager.js.map +1 -0
  247. package/dist/multistream/remoteMedia.d.ts +72 -0
  248. package/dist/multistream/remoteMedia.js +268 -0
  249. package/dist/multistream/remoteMedia.js.map +1 -0
  250. package/dist/multistream/remoteMediaGroup.d.ts +47 -0
  251. package/dist/multistream/remoteMediaGroup.js +267 -0
  252. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  253. package/dist/multistream/remoteMediaManager.d.ts +285 -0
  254. package/dist/multistream/remoteMediaManager.js +1211 -0
  255. package/dist/multistream/remoteMediaManager.js.map +1 -0
  256. package/dist/multistream/sendSlotManager.d.ts +61 -0
  257. package/dist/multistream/sendSlotManager.js +236 -0
  258. package/dist/multistream/sendSlotManager.js.map +1 -0
  259. package/dist/networkQualityMonitor/index.js +5 -4
  260. package/dist/networkQualityMonitor/index.js.map +1 -1
  261. package/dist/personal-meeting-room/index.js +2 -3
  262. package/dist/personal-meeting-room/index.js.map +1 -1
  263. package/dist/personal-meeting-room/request.js +2 -3
  264. package/dist/personal-meeting-room/request.js.map +1 -1
  265. package/dist/personal-meeting-room/util.js +1 -2
  266. package/dist/personal-meeting-room/util.js.map +1 -1
  267. package/dist/reachability/clusterReachability.d.ts +109 -0
  268. package/dist/reachability/clusterReachability.js +357 -0
  269. package/dist/reachability/clusterReachability.js.map +1 -0
  270. package/dist/reachability/index.d.ts +61 -95
  271. package/dist/reachability/index.js +304 -392
  272. package/dist/reachability/index.js.map +1 -1
  273. package/dist/reachability/request.d.ts +7 -3
  274. package/dist/reachability/request.js +18 -10
  275. package/dist/reachability/request.js.map +1 -1
  276. package/dist/reachability/util.d.ts +8 -0
  277. package/dist/reachability/util.js +29 -0
  278. package/dist/reachability/util.js.map +1 -0
  279. package/dist/reactions/constants.d.ts +3 -0
  280. package/dist/reactions/constants.js +12 -0
  281. package/dist/reactions/constants.js.map +1 -0
  282. package/dist/reactions/reactions.d.ts +2 -2
  283. package/dist/reactions/reactions.js +4 -6
  284. package/dist/reactions/reactions.js.map +1 -1
  285. package/dist/reactions/reactions.type.d.ts +23 -3
  286. package/dist/reactions/reactions.type.js +21 -23
  287. package/dist/reactions/reactions.type.js.map +1 -1
  288. package/dist/reconnection-manager/index.d.ts +32 -8
  289. package/dist/reconnection-manager/index.js +285 -232
  290. package/dist/reconnection-manager/index.js.map +1 -1
  291. package/dist/recording-controller/enums.js +4 -5
  292. package/dist/recording-controller/enums.js.map +1 -1
  293. package/dist/recording-controller/index.d.ts +15 -1
  294. package/dist/recording-controller/index.js +57 -46
  295. package/dist/recording-controller/index.js.map +1 -1
  296. package/dist/recording-controller/util.d.ts +5 -4
  297. package/dist/recording-controller/util.js +10 -10
  298. package/dist/recording-controller/util.js.map +1 -1
  299. package/dist/roap/index.d.ts +9 -47
  300. package/dist/roap/index.js +100 -238
  301. package/dist/roap/index.js.map +1 -1
  302. package/dist/roap/request.d.ts +18 -12
  303. package/dist/roap/request.js +126 -180
  304. package/dist/roap/request.js.map +1 -1
  305. package/dist/roap/turnDiscovery.d.ts +27 -16
  306. package/dist/roap/turnDiscovery.js +115 -105
  307. package/dist/roap/turnDiscovery.js.map +1 -1
  308. package/dist/rtcMetrics/constants.d.ts +4 -0
  309. package/dist/rtcMetrics/constants.js +11 -0
  310. package/dist/rtcMetrics/constants.js.map +1 -0
  311. package/dist/rtcMetrics/index.d.ts +54 -0
  312. package/dist/rtcMetrics/index.js +140 -0
  313. package/dist/rtcMetrics/index.js.map +1 -0
  314. package/dist/statsAnalyzer/global.d.ts +1 -83
  315. package/dist/statsAnalyzer/global.js +2 -85
  316. package/dist/statsAnalyzer/global.js.map +1 -1
  317. package/dist/statsAnalyzer/index.d.ts +50 -30
  318. package/dist/statsAnalyzer/index.js +436 -511
  319. package/dist/statsAnalyzer/index.js.map +1 -1
  320. package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
  321. package/dist/statsAnalyzer/mqaUtil.js +130 -90
  322. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  323. package/dist/transcription/index.js +1 -2
  324. package/dist/transcription/index.js.map +1 -1
  325. package/dist/webinar/collection.d.ts +16 -0
  326. package/dist/webinar/collection.js +43 -0
  327. package/dist/webinar/collection.js.map +1 -0
  328. package/dist/webinar/index.d.ts +5 -0
  329. package/dist/webinar/index.js +68 -0
  330. package/dist/webinar/index.js.map +1 -0
  331. package/package.json +39 -26
  332. package/src/annotation/annotation.types.ts +50 -0
  333. package/src/annotation/constants.ts +36 -0
  334. package/src/annotation/index.ts +328 -0
  335. package/src/breakouts/README.md +220 -0
  336. package/src/breakouts/breakout.ts +188 -0
  337. package/src/breakouts/collection.ts +19 -0
  338. package/src/breakouts/edit-lock-error.ts +25 -0
  339. package/src/breakouts/events.ts +56 -0
  340. package/src/breakouts/index.ts +925 -0
  341. package/src/breakouts/request.ts +55 -0
  342. package/src/breakouts/utils.ts +57 -0
  343. package/src/common/errors/no-meeting-info.ts +24 -0
  344. package/src/common/errors/webex-errors.ts +36 -12
  345. package/src/common/logs/logger-proxy.ts +1 -1
  346. package/src/common/logs/request.ts +5 -1
  347. package/src/common/queue.ts +22 -8
  348. package/src/config.ts +6 -7
  349. package/src/constants.ts +265 -100
  350. package/src/controls-options-manager/enums.ts +12 -0
  351. package/src/controls-options-manager/index.ts +116 -21
  352. package/src/controls-options-manager/types.ts +59 -0
  353. package/src/controls-options-manager/util.ts +294 -14
  354. package/src/index.ts +44 -0
  355. package/src/interceptors/index.ts +3 -0
  356. package/src/interceptors/locusRetry.ts +67 -0
  357. package/src/interpretation/README.md +60 -0
  358. package/src/interpretation/collection.ts +19 -0
  359. package/src/interpretation/index.ts +332 -0
  360. package/src/interpretation/siLanguage.ts +18 -0
  361. package/src/locus-info/controlsUtils.ts +110 -0
  362. package/src/locus-info/index.ts +450 -61
  363. package/src/locus-info/infoUtils.ts +14 -2
  364. package/src/locus-info/mediaSharesUtils.ts +64 -0
  365. package/src/locus-info/parser.ts +258 -47
  366. package/src/locus-info/selfUtils.ts +85 -2
  367. package/src/media/index.ts +153 -370
  368. package/src/media/properties.ts +106 -136
  369. package/src/media/util.ts +0 -21
  370. package/src/mediaQualityMetrics/config.ts +244 -377
  371. package/src/meeting/in-meeting-actions.ts +176 -0
  372. package/src/meeting/index.ts +4306 -2581
  373. package/src/meeting/locusMediaRequest.ts +313 -0
  374. package/src/meeting/muteState.ts +224 -138
  375. package/src/meeting/request.ts +214 -127
  376. package/src/meeting/request.type.ts +13 -0
  377. package/src/meeting/util.ts +687 -423
  378. package/src/meeting/voicea-meeting.ts +161 -0
  379. package/src/meeting-info/index.ts +81 -8
  380. package/src/meeting-info/meeting-info-v2.ts +163 -13
  381. package/src/meeting-info/util.ts +1 -1
  382. package/src/meeting-info/utilv2.ts +28 -28
  383. package/src/meetings/collection.ts +33 -0
  384. package/src/meetings/index.ts +529 -127
  385. package/src/meetings/meetings.types.ts +12 -0
  386. package/src/meetings/request.ts +2 -0
  387. package/src/meetings/util.ts +116 -5
  388. package/src/member/index.ts +43 -1
  389. package/src/member/types.ts +38 -0
  390. package/src/member/util.ts +125 -28
  391. package/src/members/collection.ts +8 -0
  392. package/src/members/index.ts +187 -52
  393. package/src/members/request.ts +87 -27
  394. package/src/members/util.ts +332 -291
  395. package/src/metrics/constants.ts +15 -6
  396. package/src/metrics/index.ts +1 -471
  397. package/src/multistream/mediaRequestManager.ts +440 -0
  398. package/src/multistream/receiveSlot.ts +184 -0
  399. package/src/multistream/receiveSlotManager.ts +166 -0
  400. package/src/multistream/remoteMedia.ts +254 -0
  401. package/src/multistream/remoteMediaGroup.ts +284 -0
  402. package/src/multistream/remoteMediaManager.ts +1145 -0
  403. package/src/multistream/sendSlotManager.ts +170 -0
  404. package/src/networkQualityMonitor/index.ts +6 -6
  405. package/src/reachability/clusterReachability.ts +320 -0
  406. package/src/reachability/index.ts +246 -347
  407. package/src/reachability/request.ts +17 -8
  408. package/src/reachability/util.ts +24 -0
  409. package/src/reactions/constants.ts +4 -0
  410. package/src/reactions/reactions.ts +4 -4
  411. package/src/reactions/reactions.type.ts +30 -4
  412. package/src/reconnection-manager/index.ts +168 -156
  413. package/src/recording-controller/index.ts +20 -3
  414. package/src/recording-controller/util.ts +26 -9
  415. package/src/roap/index.ts +96 -241
  416. package/src/roap/request.ts +74 -148
  417. package/src/roap/turnDiscovery.ts +62 -56
  418. package/src/rtcMetrics/constants.ts +3 -0
  419. package/src/rtcMetrics/index.ts +124 -0
  420. package/src/statsAnalyzer/global.ts +1 -84
  421. package/src/statsAnalyzer/index.ts +479 -645
  422. package/src/statsAnalyzer/mqaUtil.ts +128 -126
  423. package/src/webinar/collection.ts +31 -0
  424. package/src/webinar/index.ts +62 -0
  425. package/test/integration/spec/converged-space-meetings.js +233 -0
  426. package/test/integration/spec/journey.js +320 -264
  427. package/test/integration/spec/space-meeting.js +77 -4
  428. package/test/unit/spec/annotation/index.ts +418 -0
  429. package/test/unit/spec/breakouts/breakout.ts +237 -0
  430. package/test/unit/spec/breakouts/collection.ts +15 -0
  431. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  432. package/test/unit/spec/breakouts/events.ts +89 -0
  433. package/test/unit/spec/breakouts/index.ts +1790 -0
  434. package/test/unit/spec/breakouts/request.ts +104 -0
  435. package/test/unit/spec/breakouts/utils.js +72 -0
  436. package/test/unit/spec/common/queue.js +31 -2
  437. package/test/unit/spec/controls-options-manager/index.js +163 -0
  438. package/test/unit/spec/controls-options-manager/util.js +576 -60
  439. package/test/unit/spec/fixture/locus.js +1 -0
  440. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  441. package/test/unit/spec/interpretation/collection.ts +15 -0
  442. package/test/unit/spec/interpretation/index.ts +589 -0
  443. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  444. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  445. package/test/unit/spec/locus-info/index.js +1438 -16
  446. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  447. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  448. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  449. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  450. package/test/unit/spec/locus-info/parser.js +116 -35
  451. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  452. package/test/unit/spec/media/index.ts +290 -0
  453. package/test/unit/spec/media/properties.ts +75 -84
  454. package/test/unit/spec/meeting/in-meeting-actions.ts +86 -0
  455. package/test/unit/spec/meeting/index.js +8886 -2815
  456. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  457. package/test/unit/spec/meeting/muteState.js +409 -213
  458. package/test/unit/spec/meeting/request.js +523 -43
  459. package/test/unit/spec/meeting/utils.js +834 -24
  460. package/test/unit/spec/meeting-info/index.js +300 -0
  461. package/test/unit/spec/meeting-info/meetinginfov2.js +527 -5
  462. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  463. package/test/unit/spec/meetings/collection.js +26 -0
  464. package/test/unit/spec/meetings/index.js +1446 -217
  465. package/test/unit/spec/meetings/utils.js +202 -2
  466. package/test/unit/spec/member/index.js +32 -9
  467. package/test/unit/spec/member/util.js +499 -61
  468. package/test/unit/spec/members/index.js +394 -5
  469. package/test/unit/spec/members/request.js +206 -27
  470. package/test/unit/spec/members/utils.js +173 -38
  471. package/test/unit/spec/metrics/index.js +1 -50
  472. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  473. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  474. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  475. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  476. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  477. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  478. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  479. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  480. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  481. package/test/unit/spec/reachability/index.ts +532 -24
  482. package/test/unit/spec/reachability/request.js +68 -0
  483. package/test/unit/spec/reachability/util.ts +40 -0
  484. package/test/unit/spec/reconnection-manager/index.js +163 -24
  485. package/test/unit/spec/recording-controller/index.js +293 -218
  486. package/test/unit/spec/recording-controller/util.js +223 -96
  487. package/test/unit/spec/roap/index.ts +187 -77
  488. package/test/unit/spec/roap/request.ts +255 -0
  489. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  490. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  491. package/test/unit/spec/stats-analyzer/index.js +644 -165
  492. package/test/unit/spec/webinar/collection.ts +13 -0
  493. package/test/unit/spec/webinar/index.ts +60 -0
  494. package/test/utils/constants.js +9 -0
  495. package/test/utils/integrationTestUtils.js +46 -0
  496. package/test/utils/testUtils.js +0 -45
  497. package/test/utils/webex-config.js +4 -0
  498. package/test/utils/webex-test-users.js +7 -3
  499. package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
  500. package/dist/meeting/effectsState.d.ts +0 -42
  501. package/dist/meeting/effectsState.js +0 -260
  502. package/dist/meeting/effectsState.js.map +0 -1
  503. package/dist/metrics/config.d.ts +0 -169
  504. package/dist/metrics/config.js +0 -289
  505. package/dist/metrics/config.js.map +0 -1
  506. package/dist/peer-connection-manager/index.d.ts +0 -6
  507. package/dist/peer-connection-manager/index.js +0 -671
  508. package/dist/peer-connection-manager/index.js.map +0 -1
  509. package/dist/peer-connection-manager/util.d.ts +0 -6
  510. package/dist/peer-connection-manager/util.js +0 -110
  511. package/dist/peer-connection-manager/util.js.map +0 -1
  512. package/dist/roap/collection.d.ts +0 -10
  513. package/dist/roap/collection.js +0 -63
  514. package/dist/roap/collection.js.map +0 -1
  515. package/dist/roap/handler.d.ts +0 -47
  516. package/dist/roap/handler.js +0 -279
  517. package/dist/roap/handler.js.map +0 -1
  518. package/dist/roap/state.d.ts +0 -9
  519. package/dist/roap/state.js +0 -127
  520. package/dist/roap/state.js.map +0 -1
  521. package/dist/roap/util.d.ts +0 -2
  522. package/dist/roap/util.js +0 -76
  523. package/dist/roap/util.js.map +0 -1
  524. package/src/index.js +0 -15
  525. package/src/meeting/effectsState.ts +0 -209
  526. package/src/metrics/config.ts +0 -485
  527. package/src/peer-connection-manager/index.ts +0 -847
  528. package/src/peer-connection-manager/util.ts +0 -119
  529. package/src/roap/collection.ts +0 -62
  530. package/src/roap/handler.ts +0 -294
  531. package/src/roap/state.ts +0 -156
  532. package/src/roap/util.ts +0 -100
  533. package/test/unit/spec/meeting/effectsState.js +0 -281
  534. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  535. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  536. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  537. package/test/unit/spec/roap/util.js +0 -30
  538. /package/dist/common/errors/{reclaim-host-role-error.d.ts → reclaim-host-role-errors.d.ts} +0 -0
  539. /package/src/common/errors/{reclaim-host-role-error.ts → reclaim-host-role-errors.ts} +0 -0
@@ -1,118 +1,45 @@
1
- /* global window */
2
1
  // @ts-ignore
3
2
  import {StatelessWebexPlugin} from '@webex/webex-core';
4
3
 
5
4
  import LoggerProxy from '../common/logs/logger-proxy';
6
- import {PARTICIPANT, LOCI, CALL, MEDIA, HTTP_VERBS, REACHABILITY} from '../constants';
7
- import Metrics from '../metrics';
8
- import {eventType} from '../metrics/config';
9
- import ParameterError from '../common/errors/parameter';
5
+ import {IP_VERSION, REACHABILITY} from '../constants';
6
+ import {LocusMediaRequest} from '../meeting/locusMediaRequest';
7
+
10
8
  /**
11
9
  * @class RoapRequest
12
10
  */
13
11
  export default class RoapRequest extends StatelessWebexPlugin {
14
12
  /**
15
- * Joins a meeting via ROAP
16
- * @param {Object} options
17
- * @returns {Promise} returns a promise that resolves/rejects whatever the request does
13
+ * Returns reachability data.
14
+ * @param {Object} localSdp
15
+ * @returns {Object}
18
16
  */
17
+ async attachReachabilityData(localSdp) {
18
+ let joinCookie;
19
19
 
20
- attachRechabilityData(localSdp) {
21
- const reachabilityData = window.localStorage.getItem(REACHABILITY.localStorage);
20
+ // @ts-ignore
21
+ const reachabilityResult = await this.webex.meetings.reachability.getReachabilityResults();
22
22
 
23
- if (reachabilityData) {
24
- try {
25
- const reachabilityResult = JSON.parse(reachabilityData);
23
+ if (reachabilityResult && Object.keys(reachabilityResult).length) {
24
+ localSdp.reachability = reachabilityResult;
25
+ }
26
+
27
+ // @ts-ignore
28
+ const joinCookieRaw = await this.webex.boundedStorage
29
+ .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)
30
+ .catch(() => {});
26
31
 
27
- /* istanbul ignore else */
28
- if (reachabilityResult && Object.keys(reachabilityResult).length) {
29
- localSdp.reachability = reachabilityResult;
30
- }
32
+ if (joinCookieRaw) {
33
+ try {
34
+ joinCookie = JSON.parse(joinCookieRaw);
31
35
  } catch (e) {
32
36
  LoggerProxy.logger.error(
33
- `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`
37
+ `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`
34
38
  );
35
39
  }
36
40
  }
37
41
 
38
- return localSdp;
39
- }
40
-
41
- joinMeetingWithRoap(options) {
42
- LoggerProxy.logger.info('Roap:request#joinMeetingWithRoap --> Join locus with roap');
43
- LoggerProxy.logger.info(
44
- `Roap:request#joinMeetingWithRoap --> Local SDP: ${options.roapMessage}`
45
- );
46
-
47
- return Promise.resolve().then(async () => {
48
- // @ts-ignore
49
- const deviceUrl = this.webex.internal.device.url;
50
- let url = '';
51
-
52
- const body: any = {
53
- deviceUrl,
54
- usingResource: options.resourceId || null,
55
- correlationId: options.correlationId,
56
- localMedias: [
57
- {
58
- localSdp: JSON.stringify(
59
- this.attachRechabilityData({
60
- roapMessage: options.roapMessage,
61
- audioMuted: false,
62
- videoMuted: false,
63
- })
64
- ),
65
- },
66
- ],
67
- clientMediaPreferences: {
68
- preferTranscoding: options.preferTranscoding ?? true,
69
- },
70
- };
71
-
72
- if (options.locusUrl) {
73
- url = `${options.locusUrl}/${PARTICIPANT}`;
74
- } else if (options.sipUrl) {
75
- try {
76
- // @ts-ignore
77
- await this.webex.internal.services.waitForCatalog('postauth');
78
- // @ts-ignore
79
- url = `${this.webex.internal.services.get('locus')}/${LOCI}/${CALL}`;
80
- body.invitee = {
81
- address: options.sipTarget,
82
- };
83
- } catch (e) {
84
- LoggerProxy.logger.error(`Roap:request#joinMeetingWithRoap --> ${e}`);
85
- throw e;
86
- }
87
- } else {
88
- throw new ParameterError('Must provide a locusUrl or sipTarget');
89
- }
90
-
91
- // @ts-ignore
92
- return this.webex
93
- .request({
94
- method: HTTP_VERBS.POST,
95
- uri: url,
96
- body,
97
- })
98
- .then((res) => {
99
- const {locus} = res.body;
100
-
101
- locus.roapSeq = options.roapMessage.seq;
102
- locus.id = locus.url.split('/').pop();
103
- LoggerProxy.logger.info(
104
- `Roap:request#joinMeetingWithRoap --> Joined locus [${locus.id}][${locus.fullState.lastActive}]`
105
- );
106
-
107
- return locus;
108
- })
109
- .catch((err) => {
110
- LoggerProxy.logger.error(
111
- `Roap:request#joinMeetingWithRoap --> failed with error: ${err}`
112
- );
113
- throw err;
114
- });
115
- });
42
+ return {localSdp, joinCookie};
116
43
  }
117
44
 
118
45
  /**
@@ -122,78 +49,74 @@ export default class RoapRequest extends StatelessWebexPlugin {
122
49
  * @param {String} options.locusSelfUrl
123
50
  * @param {String} options.mediaId
124
51
  * @param {String} options.correlationId
125
- * @param {Boolean} options.audioMuted
126
- * @param {Boolean} options.videoMuted
127
52
  * @param {String} options.meetingId
53
+ * @param {IP_VERSION} options.ipVersion only required for offers
128
54
  * @returns {Promise} returns the response/failure of the request
129
55
  */
130
- sendRoap(options: {
56
+ async sendRoap(options: {
131
57
  roapMessage: any;
132
58
  locusSelfUrl: string;
133
59
  mediaId: string;
134
- correlationId: string;
135
- audioMuted: boolean;
136
- videoMuted: boolean;
137
60
  meetingId: string;
138
- preferTranscoding?: boolean;
61
+ ipVersion?: IP_VERSION;
62
+ locusMediaRequest?: LocusMediaRequest;
63
+ audioMuted?: boolean;
64
+ videoMuted?: boolean;
139
65
  }) {
140
- const {roapMessage, locusSelfUrl, mediaId, correlationId, meetingId} = options;
66
+ const {roapMessage, locusSelfUrl, mediaId, meetingId, locusMediaRequest, ipVersion} = options;
141
67
 
142
68
  if (!mediaId) {
143
- LoggerProxy.logger.info('Roap:request#sendRoap --> Race Condition /call mediaID not present');
69
+ LoggerProxy.logger.info('Roap:request#sendRoap --> sending empty mediaID');
144
70
  }
145
71
 
146
- const mediaUrl = `${locusSelfUrl}/${MEDIA}`;
147
- // @ts-ignore
148
- const deviceUrl = this.webex.internal.device.url;
72
+ if (!locusMediaRequest) {
73
+ LoggerProxy.logger.warn(
74
+ 'Roap:request#sendRoap --> locusMediaRequest unavailable, not sending roap'
75
+ );
76
+
77
+ return Promise.reject(new Error('sendRoap called when locusMediaRequest is undefined'));
78
+ }
79
+ const {localSdp: localSdpWithReachabilityData, joinCookie} = await this.attachReachabilityData({
80
+ roapMessage,
81
+ });
149
82
 
150
83
  LoggerProxy.logger.info(
151
- `Roap:request#sendRoap --> ${mediaUrl} \n ${roapMessage.messageType} \n seq:${roapMessage.seq}`
84
+ `Roap:request#sendRoap --> ${locusSelfUrl} \n ${roapMessage.messageType} \n seq:${roapMessage.seq}`
152
85
  );
153
86
 
154
- Metrics.postEvent({event: eventType.MEDIA_REQUEST, meetingId});
155
-
156
87
  // @ts-ignore
157
- return this.webex
158
- .request({
159
- uri: mediaUrl,
160
- method: HTTP_VERBS.PUT,
161
- body: {
162
- device: {
163
- url: deviceUrl,
164
- // @ts-ignore
165
- deviceType: this.config.meetings.deviceType,
166
- },
167
- correlationId,
168
- localMedias: [
169
- {
170
- localSdp: JSON.stringify(
171
- this.attachRechabilityData({
172
- roapMessage,
173
- // eslint-disable-next-line no-warning-comments
174
- // TODO: check whats the need for video and audiomute
175
- audioMuted: !!options.audioMuted,
176
- videoMuted: !!options.videoMuted,
177
- })
178
- ),
179
- mediaId: options.mediaId,
180
- },
181
- ],
182
- clientMediaPreferences: {
183
- preferTranscoding: options.preferTranscoding ?? true,
184
- },
185
- },
88
+ this.webex.internal.newMetrics.submitClientEvent({
89
+ name: 'client.locus.media.request',
90
+ options: {
91
+ meetingId,
92
+ },
93
+ });
94
+
95
+ return locusMediaRequest
96
+ .send({
97
+ type: 'RoapMessage',
98
+ selfUrl: locusSelfUrl,
99
+ joinCookie,
100
+ mediaId,
101
+ roapMessage,
102
+ reachability: localSdpWithReachabilityData.reachability,
103
+ ipVersion,
186
104
  })
187
105
  .then((res) => {
188
- Metrics.postEvent({event: eventType.MEDIA_RESPONSE, meetingId});
189
-
106
+ // @ts-ignore
107
+ this.webex.internal.newMetrics.submitClientEvent({
108
+ name: 'client.locus.media.response',
109
+ options: {
110
+ meetingId,
111
+ },
112
+ });
190
113
  // always it will be the first mediaConnection Object
191
114
  const mediaConnections =
192
115
  res.body.mediaConnections &&
193
116
  res.body.mediaConnections.length > 0 &&
194
117
  res.body.mediaConnections[0];
195
118
 
196
- LoggerProxy.logger.info(
119
+ LoggerProxy.logger.debug(
197
120
  `Roap:request#sendRoap --> response:${JSON.stringify(
198
121
  mediaConnections,
199
122
  null,
@@ -202,7 +125,7 @@ export default class RoapRequest extends StatelessWebexPlugin {
202
125
  );
203
126
  const {locus} = res.body;
204
127
 
205
- locus.roapSeq = options.roapMessage.seq;
128
+ locus.roapSeq = roapMessage.seq;
206
129
 
207
130
  return {
208
131
  locus,
@@ -210,10 +133,13 @@ export default class RoapRequest extends StatelessWebexPlugin {
210
133
  };
211
134
  })
212
135
  .catch((err) => {
213
- Metrics.postEvent({
214
- event: eventType.MEDIA_RESPONSE,
215
- meetingId,
216
- data: {error: Metrics.parseLocusError(err, true)},
136
+ // @ts-ignore
137
+ this.webex.internal.newMetrics.submitClientEvent({
138
+ name: 'client.locus.media.response',
139
+ options: {
140
+ meetingId,
141
+ rawError: err,
142
+ },
217
143
  });
218
144
  LoggerProxy.logger.error(`Roap:request#sendRoap --> Error:${JSON.stringify(err, null, 2)}`);
219
145
  LoggerProxy.logger.error(
@@ -8,9 +8,16 @@ import {ROAP} 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
 
15
+ // Roap spec says that seq should start from 1, but TURN discovery works fine with seq=0
16
+ // and this is handy for us, because TURN discovery is always done before the first SDP exchange,
17
+ // so we can do it with seq=0 or not do it at all and then we create the RoapMediaConnection
18
+ // and do the SDP offer with seq=1
19
+ const TURN_DISCOVERY_SEQ = 0;
20
+
14
21
  /**
15
22
  * Handles the process of finding out TURN server information from Linus.
16
23
  * This is achieved by sending a TURN_DISCOVERY_REQUEST.
@@ -146,9 +153,7 @@ export default class TurnDiscovery {
146
153
  * @private
147
154
  * @memberof Roap
148
155
  */
149
- private sendRoapTurnDiscoveryRequest(meeting: Meeting, isReconnecting: boolean) {
150
- const seq = meeting.roapSeq + 1;
151
-
156
+ sendRoapTurnDiscoveryRequest(meeting: Meeting, isReconnecting: boolean) {
152
157
  if (this.defer) {
153
158
  LoggerProxy.logger.warn(
154
159
  'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress'
@@ -162,7 +167,7 @@ export default class TurnDiscovery {
162
167
  const roapMessage = {
163
168
  messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,
164
169
  version: ROAP.ROAP_VERSION,
165
- seq,
170
+ seq: TURN_DISCOVERY_SEQ,
166
171
  };
167
172
 
168
173
  LoggerProxy.logger.info(
@@ -172,7 +177,6 @@ export default class TurnDiscovery {
172
177
  return this.roapRequest
173
178
  .sendRoap({
174
179
  roapMessage,
175
- correlationId: meeting.correlationId,
176
180
  // @ts-ignore - Fix missing type
177
181
  locusSelfUrl: meeting.selfUrl,
178
182
  // @ts-ignore - Fix missing type
@@ -180,10 +184,11 @@ export default class TurnDiscovery {
180
184
  audioMuted: meeting.audio?.isLocallyMuted(),
181
185
  videoMuted: meeting.video?.isLocallyMuted(),
182
186
  meetingId: meeting.id,
187
+ locusMediaRequest: meeting.locusMediaRequest,
188
+ // @ts-ignore - because of meeting.webex
189
+ ipVersion: MeetingUtil.getIpVersion(meeting.webex),
183
190
  })
184
191
  .then(({mediaConnections}) => {
185
- meeting.setRoapSeq(seq);
186
-
187
192
  if (mediaConnections) {
188
193
  meeting.updateMediaConnections(mediaConnections);
189
194
  }
@@ -204,19 +209,53 @@ export default class TurnDiscovery {
204
209
  roapMessage: {
205
210
  messageType: ROAP.ROAP_TYPES.OK,
206
211
  version: ROAP.ROAP_VERSION,
207
- seq: meeting.roapSeq,
212
+ seq: TURN_DISCOVERY_SEQ,
208
213
  },
209
214
  // @ts-ignore - fix type
210
215
  locusSelfUrl: meeting.selfUrl,
211
216
  // @ts-ignore - fix type
212
217
  mediaId: meeting.mediaId,
213
- correlationId: meeting.correlationId,
218
+ meetingId: meeting.id,
214
219
  audioMuted: meeting.audio?.isLocallyMuted(),
215
220
  videoMuted: meeting.video?.isLocallyMuted(),
216
- meetingId: meeting.id,
221
+ locusMediaRequest: meeting.locusMediaRequest,
217
222
  });
218
223
  }
219
224
 
225
+ /**
226
+ * Gets the reason why reachability is skipped.
227
+ *
228
+ * @param {Meeting} meeting
229
+ * @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped
230
+ */
231
+ private async getSkipReason(meeting: Meeting): Promise<string> {
232
+ const isAnyPublicClusterReachable =
233
+ // @ts-ignore - fix type
234
+ await meeting.webex.meetings.reachability.isAnyPublicClusterReachable();
235
+
236
+ if (isAnyPublicClusterReachable) {
237
+ LoggerProxy.logger.info(
238
+ 'Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery'
239
+ );
240
+
241
+ return 'reachability';
242
+ }
243
+
244
+ return '';
245
+ }
246
+
247
+ /**
248
+ * Checks if TURN discovery is skipped.
249
+ *
250
+ * @param {Meeting} meeting
251
+ * @returns {Boolean} true if TURN discovery is being skipped, false if it is being done
252
+ */
253
+ async isSkipped(meeting) {
254
+ const skipReason = await this.getSkipReason(meeting);
255
+
256
+ return !!skipReason;
257
+ }
258
+
220
259
  /**
221
260
  * Retrieves TURN server information from the backend by doing
222
261
  * a roap message exchange:
@@ -225,13 +264,22 @@ export default class TurnDiscovery {
225
264
  * | <----TURN_DISCOVERY_RESPONSE----- |
226
265
  * | --------------OK----------------> |
227
266
  *
267
+ * This TURN discovery roap exchange is always done with seq=0.
268
+ * The RoapMediaConnection SDP exchange always starts with seq=1,
269
+ * so it works fine no matter if TURN discovery is done or not.
270
+ *
228
271
  * @param {Meeting} meeting
229
- * @param {Boolean} isReconnecting should be set to true if this is a new
272
+ * @param {Boolean} [isReconnecting] should be set to true if this is a new
230
273
  * media connection just after a reconnection
274
+ * @param {Boolean} [isForced]
231
275
  * @returns {Promise}
232
276
  */
233
- async doTurnDiscovery(meeting: Meeting, isReconnecting?: boolean) {
234
- const turnDiscoverySkippedReason = await this.getSkipReason(meeting);
277
+ async doTurnDiscovery(meeting: Meeting, isReconnecting?: boolean, isForced?: boolean) {
278
+ let turnDiscoverySkippedReason: string;
279
+
280
+ if (!isForced) {
281
+ turnDiscoverySkippedReason = await this.getSkipReason(meeting);
282
+ }
235
283
 
236
284
  if (turnDiscoverySkippedReason) {
237
285
  return {
@@ -263,49 +311,7 @@ export default class TurnDiscovery {
263
311
  stack: e.stack,
264
312
  });
265
313
 
266
- return Promise.resolve({turnServerInfo: undefined, turnDiscoverySkippedReason: undefined});
314
+ return {turnServerInfo: undefined, turnDiscoverySkippedReason: undefined};
267
315
  });
268
316
  }
269
-
270
- /**
271
- * Gets the reason why reachability is skipped.
272
- *
273
- * @param {Meeting} meeting
274
- * @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped
275
- */
276
- private async getSkipReason(meeting: Meeting): Promise<string> {
277
- // @ts-ignore - fix type
278
- const isAnyClusterReachable = await meeting.webex.meetings.reachability.isAnyClusterReachable();
279
-
280
- if (isAnyClusterReachable) {
281
- LoggerProxy.logger.info(
282
- 'Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery'
283
- );
284
-
285
- return 'reachability';
286
- }
287
-
288
- // @ts-ignore - fix type
289
- if (!meeting.config.experimental.enableTurnDiscovery) {
290
- LoggerProxy.logger.info(
291
- 'Roap:turnDiscovery#getSkipReason --> TURN discovery disabled in config, skipping it'
292
- );
293
-
294
- return 'config';
295
- }
296
-
297
- return '';
298
- }
299
-
300
- /**
301
- * Checks if TURN discovery is skipped.
302
- *
303
- * @param {Meeting} meeting
304
- * @returns {Boolean} true if TURN discovery is being skipped, false if it is being done
305
- */
306
- async isSkipped(meeting) {
307
- const skipReason = await this.getSkipReason(meeting);
308
-
309
- return !!skipReason;
310
- }
311
317
  }
@@ -0,0 +1,3 @@
1
+ const RTC_METRICS = {APP_ID: 'FFB51ED5-4319-4C55-8303-B1F2FCCDE231'};
2
+
3
+ export {RTC_METRICS as default};
@@ -0,0 +1,124 @@
1
+ /* eslint-disable class-methods-use-this */
2
+ import {CallDiagnosticUtils} from '@webex/internal-plugin-metrics';
3
+ import RTC_METRICS from './constants';
4
+
5
+ /**
6
+ * Rtc Metrics
7
+ */
8
+ export default class RtcMetrics {
9
+ /**
10
+ * Array of MetricData items to be sent to the metrics service.
11
+ */
12
+ metricsQueue = [];
13
+
14
+ intervalId: number;
15
+
16
+ webex: any;
17
+
18
+ meetingId: string;
19
+
20
+ correlationId: string;
21
+
22
+ /**
23
+ * Initialize the interval.
24
+ *
25
+ * @param {object} webex - The main `webex` object.
26
+ * @param {string} meetingId - The meeting id.
27
+ * @param {string} correlationId - The correlation id.
28
+ */
29
+ constructor(webex, meetingId, correlationId) {
30
+ // `window` is used to prevent typescript from returning a NodeJS.Timer.
31
+ this.intervalId = window.setInterval(this.sendMetricsInQueue.bind(this), 30 * 1000);
32
+ this.meetingId = meetingId;
33
+ this.webex = webex;
34
+ this.correlationId = correlationId;
35
+ // Send the first set of metrics at 5 seconds in the case of a user leaving the call shortly after joining.
36
+ setTimeout(this.sendMetricsInQueue.bind(this), 5 * 1000);
37
+ }
38
+
39
+ /**
40
+ * Check to see if the metrics queue has any items.
41
+ *
42
+ * @returns {void}
43
+ */
44
+ public sendMetricsInQueue() {
45
+ if (this.metricsQueue.length) {
46
+ this.sendMetrics();
47
+ this.metricsQueue = [];
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Add metrics items to the metrics queue.
53
+ *
54
+ * @param {object} data - An object with a payload array of metrics items.
55
+ *
56
+ * @returns {void}
57
+ */
58
+ addMetrics(data) {
59
+ if (data.payload.length) {
60
+ if (data.name === 'stats-report') {
61
+ data.payload = data.payload.map(this.anonymizeIp);
62
+ }
63
+ this.metricsQueue.push(data);
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Clear the metrics interval.
69
+ *
70
+ * @returns {void}
71
+ */
72
+ closeMetrics() {
73
+ this.sendMetricsInQueue();
74
+ clearInterval(this.intervalId);
75
+ }
76
+
77
+ /**
78
+ * Anonymize IP addresses.
79
+ *
80
+ * @param {array} stats - An RTCStatsReport organized into an array of strings.
81
+ * @returns {string}
82
+ */
83
+ anonymizeIp(stats: string): string {
84
+ const data = JSON.parse(stats);
85
+ // on local and remote candidates, anonymize the last 4 bits.
86
+ if (data.type === 'local-candidate' || data.type === 'remote-candidate') {
87
+ data.ip = CallDiagnosticUtils.anonymizeIPAddress(data.ip) || undefined;
88
+ data.address = CallDiagnosticUtils.anonymizeIPAddress(data.address) || undefined;
89
+ data.relatedAddress =
90
+ CallDiagnosticUtils.anonymizeIPAddress(data.relatedAddress) || undefined;
91
+ }
92
+
93
+ return JSON.stringify(data);
94
+ }
95
+
96
+ /**
97
+ * Send metrics to the metrics service.
98
+ *
99
+ * @returns {void}
100
+ */
101
+ private sendMetrics() {
102
+ this.webex.request({
103
+ method: 'POST',
104
+ service: 'unifiedTelemetry',
105
+ resource: 'metric/v2',
106
+ headers: {
107
+ type: 'webrtcMedia',
108
+ appId: RTC_METRICS.APP_ID,
109
+ },
110
+ body: {
111
+ metrics: [
112
+ {
113
+ type: 'webrtc',
114
+ version: '1.0.1',
115
+ userId: this.webex.internal.device.userId,
116
+ meetingId: this.meetingId,
117
+ correlationId: this.correlationId,
118
+ data: this.metricsQueue,
119
+ },
120
+ ],
121
+ },
122
+ });
123
+ }
124
+ }