@webex/plugin-meetings 3.0.0-beta.3 → 3.0.0-beta.300

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 (601) hide show
  1. package/README.md +46 -8
  2. package/UPGRADING.md +9 -9
  3. package/browsers.js +19 -24
  4. package/dist/annotation/annotation.types.js +7 -0
  5. package/dist/annotation/annotation.types.js.map +1 -0
  6. package/dist/annotation/constants.js +49 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +342 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +216 -0
  11. package/dist/breakouts/breakout.js.map +1 -0
  12. package/dist/breakouts/collection.js +23 -0
  13. package/dist/breakouts/collection.js.map +1 -0
  14. package/dist/breakouts/edit-lock-error.js +52 -0
  15. package/dist/breakouts/edit-lock-error.js.map +1 -0
  16. package/dist/breakouts/events.js +45 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +1048 -0
  19. package/dist/breakouts/index.js.map +1 -0
  20. package/dist/breakouts/request.js +78 -0
  21. package/dist/breakouts/request.js.map +1 -0
  22. package/dist/breakouts/utils.js +67 -0
  23. package/dist/breakouts/utils.js.map +1 -0
  24. package/dist/common/browser-detection.js +1 -20
  25. package/dist/common/browser-detection.js.map +1 -1
  26. package/dist/common/collection.js +5 -20
  27. package/dist/common/collection.js.map +1 -1
  28. package/dist/common/config.js +0 -7
  29. package/dist/common/config.js.map +1 -1
  30. package/dist/common/errors/captcha-error.js +10 -24
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +11 -24
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +12 -25
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +10 -24
  37. package/dist/common/errors/media.js.map +1 -1
  38. package/dist/common/errors/no-meeting-info.js +51 -0
  39. package/dist/common/errors/no-meeting-info.js.map +1 -0
  40. package/dist/common/errors/parameter.js +5 -33
  41. package/dist/common/errors/parameter.js.map +1 -1
  42. package/dist/common/errors/password-error.js +10 -24
  43. package/dist/common/errors/password-error.js.map +1 -1
  44. package/dist/common/errors/permission.js +9 -23
  45. package/dist/common/errors/permission.js.map +1 -1
  46. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  47. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  48. package/dist/common/errors/reconnection-in-progress.js +0 -17
  49. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  50. package/dist/common/errors/reconnection.js +10 -24
  51. package/dist/common/errors/reconnection.js.map +1 -1
  52. package/dist/common/errors/stats.js +10 -24
  53. package/dist/common/errors/stats.js.map +1 -1
  54. package/dist/common/errors/webex-errors.js +54 -48
  55. package/dist/common/errors/webex-errors.js.map +1 -1
  56. package/dist/common/errors/webex-meetings-error.js +5 -25
  57. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  58. package/dist/common/events/events-scope.js +0 -22
  59. package/dist/common/events/events-scope.js.map +1 -1
  60. package/dist/common/events/events.js +0 -23
  61. package/dist/common/events/events.js.map +1 -1
  62. package/dist/common/events/trigger-proxy.js +0 -12
  63. package/dist/common/events/trigger-proxy.js.map +1 -1
  64. package/dist/common/events/util.js +0 -15
  65. package/dist/common/events/util.js.map +1 -1
  66. package/dist/common/logs/logger-config.js +0 -4
  67. package/dist/common/logs/logger-config.js.map +1 -1
  68. package/dist/common/logs/logger-proxy.js +1 -8
  69. package/dist/common/logs/logger-proxy.js.map +1 -1
  70. package/dist/common/logs/request.js +41 -60
  71. package/dist/common/logs/request.js.map +1 -1
  72. package/dist/common/queue.js +28 -23
  73. package/dist/common/queue.js.map +1 -1
  74. package/dist/config.js +9 -15
  75. package/dist/config.js.map +1 -1
  76. package/dist/constants.js +315 -68
  77. package/dist/constants.js.map +1 -1
  78. package/dist/controls-options-manager/constants.js +14 -0
  79. package/dist/controls-options-manager/constants.js.map +1 -0
  80. package/dist/controls-options-manager/enums.js +27 -0
  81. package/dist/controls-options-manager/enums.js.map +1 -0
  82. package/dist/controls-options-manager/index.js +297 -0
  83. package/dist/controls-options-manager/index.js.map +1 -0
  84. package/dist/controls-options-manager/types.js +7 -0
  85. package/dist/controls-options-manager/types.js.map +1 -0
  86. package/dist/controls-options-manager/util.js +319 -0
  87. package/dist/controls-options-manager/util.js.map +1 -0
  88. package/dist/index.js +114 -17
  89. package/dist/index.js.map +1 -1
  90. package/dist/interpretation/collection.js +23 -0
  91. package/dist/interpretation/collection.js.map +1 -0
  92. package/dist/interpretation/index.js +366 -0
  93. package/dist/interpretation/index.js.map +1 -0
  94. package/dist/interpretation/siLanguage.js +25 -0
  95. package/dist/interpretation/siLanguage.js.map +1 -0
  96. package/dist/locus-info/controlsUtils.js +101 -29
  97. package/dist/locus-info/controlsUtils.js.map +1 -1
  98. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  99. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  100. package/dist/locus-info/fullState.js +0 -15
  101. package/dist/locus-info/fullState.js.map +1 -1
  102. package/dist/locus-info/hostUtils.js +4 -12
  103. package/dist/locus-info/hostUtils.js.map +1 -1
  104. package/dist/locus-info/index.js +561 -246
  105. package/dist/locus-info/index.js.map +1 -1
  106. package/dist/locus-info/infoUtils.js +10 -38
  107. package/dist/locus-info/infoUtils.js.map +1 -1
  108. package/dist/locus-info/mediaSharesUtils.js +68 -38
  109. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  110. package/dist/locus-info/parser.js +314 -163
  111. package/dist/locus-info/parser.js.map +1 -1
  112. package/dist/locus-info/selfUtils.js +110 -92
  113. package/dist/locus-info/selfUtils.js.map +1 -1
  114. package/dist/media/index.js +103 -231
  115. package/dist/media/index.js.map +1 -1
  116. package/dist/media/properties.js +137 -222
  117. package/dist/media/properties.js.map +1 -1
  118. package/dist/media/util.js +2 -9
  119. package/dist/media/util.js.map +1 -1
  120. package/dist/mediaQualityMetrics/config.js +505 -495
  121. package/dist/mediaQualityMetrics/config.js.map +1 -1
  122. package/dist/meeting/in-meeting-actions.js +93 -14
  123. package/dist/meeting/in-meeting-actions.js.map +1 -1
  124. package/dist/meeting/index.js +4624 -3740
  125. package/dist/meeting/index.js.map +1 -1
  126. package/dist/meeting/locusMediaRequest.js +292 -0
  127. package/dist/meeting/locusMediaRequest.js.map +1 -0
  128. package/dist/meeting/muteState.js +249 -184
  129. package/dist/meeting/muteState.js.map +1 -1
  130. package/dist/meeting/request.js +400 -346
  131. package/dist/meeting/request.js.map +1 -1
  132. package/dist/meeting/request.type.js +7 -0
  133. package/dist/meeting/request.type.js.map +1 -0
  134. package/dist/meeting/state.js +21 -31
  135. package/dist/meeting/state.js.map +1 -1
  136. package/dist/meeting/util.js +598 -586
  137. package/dist/meeting/util.js.map +1 -1
  138. package/dist/meeting-info/collection.js +6 -25
  139. package/dist/meeting-info/collection.js.map +1 -1
  140. package/dist/meeting-info/index.js +87 -39
  141. package/dist/meeting-info/index.js.map +1 -1
  142. package/dist/meeting-info/meeting-info-v2.js +349 -283
  143. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  144. package/dist/meeting-info/request.js +3 -15
  145. package/dist/meeting-info/request.js.map +1 -1
  146. package/dist/meeting-info/util.js +98 -183
  147. package/dist/meeting-info/util.js.map +1 -1
  148. package/dist/meeting-info/utilv2.js +143 -234
  149. package/dist/meeting-info/utilv2.js.map +1 -1
  150. package/dist/meetings/collection.js +26 -19
  151. package/dist/meetings/collection.js.map +1 -1
  152. package/dist/meetings/index.js +813 -596
  153. package/dist/meetings/index.js.map +1 -1
  154. package/dist/meetings/meetings.types.js +7 -0
  155. package/dist/meetings/meetings.types.js.map +1 -0
  156. package/dist/meetings/request.js +26 -41
  157. package/dist/meetings/request.js.map +1 -1
  158. package/dist/meetings/util.js +183 -156
  159. package/dist/meetings/util.js.map +1 -1
  160. package/dist/member/index.js +135 -85
  161. package/dist/member/index.js.map +1 -1
  162. package/dist/member/types.js +25 -0
  163. package/dist/member/types.js.map +1 -0
  164. package/dist/member/util.js +158 -88
  165. package/dist/member/util.js.map +1 -1
  166. package/dist/members/collection.js +13 -12
  167. package/dist/members/collection.js.map +1 -1
  168. package/dist/members/index.js +194 -204
  169. package/dist/members/index.js.map +1 -1
  170. package/dist/members/request.js +113 -68
  171. package/dist/members/request.js.map +1 -1
  172. package/dist/members/types.js +15 -0
  173. package/dist/members/types.js.map +1 -0
  174. package/dist/members/util.js +324 -259
  175. package/dist/members/util.js.map +1 -1
  176. package/dist/metrics/constants.js +14 -7
  177. package/dist/metrics/constants.js.map +1 -1
  178. package/dist/metrics/index.js +11 -558
  179. package/dist/metrics/index.js.map +1 -1
  180. package/dist/multistream/mediaRequestManager.js +263 -50
  181. package/dist/multistream/mediaRequestManager.js.map +1 -1
  182. package/dist/multistream/receiveSlot.js +58 -65
  183. package/dist/multistream/receiveSlot.js.map +1 -1
  184. package/dist/multistream/receiveSlotManager.js +76 -95
  185. package/dist/multistream/receiveSlotManager.js.map +1 -1
  186. package/dist/multistream/remoteMedia.js +62 -76
  187. package/dist/multistream/remoteMedia.js.map +1 -1
  188. package/dist/multistream/remoteMediaGroup.js +66 -43
  189. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  190. package/dist/multistream/remoteMediaManager.js +536 -439
  191. package/dist/multistream/remoteMediaManager.js.map +1 -1
  192. package/dist/multistream/sendSlotManager.js +233 -0
  193. package/dist/multistream/sendSlotManager.js.map +1 -0
  194. package/dist/networkQualityMonitor/index.js +40 -59
  195. package/dist/networkQualityMonitor/index.js.map +1 -1
  196. package/dist/personal-meeting-room/index.js +21 -45
  197. package/dist/personal-meeting-room/index.js.map +1 -1
  198. package/dist/personal-meeting-room/request.js +1 -31
  199. package/dist/personal-meeting-room/request.js.map +1 -1
  200. package/dist/personal-meeting-room/util.js +0 -13
  201. package/dist/personal-meeting-room/util.js.map +1 -1
  202. package/dist/reachability/index.js +322 -200
  203. package/dist/reachability/index.js.map +1 -1
  204. package/dist/reachability/request.js +20 -26
  205. package/dist/reachability/request.js.map +1 -1
  206. package/dist/reactions/constants.js +13 -0
  207. package/dist/reactions/constants.js.map +1 -0
  208. package/dist/reactions/reactions.js +109 -0
  209. package/dist/reactions/reactions.js.map +1 -0
  210. package/dist/reactions/reactions.type.js +36 -0
  211. package/dist/reactions/reactions.type.js.map +1 -0
  212. package/dist/reconnection-manager/index.js +388 -476
  213. package/dist/reconnection-manager/index.js.map +1 -1
  214. package/dist/recording-controller/enums.js +17 -0
  215. package/dist/recording-controller/enums.js.map +1 -0
  216. package/dist/recording-controller/index.js +362 -0
  217. package/dist/recording-controller/index.js.map +1 -0
  218. package/dist/recording-controller/util.js +64 -0
  219. package/dist/recording-controller/util.js.map +1 -0
  220. package/dist/roap/index.js +99 -94
  221. package/dist/roap/index.js.map +1 -1
  222. package/dist/roap/request.js +131 -135
  223. package/dist/roap/request.js.map +1 -1
  224. package/dist/roap/turnDiscovery.js +151 -101
  225. package/dist/roap/turnDiscovery.js.map +1 -1
  226. package/dist/rtcMetrics/constants.js +12 -0
  227. package/dist/rtcMetrics/constants.js.map +1 -0
  228. package/dist/rtcMetrics/index.js +117 -0
  229. package/dist/rtcMetrics/index.js.map +1 -0
  230. package/dist/statsAnalyzer/global.js +1 -95
  231. package/dist/statsAnalyzer/global.js.map +1 -1
  232. package/dist/statsAnalyzer/index.js +416 -497
  233. package/dist/statsAnalyzer/index.js.map +1 -1
  234. package/dist/statsAnalyzer/mqaUtil.js +145 -88
  235. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  236. package/dist/transcription/index.js +22 -47
  237. package/dist/transcription/index.js.map +1 -1
  238. package/dist/types/annotation/annotation.types.d.ts +42 -0
  239. package/dist/types/annotation/constants.d.ts +31 -0
  240. package/dist/types/annotation/index.d.ts +117 -0
  241. package/dist/types/breakouts/breakout.d.ts +8 -0
  242. package/dist/types/breakouts/collection.d.ts +5 -0
  243. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  244. package/dist/types/breakouts/events.d.ts +8 -0
  245. package/dist/types/breakouts/index.d.ts +5 -0
  246. package/dist/types/breakouts/request.d.ts +22 -0
  247. package/dist/types/breakouts/utils.d.ts +15 -0
  248. package/dist/types/common/browser-detection.d.ts +9 -0
  249. package/dist/types/common/collection.d.ts +48 -0
  250. package/dist/types/common/config.d.ts +2 -0
  251. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  252. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  253. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  254. package/dist/types/common/errors/media.d.ts +15 -0
  255. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  256. package/dist/types/common/errors/parameter.d.ts +15 -0
  257. package/dist/types/common/errors/password-error.d.ts +15 -0
  258. package/dist/types/common/errors/permission.d.ts +14 -0
  259. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  260. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  261. package/dist/types/common/errors/reconnection.d.ts +15 -0
  262. package/dist/types/common/errors/stats.d.ts +15 -0
  263. package/dist/types/common/errors/webex-errors.d.ts +93 -0
  264. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  265. package/dist/types/common/events/events-scope.d.ts +17 -0
  266. package/dist/types/common/events/events.d.ts +12 -0
  267. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  268. package/dist/types/common/events/util.d.ts +2 -0
  269. package/dist/types/common/logs/logger-config.d.ts +2 -0
  270. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  271. package/dist/types/common/logs/request.d.ts +36 -0
  272. package/dist/types/common/queue.d.ts +34 -0
  273. package/dist/types/config.d.ts +71 -0
  274. package/dist/types/constants.d.ts +1066 -0
  275. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  276. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  277. package/dist/types/controls-options-manager/index.d.ts +136 -0
  278. package/dist/types/controls-options-manager/types.d.ts +43 -0
  279. package/dist/types/controls-options-manager/util.d.ts +1 -0
  280. package/dist/types/index.d.ts +7 -0
  281. package/dist/types/interpretation/collection.d.ts +5 -0
  282. package/dist/types/interpretation/index.d.ts +5 -0
  283. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  284. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  285. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  286. package/dist/types/locus-info/fullState.d.ts +2 -0
  287. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  288. package/dist/types/locus-info/index.d.ts +322 -0
  289. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  290. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  291. package/dist/types/locus-info/parser.d.ts +273 -0
  292. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  293. package/dist/types/media/index.d.ts +34 -0
  294. package/dist/types/media/properties.d.ts +93 -0
  295. package/dist/types/media/util.d.ts +2 -0
  296. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  297. package/dist/types/meeting/in-meeting-actions.d.ts +163 -0
  298. package/dist/types/meeting/index.d.ts +1676 -0
  299. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  300. package/dist/types/meeting/muteState.d.ts +184 -0
  301. package/dist/types/meeting/request.d.ts +290 -0
  302. package/dist/types/meeting/request.type.d.ts +11 -0
  303. package/dist/types/meeting/state.d.ts +9 -0
  304. package/dist/types/meeting/util.d.ts +102 -0
  305. package/dist/types/meeting-info/collection.d.ts +20 -0
  306. package/dist/types/meeting-info/index.d.ts +69 -0
  307. package/dist/types/meeting-info/meeting-info-v2.d.ts +123 -0
  308. package/dist/types/meeting-info/request.d.ts +22 -0
  309. package/dist/types/meeting-info/util.d.ts +2 -0
  310. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  311. package/dist/types/meetings/collection.d.ts +31 -0
  312. package/dist/types/meetings/index.d.ts +367 -0
  313. package/dist/types/meetings/meetings.types.d.ts +4 -0
  314. package/dist/types/meetings/request.d.ts +27 -0
  315. package/dist/types/meetings/util.d.ts +18 -0
  316. package/dist/types/member/index.d.ts +160 -0
  317. package/dist/types/member/types.d.ts +32 -0
  318. package/dist/types/member/util.d.ts +2 -0
  319. package/dist/types/members/collection.d.ts +29 -0
  320. package/dist/types/members/index.d.ts +353 -0
  321. package/dist/types/members/request.d.ts +114 -0
  322. package/dist/types/members/types.d.ts +25 -0
  323. package/dist/types/members/util.d.ts +215 -0
  324. package/dist/types/metrics/constants.d.ts +65 -0
  325. package/dist/types/metrics/index.d.ts +45 -0
  326. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  327. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  328. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  329. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  330. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  331. package/dist/types/multistream/remoteMediaManager.d.ts +285 -0
  332. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  333. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  334. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  335. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  336. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  337. package/dist/types/reachability/index.d.ts +194 -0
  338. package/dist/types/reachability/request.d.ts +39 -0
  339. package/dist/types/reactions/constants.d.ts +3 -0
  340. package/dist/types/reactions/reactions.d.ts +4 -0
  341. package/dist/types/reactions/reactions.type.d.ts +52 -0
  342. package/dist/types/reconnection-manager/index.d.ts +126 -0
  343. package/dist/types/recording-controller/enums.d.ts +7 -0
  344. package/dist/types/recording-controller/index.d.ts +207 -0
  345. package/dist/types/recording-controller/util.d.ts +14 -0
  346. package/dist/types/roap/index.d.ts +78 -0
  347. package/dist/types/roap/request.d.ts +39 -0
  348. package/dist/types/roap/turnDiscovery.d.ts +92 -0
  349. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  350. package/dist/types/rtcMetrics/index.d.ts +47 -0
  351. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  352. package/dist/types/statsAnalyzer/index.d.ts +201 -0
  353. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  354. package/dist/types/transcription/index.d.ts +64 -0
  355. package/dist/types/webinar/collection.d.ts +16 -0
  356. package/dist/types/webinar/index.d.ts +5 -0
  357. package/dist/webinar/collection.js +44 -0
  358. package/dist/webinar/collection.js.map +1 -0
  359. package/dist/webinar/index.js +69 -0
  360. package/dist/webinar/index.js.map +1 -0
  361. package/internal-README.md +7 -6
  362. package/package.json +29 -21
  363. package/src/annotation/annotation.types.ts +50 -0
  364. package/src/annotation/constants.ts +36 -0
  365. package/src/annotation/index.ts +328 -0
  366. package/src/breakouts/README.md +220 -0
  367. package/src/breakouts/breakout.ts +188 -0
  368. package/src/breakouts/collection.ts +19 -0
  369. package/src/breakouts/edit-lock-error.ts +25 -0
  370. package/src/breakouts/events.ts +56 -0
  371. package/src/breakouts/index.ts +925 -0
  372. package/src/breakouts/request.ts +55 -0
  373. package/src/breakouts/utils.ts +57 -0
  374. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  375. package/src/common/collection.ts +9 -7
  376. package/src/common/{config.js → config.ts} +1 -1
  377. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  378. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  379. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  380. package/src/common/errors/{media.js → media.ts} +11 -7
  381. package/src/common/errors/no-meeting-info.ts +24 -0
  382. package/src/common/errors/parameter.ts +11 -7
  383. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  384. package/src/common/errors/{permission.js → permission.ts} +10 -6
  385. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  386. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  387. package/src/common/errors/{stats.js → stats.ts} +11 -7
  388. package/src/common/errors/{webex-errors.js → webex-errors.ts} +51 -8
  389. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  390. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  391. package/src/common/events/{events.js → events.ts} +5 -1
  392. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  393. package/src/common/events/{util.js → util.ts} +2 -3
  394. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  395. package/src/common/logs/logger-proxy.ts +44 -0
  396. package/src/common/logs/{request.js → request.ts} +26 -9
  397. package/src/common/queue.ts +22 -9
  398. package/src/{config.js → config.ts} +18 -19
  399. package/src/constants.ts +260 -22
  400. package/src/controls-options-manager/constants.ts +5 -0
  401. package/src/controls-options-manager/enums.ts +18 -0
  402. package/src/controls-options-manager/index.ts +278 -0
  403. package/src/controls-options-manager/types.ts +59 -0
  404. package/src/controls-options-manager/util.ts +300 -0
  405. package/src/index.ts +40 -0
  406. package/src/interpretation/README.md +60 -0
  407. package/src/interpretation/collection.ts +19 -0
  408. package/src/interpretation/index.ts +332 -0
  409. package/src/interpretation/siLanguage.ts +18 -0
  410. package/src/locus-info/controlsUtils.ts +222 -0
  411. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  412. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  413. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  414. package/src/locus-info/{index.js → index.ts} +557 -119
  415. package/src/locus-info/{infoUtils.js → infoUtils.ts} +29 -10
  416. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +81 -17
  417. package/src/locus-info/{parser.js → parser.ts} +303 -104
  418. package/src/locus-info/{selfUtils.js → selfUtils.ts} +199 -68
  419. package/src/media/index.ts +458 -0
  420. package/src/media/properties.ts +283 -0
  421. package/src/media/{util.js → util.ts} +2 -2
  422. package/src/mediaQualityMetrics/config.ts +384 -0
  423. package/src/meeting/in-meeting-actions.ts +191 -3
  424. package/src/meeting/index.ts +7882 -0
  425. package/src/meeting/locusMediaRequest.ts +313 -0
  426. package/src/meeting/muteState.ts +451 -0
  427. package/src/meeting/{request.js → request.ts} +421 -220
  428. package/src/meeting/request.type.ts +13 -0
  429. package/src/meeting/{state.js → state.ts} +50 -35
  430. package/src/meeting/util.ts +697 -0
  431. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  432. package/src/meeting-info/index.ts +210 -0
  433. package/src/meeting-info/meeting-info-v2.ts +429 -0
  434. package/src/meeting-info/{request.js → request.ts} +14 -4
  435. package/src/meeting-info/{util.js → util.ts} +60 -51
  436. package/src/meeting-info/{utilv2.js → utilv2.ts} +78 -71
  437. package/src/meetings/{collection.js → collection.ts} +26 -3
  438. package/src/meetings/index.ts +1470 -0
  439. package/src/meetings/meetings.types.ts +12 -0
  440. package/src/meetings/{request.js → request.ts} +34 -25
  441. package/src/meetings/{util.js → util.ts} +132 -37
  442. package/src/member/{index.js → index.ts} +160 -56
  443. package/src/member/types.ts +38 -0
  444. package/src/member/util.ts +397 -0
  445. package/src/members/{collection.js → collection.ts} +10 -2
  446. package/src/members/{index.js → index.ts} +351 -146
  447. package/src/members/request.ts +255 -0
  448. package/src/members/types.ts +29 -0
  449. package/src/members/util.ts +353 -0
  450. package/src/metrics/{constants.js → constants.ts} +12 -6
  451. package/src/metrics/index.ts +73 -0
  452. package/src/multistream/mediaRequestManager.ts +337 -63
  453. package/src/multistream/receiveSlot.ts +69 -26
  454. package/src/multistream/receiveSlotManager.ts +66 -42
  455. package/src/multistream/remoteMedia.ts +40 -5
  456. package/src/multistream/remoteMediaGroup.ts +63 -3
  457. package/src/multistream/remoteMediaManager.ts +300 -66
  458. package/src/multistream/sendSlotManager.ts +170 -0
  459. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  460. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  461. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  462. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  463. package/src/reachability/index.ts +671 -0
  464. package/src/reachability/request.ts +50 -35
  465. package/src/reactions/constants.ts +4 -0
  466. package/src/reactions/reactions.ts +104 -0
  467. package/src/reactions/reactions.type.ts +62 -0
  468. package/src/reconnection-manager/{index.js → index.ts} +258 -138
  469. package/src/recording-controller/enums.ts +8 -0
  470. package/src/recording-controller/index.ts +332 -0
  471. package/src/recording-controller/util.ts +75 -0
  472. package/src/roap/{index.js → index.ts} +127 -79
  473. package/src/roap/request.ts +153 -0
  474. package/src/roap/turnDiscovery.ts +109 -47
  475. package/src/rtcMetrics/constants.ts +3 -0
  476. package/src/rtcMetrics/index.ts +100 -0
  477. package/src/statsAnalyzer/global.ts +37 -0
  478. package/src/statsAnalyzer/index.ts +1250 -0
  479. package/src/statsAnalyzer/mqaUtil.ts +292 -0
  480. package/src/transcription/{index.js → index.ts} +46 -39
  481. package/src/webinar/collection.ts +31 -0
  482. package/src/webinar/index.ts +62 -0
  483. package/test/integration/spec/converged-space-meetings.js +233 -0
  484. package/test/integration/spec/journey.js +790 -530
  485. package/test/integration/spec/space-meeting.js +391 -204
  486. package/test/integration/spec/transcription.js +7 -8
  487. package/test/unit/spec/annotation/index.ts +418 -0
  488. package/test/unit/spec/breakouts/breakout.ts +237 -0
  489. package/test/unit/spec/breakouts/collection.ts +15 -0
  490. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  491. package/test/unit/spec/breakouts/events.ts +89 -0
  492. package/test/unit/spec/breakouts/index.ts +1790 -0
  493. package/test/unit/spec/breakouts/request.ts +104 -0
  494. package/test/unit/spec/breakouts/utils.js +72 -0
  495. package/test/unit/spec/common/browser-detection.js +9 -28
  496. package/test/unit/spec/common/queue.js +31 -2
  497. package/test/unit/spec/controls-options-manager/index.js +287 -0
  498. package/test/unit/spec/controls-options-manager/util.js +582 -0
  499. package/test/unit/spec/fixture/locus.js +93 -90
  500. package/test/unit/spec/interpretation/collection.ts +15 -0
  501. package/test/unit/spec/interpretation/index.ts +589 -0
  502. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  503. package/test/unit/spec/locus-info/controlsUtils.js +325 -32
  504. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  505. package/test/unit/spec/locus-info/index.js +1390 -17
  506. package/test/unit/spec/locus-info/infoUtils.js +71 -40
  507. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  508. package/test/unit/spec/locus-info/lib/SeqCmp.json +529 -685
  509. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  510. package/test/unit/spec/locus-info/parser.js +119 -44
  511. package/test/unit/spec/locus-info/selfConstant.js +120 -103
  512. package/test/unit/spec/locus-info/selfUtils.js +296 -12
  513. package/test/unit/spec/media/index.ts +128 -77
  514. package/test/unit/spec/media/properties.ts +11 -11
  515. package/test/unit/spec/meeting/in-meeting-actions.ts +92 -3
  516. package/test/unit/spec/meeting/index.js +7433 -2752
  517. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  518. package/test/unit/spec/meeting/muteState.js +420 -211
  519. package/test/unit/spec/meeting/request.js +545 -79
  520. package/test/unit/spec/meeting/utils.js +722 -174
  521. package/test/unit/spec/meeting-info/index.js +300 -0
  522. package/test/unit/spec/meeting-info/meetinginfov2.js +624 -76
  523. package/test/unit/spec/meeting-info/request.js +7 -9
  524. package/test/unit/spec/meeting-info/util.js +11 -12
  525. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  526. package/test/unit/spec/meetings/collection.js +15 -1
  527. package/test/unit/spec/meetings/index.js +1365 -377
  528. package/test/unit/spec/meetings/utils.js +216 -14
  529. package/test/unit/spec/member/index.js +61 -7
  530. package/test/unit/spec/member/util.js +526 -26
  531. package/test/unit/spec/members/index.js +536 -55
  532. package/test/unit/spec/members/request.js +228 -40
  533. package/test/unit/spec/members/utils.js +217 -4
  534. package/test/unit/spec/metrics/index.js +12 -66
  535. package/test/unit/spec/multistream/mediaRequestManager.ts +1012 -109
  536. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  537. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  538. package/test/unit/spec/multistream/remoteMedia.ts +40 -2
  539. package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
  540. package/test/unit/spec/multistream/remoteMediaManager.ts +738 -65
  541. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  542. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  543. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  544. package/test/unit/spec/reachability/index.ts +598 -26
  545. package/test/unit/spec/reachability/request.js +68 -0
  546. package/test/unit/spec/reconnection-manager/index.js +181 -12
  547. package/test/unit/spec/recording-controller/index.js +307 -0
  548. package/test/unit/spec/recording-controller/util.js +229 -0
  549. package/test/unit/spec/roap/index.ts +179 -64
  550. package/test/unit/spec/roap/request.ts +232 -0
  551. package/test/unit/spec/roap/turnDiscovery.ts +123 -58
  552. package/test/unit/spec/rtcMetrics/index.ts +73 -0
  553. package/test/unit/spec/stats-analyzer/index.js +199 -60
  554. package/test/unit/spec/webinar/collection.ts +13 -0
  555. package/test/unit/spec/webinar/index.ts +60 -0
  556. package/test/utils/cmr.js +44 -42
  557. package/test/utils/constants.js +9 -0
  558. package/test/utils/integrationTestUtils.js +46 -0
  559. package/test/utils/testUtils.js +63 -99
  560. package/test/utils/webex-config.js +22 -18
  561. package/test/utils/webex-test-users.js +57 -50
  562. package/tsconfig.json +6 -0
  563. package/dist/media/internal-media-core-wrapper.js +0 -22
  564. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  565. package/dist/meeting/effectsState.js +0 -327
  566. package/dist/meeting/effectsState.js.map +0 -1
  567. package/dist/metrics/config.js +0 -301
  568. package/dist/metrics/config.js.map +0 -1
  569. package/dist/multistream/multistreamMedia.js +0 -116
  570. package/dist/multistream/multistreamMedia.js.map +0 -1
  571. package/dist/peer-connection-manager/util.js +0 -124
  572. package/dist/peer-connection-manager/util.js.map +0 -1
  573. package/src/common/logs/logger-proxy.js +0 -33
  574. package/src/index.js +0 -15
  575. package/src/locus-info/controlsUtils.js +0 -102
  576. package/src/media/index.js +0 -459
  577. package/src/media/internal-media-core-wrapper.ts +0 -9
  578. package/src/media/properties.js +0 -289
  579. package/src/mediaQualityMetrics/config.js +0 -382
  580. package/src/meeting/effectsState.js +0 -205
  581. package/src/meeting/index.js +0 -6284
  582. package/src/meeting/muteState.js +0 -318
  583. package/src/meeting/util.js +0 -506
  584. package/src/meeting-info/index.js +0 -131
  585. package/src/meeting-info/meeting-info-v2.js +0 -255
  586. package/src/meetings/index.js +0 -1015
  587. package/src/member/util.js +0 -254
  588. package/src/members/request.js +0 -131
  589. package/src/members/util.js +0 -258
  590. package/src/metrics/config.js +0 -324
  591. package/src/metrics/index.js +0 -530
  592. package/src/multistream/multistreamMedia.ts +0 -92
  593. package/src/peer-connection-manager/util.ts +0 -117
  594. package/src/reachability/index.js +0 -464
  595. package/src/roap/request.js +0 -127
  596. package/src/statsAnalyzer/global.js +0 -133
  597. package/src/statsAnalyzer/index.js +0 -1006
  598. package/src/statsAnalyzer/mqaUtil.js +0 -173
  599. package/test/unit/spec/meeting/effectsState.js +0 -291
  600. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  601. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -0,0 +1,232 @@
