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

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