@webex/plugin-meetings 3.0.0-beta.4 → 3.0.0-beta.41

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 (498) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/breakouts/breakout.js +137 -0
  4. package/dist/breakouts/breakout.js.map +1 -0
  5. package/dist/breakouts/collection.js +23 -0
  6. package/dist/breakouts/collection.js.map +1 -0
  7. package/dist/breakouts/edit-lock-error.js +52 -0
  8. package/dist/breakouts/edit-lock-error.js.map +1 -0
  9. package/dist/breakouts/index.js +546 -0
  10. package/dist/breakouts/index.js.map +1 -0
  11. package/dist/breakouts/request.js +78 -0
  12. package/dist/breakouts/request.js.map +1 -0
  13. package/dist/breakouts/utils.js +48 -0
  14. package/dist/breakouts/utils.js.map +1 -0
  15. package/dist/common/browser-detection.js +1 -20
  16. package/dist/common/browser-detection.js.map +1 -1
  17. package/dist/common/collection.js +5 -20
  18. package/dist/common/collection.js.map +1 -1
  19. package/dist/common/config.js +0 -7
  20. package/dist/common/config.js.map +1 -1
  21. package/dist/common/errors/captcha-error.js +10 -24
  22. package/dist/common/errors/captcha-error.js.map +1 -1
  23. package/dist/common/errors/intent-to-join.js +11 -24
  24. package/dist/common/errors/intent-to-join.js.map +1 -1
  25. package/dist/common/errors/join-meeting.js +12 -25
  26. package/dist/common/errors/join-meeting.js.map +1 -1
  27. package/dist/common/errors/media.js +10 -24
  28. package/dist/common/errors/media.js.map +1 -1
  29. package/dist/common/errors/parameter.js +5 -33
  30. package/dist/common/errors/parameter.js.map +1 -1
  31. package/dist/common/errors/password-error.js +10 -24
  32. package/dist/common/errors/password-error.js.map +1 -1
  33. package/dist/common/errors/permission.js +9 -23
  34. package/dist/common/errors/permission.js.map +1 -1
  35. package/dist/common/errors/reconnection-in-progress.js +0 -17
  36. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  37. package/dist/common/errors/reconnection.js +10 -24
  38. package/dist/common/errors/reconnection.js.map +1 -1
  39. package/dist/common/errors/stats.js +10 -24
  40. package/dist/common/errors/stats.js.map +1 -1
  41. package/dist/common/errors/webex-errors.js +6 -41
  42. package/dist/common/errors/webex-errors.js.map +1 -1
  43. package/dist/common/errors/webex-meetings-error.js +5 -25
  44. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  45. package/dist/common/events/events-scope.js +0 -22
  46. package/dist/common/events/events-scope.js.map +1 -1
  47. package/dist/common/events/events.js +0 -23
  48. package/dist/common/events/events.js.map +1 -1
  49. package/dist/common/events/trigger-proxy.js +0 -12
  50. package/dist/common/events/trigger-proxy.js.map +1 -1
  51. package/dist/common/events/util.js +0 -15
  52. package/dist/common/events/util.js.map +1 -1
  53. package/dist/common/logs/logger-config.js +0 -4
  54. package/dist/common/logs/logger-config.js.map +1 -1
  55. package/dist/common/logs/logger-proxy.js +1 -8
  56. package/dist/common/logs/logger-proxy.js.map +1 -1
  57. package/dist/common/logs/request.js +37 -60
  58. package/dist/common/logs/request.js.map +1 -1
  59. package/dist/common/queue.js +4 -14
  60. package/dist/common/queue.js.map +1 -1
  61. package/dist/config.js +6 -6
  62. package/dist/config.js.map +1 -1
  63. package/dist/constants.js +109 -49
  64. package/dist/constants.js.map +1 -1
  65. package/dist/controls-options-manager/constants.js +14 -0
  66. package/dist/controls-options-manager/constants.js.map +1 -0
  67. package/dist/controls-options-manager/enums.js +15 -0
  68. package/dist/controls-options-manager/enums.js.map +1 -0
  69. package/dist/controls-options-manager/index.js +203 -0
  70. package/dist/controls-options-manager/index.js.map +1 -0
  71. package/dist/controls-options-manager/util.js +28 -0
  72. package/dist/controls-options-manager/util.js.map +1 -0
  73. package/dist/index.js +11 -18
  74. package/dist/index.js.map +1 -1
  75. package/dist/locus-info/controlsUtils.js +12 -29
  76. package/dist/locus-info/controlsUtils.js.map +1 -1
  77. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  78. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  79. package/dist/locus-info/fullState.js +0 -15
  80. package/dist/locus-info/fullState.js.map +1 -1
  81. package/dist/locus-info/hostUtils.js +4 -12
  82. package/dist/locus-info/hostUtils.js.map +1 -1
  83. package/dist/locus-info/index.js +186 -192
  84. package/dist/locus-info/index.js.map +1 -1
  85. package/dist/locus-info/infoUtils.js +3 -37
  86. package/dist/locus-info/infoUtils.js.map +1 -1
  87. package/dist/locus-info/mediaSharesUtils.js +12 -38
  88. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  89. package/dist/locus-info/parser.js +92 -118
  90. package/dist/locus-info/parser.js.map +1 -1
  91. package/dist/locus-info/selfUtils.js +34 -91
  92. package/dist/locus-info/selfUtils.js.map +1 -1
  93. package/dist/media/index.js +66 -153
  94. package/dist/media/index.js.map +1 -1
  95. package/dist/media/properties.js +83 -117
  96. package/dist/media/properties.js.map +1 -1
  97. package/dist/media/util.js +2 -9
  98. package/dist/media/util.js.map +1 -1
  99. package/dist/mediaQualityMetrics/config.js +505 -495
  100. package/dist/mediaQualityMetrics/config.js.map +1 -1
  101. package/dist/meeting/in-meeting-actions.js +13 -14
  102. package/dist/meeting/in-meeting-actions.js.map +1 -1
  103. package/dist/meeting/index.js +2141 -2210
  104. package/dist/meeting/index.js.map +1 -1
  105. package/dist/meeting/muteState.js +59 -82
  106. package/dist/meeting/muteState.js.map +1 -1
  107. package/dist/meeting/request.js +308 -264
  108. package/dist/meeting/request.js.map +1 -1
  109. package/dist/meeting/request.type.js +7 -0
  110. package/dist/meeting/request.type.js.map +1 -0
  111. package/dist/meeting/state.js +21 -31
  112. package/dist/meeting/state.js.map +1 -1
  113. package/dist/meeting/util.js +45 -217
  114. package/dist/meeting/util.js.map +1 -1
  115. package/dist/meeting-info/collection.js +6 -25
  116. package/dist/meeting-info/collection.js.map +1 -1
  117. package/dist/meeting-info/index.js +14 -32
  118. package/dist/meeting-info/index.js.map +1 -1
  119. package/dist/meeting-info/meeting-info-v2.js +193 -268
  120. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  121. package/dist/meeting-info/request.js +3 -15
  122. package/dist/meeting-info/request.js.map +1 -1
  123. package/dist/meeting-info/util.js +98 -183
  124. package/dist/meeting-info/util.js.map +1 -1
  125. package/dist/meeting-info/utilv2.js +137 -228
  126. package/dist/meeting-info/utilv2.js.map +1 -1
  127. package/dist/meetings/collection.js +5 -20
  128. package/dist/meetings/collection.js.map +1 -1
  129. package/dist/meetings/index.js +490 -560
  130. package/dist/meetings/index.js.map +1 -1
  131. package/dist/meetings/request.js +24 -41
  132. package/dist/meetings/request.js.map +1 -1
  133. package/dist/meetings/util.js +116 -155
  134. package/dist/meetings/util.js.map +1 -1
  135. package/dist/member/index.js +78 -86
  136. package/dist/member/index.js.map +1 -1
  137. package/dist/member/util.js +31 -68
  138. package/dist/member/util.js.map +1 -1
  139. package/dist/members/collection.js +3 -12
  140. package/dist/members/collection.js.map +1 -1
  141. package/dist/members/index.js +95 -200
  142. package/dist/members/index.js.map +1 -1
  143. package/dist/members/request.js +16 -39
  144. package/dist/members/request.js.map +1 -1
  145. package/dist/members/util.js +9 -38
  146. package/dist/members/util.js.map +1 -1
  147. package/dist/metrics/config.js +1 -13
  148. package/dist/metrics/config.js.map +1 -1
  149. package/dist/metrics/constants.js +1 -6
  150. package/dist/metrics/constants.js.map +1 -1
  151. package/dist/metrics/index.js +54 -156
  152. package/dist/metrics/index.js.map +1 -1
  153. package/dist/multistream/mediaRequestManager.js +74 -52
  154. package/dist/multistream/mediaRequestManager.js.map +1 -1
  155. package/dist/multistream/receiveSlot.js +48 -65
  156. package/dist/multistream/receiveSlot.js.map +1 -1
  157. package/dist/multistream/receiveSlotManager.js +60 -82
  158. package/dist/multistream/receiveSlotManager.js.map +1 -1
  159. package/dist/multistream/remoteMedia.js +60 -76
  160. package/dist/multistream/remoteMedia.js.map +1 -1
  161. package/dist/multistream/remoteMediaGroup.js +6 -40
  162. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  163. package/dist/multistream/remoteMediaManager.js +360 -413
  164. package/dist/multistream/remoteMediaManager.js.map +1 -1
  165. package/dist/networkQualityMonitor/index.js +40 -59
  166. package/dist/networkQualityMonitor/index.js.map +1 -1
  167. package/dist/personal-meeting-room/index.js +21 -45
  168. package/dist/personal-meeting-room/index.js.map +1 -1
  169. package/dist/personal-meeting-room/request.js +1 -31
  170. package/dist/personal-meeting-room/request.js.map +1 -1
  171. package/dist/personal-meeting-room/util.js +0 -13
  172. package/dist/personal-meeting-room/util.js.map +1 -1
  173. package/dist/reachability/index.js +147 -183
  174. package/dist/reachability/index.js.map +1 -1
  175. package/dist/reachability/request.js +15 -23
  176. package/dist/reachability/request.js.map +1 -1
  177. package/dist/reactions/constants.js +13 -0
  178. package/dist/reactions/constants.js.map +1 -0
  179. package/dist/reactions/reactions.js +109 -0
  180. package/dist/reactions/reactions.js.map +1 -0
  181. package/dist/reactions/reactions.type.js +36 -0
  182. package/dist/reactions/reactions.type.js.map +1 -0
  183. package/dist/reconnection-manager/index.js +322 -456
  184. package/dist/reconnection-manager/index.js.map +1 -1
  185. package/dist/recording-controller/enums.js +17 -0
  186. package/dist/recording-controller/enums.js.map +1 -0
  187. package/dist/recording-controller/index.js +343 -0
  188. package/dist/recording-controller/index.js.map +1 -0
  189. package/dist/recording-controller/util.js +63 -0
  190. package/dist/recording-controller/util.js.map +1 -0
  191. package/dist/roap/index.js +48 -70
  192. package/dist/roap/index.js.map +1 -1
  193. package/dist/roap/request.js +143 -131
  194. package/dist/roap/request.js.map +1 -1
  195. package/dist/roap/turnDiscovery.js +91 -98
  196. package/dist/roap/turnDiscovery.js.map +1 -1
  197. package/dist/statsAnalyzer/global.js +1 -95
  198. package/dist/statsAnalyzer/global.js.map +1 -1
  199. package/dist/statsAnalyzer/index.js +361 -449
  200. package/dist/statsAnalyzer/index.js.map +1 -1
  201. package/dist/statsAnalyzer/mqaUtil.js +137 -81
  202. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  203. package/dist/transcription/index.js +22 -47
  204. package/dist/transcription/index.js.map +1 -1
  205. package/dist/types/breakouts/breakout.d.ts +8 -0
  206. package/dist/types/breakouts/collection.d.ts +5 -0
  207. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  208. package/dist/types/breakouts/index.d.ts +5 -0
  209. package/dist/types/breakouts/request.d.ts +22 -0
  210. package/dist/types/breakouts/utils.d.ts +8 -0
  211. package/dist/types/common/browser-detection.d.ts +9 -0
  212. package/dist/types/common/collection.d.ts +48 -0
  213. package/dist/types/common/config.d.ts +2 -0
  214. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  215. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  216. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  217. package/dist/types/common/errors/media.d.ts +15 -0
  218. package/dist/types/common/errors/parameter.d.ts +15 -0
  219. package/dist/types/common/errors/password-error.d.ts +15 -0
  220. package/dist/types/common/errors/permission.d.ts +14 -0
  221. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  222. package/dist/types/common/errors/reconnection.d.ts +15 -0
  223. package/dist/types/common/errors/stats.d.ts +15 -0
  224. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  225. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  226. package/dist/types/common/events/events-scope.d.ts +17 -0
  227. package/dist/types/common/events/events.d.ts +12 -0
  228. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  229. package/dist/types/common/events/util.d.ts +2 -0
  230. package/dist/types/common/logs/logger-config.d.ts +2 -0
  231. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  232. package/dist/types/common/logs/request.d.ts +34 -0
  233. package/dist/types/common/queue.d.ts +32 -0
  234. package/dist/types/config.d.ts +77 -0
  235. package/dist/types/constants.d.ts +916 -0
  236. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  237. package/dist/types/controls-options-manager/enums.d.ts +5 -0
  238. package/dist/types/controls-options-manager/index.d.ts +120 -0
  239. package/dist/types/controls-options-manager/util.d.ts +7 -0
  240. package/dist/types/index.d.ts +6 -0
  241. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  242. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  243. package/dist/types/locus-info/fullState.d.ts +2 -0
  244. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  245. package/dist/types/locus-info/index.d.ts +269 -0
  246. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  247. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  248. package/dist/types/locus-info/parser.d.ts +212 -0
  249. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  250. package/dist/types/media/index.d.ts +32 -0
  251. package/dist/types/media/properties.d.ts +108 -0
  252. package/dist/types/media/util.d.ts +2 -0
  253. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  254. package/dist/types/meeting/in-meeting-actions.d.ts +83 -0
  255. package/dist/types/meeting/index.d.ts +1699 -0
  256. package/dist/types/meeting/muteState.d.ts +116 -0
  257. package/dist/types/meeting/request.d.ts +271 -0
  258. package/dist/types/meeting/request.type.d.ts +11 -0
  259. package/dist/types/meeting/state.d.ts +9 -0
  260. package/dist/types/meeting/util.d.ts +2 -0
  261. package/dist/types/meeting-info/collection.d.ts +20 -0
  262. package/dist/types/meeting-info/index.d.ts +57 -0
  263. package/dist/types/meeting-info/meeting-info-v2.d.ts +93 -0
  264. package/dist/types/meeting-info/request.d.ts +22 -0
  265. package/dist/types/meeting-info/util.d.ts +2 -0
  266. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  267. package/dist/types/meetings/collection.d.ts +23 -0
  268. package/dist/types/meetings/index.d.ts +297 -0
  269. package/dist/types/meetings/request.d.ts +27 -0
  270. package/dist/types/meetings/util.d.ts +18 -0
  271. package/dist/types/member/index.d.ts +146 -0
  272. package/dist/types/member/util.d.ts +2 -0
  273. package/dist/types/members/collection.d.ts +24 -0
  274. package/dist/types/members/index.d.ts +320 -0
  275. package/dist/types/members/request.d.ts +50 -0
  276. package/dist/types/members/util.d.ts +2 -0
  277. package/dist/types/metrics/config.d.ts +169 -0
  278. package/dist/types/metrics/constants.d.ts +53 -0
  279. package/dist/types/metrics/index.d.ts +152 -0
  280. package/dist/types/multistream/mediaRequestManager.d.ts +51 -0
  281. package/dist/types/multistream/receiveSlot.d.ts +64 -0
  282. package/dist/types/multistream/receiveSlotManager.d.ts +46 -0
  283. package/dist/types/multistream/remoteMedia.d.ts +100 -0
  284. package/dist/types/multistream/remoteMediaGroup.d.ts +56 -0
  285. package/dist/types/multistream/remoteMediaManager.d.ts +241 -0
  286. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  287. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  288. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  289. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  290. package/dist/types/reachability/index.d.ts +140 -0
  291. package/dist/types/reachability/request.d.ts +37 -0
  292. package/dist/types/reactions/constants.d.ts +3 -0
  293. package/dist/types/reactions/reactions.d.ts +4 -0
  294. package/dist/types/reactions/reactions.type.d.ts +52 -0
  295. package/dist/types/reconnection-manager/index.d.ts +117 -0
  296. package/dist/types/recording-controller/enums.d.ts +7 -0
  297. package/dist/types/recording-controller/index.d.ts +193 -0
  298. package/dist/types/recording-controller/util.d.ts +13 -0
  299. package/dist/types/roap/index.d.ts +77 -0
  300. package/dist/types/roap/request.d.ts +38 -0
  301. package/dist/types/roap/turnDiscovery.d.ts +74 -0
  302. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  303. package/dist/types/statsAnalyzer/index.d.ts +195 -0
  304. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  305. package/dist/types/transcription/index.d.ts +64 -0
  306. package/internal-README.md +7 -6
  307. package/package.json +27 -21
  308. package/src/breakouts/README.md +199 -0
  309. package/src/breakouts/breakout.ts +130 -0
  310. package/src/breakouts/collection.ts +19 -0
  311. package/src/breakouts/edit-lock-error.ts +25 -0
  312. package/src/breakouts/index.ts +504 -0
  313. package/src/breakouts/request.ts +55 -0
  314. package/src/breakouts/utils.ts +39 -0
  315. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  316. package/src/common/collection.ts +9 -7
  317. package/src/common/{config.js → config.ts} +1 -1
  318. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  319. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  320. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  321. package/src/common/errors/{media.js → media.ts} +11 -7
  322. package/src/common/errors/parameter.ts +11 -7
  323. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  324. package/src/common/errors/{permission.js → permission.ts} +10 -6
  325. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  326. package/src/common/errors/{stats.js → stats.ts} +11 -7
  327. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -7
  328. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  329. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  330. package/src/common/events/{events.js → events.ts} +5 -1
  331. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  332. package/src/common/events/{util.js → util.ts} +2 -3
  333. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  334. package/src/common/logs/logger-proxy.ts +44 -0
  335. package/src/common/logs/{request.js → request.ts} +22 -9
  336. package/src/common/queue.ts +1 -2
  337. package/src/{config.js → config.ts} +17 -12
  338. package/src/constants.ts +62 -5
  339. package/src/controls-options-manager/constants.ts +5 -0
  340. package/src/controls-options-manager/enums.ts +6 -0
  341. package/src/controls-options-manager/index.ts +183 -0
  342. package/src/controls-options-manager/util.ts +20 -0
  343. package/src/index.js +4 -1
  344. package/src/locus-info/controlsUtils.ts +114 -0
  345. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  346. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  347. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  348. package/src/locus-info/{index.js → index.ts} +150 -66
  349. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  350. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  351. package/src/locus-info/{parser.js → parser.ts} +67 -79
  352. package/src/locus-info/{selfUtils.js → selfUtils.ts} +123 -68
  353. package/src/media/{index.js → index.ts} +182 -173
  354. package/src/media/{properties.js → properties.ts} +60 -37
  355. package/src/media/{util.js → util.ts} +2 -2
  356. package/src/mediaQualityMetrics/config.ts +384 -0
  357. package/src/meeting/in-meeting-actions.ts +31 -3
  358. package/src/meeting/{index.js → index.ts} +2512 -1579
  359. package/src/meeting/{muteState.js → muteState.ts} +95 -49
  360. package/src/meeting/{request.js → request.ts} +326 -142
  361. package/src/meeting/request.type.ts +13 -0
  362. package/src/meeting/{state.js → state.ts} +50 -35
  363. package/src/meeting/{util.js → util.ts} +117 -119
  364. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  365. package/src/meeting-info/{index.js → index.ts} +42 -36
  366. package/src/meeting-info/meeting-info-v2.ts +273 -0
  367. package/src/meeting-info/{request.js → request.ts} +14 -4
  368. package/src/meeting-info/{util.js → util.ts} +60 -51
  369. package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
  370. package/src/meetings/{collection.js → collection.ts} +6 -3
  371. package/src/meetings/index.ts +1159 -0
  372. package/src/meetings/{request.js → request.ts} +32 -25
  373. package/src/meetings/{util.js → util.ts} +58 -32
  374. package/src/member/{index.js → index.ts} +102 -56
  375. package/src/member/{util.js → util.ts} +52 -25
  376. package/src/members/{collection.js → collection.ts} +2 -2
  377. package/src/members/{index.js → index.ts} +221 -142
  378. package/src/members/{request.js → request.ts} +60 -16
  379. package/src/members/{util.js → util.ts} +50 -48
  380. package/src/metrics/{config.js → config.ts} +253 -92
  381. package/src/metrics/{constants.js → constants.ts} +0 -6
  382. package/src/metrics/{index.js → index.ts} +105 -94
  383. package/src/multistream/mediaRequestManager.ts +101 -39
  384. package/src/multistream/receiveSlot.ts +62 -26
  385. package/src/multistream/receiveSlotManager.ts +35 -21
  386. package/src/multistream/remoteMedia.ts +38 -5
  387. package/src/multistream/remoteMediaGroup.ts +4 -3
  388. package/src/multistream/remoteMediaManager.ts +152 -36
  389. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  390. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  391. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  392. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  393. package/src/reachability/{index.js → index.ts} +109 -85
  394. package/src/reachability/request.ts +46 -35
  395. package/src/reactions/constants.ts +4 -0
  396. package/src/reactions/reactions.ts +104 -0
  397. package/src/reactions/reactions.type.ts +62 -0
  398. package/src/reconnection-manager/{index.js → index.ts} +196 -103
  399. package/src/recording-controller/enums.ts +8 -0
  400. package/src/recording-controller/index.ts +315 -0
  401. package/src/recording-controller/util.ts +58 -0
  402. package/src/roap/{index.js → index.ts} +77 -60
  403. package/src/roap/request.ts +172 -0
  404. package/src/roap/turnDiscovery.ts +81 -41
  405. package/src/statsAnalyzer/global.ts +37 -0
  406. package/src/statsAnalyzer/index.ts +1234 -0
  407. package/src/statsAnalyzer/mqaUtil.ts +293 -0
  408. package/src/transcription/{index.js → index.ts} +46 -39
  409. package/test/integration/spec/converged-space-meetings.js +176 -0
  410. package/test/integration/spec/journey.js +665 -464
  411. package/test/integration/spec/space-meeting.js +320 -206
  412. package/test/integration/spec/transcription.js +7 -8
  413. package/test/unit/spec/breakouts/breakout.ts +147 -0
  414. package/test/unit/spec/breakouts/collection.ts +15 -0
  415. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  416. package/test/unit/spec/breakouts/index.ts +707 -0
  417. package/test/unit/spec/breakouts/request.ts +104 -0
  418. package/test/unit/spec/breakouts/utils.js +47 -0
  419. package/test/unit/spec/common/browser-detection.js +9 -28
  420. package/test/unit/spec/controls-options-manager/index.js +124 -0
  421. package/test/unit/spec/controls-options-manager/util.js +66 -0
  422. package/test/unit/spec/fixture/locus.js +92 -90
  423. package/test/unit/spec/locus-info/controlsUtils.js +25 -5
  424. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  425. package/test/unit/spec/locus-info/index.js +104 -2
  426. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  427. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  428. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  429. package/test/unit/spec/locus-info/parser.js +3 -9
  430. package/test/unit/spec/locus-info/selfConstant.js +97 -103
  431. package/test/unit/spec/locus-info/selfUtils.js +105 -12
  432. package/test/unit/spec/media/index.ts +39 -53
  433. package/test/unit/spec/media/properties.ts +9 -9
  434. package/test/unit/spec/meeting/in-meeting-actions.ts +13 -2
  435. package/test/unit/spec/meeting/index.js +2253 -811
  436. package/test/unit/spec/meeting/muteState.js +74 -55
  437. package/test/unit/spec/meeting/request.js +141 -43
  438. package/test/unit/spec/meeting/utils.js +106 -171
  439. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  440. package/test/unit/spec/meeting-info/request.js +7 -9
  441. package/test/unit/spec/meeting-info/util.js +11 -12
  442. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  443. package/test/unit/spec/meetings/collection.js +1 -1
  444. package/test/unit/spec/meetings/index.js +439 -257
  445. package/test/unit/spec/meetings/utils.js +14 -12
  446. package/test/unit/spec/member/index.js +0 -1
  447. package/test/unit/spec/member/util.js +31 -7
  448. package/test/unit/spec/members/index.js +104 -54
  449. package/test/unit/spec/members/request.js +29 -20
  450. package/test/unit/spec/members/utils.js +8 -5
  451. package/test/unit/spec/metrics/index.js +16 -21
  452. package/test/unit/spec/multistream/mediaRequestManager.ts +318 -64
  453. package/test/unit/spec/multistream/receiveSlot.ts +68 -17
  454. package/test/unit/spec/multistream/receiveSlotManager.ts +41 -13
  455. package/test/unit/spec/multistream/remoteMedia.ts +38 -2
  456. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  457. package/test/unit/spec/multistream/remoteMediaManager.ts +412 -65
  458. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  459. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  460. package/test/unit/spec/reachability/index.ts +70 -27
  461. package/test/unit/spec/reachability/request.js +66 -0
  462. package/test/unit/spec/reconnection-manager/index.js +58 -30
  463. package/test/unit/spec/recording-controller/index.js +231 -0
  464. package/test/unit/spec/recording-controller/util.js +102 -0
  465. package/test/unit/spec/roap/index.ts +12 -8
  466. package/test/unit/spec/roap/request.ts +217 -0
  467. package/test/unit/spec/roap/turnDiscovery.ts +72 -49
  468. package/test/unit/spec/stats-analyzer/index.js +86 -57
  469. package/test/utils/cmr.js +44 -42
  470. package/test/utils/constants.js +9 -0
  471. package/test/utils/testUtils.js +98 -77
  472. package/test/utils/webex-config.js +22 -18
  473. package/test/utils/webex-test-users.js +57 -50
  474. package/tsconfig.json +6 -0
  475. package/dist/media/internal-media-core-wrapper.js +0 -22
  476. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  477. package/dist/meeting/effectsState.js +0 -327
  478. package/dist/meeting/effectsState.js.map +0 -1
  479. package/dist/multistream/multistreamMedia.js +0 -116
  480. package/dist/multistream/multistreamMedia.js.map +0 -1
  481. package/dist/peer-connection-manager/util.js +0 -124
  482. package/dist/peer-connection-manager/util.js.map +0 -1
  483. package/src/common/logs/logger-proxy.js +0 -33
  484. package/src/locus-info/controlsUtils.js +0 -102
  485. package/src/media/internal-media-core-wrapper.ts +0 -9
  486. package/src/mediaQualityMetrics/config.js +0 -382
  487. package/src/meeting/effectsState.js +0 -205
  488. package/src/meeting-info/meeting-info-v2.js +0 -255
  489. package/src/meetings/index.js +0 -1015
  490. package/src/multistream/multistreamMedia.ts +0 -92
  491. package/src/peer-connection-manager/util.ts +0 -117
  492. package/src/roap/request.js +0 -127
  493. package/src/statsAnalyzer/global.js +0 -133
  494. package/src/statsAnalyzer/index.js +0 -1006
  495. package/src/statsAnalyzer/mqaUtil.js +0 -173
  496. package/test/unit/spec/meeting/effectsState.js +0 -291
  497. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  498. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -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,9 +46,12 @@ 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}},