1
+ import sinon from 'sinon';
2
+ import {assert} from '@webex/test-helper-chai';
3
+ import MockWebex from '@webex/test-helper-mock-webex';
4
+ import Meetings from '@webex/plugin-meetings';
5
+ import RoapRequest from '@webex/plugin-meetings/src/roap/request';
6
+ import {IP_VERSION, REACHABILITY} from '@webex/plugin-meetings/src/constants';
7
+
8
+ describe('plugin-meetings/roap', () => {
9
+ let roapRequest;
10
+ let webex;
11
+ const locusUrl = 'locusUrl';
12
+
13
+ beforeEach(async () => {
14
+ webex = new MockWebex({
15
+ children: {
16
+ meetings: Meetings,
17
+ },
18
+ });
19
+
20
+ webex.meetings.clientRegion = {
21
+ countryCode: 'US',
22
+ regionCode: 'WEST-COAST',
23
+ };
24
+
25
+ webex.internal = {
26
+ services: {
27
+ get: sinon.mock().returns(locusUrl),
28
+ waitForCatalog: sinon.mock().returns(Promise.resolve({})),
29
+ },
30
+ device: {
31
+ url: 'url',
32
+ },
33
+ newMetrics: {
34
+ submitClientEvent: sinon.stub()
35
+ },
36
+ };
37
+
38
+ // @ts-ignore
39
+ roapRequest = new RoapRequest({webex});
40
+
41
+ roapRequest.request = sinon.mock().returns(
42
+ Promise.resolve({
43
+ body: {
44
+ locus: {
45
+ roapSeq: '',
46
+ id: '',
47
+ url: 'url/path',
48
+ fullState: {
49
+ lastActive: 'lastActive',
50
+ },
51
+ },
52
+ },
53
+ })
54
+ );
55
+
56
+ await webex.boundedStorage.put(
57
+ REACHABILITY.namespace,
58
+ REACHABILITY.localStorageJoinCookie,
59
+ JSON.stringify({
60
+ anycastEntryPoint: 'aws-eu-west-1',
61
+ })
62
+ );
63
+ await webex.boundedStorage.put(
64
+ REACHABILITY.namespace,
65
+ REACHABILITY.localStorageResult,
66
+ JSON.stringify({
67
+ clusterId: {
68
+ udp: 'test',
69
+ isVideoMesh: false,
70
+ },
71
+ })
72
+ );
73
+ });
74
+
75
+ describe('#attachReachabilityData', () => {
76
+ it('returns the correct reachability data', async () => {
77
+ const res = await roapRequest.attachReachabilityData({});
78
+
79
+ assert.deepEqual(res.localSdp, {
80
+ reachability: {
81
+ clusterId: {
82
+ udp: 'test',
83
+ },
84
+ },
85
+ });
86
+ assert.deepEqual(res.joinCookie, {
87
+ anycastEntryPoint: 'aws-eu-west-1',
88
+ });
89
+ });
90
+
91
+ it('handles the case when reachability data does not exist', async () => {
92
+ await webex.boundedStorage.del(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie);
93
+
94
+ await webex.boundedStorage.del(REACHABILITY.namespace, REACHABILITY.localStorageResult);
95
+ const sdp = {
96
+ some: 'attribute',
97
+ };
98
+
99
+ const result = await roapRequest.attachReachabilityData(sdp);
100
+
101
+ assert.deepEqual(result, {
102
+ joinCookie: undefined,
103
+ localSdp: {
104
+ some: 'attribute',
105
+ },
106
+ });
107
+ });
108
+ });
109
+
110
+ describe('sendRoap', () => {
111
+ it('includes joinCookie in the request correctly', async () => {
112
+ const locusMediaRequest = {send: sinon.stub().resolves({body: {locus: {}}})};
113
+ const ipVersion = IP_VERSION.unknown;
114
+
115
+ await roapRequest.sendRoap({
116
+ locusSelfUrl: locusUrl,
117
+ ipVersion,
118
+ mediaId: 'mediaId',
119
+ roapMessage: {
120
+ seq: 'seq',
121
+ },
122
+ meetingId: 'meeting-id',
123
+ locusMediaRequest,
124
+ });
125
+
126
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
127
+ name: 'client.locus.media.request',
128
+ options: {
129
+ meetingId: 'meeting-id',
130
+ },
131
+ });
132
+
133
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
134
+ name: 'client.locus.media.response',
135
+ options: {
136
+ meetingId: 'meeting-id',
137
+ },
138
+ });
139
+
140
+ const requestParams = locusMediaRequest.send.getCall(0).args[0];
141
+ assert.deepEqual(requestParams, {
142
+ type: 'RoapMessage',
143
+ selfUrl: locusUrl,
144
+ ipVersion,
145
+ joinCookie: {
146
+ anycastEntryPoint: 'aws-eu-west-1',
147
+ },
148
+ mediaId: 'mediaId',
149
+ roapMessage: {
150
+ seq: 'seq',
151
+ },
152
+ reachability: {clusterId: {udp: 'test'}},
153
+ });
154
+ });
155
+
156
+ it('sends correct client event when fails', async () => {
157
+ const locusMediaRequest = {send: sinon.stub().rejects({code: 300, message: 'error'})};
158
+ try {
159
+ await roapRequest.sendRoap({
160
+ locusSelfUrl: locusUrl,
161
+ mediaId: 'mediaId',
162
+ roapMessage: {
163
+ seq: 'seq',
164
+ },
165
+ meetingId: 'meeting-id',
166
+ locusMediaRequest,
167
+ });
168
+ } catch (err) {
169
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
170
+ name: 'client.locus.media.response',
171
+ options: {
172
+ meetingId: 'meeting-id',
173
+ rawError: {code: 300, message: 'error'},
174
+ },
175
+ });
176
+ }
177
+ });
178
+ });
179
+
180
+ it('calls attachReachabilityData when sendRoap', async () => {
181
+ const locusMediaRequest = { send: sinon.stub().resolves({body: {locus: {}}})};
182
+
183
+ const newSdp = {
184
+ new: 'sdp',
185
+ reachability: { someResult: 'whatever' }
186
+ };
187
+ const ipVersion = IP_VERSION.only_ipv6;
188
+
189
+ roapRequest.attachReachabilityData = sinon.stub().returns(
190
+ Promise.resolve({
191
+ localSdp: newSdp,
192
+ joinCookie: {
193
+ anycastEntryPoint: 'aws-eu-west-1',
194
+ },
195
+ })
196
+ );
197
+
198
+ await roapRequest.sendRoap({
199
+ roapMessage: {
200
+ seq: 1,
201
+ },
202
+ locusSelfUrl: 'locusSelfUrl',
203
+ ipVersion,
204
+ mediaId: 'mediaId',
205
+ meetingId: 'meetingId',
206
+ preferTranscoding: true,
207
+ locusMediaRequest
208
+ });
209
+
210
+ const requestParams = locusMediaRequest.send.getCall(0).args[0];
211
+
212
+ assert.deepEqual(requestParams, {
213
+ type: 'RoapMessage',
214
+ selfUrl: 'locusSelfUrl',
215
+ ipVersion,
216
+ joinCookie: {
217
+ anycastEntryPoint: 'aws-eu-west-1',
218
+ },
219
+ mediaId: 'mediaId',
220
+ roapMessage: {
221
+ seq: 1,
222
+ },
223
+ reachability: { someResult: 'whatever' },
224
+ });
225
+
226
+ assert.calledOnceWithExactly(roapRequest.attachReachabilityData, {
227
+ roapMessage: {
228
+ seq: 1,
229
+ },
230
+ });
231
+ });
232
+ });
@@ -5,8 +5,10 @@ import TurnDiscovery from '@webex/plugin-meetings/src/roap/turnDiscovery';
5
5
  import Metrics from '@webex/plugin-meetings/src/metrics';
