@webex/plugin-meetings 3.0.0-beta.15 → 3.0.0-beta.151

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 (480) hide show
  1. package/README.md +45 -1
  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 +359 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +193 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +23 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +52 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +43 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1046 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +78 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +67 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/browser-detection.js +1 -21
  23. package/dist/common/browser-detection.js.map +1 -1
  24. package/dist/common/collection.js +5 -20
  25. package/dist/common/collection.js.map +1 -1
  26. package/dist/common/config.js +0 -7
  27. package/dist/common/config.js.map +1 -1
  28. package/dist/common/errors/captcha-error.js +0 -21
  29. package/dist/common/errors/captcha-error.js.map +1 -1
  30. package/dist/common/errors/intent-to-join.js +0 -21
  31. package/dist/common/errors/intent-to-join.js.map +1 -1
  32. package/dist/common/errors/join-meeting.js +0 -21
  33. package/dist/common/errors/join-meeting.js.map +1 -1
  34. package/dist/common/errors/media.js +0 -21
  35. package/dist/common/errors/media.js.map +1 -1
  36. package/dist/common/errors/parameter.js +0 -28
  37. package/dist/common/errors/parameter.js.map +1 -1
  38. package/dist/common/errors/password-error.js +0 -21
  39. package/dist/common/errors/password-error.js.map +1 -1
  40. package/dist/common/errors/permission.js +0 -21
  41. package/dist/common/errors/permission.js.map +1 -1
  42. package/dist/common/errors/reconnection-in-progress.js +0 -17
  43. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  44. package/dist/common/errors/reconnection.js +0 -21
  45. package/dist/common/errors/reconnection.js.map +1 -1
  46. package/dist/common/errors/stats.js +0 -21
  47. package/dist/common/errors/stats.js.map +1 -1
  48. package/dist/common/errors/webex-errors.js +9 -43
  49. package/dist/common/errors/webex-errors.js.map +1 -1
  50. package/dist/common/errors/webex-meetings-error.js +1 -24
  51. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  52. package/dist/common/events/events-scope.js +0 -22
  53. package/dist/common/events/events-scope.js.map +1 -1
  54. package/dist/common/events/events.js +0 -23
  55. package/dist/common/events/events.js.map +1 -1
  56. package/dist/common/events/trigger-proxy.js +0 -12
  57. package/dist/common/events/trigger-proxy.js.map +1 -1
  58. package/dist/common/events/util.js +0 -15
  59. package/dist/common/events/util.js.map +1 -1
  60. package/dist/common/logs/logger-config.js +0 -4
  61. package/dist/common/logs/logger-config.js.map +1 -1
  62. package/dist/common/logs/logger-proxy.js +1 -8
  63. package/dist/common/logs/logger-proxy.js.map +1 -1
  64. package/dist/common/logs/request.js +35 -61
  65. package/dist/common/logs/request.js.map +1 -1
  66. package/dist/common/queue.js +4 -14
  67. package/dist/common/queue.js.map +1 -1
  68. package/dist/config.js +7 -13
  69. package/dist/config.js.map +1 -1
  70. package/dist/constants.js +208 -64
  71. package/dist/constants.js.map +1 -1
  72. package/dist/controls-options-manager/constants.js +14 -0
  73. package/dist/controls-options-manager/constants.js.map +1 -0
  74. package/dist/controls-options-manager/enums.js +27 -0
  75. package/dist/controls-options-manager/enums.js.map +1 -0
  76. package/dist/controls-options-manager/index.js +297 -0
  77. package/dist/controls-options-manager/index.js.map +1 -0
  78. package/dist/controls-options-manager/types.js +7 -0
  79. package/dist/controls-options-manager/types.js.map +1 -0
  80. package/dist/controls-options-manager/util.js +300 -0
  81. package/dist/controls-options-manager/util.js.map +1 -0
  82. package/dist/index.js +78 -17
  83. package/dist/index.js.map +1 -1
  84. package/dist/locus-info/controlsUtils.js +100 -29
  85. package/dist/locus-info/controlsUtils.js.map +1 -1
  86. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  87. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  88. package/dist/locus-info/fullState.js +0 -15
  89. package/dist/locus-info/fullState.js.map +1 -1
  90. package/dist/locus-info/hostUtils.js +4 -12
  91. package/dist/locus-info/hostUtils.js.map +1 -1
  92. package/dist/locus-info/index.js +387 -208
  93. package/dist/locus-info/index.js.map +1 -1
  94. package/dist/locus-info/infoUtils.js +0 -38
  95. package/dist/locus-info/infoUtils.js.map +1 -1
  96. package/dist/locus-info/mediaSharesUtils.js +54 -38
  97. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  98. package/dist/locus-info/parser.js +90 -126
  99. package/dist/locus-info/parser.js.map +1 -1
  100. package/dist/locus-info/selfUtils.js +93 -92
  101. package/dist/locus-info/selfUtils.js.map +1 -1
  102. package/dist/media/index.js +70 -219
  103. package/dist/media/index.js.map +1 -1
  104. package/dist/media/properties.js +74 -198
  105. package/dist/media/properties.js.map +1 -1
  106. package/dist/media/util.js +1 -8
  107. package/dist/media/util.js.map +1 -1
  108. package/dist/mediaQualityMetrics/config.js +505 -495
  109. package/dist/mediaQualityMetrics/config.js.map +1 -1
  110. package/dist/meeting/in-meeting-actions.js +79 -14
  111. package/dist/meeting/in-meeting-actions.js.map +1 -1
  112. package/dist/meeting/index.js +2685 -3324
  113. package/dist/meeting/index.js.map +1 -1
  114. package/dist/meeting/locusMediaRequest.js +291 -0
  115. package/dist/meeting/locusMediaRequest.js.map +1 -0
  116. package/dist/meeting/muteState.js +243 -185
  117. package/dist/meeting/muteState.js.map +1 -1
  118. package/dist/meeting/request.js +296 -342
  119. package/dist/meeting/request.js.map +1 -1
  120. package/dist/meeting/request.type.js +0 -1
  121. package/dist/meeting/request.type.js.map +1 -1
  122. package/dist/meeting/state.js +16 -26
  123. package/dist/meeting/state.js.map +1 -1
  124. package/dist/meeting/util.js +446 -585
  125. package/dist/meeting/util.js.map +1 -1
  126. package/dist/meeting-info/collection.js +3 -25
  127. package/dist/meeting-info/collection.js.map +1 -1
  128. package/dist/meeting-info/index.js +8 -31
  129. package/dist/meeting-info/index.js.map +1 -1
  130. package/dist/meeting-info/meeting-info-v2.js +261 -242
  131. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  132. package/dist/meeting-info/request.js +1 -16
  133. package/dist/meeting-info/request.js.map +1 -1
  134. package/dist/meeting-info/util.js +98 -183
  135. package/dist/meeting-info/util.js.map +1 -1
  136. package/dist/meeting-info/utilv2.js +156 -232
  137. package/dist/meeting-info/utilv2.js.map +1 -1
  138. package/dist/meetings/collection.js +24 -20
  139. package/dist/meetings/collection.js.map +1 -1
  140. package/dist/meetings/index.js +526 -372
  141. package/dist/meetings/index.js.map +1 -1
  142. package/dist/meetings/meetings.types.js +7 -0
  143. package/dist/meetings/meetings.types.js.map +1 -0
  144. package/dist/meetings/request.js +21 -40
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +172 -141
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.js +58 -57
  149. package/dist/member/index.js.map +1 -1
  150. package/dist/member/types.js +15 -0
  151. package/dist/member/types.js.map +1 -0
  152. package/dist/member/util.js +101 -69
  153. package/dist/member/util.js.map +1 -1
  154. package/dist/members/collection.js +12 -12
  155. package/dist/members/collection.js.map +1 -1
  156. package/dist/members/index.js +123 -162
  157. package/dist/members/index.js.map +1 -1
  158. package/dist/members/request.js +120 -85
  159. package/dist/members/request.js.map +1 -1
  160. package/dist/members/types.js +15 -0
  161. package/dist/members/types.js.map +1 -0
  162. package/dist/members/util.js +314 -260
  163. package/dist/members/util.js.map +1 -1
  164. package/dist/metrics/config.js +50 -16
  165. package/dist/metrics/config.js.map +1 -1
  166. package/dist/metrics/constants.js +4 -7
  167. package/dist/metrics/constants.js.map +1 -1
  168. package/dist/metrics/index.js +75 -147
  169. package/dist/metrics/index.js.map +1 -1
  170. package/dist/multistream/mediaRequestManager.js +170 -50
  171. package/dist/multistream/mediaRequestManager.js.map +1 -1
  172. package/dist/multistream/receiveSlot.js +58 -65
  173. package/dist/multistream/receiveSlot.js.map +1 -1
  174. package/dist/multistream/receiveSlotManager.js +73 -94
  175. package/dist/multistream/receiveSlotManager.js.map +1 -1
  176. package/dist/multistream/remoteMedia.js +55 -74
  177. package/dist/multistream/remoteMedia.js.map +1 -1
  178. package/dist/multistream/remoteMediaGroup.js +66 -43
  179. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  180. package/dist/multistream/remoteMediaManager.js +502 -442
  181. package/dist/multistream/remoteMediaManager.js.map +1 -1
  182. package/dist/networkQualityMonitor/index.js +24 -51
  183. package/dist/networkQualityMonitor/index.js.map +1 -1
  184. package/dist/personal-meeting-room/index.js +3 -38
  185. package/dist/personal-meeting-room/index.js.map +1 -1
  186. package/dist/personal-meeting-room/request.js +2 -33
  187. package/dist/personal-meeting-room/request.js.map +1 -1
  188. package/dist/personal-meeting-room/util.js +0 -13
  189. package/dist/personal-meeting-room/util.js.map +1 -1
  190. package/dist/reachability/index.js +190 -199
  191. package/dist/reachability/index.js.map +1 -1
  192. package/dist/reachability/request.js +14 -23
  193. package/dist/reachability/request.js.map +1 -1
  194. package/dist/reactions/constants.js +13 -0
  195. package/dist/reactions/constants.js.map +1 -0
  196. package/dist/reactions/reactions.js +2 -4
  197. package/dist/reactions/reactions.js.map +1 -1
  198. package/dist/reactions/reactions.type.js +18 -24
  199. package/dist/reactions/reactions.type.js.map +1 -1
  200. package/dist/reconnection-manager/index.js +356 -476
  201. package/dist/reconnection-manager/index.js.map +1 -1
  202. package/dist/recording-controller/enums.js +17 -0
  203. package/dist/recording-controller/enums.js.map +1 -0
  204. package/dist/recording-controller/index.js +343 -0
  205. package/dist/recording-controller/index.js.map +1 -0
  206. package/dist/recording-controller/util.js +63 -0
  207. package/dist/recording-controller/util.js.map +1 -0
  208. package/dist/roap/index.js +32 -75
  209. package/dist/roap/index.js.map +1 -1
  210. package/dist/roap/request.js +129 -136
  211. package/dist/roap/request.js.map +1 -1
  212. package/dist/roap/turnDiscovery.js +143 -103
  213. package/dist/roap/turnDiscovery.js.map +1 -1
  214. package/dist/statsAnalyzer/global.js +1 -95
  215. package/dist/statsAnalyzer/global.js.map +1 -1
  216. package/dist/statsAnalyzer/index.js +369 -462
  217. package/dist/statsAnalyzer/index.js.map +1 -1
  218. package/dist/statsAnalyzer/mqaUtil.js +144 -94
  219. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  220. package/dist/transcription/index.js +9 -44
  221. package/dist/transcription/index.js.map +1 -1
  222. package/dist/types/annotation/annotation.types.d.ts +43 -0
  223. package/dist/types/annotation/constants.d.ts +31 -0
  224. package/dist/types/annotation/index.d.ts +124 -0
  225. package/dist/types/breakouts/breakout.d.ts +8 -0
  226. package/dist/types/breakouts/collection.d.ts +5 -0
  227. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  228. package/dist/types/breakouts/events.d.ts +2 -0
  229. package/dist/types/breakouts/index.d.ts +5 -0
  230. package/dist/types/breakouts/request.d.ts +22 -0
  231. package/dist/types/breakouts/utils.d.ts +15 -0
  232. package/dist/types/common/browser-detection.d.ts +9 -0
  233. package/dist/types/common/collection.d.ts +48 -0
  234. package/dist/types/common/config.d.ts +2 -0
  235. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  236. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  237. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  238. package/dist/types/common/errors/media.d.ts +15 -0
  239. package/dist/types/common/errors/parameter.d.ts +15 -0
  240. package/dist/types/common/errors/password-error.d.ts +15 -0
  241. package/dist/types/common/errors/permission.d.ts +14 -0
  242. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  243. package/dist/types/common/errors/reconnection.d.ts +15 -0
  244. package/dist/types/common/errors/stats.d.ts +15 -0
  245. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  246. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  247. package/dist/types/common/events/events-scope.d.ts +17 -0
  248. package/dist/types/common/events/events.d.ts +12 -0
  249. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  250. package/dist/types/common/events/util.d.ts +2 -0
  251. package/dist/types/common/logs/logger-config.d.ts +2 -0
  252. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  253. package/dist/types/common/logs/request.d.ts +34 -0
  254. package/dist/types/common/queue.d.ts +32 -0
  255. package/dist/types/config.d.ts +72 -0
  256. package/dist/types/constants.d.ts +978 -0
  257. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  258. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  259. package/dist/types/controls-options-manager/index.d.ts +136 -0
  260. package/dist/types/controls-options-manager/types.d.ts +43 -0
  261. package/dist/types/controls-options-manager/util.d.ts +1 -0
  262. package/dist/types/index.d.ts +7 -0
  263. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  264. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  265. package/dist/types/locus-info/fullState.d.ts +2 -0
  266. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  267. package/dist/types/locus-info/index.d.ts +315 -0
  268. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  269. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  270. package/dist/types/locus-info/parser.d.ts +212 -0
  271. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  272. package/dist/types/media/index.d.ts +34 -0
  273. package/dist/types/media/properties.d.ts +86 -0
  274. package/dist/types/media/util.d.ts +2 -0
  275. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  276. package/dist/types/meeting/in-meeting-actions.d.ts +149 -0
  277. package/dist/types/meeting/index.d.ts +1509 -0
  278. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  279. package/dist/types/meeting/muteState.d.ts +184 -0
  280. package/dist/types/meeting/request.d.ts +270 -0
  281. package/dist/types/meeting/request.type.d.ts +11 -0
  282. package/dist/types/meeting/state.d.ts +9 -0
  283. package/dist/types/meeting/util.d.ts +75 -0
  284. package/dist/types/meeting-info/collection.d.ts +20 -0
  285. package/dist/types/meeting-info/index.d.ts +57 -0
  286. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  287. package/dist/types/meeting-info/request.d.ts +22 -0
  288. package/dist/types/meeting-info/util.d.ts +2 -0
  289. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  290. package/dist/types/meetings/collection.d.ts +31 -0
  291. package/dist/types/meetings/index.d.ts +364 -0
  292. package/dist/types/meetings/meetings.types.d.ts +4 -0
  293. package/dist/types/meetings/request.d.ts +27 -0
  294. package/dist/types/meetings/util.d.ts +18 -0
  295. package/dist/types/member/index.d.ts +157 -0
  296. package/dist/types/member/types.d.ts +21 -0
  297. package/dist/types/member/util.d.ts +2 -0
  298. package/dist/types/members/collection.d.ts +29 -0
  299. package/dist/types/members/index.d.ts +353 -0
  300. package/dist/types/members/request.d.ts +114 -0
  301. package/dist/types/members/types.d.ts +24 -0
  302. package/dist/types/members/util.d.ts +210 -0
  303. package/dist/types/metrics/config.d.ts +195 -0
  304. package/dist/types/metrics/constants.d.ts +55 -0
  305. package/dist/types/metrics/index.d.ts +169 -0
  306. package/dist/types/multistream/mediaRequestManager.d.ts +104 -0
  307. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  308. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  309. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  310. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  311. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  312. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  313. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  314. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  315. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  316. package/dist/types/reachability/index.d.ts +152 -0
  317. package/dist/types/reachability/request.d.ts +37 -0
  318. package/dist/types/reactions/constants.d.ts +3 -0
  319. package/dist/types/reactions/reactions.d.ts +4 -0
  320. package/dist/types/reactions/reactions.type.d.ts +52 -0
  321. package/dist/types/reconnection-manager/index.d.ts +126 -0
  322. package/dist/types/recording-controller/enums.d.ts +7 -0
  323. package/dist/types/recording-controller/index.d.ts +193 -0
  324. package/dist/types/recording-controller/util.d.ts +13 -0
  325. package/dist/types/roap/index.d.ts +77 -0
  326. package/dist/types/roap/request.d.ts +36 -0
  327. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  328. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  329. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  330. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  331. package/dist/types/transcription/index.d.ts +64 -0
  332. package/package.json +28 -21
  333. package/src/annotation/annotation.types.ts +52 -0
  334. package/src/annotation/constants.ts +36 -0
  335. package/src/annotation/index.ts +343 -0
  336. package/src/breakouts/README.md +220 -0
  337. package/src/breakouts/breakout.ts +163 -0
  338. package/src/breakouts/collection.ts +19 -0
  339. package/src/breakouts/edit-lock-error.ts +25 -0
  340. package/src/breakouts/events.ts +37 -0
  341. package/src/breakouts/index.ts +921 -0
  342. package/src/breakouts/request.ts +55 -0
  343. package/src/breakouts/utils.ts +57 -0
  344. package/src/common/errors/webex-errors.ts +6 -2
  345. package/src/common/logs/logger-proxy.ts +1 -1
  346. package/src/config.ts +5 -7
  347. package/src/constants.ts +155 -20
  348. package/src/controls-options-manager/constants.ts +5 -0
  349. package/src/controls-options-manager/enums.ts +18 -0
  350. package/src/controls-options-manager/index.ts +278 -0
  351. package/src/controls-options-manager/types.ts +59 -0
  352. package/src/controls-options-manager/util.ts +286 -0
  353. package/src/index.ts +34 -0
  354. package/src/locus-info/controlsUtils.ts +108 -0
  355. package/src/locus-info/index.ts +310 -21
  356. package/src/locus-info/mediaSharesUtils.ts +48 -0
  357. package/src/locus-info/parser.ts +2 -1
  358. package/src/locus-info/selfUtils.ts +71 -1
  359. package/src/media/index.ts +70 -142
  360. package/src/media/properties.ts +41 -104
  361. package/src/mediaQualityMetrics/config.ts +379 -377
  362. package/src/meeting/in-meeting-actions.ts +156 -0
  363. package/src/meeting/index.ts +1730 -1768
  364. package/src/meeting/locusMediaRequest.ts +309 -0
  365. package/src/meeting/muteState.ts +228 -132
  366. package/src/meeting/request.ts +100 -91
  367. package/src/meeting/request.type.ts +2 -0
  368. package/src/meeting/util.ts +421 -421
  369. package/src/meeting-info/meeting-info-v2.ts +134 -13
  370. package/src/meeting-info/utilv2.ts +13 -3
  371. package/src/meetings/collection.ts +20 -0
  372. package/src/meetings/index.ts +375 -83
  373. package/src/meetings/meetings.types.ts +9 -0
  374. package/src/meetings/request.ts +3 -1
  375. package/src/meetings/util.ts +103 -4
  376. package/src/member/index.ts +40 -0
  377. package/src/member/types.ts +24 -0
  378. package/src/member/util.ts +81 -1
  379. package/src/members/collection.ts +8 -0
  380. package/src/members/index.ts +108 -6
  381. package/src/members/request.ts +98 -17
  382. package/src/members/types.ts +28 -0
  383. package/src/members/util.ts +319 -240
  384. package/src/metrics/config.ts +49 -10
  385. package/src/metrics/constants.ts +2 -4
  386. package/src/metrics/index.ts +43 -27
  387. package/src/multistream/mediaRequestManager.ts +210 -45
  388. package/src/multistream/receiveSlot.ts +68 -26
  389. package/src/multistream/receiveSlotManager.ts +61 -38
  390. package/src/multistream/remoteMedia.ts +29 -3
  391. package/src/multistream/remoteMediaGroup.ts +61 -2
  392. package/src/multistream/remoteMediaManager.ts +260 -66
  393. package/src/networkQualityMonitor/index.ts +6 -6
  394. package/src/reachability/index.ts +75 -25
  395. package/src/reachability/request.ts +10 -5
  396. package/src/reactions/constants.ts +4 -0
  397. package/src/reactions/reactions.ts +4 -4
  398. package/src/reactions/reactions.type.ts +28 -3
  399. package/src/reconnection-manager/index.ts +53 -32
  400. package/src/recording-controller/enums.ts +8 -0
  401. package/src/recording-controller/index.ts +315 -0
  402. package/src/recording-controller/util.ts +58 -0
  403. package/src/roap/index.ts +21 -30
  404. package/src/roap/request.ts +51 -52
  405. package/src/roap/turnDiscovery.ts +51 -27
  406. package/src/statsAnalyzer/global.ts +1 -94
  407. package/src/statsAnalyzer/index.ts +380 -390
  408. package/src/statsAnalyzer/mqaUtil.ts +106 -99
  409. package/test/integration/spec/converged-space-meetings.js +233 -0
  410. package/test/integration/spec/journey.js +332 -255
  411. package/test/integration/spec/space-meeting.js +78 -5
  412. package/test/integration/spec/transcription.js +1 -1
  413. package/test/unit/spec/annotation/index.ts +436 -0
  414. package/test/unit/spec/breakouts/breakout.ts +203 -0
  415. package/test/unit/spec/breakouts/collection.ts +15 -0
  416. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  417. package/test/unit/spec/breakouts/events.ts +77 -0
  418. package/test/unit/spec/breakouts/index.ts +1790 -0
  419. package/test/unit/spec/breakouts/request.ts +104 -0
  420. package/test/unit/spec/breakouts/utils.js +72 -0
  421. package/test/unit/spec/controls-options-manager/index.js +287 -0
  422. package/test/unit/spec/controls-options-manager/util.js +518 -0
  423. package/test/unit/spec/fixture/locus.js +1 -0
  424. package/test/unit/spec/locus-info/controlsUtils.js +303 -30
  425. package/test/unit/spec/locus-info/index.js +615 -4
  426. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  427. package/test/unit/spec/locus-info/selfConstant.js +38 -0
  428. package/test/unit/spec/locus-info/selfUtils.js +200 -0
  429. package/test/unit/spec/media/index.ts +118 -22
  430. package/test/unit/spec/media/properties.ts +9 -9
  431. package/test/unit/spec/meeting/in-meeting-actions.ts +76 -0
  432. package/test/unit/spec/meeting/index.js +2394 -1381
  433. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  434. package/test/unit/spec/meeting/muteState.js +370 -208
  435. package/test/unit/spec/meeting/request.js +354 -42
  436. package/test/unit/spec/meeting/utils.js +268 -156
  437. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  438. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  439. package/test/unit/spec/meetings/collection.js +14 -0
  440. package/test/unit/spec/meetings/index.js +842 -128
  441. package/test/unit/spec/meetings/utils.js +206 -2
  442. package/test/unit/spec/member/index.js +24 -0
  443. package/test/unit/spec/member/util.js +384 -32
  444. package/test/unit/spec/members/index.js +320 -1
  445. package/test/unit/spec/members/request.js +206 -27
  446. package/test/unit/spec/members/utils.js +184 -0
  447. package/test/unit/spec/metrics/index.js +98 -0
  448. package/test/unit/spec/multistream/mediaRequestManager.ts +676 -105
  449. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  450. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  451. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  452. package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
  453. package/test/unit/spec/multistream/remoteMediaManager.ts +672 -65
  454. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  455. package/test/unit/spec/reachability/index.ts +176 -25
  456. package/test/unit/spec/reachability/request.js +66 -0
  457. package/test/unit/spec/reconnection-manager/index.js +46 -13
  458. package/test/unit/spec/recording-controller/index.js +231 -0
  459. package/test/unit/spec/recording-controller/util.js +102 -0
  460. package/test/unit/spec/roap/index.ts +21 -51
  461. package/test/unit/spec/roap/request.ts +187 -0
  462. package/test/unit/spec/roap/turnDiscovery.ts +73 -34
  463. package/test/unit/spec/stats-analyzer/index.js +94 -43
  464. package/test/utils/constants.js +9 -0
  465. package/test/utils/integrationTestUtils.js +46 -0
  466. package/test/utils/testUtils.js +0 -45
  467. package/test/utils/webex-config.js +4 -0
  468. package/test/utils/webex-test-users.js +7 -3
  469. package/tsconfig.json +6 -0
  470. package/dist/media/internal-media-core-wrapper.js +0 -22
  471. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  472. package/dist/meeting/effectsState.js +0 -334
  473. package/dist/meeting/effectsState.js.map +0 -1
  474. package/dist/multistream/multistreamMedia.js +0 -117
  475. package/dist/multistream/multistreamMedia.js.map +0 -1
  476. package/src/index.js +0 -15
  477. package/src/media/internal-media-core-wrapper.ts +0 -9
  478. package/src/meeting/effectsState.ts +0 -211
  479. package/src/multistream/multistreamMedia.ts +0 -93
  480. package/test/unit/spec/meeting/effectsState.js +0 -281