53
57
  };
@@ -97,8 +101,8 @@ describe('Roap', () => {
97
101
  correlationId: meeting.correlationId,
98
102
  locusSelfUrl: meeting.selfUrl,
99
103
  mediaId: expectEmptyMediaId ? '' : meeting.mediaId,
100
- audioMuted: meeting.isAudioMuted(),
101
- videoMuted: meeting.isVideoMuted(),
104
+ audioMuted: meeting.audio?.isLocallyMuted(),
105
+ videoMuted: meeting.video?.isLocallyMuted(),
102
106
  meetingId: meeting.id,
103
107
  preferTranscoding: true,
104
108
  });
@@ -131,8 +135,8 @@ describe('Roap', () => {
131
135
  correlationId: meeting.correlationId,
132
136
  locusSelfUrl: meeting.selfUrl,
133
137
  mediaId: meeting.mediaId,
134
- audioMuted: meeting.isAudioMuted(),
135
- videoMuted: meeting.isVideoMuted(),
138
+ audioMuted: meeting.audio.isLocallyMuted(),
139
+ videoMuted: meeting.video.isLocallyMuted(),
136
140
  meetingId: meeting.id,
137
141
  preferTranscoding: false,
138
142
  });
@@ -0,0 +1,217 @@
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
+ await roapRequest.sendRoap({
112
+ locusSelfUrl: locusUrl,
113
+ mediaId: 'mediaId',
114
+ roapMessage: {
115
+ seq: 'seq',
116
+ },
117
+ });
118
+
119
+ const requestParams = roapRequest.request.getCall(0).args[0];
120
+ assert.equal(requestParams.method, 'PUT');
121
+ assert.equal(requestParams.uri, `${locusUrl}/media`);
122
+ assert.deepEqual(requestParams.body.localMedias, [
123
+ {
124
+ localSdp:
125
+ '{"roapMessage":{"seq":"seq"},"audioMuted":false,"videoMuted":false,"reachability":{"clusterId":{"udp":"test"}}}',
126
+ mediaId: 'mediaId',
127
+ },
128
+ ]);
129
+ assert.deepEqual(requestParams.body.clientMediaPreferences, {
130
+ joinCookie: {
131
+ anycastEntryPoint: 'aws-eu-west-1',
132
+ },
133
+ preferTranscoding: true,
134
+ });
135
+ });
136
+ });
137
+
138
+ it('calls attachReachabilityData when sendRoap', async () => {
139
+ const newSdp = {
140
+ new: 'sdp',
141
+ };
142
+
143
+ roapRequest.attachReachabilityData = sinon.stub().returns(
144
+ Promise.resolve({
145
+ localSdp: newSdp,
146
+ joinCookie: {
147
+ anycastEntryPoint: 'aws-eu-west-1',
148
+ },
149
+ })
150
+ );
151
+ webex.request.returns(
152
+ Promise.resolve({
153
+ body: {
154
+ locus: {},
155
+ },
156
+ })
157
+ );
158
+
159
+ const result = await roapRequest.sendRoap({
160
+ roapMessage: {
161
+ seq: 1,
162
+ },
163
+ locusSelfUrl: 'locusSelfUrl',
164
+ mediaId: 'mediaId',
165
+ correlationId: 'correlationId',
166
+ audioMuted: true,
167
+ videoMuted: true,
168
+ meetingId: 'meetingId',
169
+ preferTranscoding: true,
170
+ });
171
+
172
+ const requestParams = roapRequest.request.getCall(0).args[0];
173
+
174
+ assert.deepEqual(requestParams, {
175
+ uri: 'locusSelfUrl/media',
176
+ method: 'PUT',
177
+ body: {
178
+ device: {
179
+ url: 'url',
180
+ deviceType: undefined,
181
+ },
182
+ correlationId: 'correlationId',
183
+ localMedias: [
184
+ {
185
+ localSdp: JSON.stringify(newSdp),
186
+ mediaId: 'mediaId',
187
+ },
188
+ ],
189
+ clientMediaPreferences: {
190
+ joinCookie: {
191
+ anycastEntryPoint: 'aws-eu-west-1',
192
+ },
193
+ preferTranscoding: true,
194
+ },
195
+ },
196
+ });
197
+
198
+ assert.calledOnceWithExactly(roapRequest.attachReachabilityData, {
199
+ roapMessage: {
200
+ seq: 1,
201
+ },
202
+ audioMuted: true,
203
+ videoMuted: true,
204
+ });
205
+
206
+ assert.deepEqual(result, {
207
+ locus: {
208
+ fullState: {
209
+ lastActive: 'lastActive',
210
+ },
211
+ id: '',
212
+ roapSeq: 1,
213
+ url: 'url/path',
214
+ }
215
+ });
216
+ });
217
+ });
@@ -25,28 +25,33 @@ describe('TurnDiscovery', () => {
25
25
  sinon.stub(Metrics, 'sendBehavioralMetric');
26
26
 
27
27
  mockRoapRequest = {
28
- sendRoap: sinon.fake.resolves({mediaConnections: FAKE_MEDIA_CONNECTIONS_FROM_LOCUS})
28
+ sendRoap: sinon.fake.resolves({mediaConnections: FAKE_MEDIA_CONNECTIONS_FROM_LOCUS}),
29
29
  } as unknown as RoapRequest;
30
30
 
31
31
  testMeeting = {
32
32
  id: 'fake meeting id',
33
33
  config: {
34
34
  experimental: {
35
- enableTurnDiscovery: true
36
- }
35
+ enableTurnDiscovery: true,
36
+ },
37
37
  },
38
38
  correlationId: 'fake correlation id',
39
39
  selfUrl: 'fake self url',
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
50
55
  };
51
56
  });
