@webex/plugin-meetings 3.0.0-beta.31 → 3.0.0-beta.310

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 (378) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +94 -15
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +709 -35
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/utils.js +45 -1
  17. package/dist/breakouts/utils.js.map +1 -1
  18. package/dist/common/errors/no-meeting-info.js +51 -0
  19. package/dist/common/errors/no-meeting-info.js.map +1 -0
  20. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  21. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +48 -7
  23. package/dist/common/errors/webex-errors.js.map +1 -1
  24. package/dist/common/logs/logger-proxy.js +1 -1
  25. package/dist/common/logs/logger-proxy.js.map +1 -1
  26. package/dist/common/logs/request.js +5 -1
  27. package/dist/common/logs/request.js.map +1 -1
  28. package/dist/common/queue.js +24 -9
  29. package/dist/common/queue.js.map +1 -1
  30. package/dist/config.js +5 -11
  31. package/dist/config.js.map +1 -1
  32. package/dist/constants.js +233 -29
  33. package/dist/constants.js.map +1 -1
  34. package/dist/controls-options-manager/enums.js +14 -2
  35. package/dist/controls-options-manager/enums.js.map +1 -1
  36. package/dist/controls-options-manager/index.js +109 -15
  37. package/dist/controls-options-manager/index.js.map +1 -1
  38. package/dist/controls-options-manager/types.js +7 -0
  39. package/dist/controls-options-manager/types.js.map +1 -0
  40. package/dist/controls-options-manager/util.js +309 -18
  41. package/dist/controls-options-manager/util.js.map +1 -1
  42. package/dist/index.js +112 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/interpretation/collection.js +23 -0
  45. package/dist/interpretation/collection.js.map +1 -0
  46. package/dist/interpretation/index.js +366 -0
  47. package/dist/interpretation/index.js.map +1 -0
  48. package/dist/interpretation/siLanguage.js +25 -0
  49. package/dist/interpretation/siLanguage.js.map +1 -0
  50. package/dist/locus-info/controlsUtils.js +91 -2
  51. package/dist/locus-info/controlsUtils.js.map +1 -1
  52. package/dist/locus-info/index.js +383 -62
  53. package/dist/locus-info/index.js.map +1 -1
  54. package/dist/locus-info/infoUtils.js +7 -1
  55. package/dist/locus-info/infoUtils.js.map +1 -1
  56. package/dist/locus-info/mediaSharesUtils.js +57 -1
  57. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  58. package/dist/locus-info/parser.js +249 -72
  59. package/dist/locus-info/parser.js.map +1 -1
  60. package/dist/locus-info/selfUtils.js +89 -14
  61. package/dist/locus-info/selfUtils.js.map +1 -1
  62. package/dist/media/index.js +61 -116
  63. package/dist/media/index.js.map +1 -1
  64. package/dist/media/properties.js +73 -124
  65. package/dist/media/properties.js.map +1 -1
  66. package/dist/meeting/in-meeting-actions.js +82 -2
  67. package/dist/meeting/in-meeting-actions.js.map +1 -1
  68. package/dist/meeting/index.js +3777 -2929
  69. package/dist/meeting/index.js.map +1 -1
  70. package/dist/meeting/locusMediaRequest.js +292 -0
  71. package/dist/meeting/locusMediaRequest.js.map +1 -0
  72. package/dist/meeting/muteState.js +230 -124
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +260 -196
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +601 -417
  77. package/dist/meeting/util.js.map +1 -1
  78. package/dist/meeting-info/index.js +73 -7
  79. package/dist/meeting-info/index.js.map +1 -1
  80. package/dist/meeting-info/meeting-info-v2.js +192 -51
  81. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  82. package/dist/meeting-info/util.js +1 -1
  83. package/dist/meeting-info/util.js.map +1 -1
  84. package/dist/meeting-info/utilv2.js +36 -36
  85. package/dist/meeting-info/utilv2.js.map +1 -1
  86. package/dist/meetings/collection.js +39 -0
  87. package/dist/meetings/collection.js.map +1 -1
  88. package/dist/meetings/index.js +415 -115
  89. package/dist/meetings/index.js.map +1 -1
  90. package/dist/meetings/meetings.types.js +7 -0
  91. package/dist/meetings/meetings.types.js.map +1 -0
  92. package/dist/meetings/request.js +2 -0
  93. package/dist/meetings/request.js.map +1 -1
  94. package/dist/meetings/util.js +72 -6
  95. package/dist/meetings/util.js.map +1 -1
  96. package/dist/member/index.js +58 -0
  97. package/dist/member/index.js.map +1 -1
  98. package/dist/member/types.js +25 -0
  99. package/dist/member/types.js.map +1 -0
  100. package/dist/member/util.js +132 -25
  101. package/dist/member/util.js.map +1 -1
  102. package/dist/members/collection.js +10 -0
  103. package/dist/members/collection.js.map +1 -1
  104. package/dist/members/index.js +102 -6
  105. package/dist/members/index.js.map +1 -1
  106. package/dist/members/request.js +106 -38
  107. package/dist/members/request.js.map +1 -1
  108. package/dist/members/types.js +15 -0
  109. package/dist/members/types.js.map +1 -0
  110. package/dist/members/util.js +326 -232
  111. package/dist/members/util.js.map +1 -1
  112. package/dist/metrics/constants.js +13 -5
  113. package/dist/metrics/constants.js.map +1 -1
  114. package/dist/metrics/index.js +1 -468
  115. package/dist/metrics/index.js.map +1 -1
  116. package/dist/multistream/mediaRequestManager.js +238 -49
  117. package/dist/multistream/mediaRequestManager.js.map +1 -1
  118. package/dist/multistream/receiveSlot.js +29 -16
  119. package/dist/multistream/receiveSlot.js.map +1 -1
  120. package/dist/multistream/receiveSlotManager.js +39 -36
  121. package/dist/multistream/receiveSlotManager.js.map +1 -1
  122. package/dist/multistream/remoteMedia.js +44 -18
  123. package/dist/multistream/remoteMedia.js.map +1 -1
  124. package/dist/multistream/remoteMediaGroup.js +60 -3
  125. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  126. package/dist/multistream/remoteMediaManager.js +209 -59
  127. package/dist/multistream/remoteMediaManager.js.map +1 -1
  128. package/dist/multistream/sendSlotManager.js +233 -0
  129. package/dist/multistream/sendSlotManager.js.map +1 -0
  130. package/dist/reachability/index.js +225 -59
  131. package/dist/reachability/index.js.map +1 -1
  132. package/dist/reachability/request.js +17 -8
  133. package/dist/reachability/request.js.map +1 -1
  134. package/dist/reconnection-manager/index.js +201 -156
  135. package/dist/reconnection-manager/index.js.map +1 -1
  136. package/dist/recording-controller/index.js +21 -2
  137. package/dist/recording-controller/index.js.map +1 -1
  138. package/dist/recording-controller/util.js +9 -8
  139. package/dist/recording-controller/util.js.map +1 -1
  140. package/dist/roap/index.js +62 -32
  141. package/dist/roap/index.js.map +1 -1
  142. package/dist/roap/request.js +112 -97
  143. package/dist/roap/request.js.map +1 -1
  144. package/dist/roap/turnDiscovery.js +95 -36
  145. package/dist/roap/turnDiscovery.js.map +1 -1
  146. package/dist/rtcMetrics/constants.js +12 -0
  147. package/dist/rtcMetrics/constants.js.map +1 -0
  148. package/dist/rtcMetrics/index.js +117 -0
  149. package/dist/rtcMetrics/index.js.map +1 -0
  150. package/dist/statsAnalyzer/index.js +86 -78
  151. package/dist/statsAnalyzer/index.js.map +1 -1
  152. package/dist/statsAnalyzer/mqaUtil.js +11 -10
  153. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  154. package/dist/types/annotation/annotation.types.d.ts +42 -0
  155. package/dist/types/annotation/constants.d.ts +31 -0
  156. package/dist/types/annotation/index.d.ts +117 -0
  157. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  158. package/dist/types/breakouts/events.d.ts +8 -0
  159. package/dist/types/breakouts/utils.d.ts +14 -0
  160. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  161. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  162. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  163. package/dist/types/common/logs/request.d.ts +2 -0
  164. package/dist/types/common/queue.d.ts +9 -7
  165. package/dist/types/config.d.ts +1 -7
  166. package/dist/types/constants.d.ts +194 -24
  167. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  168. package/dist/types/controls-options-manager/index.d.ts +17 -1
  169. package/dist/types/controls-options-manager/types.d.ts +43 -0
  170. package/dist/types/controls-options-manager/util.d.ts +1 -7
  171. package/dist/types/index.d.ts +6 -4
  172. package/dist/types/interpretation/collection.d.ts +5 -0
  173. package/dist/types/interpretation/index.d.ts +5 -0
  174. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  175. package/dist/types/locus-info/index.d.ts +57 -4
  176. package/dist/types/locus-info/parser.d.ts +67 -6
  177. package/dist/types/media/index.d.ts +2 -0
  178. package/dist/types/media/properties.d.ts +34 -48
  179. package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
  180. package/dist/types/meeting/index.d.ts +463 -510
  181. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  182. package/dist/types/meeting/muteState.d.ts +99 -23
  183. package/dist/types/meeting/request.d.ts +72 -43
  184. package/dist/types/meeting/util.d.ts +101 -1
  185. package/dist/types/meeting-info/index.d.ts +13 -1
  186. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  187. package/dist/types/meetings/collection.d.ts +17 -0
  188. package/dist/types/meetings/index.d.ts +98 -20
  189. package/dist/types/meetings/meetings.types.d.ts +4 -0
  190. package/dist/types/member/index.d.ts +14 -0
  191. package/dist/types/member/types.d.ts +32 -0
  192. package/dist/types/members/collection.d.ts +5 -0
  193. package/dist/types/members/index.d.ts +35 -2
  194. package/dist/types/members/request.d.ts +73 -9
  195. package/dist/types/members/types.d.ts +25 -0
  196. package/dist/types/members/util.d.ts +214 -1
  197. package/dist/types/metrics/constants.d.ts +12 -4
  198. package/dist/types/metrics/index.d.ts +4 -119
  199. package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
  200. package/dist/types/multistream/receiveSlot.d.ts +13 -11
  201. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  202. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  203. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  204. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  205. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  206. package/dist/types/reachability/index.d.ts +61 -7
  207. package/dist/types/reachability/request.d.ts +7 -3
  208. package/dist/types/reconnection-manager/index.d.ts +9 -0
  209. package/dist/types/recording-controller/index.d.ts +15 -1
  210. package/dist/types/recording-controller/util.d.ts +5 -4
  211. package/dist/types/roap/index.d.ts +2 -1
  212. package/dist/types/roap/request.d.ts +15 -11
  213. package/dist/types/roap/turnDiscovery.d.ts +21 -3
  214. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  215. package/dist/types/rtcMetrics/index.d.ts +47 -0
  216. package/dist/types/statsAnalyzer/index.d.ts +7 -1
  217. package/dist/types/webinar/collection.d.ts +16 -0
  218. package/dist/types/webinar/index.d.ts +5 -0
  219. package/dist/webinar/collection.js +44 -0
  220. package/dist/webinar/collection.js.map +1 -0
  221. package/dist/webinar/index.js +69 -0
  222. package/dist/webinar/index.js.map +1 -0
  223. package/package.json +23 -20
  224. package/src/annotation/annotation.types.ts +50 -0
  225. package/src/annotation/constants.ts +36 -0
  226. package/src/annotation/index.ts +328 -0
  227. package/src/breakouts/README.md +42 -12
  228. package/src/breakouts/breakout.ts +67 -9
  229. package/src/breakouts/edit-lock-error.ts +25 -0
  230. package/src/breakouts/events.ts +56 -0
  231. package/src/breakouts/index.ts +592 -20
  232. package/src/breakouts/utils.ts +42 -0
  233. package/src/common/errors/no-meeting-info.ts +24 -0
  234. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  235. package/src/common/errors/webex-errors.ts +44 -2
  236. package/src/common/logs/logger-proxy.ts +1 -1
  237. package/src/common/logs/request.ts +5 -1
  238. package/src/common/queue.ts +22 -8
  239. package/src/config.ts +4 -10
  240. package/src/constants.ts +221 -19
  241. package/src/controls-options-manager/enums.ts +12 -0
  242. package/src/controls-options-manager/index.ts +116 -21
  243. package/src/controls-options-manager/types.ts +59 -0
  244. package/src/controls-options-manager/util.ts +294 -14
  245. package/src/index.ts +40 -0
  246. package/src/interpretation/README.md +60 -0
  247. package/src/interpretation/collection.ts +19 -0
  248. package/src/interpretation/index.ts +332 -0
  249. package/src/interpretation/siLanguage.ts +18 -0
  250. package/src/locus-info/controlsUtils.ts +108 -0
  251. package/src/locus-info/index.ts +413 -59
  252. package/src/locus-info/infoUtils.ts +10 -2
  253. package/src/locus-info/mediaSharesUtils.ts +64 -0
  254. package/src/locus-info/parser.ts +258 -47
  255. package/src/locus-info/selfUtils.ts +81 -5
  256. package/src/media/index.ts +102 -122
  257. package/src/media/properties.ts +87 -110
  258. package/src/meeting/in-meeting-actions.ts +163 -3
  259. package/src/meeting/index.ts +3132 -2541
  260. package/src/meeting/locusMediaRequest.ts +313 -0
  261. package/src/meeting/muteState.ts +229 -131
  262. package/src/meeting/request.ts +177 -121
  263. package/src/meeting/util.ts +588 -394
  264. package/src/meeting-info/index.ts +81 -8
  265. package/src/meeting-info/meeting-info-v2.ts +170 -14
  266. package/src/meeting-info/util.ts +1 -1
  267. package/src/meeting-info/utilv2.ts +23 -23
  268. package/src/meetings/collection.ts +33 -0
  269. package/src/meetings/index.ts +445 -123
  270. package/src/meetings/meetings.types.ts +12 -0
  271. package/src/meetings/request.ts +2 -0
  272. package/src/meetings/util.ts +80 -11
  273. package/src/member/index.ts +58 -0
  274. package/src/member/types.ts +38 -0
  275. package/src/member/util.ts +141 -25
  276. package/src/members/collection.ts +8 -0
  277. package/src/members/index.ts +134 -8
  278. package/src/members/request.ts +97 -17
  279. package/src/members/types.ts +29 -0
  280. package/src/members/util.ts +333 -240
  281. package/src/metrics/constants.ts +12 -4
  282. package/src/metrics/index.ts +1 -490
  283. package/src/multistream/mediaRequestManager.ts +289 -79
  284. package/src/multistream/receiveSlot.ts +31 -17
  285. package/src/multistream/receiveSlotManager.ts +34 -24
  286. package/src/multistream/remoteMedia.ts +27 -2
  287. package/src/multistream/remoteMediaGroup.ts +59 -0
  288. package/src/multistream/remoteMediaManager.ts +148 -30
  289. package/src/multistream/sendSlotManager.ts +170 -0
  290. package/src/reachability/index.ts +228 -37
  291. package/src/reachability/request.ts +17 -8
  292. package/src/reconnection-manager/index.ts +83 -56
  293. package/src/recording-controller/index.ts +20 -3
  294. package/src/recording-controller/util.ts +26 -9
  295. package/src/roap/index.ts +63 -32
  296. package/src/roap/request.ts +100 -104
  297. package/src/roap/turnDiscovery.ts +48 -26
  298. package/src/rtcMetrics/constants.ts +3 -0
  299. package/src/rtcMetrics/index.ts +100 -0
  300. package/src/statsAnalyzer/index.ts +105 -91
  301. package/src/statsAnalyzer/mqaUtil.ts +13 -14
  302. package/src/webinar/collection.ts +31 -0
  303. package/src/webinar/index.ts +62 -0
  304. package/test/integration/spec/converged-space-meetings.js +60 -3
  305. package/test/integration/spec/journey.js +320 -261
  306. package/test/integration/spec/space-meeting.js +76 -3
  307. package/test/unit/spec/annotation/index.ts +418 -0
  308. package/test/unit/spec/breakouts/breakout.ts +118 -28
  309. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  310. package/test/unit/spec/breakouts/events.ts +89 -0
  311. package/test/unit/spec/breakouts/index.ts +1395 -69
  312. package/test/unit/spec/breakouts/utils.js +52 -1
  313. package/test/unit/spec/common/queue.js +31 -2
  314. package/test/unit/spec/controls-options-manager/index.js +163 -0
  315. package/test/unit/spec/controls-options-manager/util.js +576 -60
  316. package/test/unit/spec/fixture/locus.js +1 -0
  317. package/test/unit/spec/interpretation/collection.ts +15 -0
  318. package/test/unit/spec/interpretation/index.ts +589 -0
  319. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  320. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  321. package/test/unit/spec/locus-info/index.js +1304 -33
  322. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  323. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  324. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  325. package/test/unit/spec/locus-info/parser.js +116 -35
  326. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  327. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  328. package/test/unit/spec/media/index.ts +104 -37
  329. package/test/unit/spec/media/properties.ts +2 -2
  330. package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
  331. package/test/unit/spec/meeting/index.js +5216 -1956
  332. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  333. package/test/unit/spec/meeting/muteState.js +408 -208
  334. package/test/unit/spec/meeting/request.js +483 -49
  335. package/test/unit/spec/meeting/utils.js +679 -64
  336. package/test/unit/spec/meeting-info/index.js +300 -0
  337. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  338. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  339. package/test/unit/spec/meetings/collection.js +26 -0
  340. package/test/unit/spec/meetings/index.js +1011 -205
  341. package/test/unit/spec/meetings/utils.js +202 -2
  342. package/test/unit/spec/member/index.js +61 -6
  343. package/test/unit/spec/member/util.js +510 -34
  344. package/test/unit/spec/members/index.js +432 -1
  345. package/test/unit/spec/members/request.js +206 -27
  346. package/test/unit/spec/members/utils.js +210 -0
  347. package/test/unit/spec/metrics/index.js +1 -50
  348. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  349. package/test/unit/spec/multistream/receiveSlot.ts +28 -20
  350. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  351. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  352. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  353. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  354. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  355. package/test/unit/spec/reachability/index.ts +549 -9
  356. package/test/unit/spec/reachability/request.js +68 -0
  357. package/test/unit/spec/reconnection-manager/index.js +85 -9
  358. package/test/unit/spec/recording-controller/index.js +294 -218
  359. package/test/unit/spec/recording-controller/util.js +223 -96
  360. package/test/unit/spec/roap/index.ts +178 -64
  361. package/test/unit/spec/roap/request.ts +203 -85
  362. package/test/unit/spec/roap/turnDiscovery.ts +82 -36
  363. package/test/unit/spec/rtcMetrics/index.ts +73 -0
  364. package/test/unit/spec/stats-analyzer/index.js +136 -2
  365. package/test/unit/spec/webinar/collection.ts +13 -0
  366. package/test/unit/spec/webinar/index.ts +60 -0
  367. package/test/utils/integrationTestUtils.js +46 -0
  368. package/test/utils/testUtils.js +0 -52
  369. package/dist/meeting/effectsState.js +0 -262
  370. package/dist/meeting/effectsState.js.map +0 -1
  371. package/dist/metrics/config.js +0 -299
  372. package/dist/metrics/config.js.map +0 -1
  373. package/dist/types/meeting/effectsState.d.ts +0 -42
  374. package/dist/types/metrics/config.d.ts +0 -178
  375. package/src/index.js +0 -16
  376. package/src/meeting/effectsState.ts +0 -211
  377. package/src/metrics/config.ts +0 -495
  378. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -1,114 +1,232 @@
