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

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
@@ -0,0 +1,255 @@
1
+ import sinon from 'sinon';
2
+ import {assert} from '@webex/test-helper-chai';
3
+ import MockWebex from '@webex/test-helper-mock-webex';
4
+ import Meetings from '@webex/plugin-meetings';
5
+ import RoapRequest from '@webex/plugin-meetings/src/roap/request';
6
+ import {IP_VERSION, REACHABILITY} from '@webex/plugin-meetings/src/constants';
7
+
8
+ describe('plugin-meetings/roap', () => {
9
+ let roapRequest;
10
+ let webex;
11
+ const locusUrl = 'locusUrl';
12
+
13
+ beforeEach(async () => {
14
+ webex = new MockWebex({
15
+ children: {
16
+ meetings: Meetings,
17
+ },
18
+ });
19
+
20
+ webex.meetings.clientRegion = {
21
+ countryCode: 'US',
22
+ regionCode: 'WEST-COAST',
23
+ };
24
+
25
+ webex.internal = {
26
+ services: {
27
+ get: sinon.mock().returns(locusUrl),
28
+ waitForCatalog: sinon.mock().returns(Promise.resolve({})),
29
+ },
30
+ device: {
31
+ url: 'url',
32
+ },
33
+ newMetrics: {
34
+ submitClientEvent: sinon.stub()
35
+ },
36
+ };
37
+
38
+ // @ts-ignore
39
+ roapRequest = new RoapRequest({webex});
40
+
41
+ roapRequest.request = sinon.mock().returns(
42
+ Promise.resolve({
43
+ body: {
44
+ locus: {
45
+ roapSeq: '',
46
+ id: '',
47
+ url: 'url/path',
48
+ fullState: {
49
+ lastActive: 'lastActive',
50
+ },
51
+ },
52
+ },
53
+ })
54
+ );
55
+
56
+ await webex.boundedStorage.put(
57
+ REACHABILITY.namespace,
58
+ REACHABILITY.localStorageJoinCookie,
59
+ JSON.stringify({
60
+ anycastEntryPoint: 'aws-eu-west-1',
61
+ })
62
+ );
63
+ await webex.boundedStorage.put(
64
+ REACHABILITY.namespace,
65
+ REACHABILITY.localStorageResult,
66
+ JSON.stringify({
67
+ clusterId: {
68
+ udp: { result: 'reachable', latencyInMilliseconds: 10 },
69
+ tcp: { result: 'unreachable' },
70
+ isVideoMesh: false,
71
+ },
72
+ })
73
+ );
74
+ });
75
+
76
+ describe('#attachReachabilityData', () => {
77
+ it('returns the correct reachability data', async () => {
78
+ const res = await roapRequest.attachReachabilityData({});
79
+
80
+ assert.deepEqual(res.localSdp, {
81
+ reachability: {
82
+ clusterId: {
83
+ udp: {
84
+ reachable: 'true',
85
+ latencyInMilliseconds: '10',
86
+ },
87
+ tcp: {
88
+ reachable: 'false',
89
+ },
90
+ xtls: {
91
+ untested: 'true',
92
+ }
93
+ },
94
+ },
95
+ });
96
+ assert.deepEqual(res.joinCookie, {
97
+ anycastEntryPoint: 'aws-eu-west-1',
98
+ });
99
+ });
100
+
101
+ it('handles the case when reachability data does not exist', async () => {
102
+ await webex.boundedStorage.del(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie);
103
+
104
+ await webex.boundedStorage.del(REACHABILITY.namespace, REACHABILITY.localStorageResult);
105
+ const sdp = {
106
+ some: 'attribute',
107
+ };
108
+
109
+ const result = await roapRequest.attachReachabilityData(sdp);
110
+
111
+ assert.deepEqual(result, {
112
+ joinCookie: undefined,
113
+ localSdp: {
114
+ some: 'attribute',
115
+ },
116
+ });
117
+ });
118
+ });
119
+
120
+ describe('sendRoap', () => {
121
+ it('includes joinCookie in the request correctly', async () => {
122
+ const locusMediaRequest = {send: sinon.stub().resolves({body: {locus: {}}})};
123
+ const ipVersion = IP_VERSION.unknown;
124
+
125
+ await roapRequest.sendRoap({
126
+ locusSelfUrl: locusUrl,
127
+ ipVersion,
128
+ mediaId: 'mediaId',
129
+ roapMessage: {
130
+ seq: 'seq',
131
+ },
132
+ meetingId: 'meeting-id',
133
+ locusMediaRequest,
134
+ });
135
+
136
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
137
+ name: 'client.locus.media.request',
138
+ options: {
139
+ meetingId: 'meeting-id',
140
+ },
141
+ });
142
+
143
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
144
+ name: 'client.locus.media.response',
145
+ options: {
146
+ meetingId: 'meeting-id',
147
+ },
148
+ });
149
+
150
+ const requestParams = locusMediaRequest.send.getCall(0).args[0];
151
+ assert.deepEqual(requestParams, {
152
+ type: 'RoapMessage',
153
+ selfUrl: locusUrl,
154
+ ipVersion,
155
+ joinCookie: {
156
+ anycastEntryPoint: 'aws-eu-west-1',
157
+ },
158
+ mediaId: 'mediaId',
159
+ roapMessage: {
160
+ seq: 'seq',
161
+ },
162
+ reachability: {
163
+ clusterId: {
164
+ tcp: {
165
+ reachable: 'false',
166
+ },
167
+ udp: {
168
+ latencyInMilliseconds: '10',
169
+ reachable: 'true',
170
+ },
171
+ xtls: {
172
+ untested: 'true',
173
+ },
174
+ },
175
+ },
176
+ });
177
+ });
178
+
179
+ it('sends correct client event when fails', async () => {
180
+ const locusMediaRequest = {send: sinon.stub().rejects({code: 300, message: 'error'})};
181
+ try {
182
+ await roapRequest.sendRoap({
183
+ locusSelfUrl: locusUrl,
184
+ mediaId: 'mediaId',
185
+ roapMessage: {
186
+ seq: 'seq',
187
+ },
188
+ meetingId: 'meeting-id',
189
+ locusMediaRequest,
190
+ });
191
+ } catch (err) {
192
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
193
+ name: 'client.locus.media.response',
194
+ options: {
195
+ meetingId: 'meeting-id',
196
+ rawError: {code: 300, message: 'error'},
197
+ },
198
+ });
199
+ }
200
+ });
201
+ });
202
+
203
+ it('calls attachReachabilityData when sendRoap', async () => {
204
+ const locusMediaRequest = { send: sinon.stub().resolves({body: {locus: {}}})};
205
+
206
+ const newSdp = {
207
+ new: 'sdp',
208
+ reachability: { someResult: 'whatever' }
209
+ };
210
+ const ipVersion = IP_VERSION.only_ipv6;
211
+
212
+ roapRequest.attachReachabilityData = sinon.stub().returns(
213
+ Promise.resolve({
214
+ localSdp: newSdp,
215
+ joinCookie: {
216
+ anycastEntryPoint: 'aws-eu-west-1',
217
+ },
218
+ })
219
+ );
220
+
221
+ await roapRequest.sendRoap({
222
+ roapMessage: {
223
+ seq: 1,
224
+ },
225
+ locusSelfUrl: 'locusSelfUrl',
226
+ ipVersion,
227
+ mediaId: 'mediaId',
228
+ meetingId: 'meetingId',
229
+ preferTranscoding: true,
230
+ locusMediaRequest
231
+ });
232
+
233
+ const requestParams = locusMediaRequest.send.getCall(0).args[0];
234
+
235
+ assert.deepEqual(requestParams, {
236
+ type: 'RoapMessage',
237
+ selfUrl: 'locusSelfUrl',
238
+ ipVersion,
239
+ joinCookie: {
240
+ anycastEntryPoint: 'aws-eu-west-1',
241
+ },
242
+ mediaId: 'mediaId',
243
+ roapMessage: {
244
+ seq: 1,
245
+ },
246
+ reachability: { someResult: 'whatever' },
247
+ });
248
+
249
+ assert.calledOnceWithExactly(roapRequest.attachReachabilityData, {
250
+ roapMessage: {
251
+ seq: 1,
252
+ },
253
+ });
254
+ });
255
+ });
@@ -5,8 +5,10 @@ import TurnDiscovery from '@webex/plugin-meetings/src/roap/turnDiscovery';
5
5
  import Metrics from '@webex/plugin-meetings/src/metrics';
