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

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