1
- import {assert} from '@webex/test-helper-chai';
2
1
  import sinon from 'sinon';
2
+ import {assert} from '@webex/test-helper-chai';
3
3
  import MockWebex from '@webex/test-helper-mock-webex';
4
- import Metrics from '@webex/plugin-meetings/src/metrics';
5
-
4
+ import Meetings from '@webex/plugin-meetings';
6
5
  import RoapRequest from '@webex/plugin-meetings/src/roap/request';
7
-
8
-
9
- describe('RoapRequest', () => {
10
- describe('attachRechabilityData', () => {
11
- let webex;
12
-
13
- beforeEach(() => {
14
- webex = new MockWebex();
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
+ },
15
18
  });
16
-
17
- it('attaches the reachability data when it exists', async () => {
18
- // @ts-ignore
19
- const roapRequest = new RoapRequest({}, {parent: webex});
20
-
21
- const sdp = {some: 'attribute'};
22
19
 
23
- const reachabilitData = {reachability: 'data'};
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
+ );
24
55
 
25
- await webex.boundedStorage.put(
26
- 'Reachability',
27
- 'reachability.result',
28
- JSON.stringify(reachabilitData)
29
- );
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
+ });
30
74
 
31
- const newSdp = await roapRequest.attachRechabilityData(sdp);
75
+ describe('#attachReachabilityData', () => {
76
+ it('returns the correct reachability data', async () => {
77
+ const res = await roapRequest.attachReachabilityData({});
32
78
 
33
- assert.deepEqual(newSdp, {
34
- some: 'attribute',
35
- reachability: reachabilitData
36
- })
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
+ });
37
89
  });
38
-
39
- it('handles the case when realiability data does not exist', async () => {
40
- // @ts-ignore
41
- const roapRequest = new RoapRequest({}, {parent: webex});
42
90
 
43
- const sdp = {some: 'attribute'};
91
+ it('handles the case when reachability data does not exist', async () => {
92
+ await webex.boundedStorage.del(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie);
44
93
 
45
- const newSdp = await roapRequest.attachRechabilityData(sdp);
94
+ await webex.boundedStorage.del(REACHABILITY.namespace, REACHABILITY.localStorageResult);
95
+ const sdp = {
96
+ some: 'attribute',
97
+ };
98
+
99
+ const result = await roapRequest.attachReachabilityData(sdp);
46
100
 
47
- assert.deepEqual(newSdp, sdp);
101
+ assert.deepEqual(result, {
102
+ joinCookie: undefined,
103
+ localSdp: {
104
+ some: 'attribute',
105
+ },
106
+ });
48
107
  });
49
108
  });
50
109
 
51
110
  describe('sendRoap', () => {
52
- let webex;
53
-
54
- beforeEach(() => {
55
- webex = new MockWebex();
56
- });
111
+ it('includes joinCookie in the request correctly', async () => {
112
+ const locusMediaRequest = {send: sinon.stub().resolves({body: {locus: {}}})};
113
+ const ipVersion = IP_VERSION.unknown;
57
114
 
58
- it('calls attachReliabilityData', async () => {
59
- Metrics.postEvent = sinon.stub();
60
-
61
- // @ts-ignore
62
- const roapRequest = new RoapRequest({}, {parent: webex});
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
+ });
63
125
 
64
- const newSdp = {new: 'sdp'}
126
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
127
+ name: 'client.locus.media.request',
128
+ options: {
129
+ meetingId: 'meeting-id',
130
+ },
131
+ });
65
132
 
66
- roapRequest.attachRechabilityData = sinon.stub().returns(Promise.resolve(newSdp));
67
- webex.request.returns(Promise.resolve({
68
- body: {
69
- locus: {}
70
- }
71
- }))
133
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
134
+ name: 'client.locus.media.response',
135
+ options: {
136
+ meetingId: 'meeting-id',
137
+ },
138
+ });
72
139
 
73
- const result = await roapRequest.sendRoap({
74
- roapMessage: {seq: 1},
75
- locusSelfUrl: 'locusSelfUrl',
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
+ },
76
148
  mediaId: 'mediaId',
77
- correlationId: 'correlationId',
78
- audioMuted: true,
79
- videoMuted: true,
80
- meetingId: 'meetingId',
81
- preferTranscoding: true
149
+ roapMessage: {
150
+ seq: 'seq',
151
+ },
152
+ reachability: {clusterId: {udp: 'test'}},
82
153
  });
154
+ });
83
155
 