6
6
  import BEHAVIORAL_METRICS from '@webex/plugin-meetings/src/metrics/constants';
7
7
  import RoapRequest from '@webex/plugin-meetings/src/roap/request';
8
+ import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
8
9
 
9
10
  import testUtils from '../../../utils/testUtils';
11
+ import { IP_VERSION } from '../../../../src/constants';
10
12
 
11
13
  describe('TurnDiscovery', () => {
12
14
  let clock;
@@ -23,6 +25,7 @@ describe('TurnDiscovery', () => {
23
25
  clock = sinon.useFakeTimers();
24
26
 
25
27
  sinon.stub(Metrics, 'sendBehavioralMetric');
28
+ sinon.stub(MeetingUtil, 'getIpVersion').returns(IP_VERSION.unknown);
26
29
 
27
30
  mockRoapRequest = {
28
31
  sendRoap: sinon.fake.resolves({mediaConnections: FAKE_MEDIA_CONNECTIONS_FROM_LOCUS}),
@@ -30,11 +33,6 @@ describe('TurnDiscovery', () => {
30
33
 
31
34
  testMeeting = {
32
35
  id: 'fake meeting id',
33
- config: {
34
- experimental: {
35
- enableTurnDiscovery: true,
36
- },
37
- },
38
36
  correlationId: 'fake correlation id',
39
37
  selfUrl: 'fake self url',
40
38
  mediaId: 'fake media id',
@@ -50,7 +48,11 @@ describe('TurnDiscovery', () => {
50
48
  testMeeting.roapSeq = newSeq;
51
49
  }),
52
50
  updateMediaConnections: sinon.stub(),
53
- webex: {meetings: {reachability: {isAnyClusterReachable: () => false}}},
51
+ webex: {meetings: {reachability: {
52
+ isAnyPublicClusterReachable: () => Promise.resolve(false),
53
+ }}},
54
+ isMultistream: false,
55
+ locusMediaRequest: { fake: true },
54
56
  };
55
57
  });
56
58
 
@@ -67,19 +69,26 @@ describe('TurnDiscovery', () => {
67
69
  await testUtils.flushPromises();
68
70
 
69
71
  assert.calledOnce(mockRoapRequest.sendRoap);
70
- assert.calledWith(mockRoapRequest.sendRoap, {
72
+
73
+ const expectedSendRoapArgs: any = {
71
74
  roapMessage: {
72
75
  messageType,
73
76
  version: '2',
74
77
  seq: expectedSeq,
75
78
  },
76
- correlationId: testMeeting.correlationId,
77
79
  locusSelfUrl: testMeeting.selfUrl,
78
80
  mediaId: expectedMediaId,
79
81
  audioMuted: testMeeting.audio?.isLocallyMuted(),
80
82
  videoMuted: testMeeting.video?.isLocallyMuted(),
81
83
  meetingId: testMeeting.id,
82
- });
84
+ locusMediaRequest: testMeeting.locusMediaRequest,
85
+ };
86
+
87
+ if (messageType === 'TURN_DISCOVERY_REQUEST') {
88
+ expectedSendRoapArgs.ipVersion = 0;
89
+ }
90
+
91
+ assert.calledWith(mockRoapRequest.sendRoap, expectedSendRoapArgs);
83
92
 
84
93
  if (messageType === 'TURN_DISCOVERY_REQUEST') {
85
94
  // check also that we've applied the media connections from the response
@@ -101,39 +110,82 @@ describe('TurnDiscovery', () => {
101
110
  };
102
111
 
103
112
  describe('doTurnDiscovery', () => {
104
- it('sends TURN_DISCOVERY_REQUEST, waits for response and sends OK', async () => {
113
+ [false, true].forEach(function (enabledMultistream ) {
114
+ it('sends TURN_DISCOVERY_REQUEST'+ (enabledMultistream ? ' when enable Multistream':'') + ', waits for response and sends OK', async () => {
115
+ testMeeting.isMultistream = enabledMultistream;
116
+
117
+ const td = new TurnDiscovery(mockRoapRequest);
118
+
119
+ const result = td.doTurnDiscovery(testMeeting, false);
120
+
121
+ // check that TURN_DISCOVERY_REQUEST was sent
122
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
123
+
124
+ // @ts-ignore
125
+ mockRoapRequest.sendRoap.resetHistory();
126
+
127
+ // simulate the response
128
+ td.handleTurnDiscoveryResponse({
129
+ headers: [
130
+ `x-cisco-turn-url=${FAKE_TURN_URL}`,
131
+ `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
132
+ `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
133
+ ]
134
+ });
135
+
136
+ await testUtils.flushPromises();
137
+
138
+ // check that we've sent OK
139
+ await checkRoapMessageSent('OK', 0);
140
+
141
+ const {turnServerInfo, turnDiscoverySkippedReason} = await result;
142
+
143
+ assert.deepEqual(turnServerInfo, {
144
+ url: FAKE_TURN_URL,
145
+ username: FAKE_TURN_USERNAME,
146
+ password: FAKE_TURN_PASSWORD
147
+ });
148
+
149
+ assert.isUndefined(turnDiscoverySkippedReason);
150
+ });
151
+ });
152
+
153
+ it('sends TURN_DISCOVERY_REQUEST, waits for response and sends OK when isForced = true when cluster is reachable', async () => {
154
+ const prev = testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable;
155
+ testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = sinon.stub().resolves(true);
156
+
105
157
  const td = new TurnDiscovery(mockRoapRequest);
158
+ const result = td.doTurnDiscovery(testMeeting, false, true);
106
159
 
107
- const result = td.doTurnDiscovery(testMeeting, false);
160
+ // We ignore reachability results so we don't get skip reason
161
+ assert.notCalled(testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable);
108
162
 
109
163
  // check that TURN_DISCOVERY_REQUEST was sent
110
164
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
111
165
  // @ts-ignore
112
166
  mockRoapRequest.sendRoap.resetHistory();
113
-
114
167
  // simulate the response
115
168
  td.handleTurnDiscoveryResponse({
116
169
  headers: [
117
170
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
118
171
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
119
172
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
120
- ],
173
+ ]
121
174
  });
122
-
123
175
  await testUtils.flushPromises();
124
-
125
176
  // check that we've sent OK
126
177
  await checkRoapMessageSent('OK', 0);
127
178
 
128
179
  const {turnServerInfo, turnDiscoverySkippedReason} = await result;
129
-
130
180
  assert.deepEqual(turnServerInfo, {
131
181
  url: FAKE_TURN_URL,
132
182
  username: FAKE_TURN_USERNAME,
133
- password: FAKE_TURN_PASSWORD,
183
+ password: FAKE_TURN_PASSWORD
134
184
  });
135
-
136
185
  assert.isUndefined(turnDiscoverySkippedReason);
186
+
187
+ // restore previous callback
188
+ testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = prev;
137
189
  });
138
190
 
139
191
  it('sends TURN_DISCOVERY_REQUEST with empty mediaId when isReconnecting is true', async () => {
@@ -207,24 +259,6 @@ describe('TurnDiscovery', () => {
207
259
  assert.isUndefined(turnDiscoverySkippedReason);
208
260
  });
209
261
 
210
- it('resolves with undefined if turn discovery feature is disabled in config', async () => {
211
- const prevConfigValue = testMeeting.config.experimental.enableTurnDiscovery;
212
-
213
- testMeeting.config.experimental.enableTurnDiscovery = false;
214
- // @ts-ignore
215
- const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
216
-
217
- const {turnServerInfo, turnDiscoverySkippedReason} = result;
218
-
219
- assert.isUndefined(turnServerInfo);
220
- assert.equal(turnDiscoverySkippedReason, 'config');
221
- assert.notCalled(mockRoapRequest.sendRoap);
222
- assert.notCalled(Metrics.sendBehavioralMetric);
223
-
224
- // restore previous config
225
- testMeeting.config.experimental.enableTurnDiscovery = prevConfigValue;
226
- });
227
-
228
262
  it('resolves with undefined if sending the request fails', async () => {
229
263
  const td = new TurnDiscovery(mockRoapRequest);
230
264
 
@@ -240,8 +274,8 @@ describe('TurnDiscovery', () => {
240
274
  });
241
275
 
242
276
  it('resolves with undefined when cluster is reachable', async () => {
243
- const prev = testMeeting.webex.meetings.reachability.isAnyClusterReachable;
244
- testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => true;
277
+ const prev = testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable;
278
+ testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = () => Promise.resolve(true);
245
279
  const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
246
280
 
247
281
  const {turnServerInfo, turnDiscoverySkippedReason} = result;
@@ -250,7 +284,7 @@ describe('TurnDiscovery', () => {
250
284
  assert.equal(turnDiscoverySkippedReason, 'reachability');
251
285
  assert.notCalled(mockRoapRequest.sendRoap);
252
286
  assert.notCalled(Metrics.sendBehavioralMetric);
253
- testMeeting.webex.meetings.reachability.isAnyClusterReachable = prev;
287
+ testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = prev;
254
288
  });
255
289
 
256
290
  it("resolves with undefined if we don't get a response within 10s", async () => {
@@ -272,6 +306,8 @@ describe('TurnDiscovery', () => {
272
306
  const td = new TurnDiscovery(mockRoapRequest);
273
307
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
274
308
 
309
+ await testUtils.flushPromises();
310
+
275
311
  // simulate the response without the password
276
312
  td.handleTurnDiscoveryResponse({
277
313
  headers: [
@@ -291,6 +327,8 @@ describe('TurnDiscovery', () => {
291
327
  const td = new TurnDiscovery(mockRoapRequest);
292
328
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
293
329
 
330
+ await testUtils.flushPromises();
331
+
294
332
  // simulate the response without the headers
295
333
  td.handleTurnDiscoveryResponse({});
296
334
 
@@ -306,6 +344,8 @@ describe('TurnDiscovery', () => {
306
344
  const td = new TurnDiscovery(mockRoapRequest);
307
345
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
308
346
 
347
+ await testUtils.flushPromises();
348
+
309
349
  // simulate the response without the headers
310
350
  td.handleTurnDiscoveryResponse({headers: []});
311
351
 
@@ -322,6 +362,8 @@ describe('TurnDiscovery', () => {
322
362
 
323
363
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
324
364
 
365
+ await testUtils.flushPromises();
366
+
325
367
  // check that TURN_DISCOVERY_REQUEST was sent
326
368
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
327
369
  // @ts-ignore
@@ -354,15 +396,11 @@ describe('TurnDiscovery', () => {
354
396
 
355
397
  describe('isSkipped', () => {
356
398
  [
357
- {enabledInConfig: true, isAnyClusterReachable: true, expectedIsSkipped: true},
358
- {enabledInConfig: true, isAnyClusterReachable: false, expectedIsSkipped: false},
359
- {enabledInConfig: false, isAnyClusterReachable: true, expectedIsSkipped: true},
360
- {enabledInConfig: false, isAnyClusterReachable: false, expectedIsSkipped: true},
361
- ].forEach(({enabledInConfig, isAnyClusterReachable, expectedIsSkipped}) => {
362
- it(`returns ${expectedIsSkipped} when TURN discovery is ${enabledInConfig ? '' : 'not '} enabled in config and isAnyClusterReachable() returns ${isAnyClusterReachable ? 'true' : 'false'}`, async () => {
363
- testMeeting.config.experimental.enableTurnDiscovery = enabledInConfig;
364
-
365
- sinon.stub(testMeeting.webex.meetings.reachability, 'isAnyClusterReachable').resolves(isAnyClusterReachable);
399
+ {isAnyPublicClusterReachable: true, expectedIsSkipped: true},
400
+ {isAnyPublicClusterReachable: false, expectedIsSkipped: false},
401
+ ].forEach(({isAnyPublicClusterReachable, expectedIsSkipped}) => {
402
+ it(`returns ${expectedIsSkipped} when isAnyPublicClusterReachable() returns ${isAnyPublicClusterReachable ? 'true' : 'false'}`, async () => {
403
+ sinon.stub(testMeeting.webex.meetings.reachability, 'isAnyPublicClusterReachable').resolves(isAnyPublicClusterReachable);
366
404
 
367
405
  const td = new TurnDiscovery(mockRoapRequest);
368
406
 
@@ -0,0 +1,93 @@
1
+ import RtcMetrics from '@webex/plugin-meetings/src/rtcMetrics';
2
+ import MockWebex from '@webex/test-helper-mock-webex';
3
+ import {assert} from '@webex/test-helper-chai';
4
+ import sinon from 'sinon';
5
+ import RTC_METRICS from '../../../../src/rtcMetrics/constants';
6
+
7
+ const FAKE_METRICS_ITEM = {payload: ['fake-metrics']};
8
+
9
+ const STATS_WITH_IP = '{\"id\":\"RTCIceCandidate_/kQs0ZNU\",\"type\":\"remote-candidate\",\"transportId\":\"RTCTransport_0_1\",\"isRemote\":true,\"ip\":\"11.22.111.255\",\"address\":\"11.22.111.255\",\"port\":5004,\"protocol\":\"udp\",\"candidateType\":\"host\",\"priority\":2130706431}';
10
+ const STATS_WITH_IP_RESULT = '{\"id\":\"RTCIceCandidate_/kQs0ZNU\",\"type\":\"remote-candidate\",\"transportId\":\"RTCTransport_0_1\",\"isRemote\":true,\"ip\":\"11.22.111.240\",\"address\":\"11.22.111.240\",\"port\":5004,\"protocol\":\"udp\",\"candidateType\":\"host\",\"priority\":2130706431}';
11
+
12
+ describe('RtcMetrics', () => {
13
+ let metrics: RtcMetrics;
14
+ let webex: MockWebex;
15
+ let clock;
16
+ let anonymizeIpSpy;
17
+
18
+ const sandbox = sinon.createSandbox();
19
+
20
+ beforeEach(() => {
21
+ clock = sinon.useFakeTimers();
22
+ webex = new MockWebex();
23
+ metrics = new RtcMetrics(webex, 'mock-meeting-id', 'mock-correlation-id');
24
+ anonymizeIpSpy = sandbox.spy(metrics, 'anonymizeIp');
25
+ });
26
+
27
+ afterEach(() => {
28
+ sandbox.restore();
29
+ });
30
+
31
+ it('sendMetrics should send a webex request', () => {
32
+ assert.notCalled(webex.request);
33
+
34
+ metrics.addMetrics(FAKE_METRICS_ITEM);
35
+ (metrics as any).sendMetrics();
36
+
37
+ assert.callCount(webex.request, 1);
38
+ assert.calledWithMatch(webex.request, sinon.match.has('headers', {
39
+ type: 'webrtcMedia',
40
+ appId: RTC_METRICS.APP_ID,
41
+ }));
42
+ assert.calledWithMatch(webex.request, sinon.match.hasNested('body.metrics[0].data[0].payload', FAKE_METRICS_ITEM.payload));
43
+ assert.calledWithMatch(webex.request, sinon.match.hasNested('body.metrics[0].meetingId', 'mock-meeting-id'));
44
+ assert.calledWithMatch(webex.request, sinon.match.hasNested('body.metrics[0].correlationId', 'mock-correlation-id'));
45
+ });
46
+
47
+ it('should have a defined sendMetricsInQueue function which is public', () => {
48
+ assert.isDefined(metrics.sendMetricsInQueue);
49
+ assert.isFunction(metrics.sendMetricsInQueue);
50
+ });
51
+
52
+ it('should send metrics requests over time', () => {
53
+ assert.notCalled(webex.request);
54
+
55
+ metrics.addMetrics(FAKE_METRICS_ITEM);
56
+ assert.deepEqual(metrics.metricsQueue, [FAKE_METRICS_ITEM]);
57
+ clock.tick(60 * 1000);
58
+
59
+ assert.callCount(webex.request, 1);
60
+ });
61
+
62
+ it('should not send requests with no items in the queue', () => {
63
+ clock.tick(60 * 1000);
64
+ assert.notCalled(webex.request);
65
+ });
66
+
67
+ it('sendMetricsInQueue should send metrics if any exist in the queue', () => {
68
+ assert.notCalled(webex.request);
69
+
70
+ metrics.addMetrics(FAKE_METRICS_ITEM);
71
+ (metrics as any).sendMetricsInQueue();
72
+
73
+ assert.callCount(webex.request, 1);
74
+ });
75
+
76
+ it('should clear out metrics on close', () => {
77
+ assert.notCalled(webex.request);
78
+
79
+ metrics.addMetrics(FAKE_METRICS_ITEM);
80
+ metrics.closeMetrics();
81
+
82
+ assert.callCount(webex.request, 1);
83
+ });
84
+
85
+ it('should anonymize IP addresses', () => {
86
+ assert.strictEqual(metrics.anonymizeIp(STATS_WITH_IP), STATS_WITH_IP_RESULT);
87
+ });
88
+
89
+ it('should call anonymizeIp', () => {
90
+ metrics.addMetrics({ name: 'stats-report', payload: [STATS_WITH_IP] });
91
+ assert.calledOnce(anonymizeIpSpy);
92
+ })
93
+ });