@@ -0,0 +1,102 @@
1
+ import RecordingUtil from '@webex/plugin-meetings/src/recording-controller/util';
2
+ import RecordingAction from '@webex/plugin-meetings/src/recording-controller/enums';
3
+ import { assert } from 'chai';
4
+
5
+ describe('plugin-meetings', () => {
6
+ describe('recording-controller tests', () => {
7
+ describe('recording util tests', () => {
8
+
9
+ let locusInfo;
10
+
11
+ beforeEach(() => {
12
+ locusInfo = {
13
+ parsedLocus: {
14
+ info: {
15
+ userDisplayHints: [],
16
+ },
17
+ },
18
+ };
19
+ });
20
+
21
+ describe('canUserStart', () => {
22
+ it('can start recording when the correct display hint is present', () => {
23
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_START');
24
+
25
+ assert.equal(RecordingUtil.canUserStart(locusInfo.parsedLocus.info.userDisplayHints), true);
26
+ });
27
+
28
+ it('rejects when correct display hint is not present', () => {
29
+ assert.equal(RecordingUtil.canUserStart(locusInfo.parsedLocus.info.userDisplayHints), false);
30
+ });
31
+ });
32
+
33
+ describe('canUserPause', () => {
34
+ it('can pause recording when the correct display hint is present', () => {
35
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_PAUSE');
36
+
37
+ assert.equal(RecordingUtil.canUserPause(locusInfo.parsedLocus.info.userDisplayHints), true);
38
+ });
39
+
40
+ it('rejects when correct display hint is not present', () => {
41
+ assert.equal(RecordingUtil.canUserPause(locusInfo.parsedLocus.info.userDisplayHints), false);
42
+ });
43
+ });
44
+
45
+ describe('canUserStop', () => {
46
+ it('can stop recording when the correct display hint is present', () => {
47
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_STOP');
48
+
49
+ assert.equal(RecordingUtil.canUserStop(locusInfo.parsedLocus.info.userDisplayHints), true);
50
+ });
51
+
52
+ it('rejects when correct display hint is not present', () => {
53
+ assert.equal(RecordingUtil.canUserStop(locusInfo.parsedLocus.info.userDisplayHints), false);
54
+ });
55
+ });
56
+
57
+ describe('canUserResume', () => {
58
+ it('can start recording when the correct display hint is present', () => {
59
+ locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_RESUME');
60
+
61
+ assert.equal(RecordingUtil.canUserResume(locusInfo.parsedLocus.info.userDisplayHints), true);
62
+ });
63
+
64
+ it('rejects when correct display hint is not present', () => {
65
+ assert.equal(RecordingUtil.canUserResume(locusInfo.parsedLocus.info.userDisplayHints), false);
66
+ });
67
+ });
68
+
69
+ describe('deriveRecordingStates', () => {
70
+ it('gets the correct values for a start recording action', () => {
71
+ assert.deepEqual(RecordingUtil.deriveRecordingStates(RecordingAction.Start), {recording: true, paused: false});
72
+ });
73
+
74
+ it('gets the correct values for a stop recording action', () => {
75
+ assert.deepEqual(RecordingUtil.deriveRecordingStates(RecordingAction.Stop), {recording: false, paused: false});
76
+ });
77
+
78
+ it('gets the correct values for a resume recording action', () => {
79
+ assert.deepEqual(RecordingUtil.deriveRecordingStates(RecordingAction.Resume), {recording: true, paused: false});
80
+ });
81
+
82
+ it('gets the correct values for a paused recording action', () => {
83
+ assert.deepEqual(RecordingUtil.deriveRecordingStates(RecordingAction.Pause), {recording: true, paused: true});
84
+ });
85
+ });
86
+
87
+ describe('extractLocusId', () => {
88
+ it('gets the correct id from the url param', () => {
89
+ assert.equal(RecordingUtil.extractLocusId('test/id'), 'id');
90
+ });
91
+
92
+ it('works with empty string parameters passed', () => {
93
+ assert.equal(RecordingUtil.extractLocusId(''), '');
94
+ });
95
+
96
+ it('works with no parameters passed', () => {
97
+ assert.isUndefined(RecordingUtil.extractLocusId(undefined));
98
+ });
99
+ });
100
+ });
101
+ });
102
+ });
@@ -4,12 +4,13 @@ import TurnDiscovery from '@webex/plugin-meetings/src/roap/turnDiscovery';
4
4
 