6
6
  import BEHAVIORAL_METRICS from '@webex/plugin-meetings/src/metrics/constants';
7
7
  import RoapRequest from '@webex/plugin-meetings/src/roap/request';
8
+ import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
8
9
 
9
10
  import testUtils from '../../../utils/testUtils';
11
+ import { IP_VERSION } from '../../../../src/constants';
10
12
 
11
13
  describe('TurnDiscovery', () => {
12
14
  let clock;
@@ -23,30 +25,34 @@ describe('TurnDiscovery', () => {
23
25
  clock = sinon.useFakeTimers();
24
26
 
25
27
  sinon.stub(Metrics, 'sendBehavioralMetric');
28
+ sinon.stub(MeetingUtil, 'getIpVersion').returns(IP_VERSION.unknown);
26
29
 
27
30
  mockRoapRequest = {
28
- sendRoap: sinon.fake.resolves({mediaConnections: FAKE_MEDIA_CONNECTIONS_FROM_LOCUS})
31
+ sendRoap: sinon.fake.resolves({mediaConnections: FAKE_MEDIA_CONNECTIONS_FROM_LOCUS}),
29
32
  } as unknown as RoapRequest;
30
33
 
31
34
  testMeeting = {
32
35
  id: 'fake meeting id',
33
- config: {
34
- experimental: {
35
- enableTurnDiscovery: true
36
- }
37
- },
38
36
  correlationId: 'fake correlation id',
39
37
  selfUrl: 'fake self url',
40
38
  mediaId: 'fake media id',
41
39
  locusUrl: `https://locus-a.wbx2.com/locus/api/v1/loci/${FAKE_LOCUS_ID}`,
42
40
  roapSeq: -1,
43
- isAudioMuted: () => true,
44
- isVideoMuted: () => false,
41
+ audio:{
42
+ isLocallyMuted: () => true,
43
+ },
44
+ video:{
45
+ isLocallyMuted: () => false,
46
+ },
45
47
  setRoapSeq: sinon.fake((newSeq) => {
46
48
  testMeeting.roapSeq = newSeq;
47
49
  }),
48
50
  updateMediaConnections: sinon.stub(),
49
- webex: {meetings: {reachability: {isAnyClusterReachable: () => false}}}
51
+ webex: {meetings: {reachability: {
52
+ isAnyPublicClusterReachable: () => Promise.resolve(false),
53
+ }}},
54
+ isMultistream: false,
55
+ locusMediaRequest: { fake: true },
50
56
  };
51
57
  });
52
58
 
@@ -55,23 +61,32 @@ describe('TurnDiscovery', () => {
55
61
  sinon.restore();
56
62
  });
57
63
 
58
- const checkRoapMessageSent = async (messageType, expectedSeq, expectedMediaId = testMeeting.mediaId) => {
64
+ const checkRoapMessageSent = async (
65
+ messageType,
66
+ expectedSeq,
67
+ expectedMediaId = testMeeting.mediaId
68
+ ) => {
59
69
  await testUtils.flushPromises();
60
70
 
61
71
  assert.calledOnce(mockRoapRequest.sendRoap);
62
- assert.calledWith(mockRoapRequest.sendRoap, {
72
+
73
+ const expectedSendRoapArgs: any = {
63
74
  roapMessage: {
64
75
  messageType,
65
76
  version: '2',
66
77
  seq: expectedSeq,
67
78
  },
68
- correlationId: testMeeting.correlationId,
69
79
  locusSelfUrl: testMeeting.selfUrl,
70
80
  mediaId: expectedMediaId,
71
- audioMuted: testMeeting.isAudioMuted(),
72
- videoMuted: testMeeting.isVideoMuted(),
73
- meetingId: testMeeting.id
74
- });
81
+ meetingId: testMeeting.id,
82
+ locusMediaRequest: testMeeting.locusMediaRequest,
83
+ };
84
+
85
+ if (messageType === 'TURN_DISCOVERY_REQUEST') {
86
+ expectedSendRoapArgs.ipVersion = 0;
87
+ }
88
+
89
+ assert.calledWith(mockRoapRequest.sendRoap, expectedSendRoapArgs);
75
90
 
76
91
  if (messageType === 'TURN_DISCOVERY_REQUEST') {
77
92
  // check also that we've applied the media connections from the response
@@ -93,16 +108,60 @@ describe('TurnDiscovery', () => {
93
108
  };
94
109
 
95
110
  describe('doTurnDiscovery', () => {
96
- it('sends TURN_DISCOVERY_REQUEST, waits for response and sends OK', async () => {
111
+ [false, true].forEach(function (enabledMultistream ) {
112
+ it('sends TURN_DISCOVERY_REQUEST'+ (enabledMultistream ? ' when enable Multistream':'') + ', waits for response and sends OK', async () => {
113
+ testMeeting.isMultistream = enabledMultistream;
114
+
115
+ const td = new TurnDiscovery(mockRoapRequest);
116
+
117
+ const result = td.doTurnDiscovery(testMeeting, false);
118
+
119
+ // check that TURN_DISCOVERY_REQUEST was sent
120
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
121
+
122
+ // @ts-ignore
123
+ mockRoapRequest.sendRoap.resetHistory();
124
+
125
+ // simulate the response
126
+ td.handleTurnDiscoveryResponse({
127
+ headers: [
128
+ `x-cisco-turn-url=${FAKE_TURN_URL}`,
129
+ `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
130
+ `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
131
+ ]
132
+ });
133
+
134
+ await testUtils.flushPromises();
135
+
136
+ // check that we've sent OK
137
+ await checkRoapMessageSent('OK', 0);
138
+
139
+ const {turnServerInfo, turnDiscoverySkippedReason} = await result;
140
+
141
+ assert.deepEqual(turnServerInfo, {
142
+ url: FAKE_TURN_URL,
143
+ username: FAKE_TURN_USERNAME,
144
+ password: FAKE_TURN_PASSWORD
145
+ });
146
+
147
+ assert.isUndefined(turnDiscoverySkippedReason);
148
+ });
149
+ });
150
+
151
+ it('sends TURN_DISCOVERY_REQUEST, waits for response and sends OK when isForced = true when cluster is reachable', async () => {
152
+ const prev = testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable;
153
+ testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = sinon.stub().resolves(true);
154
+
97
155
  const td = new TurnDiscovery(mockRoapRequest);
156
+ const result = td.doTurnDiscovery(testMeeting, false, true);
98
157
 
99
- const result = td.doTurnDiscovery(testMeeting, false);
158
+ // We ignore reachability results so we don't get skip reason
159
+ assert.notCalled(testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable);
100
160
 
101
161
  // check that TURN_DISCOVERY_REQUEST was sent
102
162
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
103
-
163
+ // @ts-ignore
104
164
  mockRoapRequest.sendRoap.resetHistory();
105
-
106
165
  // simulate the response
107
166
  td.handleTurnDiscoveryResponse({
108
167
  headers: [
@@ -111,21 +170,20 @@ describe('TurnDiscovery', () => {
111
170
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
112
171
  ]
113
172
  });
114
-
115
173
  await testUtils.flushPromises();
116
-
117
174
  // check that we've sent OK
118
175
  await checkRoapMessageSent('OK', 0);
119
176
 
120
177
  const {turnServerInfo, turnDiscoverySkippedReason} = await result;
121
-
122
178
  assert.deepEqual(turnServerInfo, {
123
179
  url: FAKE_TURN_URL,
124
180
  username: FAKE_TURN_USERNAME,
125
181
  password: FAKE_TURN_PASSWORD
126
182
  });
127
-
128
183
  assert.isUndefined(turnDiscoverySkippedReason);
184
+
185
+ // restore previous callback
186
+ testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = prev;
129
187
  });
130
188
 
131
189
  it('sends TURN_DISCOVERY_REQUEST with empty mediaId when isReconnecting is true', async () => {
@@ -137,6 +195,7 @@ describe('TurnDiscovery', () => {
137
195
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0, '');
138
196
 
139
197
  // the main part of the test is complete now, checking the remaining part of the flow just for completeness
198
+ // @ts-ignore
140
199
  mockRoapRequest.sendRoap.resetHistory();
141
200
 
142
201
  // simulate the response
@@ -145,7 +204,7 @@ describe('TurnDiscovery', () => {
145
204
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
146
205
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
147
206
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
148
- ]
207
+ ],
149
208
  });
150
209
 
151
210
  await testUtils.flushPromises();
@@ -158,7 +217,7 @@ describe('TurnDiscovery', () => {
158
217
  assert.deepEqual(turnServerInfo, {
159
218
  url: FAKE_TURN_URL,
160
219
  username: FAKE_TURN_USERNAME,
161
- password: FAKE_TURN_PASSWORD
220
+ password: FAKE_TURN_PASSWORD,
162
221
  });
163
222
  assert.isUndefined(turnDiscoverySkippedReason);
164
223
  });
@@ -169,7 +228,7 @@ describe('TurnDiscovery', () => {
169
228
 
170
229
  // check that TURN_DISCOVERY_REQUEST was sent
171
230
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
172
-
231
+ // @ts-ignore
173
232
  mockRoapRequest.sendRoap.resetHistory();
174
233
 
175
234
  // simulate the response with some extra headers
@@ -181,7 +240,7 @@ describe('TurnDiscovery', () => {
181
240
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
182
241
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
183
242
  'another-header-at-the-end=12345',
184
- ]
243
+ ],
185
244
  });
186
245
 
187
246
  await testUtils.flushPromises();
@@ -193,29 +252,11 @@ describe('TurnDiscovery', () => {
193
252
  assert.deepEqual(turnServerInfo, {
194
253
  url: FAKE_TURN_URL,
195
254
  username: FAKE_TURN_USERNAME,
196
- password: FAKE_TURN_PASSWORD
255
+ password: FAKE_TURN_PASSWORD,
197
256
  });
198
257
  assert.isUndefined(turnDiscoverySkippedReason);
199
258
  });
200
259
 
201
- it('resolves with undefined if turn discovery feature is disabled in config', async () => {
202
- const prevConfigValue = testMeeting.config.experimental.enableTurnDiscovery;
203
-
204
- testMeeting.config.experimental.enableTurnDiscovery = false;
205
-
206
- const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
207
-
208
- const {turnServerInfo, turnDiscoverySkippedReason} = result;
209
-
210
- assert.isUndefined(turnServerInfo);
211
- assert.equal(turnDiscoverySkippedReason, 'config');
212
- assert.notCalled(mockRoapRequest.sendRoap);
213
- assert.notCalled(Metrics.sendBehavioralMetric);
214
-
215
- // restore previous config
216
- testMeeting.config.experimental.enableTurnDiscovery = prevConfigValue;
217
- });
218
-
219
260
  it('resolves with undefined if sending the request fails', async () => {
220
261
  const td = new TurnDiscovery(mockRoapRequest);
221
262
 
@@ -231,8 +272,8 @@ describe('TurnDiscovery', () => {
231
272
  });
232
273
 
233
274
  it('resolves with undefined when cluster is reachable', async () => {
234
- const prev = testMeeting.webex.meetings.reachability.isAnyClusterReachable;
235
- testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => true;
275
+ const prev = testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable;
276
+ testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = () => Promise.resolve(true);
236
277
  const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
237
278
 
238
279
  const {turnServerInfo, turnDiscoverySkippedReason} = result;
@@ -241,11 +282,10 @@ describe('TurnDiscovery', () => {
241
282
  assert.equal(turnDiscoverySkippedReason, 'reachability');
242
283
  assert.notCalled(mockRoapRequest.sendRoap);
243
284
  assert.notCalled(Metrics.sendBehavioralMetric);
244
- testMeeting.webex.meetings.reachability.isAnyClusterReachable = prev;
245
-
285
+ testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = prev;
246
286
  });
247
287
 
248
- it('resolves with undefined if we don\'t get a response within 10s', async () => {
288
+ it("resolves with undefined if we don't get a response within 10s", async () => {
249
289
  const td = new TurnDiscovery(mockRoapRequest);
250
290
 
251
291
  const promise = td.doTurnDiscovery(testMeeting, false);
@@ -264,12 +304,14 @@ describe('TurnDiscovery', () => {
264
304
  const td = new TurnDiscovery(mockRoapRequest);
265
305
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
266
306
 
307
+ await testUtils.flushPromises();
308
+
267
309
  // simulate the response without the password
268
310
  td.handleTurnDiscoveryResponse({
269
311
  headers: [
270
312
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
271
313
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
272
- ]
314
+ ],
273
315
  });
274
316
  await testUtils.flushPromises();
275
317
  const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
@@ -283,6 +325,8 @@ describe('TurnDiscovery', () => {
283
325
  const td = new TurnDiscovery(mockRoapRequest);
284
326
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
285
327
 
328
+ await testUtils.flushPromises();
329
+
286
330
  // simulate the response without the headers
287
331
  td.handleTurnDiscoveryResponse({});
288
332
 
@@ -298,11 +342,13 @@ describe('TurnDiscovery', () => {
298
342
  const td = new TurnDiscovery(mockRoapRequest);
299
343
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
300
344
 
345
+ await testUtils.flushPromises();
346
+
301
347
  // simulate the response without the headers
302
348
  td.handleTurnDiscoveryResponse({headers: []});
303
349
 
304
350
  await testUtils.flushPromises();
305
- const {turnServerInfo, turnDiscoverySkippedReason}= await turnDiscoveryPromise;
351
+ const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
306
352
 
307
353
  assert.isUndefined(turnServerInfo);
308
354
  assert.isUndefined(turnDiscoverySkippedReason);
@@ -314,9 +360,11 @@ describe('TurnDiscovery', () => {
314
360
 
315
361
  const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
316
362
 
363
+ await testUtils.flushPromises();
364
+
317
365
  // check that TURN_DISCOVERY_REQUEST was sent
318
366
  await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
319
-
367
+ // @ts-ignore
320
368
  mockRoapRequest.sendRoap.resetHistory();
321
369
 
322
370
  // setup the mock so that sending of OK fails
@@ -328,7 +376,7 @@ describe('TurnDiscovery', () => {
328
376
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
329
377
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
330
378
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
331
- ]
379
+ ],
332
380
  });
333
381
 
334
382
  await testUtils.flushPromises();
@@ -344,8 +392,25 @@ describe('TurnDiscovery', () => {
344
392
  });
345
393
  });
346
394
 
395
+ describe('isSkipped', () => {
396
+ [
397
+ {isAnyPublicClusterReachable: true, expectedIsSkipped: true},
398
+ {isAnyPublicClusterReachable: false, expectedIsSkipped: false},
399
+ ].forEach(({isAnyPublicClusterReachable, expectedIsSkipped}) => {
400
+ it(`returns ${expectedIsSkipped} when isAnyPublicClusterReachable() returns ${isAnyPublicClusterReachable ? 'true' : 'false'}`, async () => {
401
+ sinon.stub(testMeeting.webex.meetings.reachability, 'isAnyPublicClusterReachable').resolves(isAnyPublicClusterReachable);
402
+
403
+ const td = new TurnDiscovery(mockRoapRequest);
404
+
405
+ const isSkipped = await td.isSkipped(testMeeting);
406
+
407
+ assert.equal(isSkipped, expectedIsSkipped);
408
+ })
409
+ })
410
+ })
411
+
347
412
  describe('handleTurnDiscoveryResponse', () => {
348
- it('doesn\'t do anything if turn discovery was not started', () => {
413
+ it("doesn't do anything if turn discovery was not started", () => {
349
414
  const td = new TurnDiscovery(mockRoapRequest);
350
415
 
351
416
  // there is not much we can check, but we mainly want to make
@@ -355,7 +420,7 @@ describe('TurnDiscovery', () => {
355
420
  `x-cisco-turn-url=${FAKE_TURN_URL}`,
356
421
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
357
422
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
358
- ]
423
+ ],
359
424
  });
360
425
 
361
426
  assert.notCalled(mockRoapRequest.sendRoap);
@@ -0,0 +1,73 @@
1
+ import RtcMetrics from '@webex/plugin-meetings/src/rtcMetrics';
2
+ import MockWebex from '@webex/test-helper-mock-webex';
3
+ import {assert} from '@webex/test-helper-chai';
4
+ import sinon from 'sinon';
5
+ import RTC_METRICS from '../../../../src/rtcMetrics/constants';
6
+
7
+ const FAKE_METRICS_ITEM = {payload: ['fake-metrics']};
8
+
9
+ describe('RtcMetrics', () => {
10
+ let metrics: RtcMetrics;
11
+ let webex: MockWebex;
12
+ let clock;
13
+
14
+ beforeEach(() => {
15
+ clock = sinon.useFakeTimers();
16
+ webex = new MockWebex();
17
+ metrics = new RtcMetrics(webex, 'mock-meeting-id', 'mock-correlation-id');
18
+ });
19
+
20
+ it('sendMetrics should send a webex request', () => {
21
+ assert.notCalled(webex.request);
22
+
23
+ metrics.addMetrics(FAKE_METRICS_ITEM);
24
+ (metrics as any).sendMetrics();
25
+
26
+ assert.callCount(webex.request, 1);
27
+ assert.calledWithMatch(webex.request, sinon.match.has('headers', {
28
+ type: 'webrtcMedia',
29
+ appId: RTC_METRICS.APP_ID,
30
+ }));
31
+ assert.calledWithMatch(webex.request, sinon.match.hasNested('body.metrics[0].data[0].payload', FAKE_METRICS_ITEM.payload));
32
+ assert.calledWithMatch(webex.request, sinon.match.hasNested('body.metrics[0].meetingId', 'mock-meeting-id'));
33
+ assert.calledWithMatch(webex.request, sinon.match.hasNested('body.metrics[0].correlationId', 'mock-correlation-id'));
34
+ });
35
+
36
+ it('should have a defined sendMetricsInQueue function which is public', () => {
37
+ assert.isDefined(metrics.sendMetricsInQueue);
38
+ assert.isFunction(metrics.sendMetricsInQueue);
39
+ });
40
+
41
+ it('should send metrics requests over time', () => {
42
+ assert.notCalled(webex.request);
43
+
44
+ metrics.addMetrics(FAKE_METRICS_ITEM);
45
+ assert.deepEqual(metrics.metricsQueue, [FAKE_METRICS_ITEM]);
46
+ clock.tick(60 * 1000);
47
+
48
+ assert.callCount(webex.request, 1);
49
+ });
50
+
51
+ it('should not send requests with no items in the queue', () => {
52
+ clock.tick(60 * 1000);
53
+ assert.notCalled(webex.request);
54
+ });
55
+
56
+ it('sendMetricsInQueue should send metrics if any exist in the queue', () => {
57
+ assert.notCalled(webex.request);
58
+
59
+ metrics.addMetrics(FAKE_METRICS_ITEM);
60
+ (metrics as any).sendMetricsInQueue();
61
+
62
+ assert.callCount(webex.request, 1);
63
+ });
64
+
65
+ it('should clear out metrics on close', () => {
66
+ assert.notCalled(webex.request);
67
+
68
+ metrics.addMetrics(FAKE_METRICS_ITEM);
69
+ metrics.closeMetrics();
70
+
71
+ assert.callCount(webex.request, 1);
72
+ });
73
+ });