@webex/plugin-meetings 3.0.0-beta.39 → 3.0.0-beta.391

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 (393) hide show
  1. package/README.md +58 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +94 -15
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/events.js +45 -0
  11. package/dist/breakouts/events.js.map +1 -0
  12. package/dist/breakouts/index.js +671 -81
  13. package/dist/breakouts/index.js.map +1 -1
  14. package/dist/breakouts/utils.js +45 -1
  15. package/dist/breakouts/utils.js.map +1 -1
  16. package/dist/common/errors/no-meeting-info.js +51 -0
  17. package/dist/common/errors/no-meeting-info.js.map +1 -0
  18. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  19. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +48 -7
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/logs/request.js +5 -1
  25. package/dist/common/logs/request.js.map +1 -1
  26. package/dist/common/queue.js +24 -9
  27. package/dist/common/queue.js.map +1 -1
  28. package/dist/config.js +5 -10
  29. package/dist/config.js.map +1 -1
  30. package/dist/constants.js +242 -33
  31. package/dist/constants.js.map +1 -1
  32. package/dist/controls-options-manager/enums.js +14 -2
  33. package/dist/controls-options-manager/enums.js.map +1 -1
  34. package/dist/controls-options-manager/index.js +109 -15
  35. package/dist/controls-options-manager/index.js.map +1 -1
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +309 -18
  39. package/dist/controls-options-manager/util.js.map +1 -1
  40. package/dist/index.js +110 -2
  41. package/dist/index.js.map +1 -1
  42. package/dist/interceptors/index.js +15 -0
  43. package/dist/interceptors/index.js.map +1 -0
  44. package/dist/interceptors/locusRetry.js +93 -0
  45. package/dist/interceptors/locusRetry.js.map +1 -0
  46. package/dist/interpretation/collection.js +23 -0
  47. package/dist/interpretation/collection.js.map +1 -0
  48. package/dist/interpretation/index.js +380 -0
  49. package/dist/interpretation/index.js.map +1 -0
  50. package/dist/interpretation/siLanguage.js +25 -0
  51. package/dist/interpretation/siLanguage.js.map +1 -0
  52. package/dist/locus-info/controlsUtils.js +91 -2
  53. package/dist/locus-info/controlsUtils.js.map +1 -1
  54. package/dist/locus-info/index.js +386 -62
  55. package/dist/locus-info/index.js.map +1 -1
  56. package/dist/locus-info/infoUtils.js +7 -1
  57. package/dist/locus-info/infoUtils.js.map +1 -1
  58. package/dist/locus-info/mediaSharesUtils.js +71 -1
  59. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  60. package/dist/locus-info/parser.js +249 -72
  61. package/dist/locus-info/parser.js.map +1 -1
  62. package/dist/locus-info/selfUtils.js +89 -14
  63. package/dist/locus-info/selfUtils.js.map +1 -1
  64. package/dist/media/index.js +65 -102
  65. package/dist/media/index.js.map +1 -1
  66. package/dist/media/properties.js +73 -124
  67. package/dist/media/properties.js.map +1 -1
  68. package/dist/mediaQualityMetrics/config.js +135 -330
  69. package/dist/mediaQualityMetrics/config.js.map +1 -1
  70. package/dist/meeting/in-meeting-actions.js +86 -2
  71. package/dist/meeting/in-meeting-actions.js.map +1 -1
  72. package/dist/meeting/index.js +4075 -2827
  73. package/dist/meeting/index.js.map +1 -1
  74. package/dist/meeting/locusMediaRequest.js +292 -0
  75. package/dist/meeting/locusMediaRequest.js.map +1 -0
  76. package/dist/meeting/muteState.js +224 -136
  77. package/dist/meeting/muteState.js.map +1 -1
  78. package/dist/meeting/request.js +177 -152
  79. package/dist/meeting/request.js.map +1 -1
  80. package/dist/meeting/util.js +672 -417
  81. package/dist/meeting/util.js.map +1 -1
  82. package/dist/meeting-info/index.js +73 -7
  83. package/dist/meeting-info/index.js.map +1 -1
  84. package/dist/meeting-info/meeting-info-v2.js +192 -51
  85. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  86. package/dist/meeting-info/util.js +1 -1
  87. package/dist/meeting-info/util.js.map +1 -1
  88. package/dist/meeting-info/utilv2.js +36 -36
  89. package/dist/meeting-info/utilv2.js.map +1 -1
  90. package/dist/meetings/collection.js +39 -0
  91. package/dist/meetings/collection.js.map +1 -1
  92. package/dist/meetings/index.js +484 -119
  93. package/dist/meetings/index.js.map +1 -1
  94. package/dist/meetings/meetings.types.js +7 -0
  95. package/dist/meetings/meetings.types.js.map +1 -0
  96. package/dist/meetings/request.js +2 -0
  97. package/dist/meetings/request.js.map +1 -1
  98. package/dist/meetings/util.js +73 -7
  99. package/dist/meetings/util.js.map +1 -1
  100. package/dist/member/index.js +58 -0
  101. package/dist/member/index.js.map +1 -1
  102. package/dist/member/types.js +25 -0
  103. package/dist/member/types.js.map +1 -0
  104. package/dist/member/util.js +132 -25
  105. package/dist/member/util.js.map +1 -1
  106. package/dist/members/collection.js +10 -0
  107. package/dist/members/collection.js.map +1 -1
  108. package/dist/members/index.js +102 -6
  109. package/dist/members/index.js.map +1 -1
  110. package/dist/members/request.js +106 -38
  111. package/dist/members/request.js.map +1 -1
  112. package/dist/members/types.js +15 -0
  113. package/dist/members/types.js.map +1 -0
  114. package/dist/members/util.js +326 -232
  115. package/dist/members/util.js.map +1 -1
  116. package/dist/metrics/constants.js +18 -1
  117. package/dist/metrics/constants.js.map +1 -1
  118. package/dist/metrics/index.js +1 -446
  119. package/dist/metrics/index.js.map +1 -1
  120. package/dist/multistream/mediaRequestManager.js +223 -32
  121. package/dist/multistream/mediaRequestManager.js.map +1 -1
  122. package/dist/multistream/receiveSlot.js +10 -0
  123. package/dist/multistream/receiveSlot.js.map +1 -1
  124. package/dist/multistream/receiveSlotManager.js +39 -36
  125. package/dist/multistream/receiveSlotManager.js.map +1 -1
  126. package/dist/multistream/remoteMedia.js +3 -1
  127. package/dist/multistream/remoteMedia.js.map +1 -1
  128. package/dist/multistream/remoteMediaGroup.js +76 -5
  129. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  130. package/dist/multistream/remoteMediaManager.js +366 -104
  131. package/dist/multistream/remoteMediaManager.js.map +1 -1
  132. package/dist/multistream/sendSlotManager.js +255 -0
  133. package/dist/multistream/sendSlotManager.js.map +1 -0
  134. package/dist/reachability/clusterReachability.js +356 -0
  135. package/dist/reachability/clusterReachability.js.map +1 -0
  136. package/dist/reachability/index.js +263 -390
  137. package/dist/reachability/index.js.map +1 -1
  138. package/dist/reachability/request.js +6 -4
  139. package/dist/reachability/request.js.map +1 -1
  140. package/dist/reachability/util.js +29 -0
  141. package/dist/reachability/util.js.map +1 -0
  142. package/dist/reconnection-manager/index.js +266 -202
  143. package/dist/reconnection-manager/index.js.map +1 -1
  144. package/dist/recording-controller/index.js +21 -2
  145. package/dist/recording-controller/index.js.map +1 -1
  146. package/dist/recording-controller/util.js +9 -8
  147. package/dist/recording-controller/util.js.map +1 -1
  148. package/dist/roap/index.js +51 -28
  149. package/dist/roap/index.js.map +1 -1
  150. package/dist/roap/request.js +48 -64
  151. package/dist/roap/request.js.map +1 -1
  152. package/dist/roap/turnDiscovery.js +220 -70
  153. package/dist/roap/turnDiscovery.js.map +1 -1
  154. package/dist/rtcMetrics/constants.js +12 -0
  155. package/dist/rtcMetrics/constants.js.map +1 -0
  156. package/dist/rtcMetrics/index.js +179 -0
  157. package/dist/rtcMetrics/index.js.map +1 -0
  158. package/dist/statsAnalyzer/index.js +357 -295
  159. package/dist/statsAnalyzer/index.js.map +1 -1
  160. package/dist/statsAnalyzer/mqaUtil.js +296 -156
  161. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  162. package/dist/types/annotation/annotation.types.d.ts +42 -0
  163. package/dist/types/annotation/constants.d.ts +31 -0
  164. package/dist/types/annotation/index.d.ts +117 -0
  165. package/dist/types/breakouts/events.d.ts +8 -0
  166. package/dist/types/breakouts/utils.d.ts +14 -0
  167. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  168. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  169. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  170. package/dist/types/common/logs/request.d.ts +2 -0
  171. package/dist/types/common/queue.d.ts +9 -7
  172. package/dist/types/config.d.ts +2 -7
  173. package/dist/types/constants.d.ts +203 -31
  174. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  175. package/dist/types/controls-options-manager/index.d.ts +17 -1
  176. package/dist/types/controls-options-manager/types.d.ts +43 -0
  177. package/dist/types/controls-options-manager/util.d.ts +1 -7
  178. package/dist/types/index.d.ts +6 -5
  179. package/dist/types/interceptors/index.d.ts +2 -0
  180. package/dist/types/interceptors/locusRetry.d.ts +27 -0
  181. package/dist/types/interpretation/collection.d.ts +5 -0
  182. package/dist/types/interpretation/index.d.ts +5 -0
  183. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  184. package/dist/types/locus-info/index.d.ts +57 -4
  185. package/dist/types/locus-info/parser.d.ts +66 -6
  186. package/dist/types/media/index.d.ts +2 -0
  187. package/dist/types/media/properties.d.ts +34 -49
  188. package/dist/types/mediaQualityMetrics/config.d.ts +99 -223
  189. package/dist/types/meeting/in-meeting-actions.d.ts +86 -2
  190. package/dist/types/meeting/index.d.ts +567 -496
  191. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  192. package/dist/types/meeting/muteState.d.ts +93 -25
  193. package/dist/types/meeting/request.d.ts +64 -43
  194. package/dist/types/meeting/util.d.ts +117 -1
  195. package/dist/types/meeting-info/index.d.ts +13 -1
  196. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  197. package/dist/types/meetings/collection.d.ts +17 -0
  198. package/dist/types/meetings/index.d.ts +113 -21
  199. package/dist/types/meetings/meetings.types.d.ts +4 -0
  200. package/dist/types/member/index.d.ts +14 -0
  201. package/dist/types/member/types.d.ts +32 -0
  202. package/dist/types/members/collection.d.ts +5 -0
  203. package/dist/types/members/index.d.ts +35 -2
  204. package/dist/types/members/request.d.ts +73 -9
  205. package/dist/types/members/types.d.ts +25 -0
  206. package/dist/types/members/util.d.ts +214 -1
  207. package/dist/types/metrics/constants.d.ts +17 -0
  208. package/dist/types/metrics/index.d.ts +4 -111
  209. package/dist/types/multistream/mediaRequestManager.d.ts +72 -3
  210. package/dist/types/multistream/receiveSlot.d.ts +7 -3
  211. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  212. package/dist/types/multistream/remoteMedia.d.ts +3 -31
  213. package/dist/types/multistream/remoteMediaGroup.d.ts +2 -9
  214. package/dist/types/multistream/remoteMediaManager.d.ts +62 -2
  215. package/dist/types/multistream/sendSlotManager.d.ts +70 -0
  216. package/dist/types/reachability/clusterReachability.d.ts +109 -0
  217. package/dist/types/reachability/index.d.ts +60 -95
  218. package/dist/types/reachability/request.d.ts +3 -1
  219. package/dist/types/reachability/util.d.ts +8 -0
  220. package/dist/types/reconnection-manager/index.d.ts +19 -0
  221. package/dist/types/recording-controller/index.d.ts +15 -1
  222. package/dist/types/recording-controller/util.d.ts +5 -4
  223. package/dist/types/roap/index.d.ts +2 -1
  224. package/dist/types/roap/request.d.ts +9 -8
  225. package/dist/types/roap/turnDiscovery.d.ts +39 -5
  226. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  227. package/dist/types/rtcMetrics/index.d.ts +61 -0
  228. package/dist/types/statsAnalyzer/index.d.ts +34 -12
  229. package/dist/types/statsAnalyzer/mqaUtil.d.ts +28 -4
  230. package/dist/types/webinar/collection.d.ts +16 -0
  231. package/dist/types/webinar/index.d.ts +5 -0
  232. package/dist/webinar/collection.js +44 -0
  233. package/dist/webinar/collection.js.map +1 -0
  234. package/dist/webinar/index.js +69 -0
  235. package/dist/webinar/index.js.map +1 -0
  236. package/package.json +22 -19
  237. package/src/annotation/annotation.types.ts +50 -0
  238. package/src/annotation/constants.ts +36 -0
  239. package/src/annotation/index.ts +328 -0
  240. package/src/breakouts/README.md +35 -11
  241. package/src/breakouts/breakout.ts +67 -9
  242. package/src/breakouts/events.ts +56 -0
  243. package/src/breakouts/index.ts +558 -59
  244. package/src/breakouts/utils.ts +42 -0
  245. package/src/common/errors/no-meeting-info.ts +24 -0
  246. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  247. package/src/common/errors/webex-errors.ts +44 -2
  248. package/src/common/logs/logger-proxy.ts +1 -1
  249. package/src/common/logs/request.ts +5 -1
  250. package/src/common/queue.ts +22 -8
  251. package/src/config.ts +4 -9
  252. package/src/constants.ts +229 -21
  253. package/src/controls-options-manager/enums.ts +12 -0
  254. package/src/controls-options-manager/index.ts +116 -21
  255. package/src/controls-options-manager/types.ts +59 -0
  256. package/src/controls-options-manager/util.ts +294 -14
  257. package/src/index.ts +44 -0
  258. package/src/interceptors/index.ts +3 -0
  259. package/src/interceptors/locusRetry.ts +67 -0
  260. package/src/interpretation/README.md +60 -0
  261. package/src/interpretation/collection.ts +19 -0
  262. package/src/interpretation/index.ts +349 -0
  263. package/src/interpretation/siLanguage.ts +18 -0
  264. package/src/locus-info/controlsUtils.ts +108 -0
  265. package/src/locus-info/index.ts +417 -59
  266. package/src/locus-info/infoUtils.ts +10 -2
  267. package/src/locus-info/mediaSharesUtils.ts +80 -0
  268. package/src/locus-info/parser.ts +258 -47
  269. package/src/locus-info/selfUtils.ts +81 -5
  270. package/src/media/index.ts +100 -108
  271. package/src/media/properties.ts +88 -117
  272. package/src/mediaQualityMetrics/config.ts +103 -238
  273. package/src/meeting/in-meeting-actions.ts +171 -3
  274. package/src/meeting/index.ts +3411 -2435
  275. package/src/meeting/locusMediaRequest.ts +313 -0
  276. package/src/meeting/muteState.ts +223 -136
  277. package/src/meeting/request.ts +155 -120
  278. package/src/meeting/util.ts +685 -395
  279. package/src/meeting-info/index.ts +81 -8
  280. package/src/meeting-info/meeting-info-v2.ts +170 -14
  281. package/src/meeting-info/util.ts +1 -1
  282. package/src/meeting-info/utilv2.ts +23 -23
  283. package/src/meetings/collection.ts +33 -0
  284. package/src/meetings/index.ts +507 -127
  285. package/src/meetings/meetings.types.ts +12 -0
  286. package/src/meetings/request.ts +2 -0
  287. package/src/meetings/util.ts +81 -12
  288. package/src/member/index.ts +58 -0
  289. package/src/member/types.ts +38 -0
  290. package/src/member/util.ts +141 -25
  291. package/src/members/collection.ts +8 -0
  292. package/src/members/index.ts +134 -8
  293. package/src/members/request.ts +97 -17
  294. package/src/members/types.ts +29 -0
  295. package/src/members/util.ts +333 -240
  296. package/src/metrics/constants.ts +17 -0
  297. package/src/metrics/index.ts +1 -469
  298. package/src/multistream/mediaRequestManager.ts +271 -56
  299. package/src/multistream/receiveSlot.ts +11 -4
  300. package/src/multistream/receiveSlotManager.ts +34 -24
  301. package/src/multistream/remoteMedia.ts +5 -3
  302. package/src/multistream/remoteMediaGroup.ts +78 -0
  303. package/src/multistream/remoteMediaManager.ts +248 -44
  304. package/src/multistream/sendSlotManager.ts +199 -0
  305. package/src/reachability/clusterReachability.ts +320 -0
  306. package/src/reachability/index.ts +229 -346
  307. package/src/reachability/request.ts +8 -4
  308. package/src/reachability/util.ts +24 -0
  309. package/src/reconnection-manager/index.ts +128 -97
  310. package/src/recording-controller/index.ts +20 -3
  311. package/src/recording-controller/util.ts +26 -9
  312. package/src/roap/index.ts +52 -23
  313. package/src/roap/request.ts +48 -67
  314. package/src/roap/turnDiscovery.ts +147 -49
  315. package/src/rtcMetrics/constants.ts +3 -0
  316. package/src/rtcMetrics/index.ts +166 -0
  317. package/src/statsAnalyzer/index.ts +457 -416
  318. package/src/statsAnalyzer/mqaUtil.ts +317 -170
  319. package/src/webinar/collection.ts +31 -0
  320. package/src/webinar/index.ts +62 -0
  321. package/test/integration/spec/converged-space-meetings.js +60 -3
  322. package/test/integration/spec/journey.js +320 -261
  323. package/test/integration/spec/space-meeting.js +76 -3
  324. package/test/unit/spec/annotation/index.ts +418 -0
  325. package/test/unit/spec/breakouts/breakout.ts +118 -28
  326. package/test/unit/spec/breakouts/events.ts +89 -0
  327. package/test/unit/spec/breakouts/index.ts +1349 -114
  328. package/test/unit/spec/breakouts/utils.js +52 -1
  329. package/test/unit/spec/common/queue.js +31 -2
  330. package/test/unit/spec/controls-options-manager/index.js +163 -0
  331. package/test/unit/spec/controls-options-manager/util.js +576 -60
  332. package/test/unit/spec/fixture/locus.js +1 -0
  333. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  334. package/test/unit/spec/interpretation/collection.ts +15 -0
  335. package/test/unit/spec/interpretation/index.ts +625 -0
  336. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  337. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  338. package/test/unit/spec/locus-info/index.js +1363 -37
  339. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  340. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  341. package/test/unit/spec/locus-info/mediaSharesUtils.ts +41 -0
  342. package/test/unit/spec/locus-info/parser.js +116 -35
  343. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  344. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  345. package/test/unit/spec/media/index.ts +173 -81
  346. package/test/unit/spec/media/properties.ts +2 -2
  347. package/test/unit/spec/meeting/in-meeting-actions.ts +85 -3
  348. package/test/unit/spec/meeting/index.js +6821 -2172
  349. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  350. package/test/unit/spec/meeting/muteState.js +402 -212
  351. package/test/unit/spec/meeting/request.js +473 -54
  352. package/test/unit/spec/meeting/utils.js +773 -67
  353. package/test/unit/spec/meeting-info/index.js +300 -0
  354. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  355. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  356. package/test/unit/spec/meetings/collection.js +26 -0
  357. package/test/unit/spec/meetings/index.js +1415 -213
  358. package/test/unit/spec/meetings/utils.js +229 -2
  359. package/test/unit/spec/member/index.js +61 -6
  360. package/test/unit/spec/member/util.js +510 -34
  361. package/test/unit/spec/members/index.js +432 -1
  362. package/test/unit/spec/members/request.js +206 -27
  363. package/test/unit/spec/members/utils.js +210 -0
  364. package/test/unit/spec/metrics/index.js +1 -50
  365. package/test/unit/spec/multistream/mediaRequestManager.ts +781 -114
  366. package/test/unit/spec/multistream/receiveSlot.ts +9 -1
  367. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  368. package/test/unit/spec/multistream/remoteMedia.ts +2 -0
  369. package/test/unit/spec/multistream/remoteMediaGroup.ts +345 -0
  370. package/test/unit/spec/multistream/remoteMediaManager.ts +525 -0
  371. package/test/unit/spec/multistream/sendSlotManager.ts +274 -0
  372. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  373. package/test/unit/spec/reachability/index.ts +551 -14
  374. package/test/unit/spec/reachability/request.js +3 -1
  375. package/test/unit/spec/reachability/util.ts +40 -0
  376. package/test/unit/spec/reconnection-manager/index.js +171 -11
  377. package/test/unit/spec/recording-controller/index.js +294 -218
  378. package/test/unit/spec/recording-controller/util.js +223 -96
  379. package/test/unit/spec/roap/index.ts +180 -83
  380. package/test/unit/spec/roap/request.ts +100 -62
  381. package/test/unit/spec/roap/turnDiscovery.ts +388 -96
  382. package/test/unit/spec/rtcMetrics/index.ts +122 -0
  383. package/test/unit/spec/stats-analyzer/index.js +1252 -12
  384. package/test/unit/spec/webinar/collection.ts +13 -0
  385. package/test/unit/spec/webinar/index.ts +60 -0
  386. package/test/utils/integrationTestUtils.js +46 -0
  387. package/test/utils/testUtils.js +0 -57
  388. package/test/utils/webex-test-users.js +12 -4
  389. package/dist/metrics/config.js +0 -289
  390. package/dist/metrics/config.js.map +0 -1
  391. package/dist/types/metrics/config.d.ts +0 -169
  392. package/src/index.js +0 -18
  393. package/src/metrics/config.ts +0 -485