52
57
 
@@ -55,7 +60,11 @@ describe('TurnDiscovery', () => {
55
60
  sinon.restore();
56
61
  });
57
62
 
58
- const checkRoapMessageSent = async (messageType, expectedSeq, expectedMediaId = testMeeting.mediaId) => {
63
+ const checkRoapMessageSent = async (
64
+ messageType,
65
+ expectedSeq,
66
+ expectedMediaId = testMeeting.mediaId
67
+ ) => {
59
68
  await testUtils.flushPromises();
60
69
 
61
70
  assert.calledOnce(mockRoapRequest.sendRoap);
@@ -68,9 +77,10 @@ describe('TurnDiscovery', () => {
68
77
  correlationId: testMeeting.correlationId,
69
78
  locusSelfUrl: testMeeting.selfUrl,
70
79
  mediaId: expectedMediaId,
71
- audioMuted: testMeeting.isAudioMuted(),
72
- videoMuted: testMeeting.isVideoMuted(),
73
- meetingId: testMeeting.id
80
+ audioMuted: testMeeting.audio?.isLocallyMuted(),
81
+ videoMuted: testMeeting.video?.isLocallyMuted(),
82
+ meetingId: testMeeting.id,
83
+ preferTranscoding: !testMeeting.isMultistream
74
84
  });
75
85
 
76
86
  if (messageType === 'TURN_DISCOVERY_REQUEST') {
@@ -93,39 +103,44 @@ describe('TurnDiscovery', () => {
93
103
  };
94
104
 
95
105
  describe('doTurnDiscovery', () => {
96
- it('sends TURN_DISCOVERY_REQUEST, waits for response and sends OK', async () => {
97
- const td = new TurnDiscovery(mockRoapRequest);
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;
98
109
 
99
- const result = td.doTurnDiscovery(testMeeting, false);
110
+ const td = new TurnDiscovery(mockRoapRequest);
100
111
 
101
- // check that TURN_DISCOVERY_REQUEST was sent
102
- await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
112
+ const result = td.doTurnDiscovery(testMeeting, false);
103
113
 
104
- mockRoapRequest.sendRoap.resetHistory();
114
+ // check that TURN_DISCOVERY_REQUEST was sent
115
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
105
116
 
106
- // simulate the response
107
- td.handleTurnDiscoveryResponse({
108
- headers: [
109
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
110
- `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
111
- `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
112
- ]
113
- });
117
+ // @ts-ignore
118
+ mockRoapRequest.sendRoap.resetHistory();
114
119
 
115
- await testUtils.flushPromises();
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
+ ]
127
+ });
116
128
 
117
- // check that we've sent OK
118
- await checkRoapMessageSent('OK', 0);
129
+ await testUtils.flushPromises();
119
130
 
120
- const {turnServerInfo, turnDiscoverySkippedReason} = await result;
131
+ // check that we've sent OK
132
+ await checkRoapMessageSent('OK', 0);
121
133
 
122
- assert.deepEqual(turnServerInfo, {
123
- url: FAKE_TURN_URL,
124
- username: FAKE_TURN_USERNAME,
125
- password: FAKE_TURN_PASSWORD
126
- });
134
+ const {turnServerInfo, turnDiscoverySkippedReason} = await result;
127
135
 
128
- assert.isUndefined(turnDiscoverySkippedReason);
136
+ assert.deepEqual(turnServerInfo, {
137
+ url: FAKE_TURN_URL,
138
+ username: FAKE_TURN_USERNAME,
139
+ password: FAKE_TURN_PASSWORD
140
+ });
141
+
142
+ assert.isUndefined(turnDiscoverySkippedReason);
143
+ });
129
144
  });
130
145
 
131
146
  it('sends TURN_DISCOVERY_REQUEST with empty mediaId when isReconnecting is true', async () => {
@@ -137,6 +152,7 @@ describe('TurnDiscovery', () => {
137
152
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0, '');
138
153
 
139
154
  // the main part of the test is complete now, checking the remaining part of the flow just for completeness
155
+ // @ts-ignore
140
156
  mockRoapRequest.sendRoap.resetHistory();
141
157
 
142
158
  // simulate the response
@@ -145,7 +161,7 @@ describe('TurnDiscovery', () => {
145
161
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
146
162
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
147
163
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
148
- ]
164
+ ],
149
165
  });
150
166
 
151
167
  await testUtils.flushPromises();
@@ -158,7 +174,7 @@ describe('TurnDiscovery', () => {
158
174
  assert.deepEqual(turnServerInfo, {
159
175
  url: FAKE_TURN_URL,
160
176
  username: FAKE_TURN_USERNAME,
161
- password: FAKE_TURN_PASSWORD
177
+ password: FAKE_TURN_PASSWORD,
162
178
  });
163
179
  assert.isUndefined(turnDiscoverySkippedReason);
164
180
  });
@@ -169,7 +185,7 @@ describe('TurnDiscovery', () => {
169
185
 
170
186
  // check that TURN_DISCOVERY_REQUEST was sent
171
187
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
172
-
188
+ // @ts-ignore
173
189
  mockRoapRequest.sendRoap.resetHistory();
174
190
 
175
191
  // simulate the response with some extra headers
@@ -181,7 +197,7 @@ describe('TurnDiscovery', () => {
181
197
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
182
198
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
183
199
  'another-header-at-the-end=12345',
184
- ]
200
+ ],
185
201
  });
186
202
 
187
203
  await testUtils.flushPromises();
@@ -193,7 +209,7 @@ describe('TurnDiscovery', () => {
193
209
  assert.deepEqual(turnServerInfo, {
194
210
  url: FAKE_TURN_URL,
195
211
  username: FAKE_TURN_USERNAME,
196
- password: FAKE_TURN_PASSWORD
212
+ password: FAKE_TURN_PASSWORD,
197
213
  });
198
214
  assert.isUndefined(turnDiscoverySkippedReason);
199
215
  });
@@ -202,7 +218,7 @@ describe('TurnDiscovery', () => {
202
218
  const prevConfigValue = testMeeting.config.experimental.enableTurnDiscovery;
203
219
 
204
220
  testMeeting.config.experimental.enableTurnDiscovery = false;
205
-
221
+ // @ts-ignore
206
222
  const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
207
223
 
208
224
  const {turnServerInfo, turnDiscoverySkippedReason} = result;
@@ -232,7 +248,7 @@ describe('TurnDiscovery', () => {
232
248
 
233
249
  it('resolves with undefined when cluster is reachable', async () => {
234
250
  const prev = testMeeting.webex.meetings.reachability.isAnyClusterReachable;
235
- testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => true;
251
+ testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => Promise.resolve(true);
236
252
  const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
237
253
 
238
254
  const {turnServerInfo, turnDiscoverySkippedReason} = result;
@@ -242,10 +258,9 @@ describe('TurnDiscovery', () => {
242
258
  assert.notCalled(mockRoapRequest.sendRoap);
243
259
  assert.notCalled(Metrics.sendBehavioralMetric);
244
260
  testMeeting.webex.meetings.reachability.isAnyClusterReachable = prev;
245
-
246
261
  });
247
262
 
248
- it('resolves with undefined if we don\'t get a response within 10s', async () => {
263
+ it("resolves with undefined if we don't get a response within 10s", async () => {
249
264
  const td = new TurnDiscovery(mockRoapRequest);
250
265
 
251
266
  const promise = td.doTurnDiscovery(testMeeting, false);
@@ -264,12 +279,14 @@ describe('TurnDiscovery', () => {
264
279
  const td = new TurnDiscovery(mockRoapRequest);
265
280
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
266
281
 
282
+ await testUtils.flushPromises();
283
+
267
284
  // simulate the response without the password
268
285
  td.handleTurnDiscoveryResponse({
269
286
  headers: [
270
287
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
271
288
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
272
- ]
289
+ ],
273
290
  });
274
291
  await testUtils.flushPromises();
275
292
  const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
@@ -283,6 +300,8 @@ describe('TurnDiscovery', () => {
283
300
  const td = new TurnDiscovery(mockRoapRequest);
284
301
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
285
302
 
303
+ await testUtils.flushPromises();
304
+
286
305
  // simulate the response without the headers
287
306
  td.handleTurnDiscoveryResponse({});
288
307
 
@@ -298,11 +317,13 @@ describe('TurnDiscovery', () => {
298
317
  const td = new TurnDiscovery(mockRoapRequest);
299
318
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
300
319
 
320
+ await testUtils.flushPromises();
321
+
301
322
  // simulate the response without the headers
302
323
  td.handleTurnDiscoveryResponse({headers: []});
303
324
 
304
325
  await testUtils.flushPromises();
305
- const {turnServerInfo, turnDiscoverySkippedReason}= await turnDiscoveryPromise;
326
+ const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
306
327
 
307
328
  assert.isUndefined(turnServerInfo);
308
329
  assert.isUndefined(turnDiscoverySkippedReason);
@@ -314,9 +335,11 @@ describe('TurnDiscovery', () => {
314
335
 
315
336
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
316
337
 
338
+ await testUtils.flushPromises();
339
+
317
340
  // check that TURN_DISCOVERY_REQUEST was sent
318
341
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
319
-
342
+ // @ts-ignore
320
343
  mockRoapRequest.sendRoap.resetHistory();
321
344
 
322
345
  // setup the mock so that sending of OK fails
@@ -328,7 +351,7 @@ describe('TurnDiscovery', () => {
328
351
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
329
352
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
330
353
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
331
- ]
354
+ ],
332
355
  });
333
356
 
334
357
  await testUtils.flushPromises();
@@ -345,7 +368,7 @@ describe('TurnDiscovery', () => {
345
368
  });
346
369
 
347
370
  describe('handleTurnDiscoveryResponse', () => {
348
- it('doesn\'t do anything if turn discovery was not started', () => {
371
+ it("doesn't do anything if turn discovery was not started", () => {
349
372
  const td = new TurnDiscovery(mockRoapRequest);
350
373
 
351
374
  // there is not much we can check, but we mainly want to make
@@ -355,7 +378,7 @@ describe('TurnDiscovery', () => {
355
378
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
356
379
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
357
380
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
358
- ]
381
+ ],
359
382
  });
360
383
 
361
384
  assert.notCalled(mockRoapRequest.sendRoap);