5
5
  import RoapRequest from '@webex/plugin-meetings/src/roap/request';
6
6
  import Roap from '@webex/plugin-meetings/src/roap/';
7
+ import Meeting from '@webex/plugin-meetings/src/meeting';
7
8
 
8
9
  describe('Roap', () => {
9
10
  describe('doTurnDiscovery', () => {
10
11
  it('calls this.turnDiscovery.doTurnDiscovery() and forwards all the arguments', async () => {
11
12
  const RESULT = {something: 'some value'};
12
- const meeting = {id: 'some meeting id'};
13
+ const meeting = {id: 'some meeting id'} as Meeting;
13
14
 
14
15
  const doTurnDiscoveryStub = sinon
15
16
  .stub(TurnDiscovery.prototype, 'doTurnDiscovery')
@@ -45,11 +46,16 @@ describe('Roap', () => {
45
46
  correlationId: 'correlation id',
46
47
  selfUrl: 'self url',
47
48
  mediaId: 'media id',
48
- isMultistream: false,
49
- isAudioMuted: () => true,
50
- isVideoMuted: () => false,
49
+ audio:{
50
+ isLocallyMuted: () => true,
51
+ },
52
+ video:{
53
+ isLocallyMuted: () => false,
54
+ },
51
55
  setRoapSeq: sinon.stub(),
52
56
  config: {experimental: {enableTurnDiscovery: false}},
57
+ locusMediaRequest: {fake: true},
58
+ webex: { meetings: { reachability: { isAnyClusterReachable: () => true}}},
53
59
  };
54
60
 
55
61
  sendRoapStub = sinon.stub(RoapRequest.prototype, 'sendRoap').resolves({});
@@ -61,20 +67,20 @@ describe('Roap', () => {
61
67
  });
62
68
 
63
69
  [
64
- {reconnect: true, enableTurnDiscovery: true, expectEmptyMediaId: false},
65
- {reconnect: true, enableTurnDiscovery: false, expectEmptyMediaId: true},
66
- {reconnect: false, enableTurnDiscovery: true, expectEmptyMediaId: false},
67
- {reconnect: false, enableTurnDiscovery: false, expectEmptyMediaId: false},
68
- ].forEach(({reconnect, enableTurnDiscovery, expectEmptyMediaId}) =>
70
+ {reconnect: true, turnDiscoverySkipped: false, expectEmptyMediaId: false},
71
+ {reconnect: true, turnDiscoverySkipped: true, expectEmptyMediaId: true},
72
+ {reconnect: false, turnDiscoverySkipped: false, expectEmptyMediaId: false},
73
+ {reconnect: false, turnDiscoverySkipped: true, expectEmptyMediaId: false},
74
+ ].forEach(({reconnect, turnDiscoverySkipped, expectEmptyMediaId}) =>
69
75
  it(`sends roap OFFER with ${expectEmptyMediaId ? 'empty ' : ''}mediaId when ${
70
76
  reconnect ? '' : 'not '
71
77
  }reconnecting and TURN discovery is ${
72
- enableTurnDiscovery ? 'enabled' : 'disabled'
78
+ turnDiscoverySkipped ? 'skipped' : 'not skipped'
73
79
  }`, async () => {
74
- meeting.config.experimental.enableTurnDiscovery = enableTurnDiscovery;
75
-
76
80
  const roap = new Roap({}, {parent: 'fake'});
77
81
 
82
+ sinon.stub(roap.turnDiscovery, 'isSkipped').resolves(turnDiscoverySkipped);
83
+
78
84
  await roap.sendRoapMediaRequest({
79
85
  meeting,
80
86
  sdp: 'sdp',
@@ -92,50 +98,14 @@ describe('Roap', () => {
92
98
  };
93
99
 
94
100
  assert.calledOnce(sendRoapStub);
95
- assert.calledWith(sendRoapStub, {
101
+ assert.calledWith(sendRoapStub, sinon.match({
96
102
  roapMessage: expectedRoapMessage,
97
- correlationId: meeting.correlationId,
98
103
  locusSelfUrl: meeting.selfUrl,
99
104
  mediaId: expectEmptyMediaId ? '' : meeting.mediaId,
100
- audioMuted: meeting.isAudioMuted(),
101
- videoMuted: meeting.isVideoMuted(),
102
105
  meetingId: meeting.id,
103
- preferTranscoding: true,
104
- });
106
+ locusMediaRequest: meeting.locusMediaRequest,
107
+ }));
105
108
  })
106
109
  );
107
- it('sends roap request with preferTranscoding=false for multistream meetings', async () => {
108
- const roap = new Roap({}, {parent: 'fake'});
109
-
110
- meeting.isMultistream = true;
111
-
112
- await roap.sendRoapMediaRequest({
113
- meeting,
114
- sdp: 'sdp',
115
- reconnect: false,
116
- seq: 10,
117
- tieBreaker: 1,
118
- });
119
-
120
- const expectedRoapMessage = {
121
- messageType: 'OFFER',
122
- sdps: ['sdp'],
123
- version: '2',
124
- seq: 10,
125
- tieBreaker: 1,
126
- };
127
-
128
- assert.calledOnce(sendRoapStub);
129
- assert.calledWith(sendRoapStub, {
130
- roapMessage: expectedRoapMessage,
131
- correlationId: meeting.correlationId,
132
- locusSelfUrl: meeting.selfUrl,
133
- mediaId: meeting.mediaId,
134
- audioMuted: meeting.isAudioMuted(),
135
- videoMuted: meeting.isVideoMuted(),
136
- meetingId: meeting.id,
137
- preferTranscoding: false,
138
- });
139
- });
140
110
  });
141
111
  });
@@ -0,0 +1,187 @@
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 Metrics from '@webex/plugin-meetings/src/metrics';
7
+ import {REACHABILITY} from '@webex/plugin-meetings/src/constants';
8
+
9
+ describe('plugin-meetings/roap', () => {
10
+ let roapRequest;
11
+ let webex;
12
+ const locusUrl = 'locusUrl';
13
+
14
+ beforeEach(async () => {
15
+ webex = new MockWebex({
16
+ children: {
17
+ meetings: Meetings,
18
+ },
19
+ });
20
+
21
+ webex.meetings.clientRegion = {
22
+ countryCode: 'US',
23
+ regionCode: 'WEST-COAST',
24
+ };
25
+
26
+ webex.internal = {
27
+ services: {
28
+ get: sinon.mock().returns(locusUrl),
29
+ waitForCatalog: sinon.mock().returns(Promise.resolve({})),
30
+ },
31
+ device: {
32
+ url: 'url',
33
+ },
34
+ };
35
+
36
+ // @ts-ignore
37
+ roapRequest = new RoapRequest({webex});
38
+
39
+ roapRequest.request = sinon.mock().returns(
40
+ Promise.resolve({
41
+ body: {
42
+ locus: {
43
+ roapSeq: '',
44
+ id: '',
45
+ url: 'url/path',
46
+ fullState: {
47
+ lastActive: 'lastActive',
48
+ },
49
+ },
50
+ },
51
+ })
52
+ );
53
+
54
+ Metrics.postEvent = sinon.stub().returns();
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: 'test',
69
+ },
70
+ })
71
+ );
72
+ });
73
+
74
+ describe('#attachReachabilityData', () => {
75
+ it('returns the correct reachability data', async () => {
76
+ const res = await roapRequest.attachReachabilityData({});
77
+
78
+ assert.deepEqual(res.localSdp, {
79
+ reachability: {
80
+ clusterId: {
81
+ udp: 'test',
82
+ },
83
+ },
84
+ });
85
+ assert.deepEqual(res.joinCookie, {
86
+ anycastEntryPoint: 'aws-eu-west-1',
87
+ });
88
+ });
89
+
90
+ it('handles the case when reachability data does not exist', async () => {
91
+ await webex.boundedStorage.del(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie);
92
+
93
+ await webex.boundedStorage.del(REACHABILITY.namespace, REACHABILITY.localStorageResult);
94
+ const sdp = {
95
+ some: 'attribute',
96
+ };
97
+
98
+ const result = await roapRequest.attachReachabilityData(sdp);
99
+
100
+ assert.deepEqual(result, {
101
+ joinCookie: undefined,
102
+ localSdp: {
103
+ some: 'attribute',
104
+ },
105
+ });
106
+ });
107
+ });
108
+
109
+ describe('sendRoap', () => {
110
+ it('includes joinCookie in the request correctly', async () => {
111
+ const locusMediaRequest = { send: sinon.stub().resolves({body: {locus: {}}})};
112
+
113
+ await roapRequest.sendRoap({
114
+ locusSelfUrl: locusUrl,
115
+ mediaId: 'mediaId',
116
+ roapMessage: {
117
+ seq: 'seq',
118
+ },
119
+ locusMediaRequest,
120
+ });
121
+
122
+ const requestParams = locusMediaRequest.send.getCall(0).args[0];
123
+ assert.deepEqual(requestParams, {
124
+ type: 'RoapMessage',
125
+ selfUrl: locusUrl,
126
+ joinCookie: {
127
+ anycastEntryPoint: 'aws-eu-west-1',
128
+ },
129
+ mediaId: 'mediaId',
130
+ roapMessage: {
131
+ seq: 'seq',
132
+ },
133
+ reachability: {clusterId:{udp:"test"}},
134
+ });
135
+ });
136
+ });
137
+
138
+ it('calls attachReachabilityData when sendRoap', async () => {
139
+ const locusMediaRequest = { send: sinon.stub().resolves({body: {locus: {}}})};
140
+
141
+ const newSdp = {
142
+ new: 'sdp',
143
+ reachability: { someResult: 'whatever' }
144
+ };
145
+
146
+ roapRequest.attachReachabilityData = sinon.stub().returns(
147
+ Promise.resolve({
148
+ localSdp: newSdp,
149
+ joinCookie: {
150
+ anycastEntryPoint: 'aws-eu-west-1',
151
+ },
152
+ })
153
+ );
154
+
155
+ await roapRequest.sendRoap({
156
+ roapMessage: {
157
+ seq: 1,
158
+ },
159
+ locusSelfUrl: 'locusSelfUrl',
160
+ mediaId: 'mediaId',
161
+ meetingId: 'meetingId',
162
+ preferTranscoding: true,
163
+ locusMediaRequest
164
+ });
165
+
166
+ const requestParams = locusMediaRequest.send.getCall(0).args[0];
167
+
168
+ assert.deepEqual(requestParams, {
169
+ type: 'RoapMessage',
170
+ selfUrl: 'locusSelfUrl',
171
+ joinCookie: {
172
+ anycastEntryPoint: 'aws-eu-west-1',
173
+ },
174
+ mediaId: 'mediaId',
175
+ roapMessage: {
176
+ seq: 1,
177
+ },
178
+ reachability: { someResult: 'whatever' },
179
+ });
180
+
181
+ assert.calledOnceWithExactly(roapRequest.attachReachabilityData, {
182
+ roapMessage: {
183
+ seq: 1,
184
+ },
185
+ });
186
+ });
187
+ });
@@ -40,13 +40,19 @@ describe('TurnDiscovery', () => {
40
40
  mediaId: 'fake media id',
41
41
  locusUrl: `https://locus-a.wbx2.com/locus/api/v1/loci/${FAKE_LOCUS_ID}`,
42
42
  roapSeq: -1,
43
- isAudioMuted: () => true,
44
- isVideoMuted: () => false,
43
+ audio:{
44
+ isLocallyMuted: () => true,
45
+ },
46
+ video:{
47
+ isLocallyMuted: () => false,
48
+ },
45
49
  setRoapSeq: sinon.fake((newSeq) => {
46
50
  testMeeting.roapSeq = newSeq;
47
51
  }),
48
52
  updateMediaConnections: sinon.stub(),
49
- webex: {meetings: {reachability: {isAnyClusterReachable: () => false}}},
53
+ webex: {meetings: {reachability: {isAnyClusterReachable: () => Promise.resolve(false)}}},
54
+ isMultistream: false,
55
+ locusMediaRequest: { fake: true },
50
56
  };
51
57
  });
52
58
 
@@ -69,12 +75,10 @@ describe('TurnDiscovery', () => {
69
75
  version: '2',
70
76
  seq: expectedSeq,
71
77
  },
72
- correlationId: testMeeting.correlationId,
73
78
  locusSelfUrl: testMeeting.selfUrl,
74
79
  mediaId: expectedMediaId,
75
- audioMuted: testMeeting.isAudioMuted(),
76
- videoMuted: testMeeting.isVideoMuted(),
77
80
  meetingId: testMeeting.id,
81
+ locusMediaRequest: testMeeting.locusMediaRequest
78
82
  });