84
- assert.calledOnceWithExactly(webex.request, {
85
- uri: 'locusSelfUrl/media',
86
- method: 'PUT',
87
- body: {
88
- device: {
89
- url: undefined,
90
- deviceType: undefined,
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',
91
164
  },
92
- correlationId: 'correlationId',
93
- localMedias: [{
94
- localSdp: JSON.stringify(newSdp),
95
- mediaId: 'mediaId'
96
- }],
97
- clientMediaPreferences: {preferTranscoding: true}
98
- },
99
- });
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
+ });
100
179
 
101
- assert.calledOnceWithExactly(roapRequest.attachRechabilityData, {
102
- roapMessage: {seq: 1},
103
- audioMuted: true,
104
- videoMuted: true
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
+ },
105
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
+ });
106
209
 
107
- assert.deepEqual(result, {
108
- locus: {
109
- roapSeq: 1
110
- }
111
- });
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' },
112
224
  });
113
- })
225
+
226
+ assert.calledOnceWithExactly(roapRequest.attachReachabilityData, {
227
+ roapMessage: {
228
+ seq: 1,
229
+ },
230
+ });
231
+ });
114
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,6 +25,7 @@ describe('TurnDiscovery', () => {
23
25
  clock = sinon.useFakeTimers();
24
26
 
25
27
  sinon.stub(Metrics, 'sendBehavioralMetric');
28
+ sinon.stub(MeetingUtil, 'getIpVersion').returns(IP_VERSION.unknown);
26
29
 
27
30
  mockRoapRequest = {
28
31
  sendRoap: sinon.fake.resolves({mediaConnections: FAKE_MEDIA_CONNECTIONS_FROM_LOCUS}),
@@ -30,24 +33,26 @@ describe('TurnDiscovery', () => {
30
33
 
31
34
  testMeeting = {
32
35
  id: 'fake meeting id',
33
- config: {
34
- experimental: {
35
- enableTurnDiscovery: true,
36
- },
37
- },
38
36
  correlationId: 'fake correlation id',
39
37
  selfUrl: 'fake self url',
40
38
  mediaId: 'fake media id',
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: () => Promise.resolve(false)}}},
50
- isMultistream: false
51
+ webex: {meetings: {reachability: {
52
+ isAnyPublicClusterReachable: () => Promise.resolve(false),
53
+ }}},
54
+ isMultistream: false,
55
+ locusMediaRequest: { fake: true },
51
56
  };
52
57
  });