@@ -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,8 +48,11 @@ describe('TurnDiscovery', () => {
50
48
  testMeeting.roapSeq = newSeq;
51
49
  }),
52
50
  updateMediaConnections: sinon.stub(),
53
- webex: {meetings: {reachability: {isAnyClusterReachable: () => Promise.resolve(false)}}},
54
- isMultistream: false
51
+ webex: {meetings: {reachability: {
52
+ isAnyPublicClusterReachable: () => Promise.resolve(false),
53
+ }}},
54
+ isMultistream: false,
55
+ locusMediaRequest: { fake: true },
55
56
  };
56
57
  });
57
58
 
@@ -68,30 +69,28 @@ describe('TurnDiscovery', () => {
68
69
  await testUtils.flushPromises();
69
70
 
70
71
  assert.calledOnce(mockRoapRequest.sendRoap);
71
- assert.calledWith(mockRoapRequest.sendRoap, {
72
+
73
+ const expectedSendRoapArgs: any = {
72
74
  roapMessage: {
73
75
  messageType,
74
76
  version: '2',
75
77
  seq: expectedSeq,
76
78
  },
77
- correlationId: testMeeting.correlationId,
78
79
  locusSelfUrl: testMeeting.selfUrl,
79
80
  mediaId: expectedMediaId,
80
- audioMuted: testMeeting.audio?.isLocallyMuted(),
81
- videoMuted: testMeeting.video?.isLocallyMuted(),
82
81
  meetingId: testMeeting.id,
83
- preferTranscoding: !testMeeting.isMultistream
84
- });
82
+ locusMediaRequest: testMeeting.locusMediaRequest,
83
+ };
85
84
 
86
85
  if (messageType === 'TURN_DISCOVERY_REQUEST') {
87
- // check also that we've applied the media connections from the response
88
- assert.calledOnce(testMeeting.updateMediaConnections);
89
- assert.calledWith(testMeeting.updateMediaConnections, FAKE_MEDIA_CONNECTIONS_FROM_LOCUS);
86
+ expectedSendRoapArgs.ipVersion = 0;
87
+ expectedSendRoapArgs.roapMessage.headers = ['includeAnswerInHttpResponse', 'noOkInTransaction'];
90
88
  }
89
+
90
+ assert.calledWith(mockRoapRequest.sendRoap, expectedSendRoapArgs);
91
91
  };
92
92
 
93
93
  const checkFailureMetricsSent = () => {
94
- assert.calledOnce(Metrics.sendBehavioralMetric);
95
94
  assert.calledWith(
96
95
  Metrics.sendBehavioralMetric,
97
96
  BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE,
@@ -102,45 +101,318 @@ describe('TurnDiscovery', () => {
102
101
  );
103
102
  };
104
103
 
104
+ const checkHttpResponseMissingMetricsSent = () => {
105
+ assert.calledWith(
106
+ Metrics.sendBehavioralMetric,
107
+ BEHAVIORAL_METRICS.ROAP_HTTP_RESPONSE_MISSING,
108
+ sinon.match({
109
+ correlationId: testMeeting.correlationId,
110
+ messageType: 'TURN_DISCOVERY_RESPONSE',
111
+ isMultistream: testMeeting.isMultistream,
112
+ })
113
+ );
114
+ };
115
+
105
116
  describe('doTurnDiscovery', () => {
106
- [false, true].forEach(function (enabledMultistream ) {
107
- it('sends TURN_DISCOVERY_REQUEST'+ (enabledMultistream ? ' when enable Multistream':'') + ', waits for response and sends OK', async () => {
108
- testMeeting.isMultistream = enabledMultistream;
117
+ [false, true].forEach(function (enabledMultistream) {
118
+ describe('when Multistream is ' + (enabledMultistream ? 'enabled' : 'disabled'), () => {
119
+ beforeEach(() => {
120
+ testMeeting.isMultistream = enabledMultistream;
121
+ });
109
122
 
110
- const td = new TurnDiscovery(mockRoapRequest);
123
+ // checks that OK roap message was sent or not sent and that the result is as expected
124
+ const checkResult = async (resultPromise, expectedRoapMessageSent, expectedResult) => {
125
+ let turnServerInfo, turnDiscoverySkippedReason;
126
+
127
+ if (expectedRoapMessageSent === 'OK') {
128
+ await testUtils.flushPromises();
129
+
130
+ // check that we've sent OK
131
+ await checkRoapMessageSent('OK', 0);
132
+
133
+ assert.calledWith(
134
+ Metrics.sendBehavioralMetric,
135
+ BEHAVIORAL_METRICS.TURN_DISCOVERY_REQUIRES_OK,
136
+ sinon.match({
137
+ correlation_id: testMeeting.correlationId,
138
+ locus_id: FAKE_LOCUS_ID,
139
+ })
140
+ );
141
+
142
+ ({turnServerInfo, turnDiscoverySkippedReason} = await resultPromise);
143
+ } else {
144
+ ({turnServerInfo, turnDiscoverySkippedReason} = await resultPromise);
145
+
146
+ await testUtils.flushPromises();
147
+
148
+ // check that we didn't send OK or any other message
149
+ assert.notCalled(mockRoapRequest.sendRoap);
150
+ }
151
+
152
+ assert.deepEqual(turnServerInfo, expectedResult);
153
+ assert.isUndefined(turnDiscoverySkippedReason);
154
+ };
155
+
156
+ it('sends TURN_DISCOVERY_REQUEST, waits for response and sends OK', async () => {
157
+ const td = new TurnDiscovery(mockRoapRequest);
158
+ const result = td.doTurnDiscovery(testMeeting, false);
159
+
160
+ // check that TURN_DISCOVERY_REQUEST was sent
161
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
162
+
163
+ // check also that we've applied the media connections from the response
164
+ assert.calledOnce(testMeeting.updateMediaConnections);
165
+ assert.calledWith(testMeeting.updateMediaConnections, FAKE_MEDIA_CONNECTIONS_FROM_LOCUS);
166
+
167
+ // response is not in http response, so we expect a metric for that
168
+ checkHttpResponseMissingMetricsSent();
169
+
170
+ // @ts-ignore
171
+ mockRoapRequest.sendRoap.resetHistory();
172
+
173
+ // simulate the response
174
+ td.handleTurnDiscoveryResponse(
175
+ {
176
+ messageType: 'TURN_DISCOVERY_RESPONSE',
177
+ headers: [
178
+ `x-cisco-turn-url=${FAKE_TURN_URL}`,
179
+ `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
180
+ `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
181
+ ],
182
+ },
183
+ 'from test'
184
+ );
185
+
186
+ await checkResult(result, 'OK', {
187
+ url: FAKE_TURN_URL,
188
+ username: FAKE_TURN_USERNAME,
189
+ password: FAKE_TURN_PASSWORD,
190
+ });
191
+ });
111
192
 
112
- const result = td.doTurnDiscovery(testMeeting, false);
193
+ it('sends TURN_DISCOVERY_REQUEST, waits for response and does not send OK if response received from Mercury has "noOkInTransaction" header', async () => {
194
+ const td = new TurnDiscovery(mockRoapRequest);
195
+ const result = td.doTurnDiscovery(testMeeting, false);
196
+
197
+ // check that TURN_DISCOVERY_REQUEST was sent
198
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
199
+
200
+ // check also that we've applied the media connections from the response
201
+ assert.calledOnce(testMeeting.updateMediaConnections);
202
+ assert.calledWith(testMeeting.updateMediaConnections, FAKE_MEDIA_CONNECTIONS_FROM_LOCUS);
203
+
204
+ // @ts-ignore
205
+ mockRoapRequest.sendRoap.resetHistory();
206
+
207
+ // simulate the response
208
+ td.handleTurnDiscoveryResponse(
209
+ {
210
+ messageType: 'TURN_DISCOVERY_RESPONSE',
211
+ headers: [
212
+ `x-cisco-turn-url=${FAKE_TURN_URL}`,
213
+ `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
214
+ `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
215
+ 'noOkInTransaction',
216
+ ],
217
+ },
218
+ 'from test'
219
+ );
220
+
221
+ await checkResult(result, undefined, {
222
+ url: FAKE_TURN_URL,
223
+ username: FAKE_TURN_USERNAME,
224
+ password: FAKE_TURN_PASSWORD,
225
+ });
226
+ });
113
227
 
114
- // check that TURN_DISCOVERY_REQUEST was sent
115
- await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
228
+ it('sends TURN_DISCOVERY_REQUEST, handles http response and does not send OK if received response has "noOkInTransaction" header', async () => {
229
+ mockRoapRequest.sendRoap = sinon.fake.resolves({
230
+ mediaConnections: [
231
+ {
232
+ mediaId: '464ff97f-4bda-466a-ad06-3a22184a2274',
233
+ remoteSdp: `{"roapMessage": {"messageType":"TURN_DISCOVERY_RESPONSE","seq":"0","headers": ["x-cisco-turn-url=${FAKE_TURN_URL}","x-cisco-turn-username=${FAKE_TURN_USERNAME}","x-cisco-turn-password=${FAKE_TURN_PASSWORD}", "noOkInTransaction"]}}`,
234
+ },
235
+ ],
236
+ });
237
+
238
+ const td = new TurnDiscovery(mockRoapRequest);
239
+ const result = td.doTurnDiscovery(testMeeting, false);
240
+
241
+ // check that TURN_DISCOVERY_REQUEST was sent
242
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
243
+
244
+ // @ts-ignore
245
+ mockRoapRequest.sendRoap.resetHistory();
246
+
247
+ await checkResult(result, undefined, {
248
+ url: FAKE_TURN_URL,
249
+ username: FAKE_TURN_USERNAME,
250
+ password: FAKE_TURN_PASSWORD,
251
+ });
252
+ });
116
253
 
117
- // @ts-ignore
118
- mockRoapRequest.sendRoap.resetHistory();
254
+ it('sends TURN_DISCOVERY_REQUEST, handles http response and sends OK if received response does not have "noOkInTransaction" header', async () => {
255
+ let sendRoapPromiseResolve;
256
+ const sendRoapResult = {
257
+ mediaConnections: [
258
+ {
259
+ mediaId: '464ff97f-4bda-466a-ad06-3a22184a2274',
260
+ remoteSdp: `{"roapMessage": {"messageType":"TURN_DISCOVERY_RESPONSE","seq":"0","headers": ["x-cisco-turn-url=${FAKE_TURN_URL}","x-cisco-turn-username=${FAKE_TURN_USERNAME}","x-cisco-turn-password=${FAKE_TURN_PASSWORD}"]}}`,
261
+ },
262
+ ],
263
+ };
264
+ mockRoapRequest.sendRoap = sinon.fake.returns(new Promise((resolve) => {
265
+ sendRoapPromiseResolve = resolve;
266
+ }));
267
+
268
+ const td = new TurnDiscovery(mockRoapRequest);
269
+ const result = td.doTurnDiscovery(testMeeting, false);
270
+
271
+ // check that TURN_DISCOVERY_REQUEST was sent
272
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
273
+
274
+ // @ts-ignore
275
+ mockRoapRequest.sendRoap.resetHistory();
276
+ // simulate the http response without 'noOkInTransaction' header
277
+ sendRoapPromiseResolve(sendRoapResult);
278
+
279
+ await checkResult(result, 'OK', {
280
+ url: FAKE_TURN_URL,
281
+ username: FAKE_TURN_USERNAME,
282
+ password: FAKE_TURN_PASSWORD,
283
+ });
284
+ });
119
285
 
120
- // simulate the response
121
- td.handleTurnDiscoveryResponse({
122
- headers: [
123
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
124
- `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
125
- `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
126
- ]
286
+ it('handles http response that has invalid JSON in the remoteSdp field', async () => {
287
+ mockRoapRequest.sendRoap = sinon.fake.resolves({
288
+ mediaConnections: [
289
+ {
290
+ mediaId: '464ff97f-4bda-466a-ad06-3a22184a2274',
291
+ remoteSdp: `not a json`,
292
+ },
293
+ ],
294
+ });
295
+
296
+ const td = new TurnDiscovery(mockRoapRequest);
297
+ const result = td.doTurnDiscovery(testMeeting, false);
298
+
299
+ // check that TURN_DISCOVERY_REQUEST was sent
300
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
301
+
302
+ // @ts-ignore
303
+ mockRoapRequest.sendRoap.resetHistory();
304
+
305
+ await checkResult(result, undefined, undefined);
306
+ checkFailureMetricsSent();
307
+ });
308
+
309
+ it('waits for response from Mercury if http response does not contain a roapMessage', async () => {
310
+ mockRoapRequest.sendRoap = sinon.fake.resolves({
311
+ mediaConnections: [
312
+ {
313
+ mediaId: '464ff97f-4bda-466a-ad06-3a22184a2274',
314
+ remoteSdp: `{"something": "whatever"}`,
315
+ },
316
+ ],
317
+ });
318
+
319
+ const td = new TurnDiscovery(mockRoapRequest);
320
+ const result = td.doTurnDiscovery(testMeeting, false);
321
+
322
+ // check that TURN_DISCOVERY_REQUEST was sent
323
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
324
+
325
+ checkHttpResponseMissingMetricsSent();
326
+
327
+ // @ts-ignore
328
+ mockRoapRequest.sendRoap.resetHistory();
329
+
330
+ // simulate the response coming from Mercury
331
+ td.handleTurnDiscoveryResponse(
332
+ {
333
+ messageType: 'TURN_DISCOVERY_RESPONSE',
334
+ headers: [
335
+ `x-cisco-turn-url=${FAKE_TURN_URL}`,
336
+ `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
337
+ `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
338
+ ],
339
+ },
340
+ 'from test'
341
+ );
342
+
343
+ await checkResult(result, 'OK', {
344
+ url: FAKE_TURN_URL,
345
+ username: FAKE_TURN_USERNAME,
346
+ password: FAKE_TURN_PASSWORD,
347
+ });
127
348
  });
128
349
 
129
- await testUtils.flushPromises();
350
+ it('handles unexpected roap message type in http response', async () => {
351
+ mockRoapRequest.sendRoap = sinon.fake.resolves({
352
+ mediaConnections: [
353
+ {
354
+ mediaId: '464ff97f-4bda-466a-ad06-3a22184a2274',
355
+ remoteSdp: `{"roapMessage": {"messageType":"ERROR","seq":"0"}}`,
356
+ },
357
+ ],
358
+ });
130
359
 
131
- // check that we've sent OK
132
- await checkRoapMessageSent('OK', 0);
360
+ const td = new TurnDiscovery(mockRoapRequest);
361
+ const result = td.doTurnDiscovery(testMeeting, false);
133
362
 
134
- const {turnServerInfo, turnDiscoverySkippedReason} = await result;
363
+ // check that TURN_DISCOVERY_REQUEST was sent
364
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
135
365
 
136
- assert.deepEqual(turnServerInfo, {
137
- url: FAKE_TURN_URL,
138
- username: FAKE_TURN_USERNAME,
139
- password: FAKE_TURN_PASSWORD
366
+ // @ts-ignore
367
+ mockRoapRequest.sendRoap.resetHistory();
368
+
369
+ await checkResult(result, undefined, undefined);
140
370
  });
371
+ });
372
+ });
141
373
 
142
- assert.isUndefined(turnDiscoverySkippedReason);
374
+ it('sends TURN_DISCOVERY_REQUEST, waits for response and sends OK when isForced = true when cluster is reachable', async () => {
375
+ const prev = testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable;
376
+ testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = sinon
377
+ .stub()
378
+ .resolves(true);
379
+
380
+ const td = new TurnDiscovery(mockRoapRequest);
381
+ const result = td.doTurnDiscovery(testMeeting, false, true);
382
+
383
+ // We ignore reachability results so we don't get skip reason
384
+ assert.notCalled(testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable);
385
+
386
+ // check that TURN_DISCOVERY_REQUEST was sent
387
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
388
+ // @ts-ignore
389
+ mockRoapRequest.sendRoap.resetHistory();
390
+ // simulate the response
391
+ td.handleTurnDiscoveryResponse(
392
+ {
393
+ messageType: 'TURN_DISCOVERY_RESPONSE',
394
+ headers: [
395
+ `x-cisco-turn-url=${FAKE_TURN_URL}`,
396
+ `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
397
+ `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
398
+ ],
399
+ },
400
+ 'from test'
401
+ );
402
+ await testUtils.flushPromises();
403
+ // check that we've sent OK
404
+ await checkRoapMessageSent('OK', 0);
405
+
406
+ const {turnServerInfo, turnDiscoverySkippedReason} = await result;
407
+ assert.deepEqual(turnServerInfo, {
408
+ url: FAKE_TURN_URL,
409
+ username: FAKE_TURN_USERNAME,
410
+ password: FAKE_TURN_PASSWORD,
143
411
  });
412
+ assert.isUndefined(turnDiscoverySkippedReason);
413
+
414
+ // restore previous callback
415
+ testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = prev;
144
416
  });
145
417
 
146
418
  it('sends TURN_DISCOVERY_REQUEST with empty mediaId when isReconnecting is true', async () => {
@@ -156,13 +428,17 @@ describe('TurnDiscovery', () => {
156
428
  mockRoapRequest.sendRoap.resetHistory();
157
429
 
158
430
  // simulate the response
159
- td.handleTurnDiscoveryResponse({
160
- headers: [
161
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
162
- `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
163
- `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
164
- ],
165
- });
431
+ td.handleTurnDiscoveryResponse(
432
+ {
433
+ messageType: 'TURN_DISCOVERY_RESPONSE',
434
+ headers: [
435
+ `x-cisco-turn-url=${FAKE_TURN_URL}`,
436
+ `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
437
+ `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
438
+ ],
439
+ },
440
+ 'from test'
441
+ );
166
442
 
167
443
  await testUtils.flushPromises();
168
444
 
@@ -189,16 +465,20 @@ describe('TurnDiscovery', () => {
189
465
  mockRoapRequest.sendRoap.resetHistory();
190
466
 
191
467
  // simulate the response with some extra headers
192
- td.handleTurnDiscoveryResponse({
193
- headers: [
194
- 'x-cisco-turn-unexpected-header=xxx',
195
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
196
- 'x-cisco-some-other-header',
197
- `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
198
- `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
199
- 'another-header-at-the-end=12345',
200
- ],
201
- });
468
+ td.handleTurnDiscoveryResponse(
469
+ {
470
+ messageType: 'TURN_DISCOVERY_RESPONSE',
471
+ headers: [
472
+ 'x-cisco-turn-unexpected-header=xxx',
473
+ `x-cisco-turn-url=${FAKE_TURN_URL}`,
474
+ 'x-cisco-some-other-header',
475
+ `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
476
+ `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
477
+ 'another-header-at-the-end=12345',
478
+ ],
479
+ },
480
+ 'from test'
481
+ );
202
482
 
203
483
  await testUtils.flushPromises();
204
484
 
@@ -214,24 +494,6 @@ describe('TurnDiscovery', () => {
214
494
  assert.isUndefined(turnDiscoverySkippedReason);
215
495
  });
216
496
 
217
- it('resolves with undefined if turn discovery feature is disabled in config', async () => {
218
- const prevConfigValue = testMeeting.config.experimental.enableTurnDiscovery;
219
-
220
- testMeeting.config.experimental.enableTurnDiscovery = false;
221
- // @ts-ignore
222
- const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
223
-
224
- const {turnServerInfo, turnDiscoverySkippedReason} = result;
225
-
226
- assert.isUndefined(turnServerInfo);
227
- assert.equal(turnDiscoverySkippedReason, 'config');
228
- assert.notCalled(mockRoapRequest.sendRoap);
229
- assert.notCalled(Metrics.sendBehavioralMetric);
230
-
231
- // restore previous config
232
- testMeeting.config.experimental.enableTurnDiscovery = prevConfigValue;
233
- });
234
-
235
497
  it('resolves with undefined if sending the request fails', async () => {
236
498
  const td = new TurnDiscovery(mockRoapRequest);
237
499
 
@@ -247,8 +509,9 @@ describe('TurnDiscovery', () => {
247
509
  });
248
510
 
249
511
  it('resolves with undefined when cluster is reachable', async () => {
250
- const prev = testMeeting.webex.meetings.reachability.isAnyClusterReachable;
251
- testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => Promise.resolve(true);
512
+ const prev = testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable;
513
+ testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = () =>
514
+ Promise.resolve(true);
252
515
  const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
253
516
 
254
517
  const {turnServerInfo, turnDiscoverySkippedReason} = result;
@@ -257,7 +520,7 @@ describe('TurnDiscovery', () => {
257
520
  assert.equal(turnDiscoverySkippedReason, 'reachability');
258
521
  assert.notCalled(mockRoapRequest.sendRoap);
259
522
  assert.notCalled(Metrics.sendBehavioralMetric);
260
- testMeeting.webex.meetings.reachability.isAnyClusterReachable = prev;
523
+ testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = prev;
261
524
  });
262
525
 
263
526
  it("resolves with undefined if we don't get a response within 10s", async () => {
@@ -282,12 +545,16 @@ describe('TurnDiscovery', () => {
282
545
  await testUtils.flushPromises();
283
546
 
284
547
  // simulate the response without the password
285
- td.handleTurnDiscoveryResponse({
286
- headers: [
287
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
288
- `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
289
- ],
290
- });
548
+ td.handleTurnDiscoveryResponse(
549
+ {
550
+ messageType: 'TURN_DISCOVERY_RESPONSE',
551
+ headers: [
552
+ `x-cisco-turn-url=${FAKE_TURN_URL}`,
553
+ `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
554
+ ],
555
+ },
556
+ 'from test'
557
+ );
291
558
  await testUtils.flushPromises();
292
559
  const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
293
560
 
@@ -303,7 +570,7 @@ describe('TurnDiscovery', () => {
303
570
  await testUtils.flushPromises();
304
571
 
305
572
  // simulate the response without the headers
306
- td.handleTurnDiscoveryResponse({});
573
+ td.handleTurnDiscoveryResponse({messageType: 'TURN_DISCOVERY_RESPONSE'}, 'from test');
307
574
 
308
575
  await testUtils.flushPromises();
309
576
  const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
@@ -320,7 +587,10 @@ describe('TurnDiscovery', () => {
320
587
  await testUtils.flushPromises();
321
588
 
322
589
  // simulate the response without the headers
323
- td.handleTurnDiscoveryResponse({headers: []});
590
+ td.handleTurnDiscoveryResponse(
591
+ {messageType: 'TURN_DISCOVERY_RESPONSE', headers: []},
592
+ 'from test'
593
+ );
324
594
 
325
595
  await testUtils.flushPromises();
326
596
  const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
@@ -346,13 +616,17 @@ describe('TurnDiscovery', () => {
346
616
  mockRoapRequest.sendRoap = sinon.fake.rejects(new Error('fake error'));
347
617
 
348
618
  // simulate the response
349
- td.handleTurnDiscoveryResponse({
350
- headers: [
351
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
352
- `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
353
- `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
354
- ],
355
- });
619
+ td.handleTurnDiscoveryResponse(
620
+ {
621
+ messageType: 'TURN_DISCOVERY_RESPONSE',
622
+ headers: [
623
+ `x-cisco-turn-url=${FAKE_TURN_URL}`,
624
+ `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
625
+ `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
626
+ ],
627
+ },
628
+ 'from test'
629
+ );
356
630
 
357
631
  await testUtils.flushPromises();
358
632
 
@@ -367,6 +641,23 @@ describe('TurnDiscovery', () => {
367
641
  });
368
642
  });
369
643
 
644
+ describe('isSkipped', () => {
645
+ [
646
+ {isAnyPublicClusterReachable: true, expectedIsSkipped: true},
647
+ {isAnyPublicClusterReachable: false, expectedIsSkipped: false},
648
+ ].forEach(({isAnyPublicClusterReachable, expectedIsSkipped}) => {
649
+ it(`returns ${expectedIsSkipped} when isAnyPublicClusterReachable() returns ${isAnyPublicClusterReachable ? 'true' : 'false'}`, async () => {
650
+ sinon.stub(testMeeting.webex.meetings.reachability, 'isAnyPublicClusterReachable').resolves(isAnyPublicClusterReachable);
651
+
652
+ const td = new TurnDiscovery(mockRoapRequest);
653
+
654
+ const isSkipped = await td.isSkipped(testMeeting);
655
+
656
+ assert.equal(isSkipped, expectedIsSkipped);
657
+ })
658
+ })
659
+ })
660
+
370
661
  describe('handleTurnDiscoveryResponse', () => {
371
662
  it("doesn't do anything if turn discovery was not started", () => {
372
663
  const td = new TurnDiscovery(mockRoapRequest);
@@ -374,12 +665,13 @@ describe('TurnDiscovery', () => {
374
665
  // there is not much we can check, but we mainly want to make
375
666
  // sure that it doesn't crash
376
667
  td.handleTurnDiscoveryResponse({
668
+ messageType: 'TURN_DISCOVERY_RESPONSE',
377
669
  headers: [
378
670
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
379
671
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
380
672
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
381
673
  ],
382
- });
674
+ }, 'from test');
383
675
 
384
676
  assert.notCalled(mockRoapRequest.sendRoap);
385
677
  });