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

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