53
58
 
@@ -64,20 +69,24 @@ describe('TurnDiscovery', () => {
64
69
  await testUtils.flushPromises();
65
70
 
66
71
  assert.calledOnce(mockRoapRequest.sendRoap);
67
- assert.calledWith(mockRoapRequest.sendRoap, {
72
+
73
+ const expectedSendRoapArgs: any = {
68
74
  roapMessage: {
69
75
  messageType,
70
76
  version: '2',
71
77
  seq: expectedSeq,
72
78
  },
73
- correlationId: testMeeting.correlationId,
74
79
  locusSelfUrl: testMeeting.selfUrl,
75
80
  mediaId: expectedMediaId,
76
- audioMuted: testMeeting.isAudioMuted(),
77
- videoMuted: testMeeting.isVideoMuted(),
78
81
  meetingId: testMeeting.id,
79
- preferTranscoding: !testMeeting.isMultistream
80
- });
82
+ locusMediaRequest: testMeeting.locusMediaRequest,
83
+ };
84
+
85
+ if (messageType === 'TURN_DISCOVERY_REQUEST') {
86
+ expectedSendRoapArgs.ipVersion = 0;
87
+ }
88
+
89
+ assert.calledWith(mockRoapRequest.sendRoap, expectedSendRoapArgs);
81
90
 
82
91
  if (messageType === 'TURN_DISCOVERY_REQUEST') {
83
92
  // check also that we've applied the media connections from the response
@@ -139,6 +148,44 @@ describe('TurnDiscovery', () => {
139
148
  });
140
149
  });
141
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
+
155
+ const td = new TurnDiscovery(mockRoapRequest);
156
+ const result = td.doTurnDiscovery(testMeeting, false, true);
157
+
158
+ // We ignore reachability results so we don't get skip reason
159
+ assert.notCalled(testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable);
160
+
161
+ // check that TURN_DISCOVERY_REQUEST was sent
162
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
163
+ // @ts-ignore
164
+ mockRoapRequest.sendRoap.resetHistory();
165
+ // simulate the response
166
+ td.handleTurnDiscoveryResponse({
167
+ headers: [
168
+ `x-cisco-turn-url=${FAKE_TURN_URL}`,
169
+ `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
170
+ `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
171
+ ]
172
+ });
173
+ await testUtils.flushPromises();
174
+ // check that we've sent OK
175
+ await checkRoapMessageSent('OK', 0);
176
+
177
+ const {turnServerInfo, turnDiscoverySkippedReason} = await result;
178
+ assert.deepEqual(turnServerInfo, {
179
+ url: FAKE_TURN_URL,
180
+ username: FAKE_TURN_USERNAME,
181
+ password: FAKE_TURN_PASSWORD
182
+ });
183
+ assert.isUndefined(turnDiscoverySkippedReason);
184
+
185
+ // restore previous callback
186
+ testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = prev;
187
+ });
188
+
142
189
  it('sends TURN_DISCOVERY_REQUEST with empty mediaId when isReconnecting is true', async () => {
143
190
  const td = new TurnDiscovery(mockRoapRequest);
144
191
 
@@ -210,24 +257,6 @@ describe('TurnDiscovery', () => {
210
257
  assert.isUndefined(turnDiscoverySkippedReason);
211
258
  });
212
259
 
213
- it('resolves with undefined if turn discovery feature is disabled in config', async () => {
214
- const prevConfigValue = testMeeting.config.experimental.enableTurnDiscovery;
215
-
216
- testMeeting.config.experimental.enableTurnDiscovery = false;
217
- // @ts-ignore
218
- const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
219
-
220
- const {turnServerInfo, turnDiscoverySkippedReason} = result;
221
-
222
- assert.isUndefined(turnServerInfo);
223
- assert.equal(turnDiscoverySkippedReason, 'config');
224
- assert.notCalled(mockRoapRequest.sendRoap);
225
- assert.notCalled(Metrics.sendBehavioralMetric);
226
-
227
- // restore previous config
228
- testMeeting.config.experimental.enableTurnDiscovery = prevConfigValue;
229
- });
230
-
231
260
  it('resolves with undefined if sending the request fails', async () => {
232
261
  const td = new TurnDiscovery(mockRoapRequest);
233
262
 
@@ -243,8 +272,8 @@ describe('TurnDiscovery', () => {
243
272
  });
244
273
 
245
274
  it('resolves with undefined when cluster is reachable', async () => {
246
- const prev = testMeeting.webex.meetings.reachability.isAnyClusterReachable;
247
- testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => Promise.resolve(true);
275
+ const prev = testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable;
276
+ testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = () => Promise.resolve(true);
248
277
  const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
249
278
 
250
279
  const {turnServerInfo, turnDiscoverySkippedReason} = result;
@@ -253,7 +282,7 @@ describe('TurnDiscovery', () => {
253
282
  assert.equal(turnDiscoverySkippedReason, 'reachability');
254
283
  assert.notCalled(mockRoapRequest.sendRoap);
255
284
  assert.notCalled(Metrics.sendBehavioralMetric);
256
- testMeeting.webex.meetings.reachability.isAnyClusterReachable = prev;
285
+ testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = prev;
257
286
  });
258
287
 
259
288
  it("resolves with undefined if we don't get a response within 10s", async () => {
@@ -363,6 +392,23 @@ describe('TurnDiscovery', () => {
363
392
  });
364
393
  });
365
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
+
366
412
  describe('handleTurnDiscoveryResponse', () => {
367
413
  it("doesn't do anything if turn discovery was not started", () => {
368
414
  const td = new TurnDiscovery(mockRoapRequest);
@@ -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
+ });