79
83
 
80
84
  if (messageType === 'TURN_DISCOVERY_REQUEST') {
@@ -97,39 +101,44 @@ describe('TurnDiscovery', () => {
97
101
  };
98
102
 
99
103
  describe('doTurnDiscovery', () => {
100
- it('sends TURN_DISCOVERY_REQUEST, waits for response and sends OK', async () => {
101
- const td = new TurnDiscovery(mockRoapRequest);
104
+ [false, true].forEach(function (enabledMultistream ) {
105
+ it('sends TURN_DISCOVERY_REQUEST'+ (enabledMultistream ? ' when enable Multistream':'') + ', waits for response and sends OK', async () => {
106
+ testMeeting.isMultistream = enabledMultistream;
102
107
 
103
- const result = td.doTurnDiscovery(testMeeting, false);
108
+ const td = new TurnDiscovery(mockRoapRequest);
104
109
 
105
- // check that TURN_DISCOVERY_REQUEST was sent
106
- await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
110
+ const result = td.doTurnDiscovery(testMeeting, false);
107
111
 
108
- mockRoapRequest.sendRoap.resetHistory();
112
+ // check that TURN_DISCOVERY_REQUEST was sent
113
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
109
114
 
110
- // simulate the response
111
- td.handleTurnDiscoveryResponse({
112
- headers: [
113
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
114
- `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
115
- `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
116
- ],
117
- });
115
+ // @ts-ignore
116
+ mockRoapRequest.sendRoap.resetHistory();
118
117
 
119
- await testUtils.flushPromises();
118
+ // simulate the response
119
+ td.handleTurnDiscoveryResponse({
120
+ headers: [
121
+ `x-cisco-turn-url=${FAKE_TURN_URL}`,
122
+ `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
123
+ `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
124
+ ]
125
+ });
120
126
 
121
- // check that we've sent OK
122
- await checkRoapMessageSent('OK', 0);
127
+ await testUtils.flushPromises();
123
128
 
124
- const {turnServerInfo, turnDiscoverySkippedReason} = await result;
129
+ // check that we've sent OK
130
+ await checkRoapMessageSent('OK', 0);
125
131
 
126
- assert.deepEqual(turnServerInfo, {
127
- url: FAKE_TURN_URL,
128
- username: FAKE_TURN_USERNAME,
129
- password: FAKE_TURN_PASSWORD,
130
- });
132
+ const {turnServerInfo, turnDiscoverySkippedReason} = await result;
131
133
 
132
- assert.isUndefined(turnDiscoverySkippedReason);
134
+ assert.deepEqual(turnServerInfo, {
135
+ url: FAKE_TURN_URL,
136
+ username: FAKE_TURN_USERNAME,
137
+ password: FAKE_TURN_PASSWORD
138
+ });
139
+
140
+ assert.isUndefined(turnDiscoverySkippedReason);
141
+ });
133
142
  });
134
143
 
135
144
  it('sends TURN_DISCOVERY_REQUEST with empty mediaId when isReconnecting is true', async () => {
@@ -141,6 +150,7 @@ describe('TurnDiscovery', () => {
141
150
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0, '');
142
151
 
143
152
  // the main part of the test is complete now, checking the remaining part of the flow just for completeness
153
+ // @ts-ignore
144
154
  mockRoapRequest.sendRoap.resetHistory();
145
155
 
146
156
  // simulate the response
@@ -173,7 +183,7 @@ describe('TurnDiscovery', () => {
173
183
 
174
184
  // check that TURN_DISCOVERY_REQUEST was sent
175
185
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
176
-
186
+ // @ts-ignore
177
187
  mockRoapRequest.sendRoap.resetHistory();
178
188
 
179
189
  // simulate the response with some extra headers
@@ -206,7 +216,7 @@ describe('TurnDiscovery', () => {
206
216
  const prevConfigValue = testMeeting.config.experimental.enableTurnDiscovery;
207
217
 
208
218
  testMeeting.config.experimental.enableTurnDiscovery = false;
209
-
219
+ // @ts-ignore
210
220
  const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
211
221
 
212
222
  const {turnServerInfo, turnDiscoverySkippedReason} = result;
@@ -236,7 +246,7 @@ describe('TurnDiscovery', () => {
236
246
 
237
247
  it('resolves with undefined when cluster is reachable', async () => {
238
248
  const prev = testMeeting.webex.meetings.reachability.isAnyClusterReachable;
239
- testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => true;
249
+ testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => Promise.resolve(true);
240
250
  const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
241
251
 
242
252
  const {turnServerInfo, turnDiscoverySkippedReason} = result;
@@ -267,6 +277,8 @@ describe('TurnDiscovery', () => {
267
277
  const td = new TurnDiscovery(mockRoapRequest);
268
278
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
269
279
 
280
+ await testUtils.flushPromises();
281
+
270
282
  // simulate the response without the password
271
283
  td.handleTurnDiscoveryResponse({
272
284
  headers: [
@@ -286,6 +298,8 @@ describe('TurnDiscovery', () => {
286
298
  const td = new TurnDiscovery(mockRoapRequest);
287
299
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
288
300
 
301
+ await testUtils.flushPromises();
302
+
289
303
  // simulate the response without the headers
290
304
  td.handleTurnDiscoveryResponse({});
291
305
 
@@ -301,6 +315,8 @@ describe('TurnDiscovery', () => {
301
315
  const td = new TurnDiscovery(mockRoapRequest);
302
316
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
303
317
 
318
+ await testUtils.flushPromises();
319
+
304
320
  // simulate the response without the headers
305
321
  td.handleTurnDiscoveryResponse({headers: []});
306
322
 
@@ -317,9 +333,11 @@ describe('TurnDiscovery', () => {
317
333
 
318
334
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
319
335
 
336
+ await testUtils.flushPromises();
337
+
320
338
  // check that TURN_DISCOVERY_REQUEST was sent
321
339
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
322
-
340
+ // @ts-ignore
323
341
  mockRoapRequest.sendRoap.resetHistory();
324
342
 
325
343
  // setup the mock so that sending of OK fails
@@ -347,6 +365,27 @@ describe('TurnDiscovery', () => {
347
365
  });
348
366
  });
349
367
 
368
+ describe('isSkipped', () => {
369
+ [
370
+ {enabledInConfig: true, isAnyClusterReachable: true, expectedIsSkipped: true},
371
+ {enabledInConfig: true, isAnyClusterReachable: false, expectedIsSkipped: false},
372
+ {enabledInConfig: false, isAnyClusterReachable: true, expectedIsSkipped: true},
373
+ {enabledInConfig: false, isAnyClusterReachable: false, expectedIsSkipped: true},
374
+ ].forEach(({enabledInConfig, isAnyClusterReachable, expectedIsSkipped}) => {
375
+ it(`returns ${expectedIsSkipped} when TURN discovery is ${enabledInConfig ? '' : 'not '} enabled in config and isAnyClusterReachable() returns ${isAnyClusterReachable ? 'true' : 'false'}`, async () => {
376
+ testMeeting.config.experimental.enableTurnDiscovery = enabledInConfig;
377
+
378
+ sinon.stub(testMeeting.webex.meetings.reachability, 'isAnyClusterReachable').resolves(isAnyClusterReachable);
379
+
380
+ const td = new TurnDiscovery(mockRoapRequest);
381
+
382
+ const isSkipped = await td.isSkipped(testMeeting);
383
+
384
+ assert.equal(isSkipped, expectedIsSkipped);
385
+ })
386
+ })
387
+ })
388
+
350
389
  describe('handleTurnDiscoveryResponse', () => {
351
390
  it("doesn't do anything if turn discovery was not started", () => {
352
391
  const td = new TurnDiscovery(mockRoapRequest);