@webex/plugin-meetings 3.0.0-beta.22 → 3.0.0-beta.221

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 (419) 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 +114 -14
  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 +841 -19
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/request.js +78 -0
  17. package/dist/breakouts/request.js.map +1 -0
  18. package/dist/breakouts/utils.js +67 -0
  19. package/dist/breakouts/utils.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +3 -2
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/queue.js +24 -9
  25. package/dist/common/queue.js.map +1 -1
  26. package/dist/config.js +3 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +188 -30
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/constants.js +14 -0
  31. package/dist/controls-options-manager/constants.js.map +1 -0
  32. package/dist/controls-options-manager/enums.js +27 -0
  33. package/dist/controls-options-manager/enums.js.map +1 -0
  34. package/dist/controls-options-manager/index.js +297 -0
  35. package/dist/controls-options-manager/index.js.map +1 -0
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +319 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +106 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +366 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +91 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +357 -62
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/infoUtils.js +7 -1
  53. package/dist/locus-info/infoUtils.js.map +1 -1
  54. package/dist/locus-info/mediaSharesUtils.js +43 -1
  55. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  56. package/dist/locus-info/parser.js +219 -63
  57. package/dist/locus-info/parser.js.map +1 -1
  58. package/dist/locus-info/selfUtils.js +89 -14
  59. package/dist/locus-info/selfUtils.js.map +1 -1
  60. package/dist/media/index.js +49 -106
  61. package/dist/media/index.js.map +1 -1
  62. package/dist/media/properties.js +29 -90
  63. package/dist/media/properties.js.map +1 -1
  64. package/dist/mediaQualityMetrics/config.js +505 -493
  65. package/dist/mediaQualityMetrics/config.js.map +1 -1
  66. package/dist/meeting/in-meeting-actions.js +90 -2
  67. package/dist/meeting/in-meeting-actions.js.map +1 -1
  68. package/dist/meeting/index.js +2587 -2560
  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 +228 -123
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +244 -194
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +568 -414
  77. package/dist/meeting/util.js.map +1 -1
  78. package/dist/meeting-info/index.js +48 -7
  79. package/dist/meeting-info/index.js.map +1 -1
  80. package/dist/meeting-info/meeting-info-v2.js +171 -51
  81. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  82. package/dist/meeting-info/utilv2.js +20 -5
  83. package/dist/meeting-info/utilv2.js.map +1 -1
  84. package/dist/meetings/collection.js +22 -0
  85. package/dist/meetings/collection.js.map +1 -1
  86. package/dist/meetings/index.js +361 -84
  87. package/dist/meetings/index.js.map +1 -1
  88. package/dist/meetings/meetings.types.js +7 -0
  89. package/dist/meetings/meetings.types.js.map +1 -0
  90. package/dist/meetings/request.js +2 -0
  91. package/dist/meetings/request.js.map +1 -1
  92. package/dist/meetings/util.js +88 -1
  93. package/dist/meetings/util.js.map +1 -1
  94. package/dist/member/index.js +49 -0
  95. package/dist/member/index.js.map +1 -1
  96. package/dist/member/types.js +25 -0
  97. package/dist/member/types.js.map +1 -0
  98. package/dist/member/util.js +121 -25
  99. package/dist/member/util.js.map +1 -1
  100. package/dist/members/collection.js +10 -0
  101. package/dist/members/collection.js.map +1 -1
  102. package/dist/members/index.js +86 -5
  103. package/dist/members/index.js.map +1 -1
  104. package/dist/members/request.js +106 -38
  105. package/dist/members/request.js.map +1 -1
  106. package/dist/members/types.js +15 -0
  107. package/dist/members/types.js.map +1 -0
  108. package/dist/members/util.js +316 -233
  109. package/dist/members/util.js.map +1 -1
  110. package/dist/metrics/constants.js +3 -5
  111. package/dist/metrics/constants.js.map +1 -1
  112. package/dist/metrics/index.js +1 -468
  113. package/dist/metrics/index.js.map +1 -1
  114. package/dist/multistream/mediaRequestManager.js +238 -49
  115. package/dist/multistream/mediaRequestManager.js.map +1 -1
  116. package/dist/multistream/receiveSlot.js +49 -16
  117. package/dist/multistream/receiveSlot.js.map +1 -1
  118. package/dist/multistream/receiveSlotManager.js +52 -34
  119. package/dist/multistream/receiveSlotManager.js.map +1 -1
  120. package/dist/multistream/remoteMedia.js +44 -18
  121. package/dist/multistream/remoteMedia.js.map +1 -1
  122. package/dist/multistream/remoteMediaGroup.js +60 -3
  123. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  124. package/dist/multistream/remoteMediaManager.js +173 -59
  125. package/dist/multistream/remoteMediaManager.js.map +1 -1
  126. package/dist/networkQualityMonitor/index.js +4 -2
  127. package/dist/networkQualityMonitor/index.js.map +1 -1
  128. package/dist/reachability/index.js +90 -30
  129. package/dist/reachability/index.js.map +1 -1
  130. package/dist/reachability/request.js +16 -7
  131. package/dist/reachability/request.js.map +1 -1
  132. package/dist/reconnection-manager/index.js +196 -155
  133. package/dist/reconnection-manager/index.js.map +1 -1
  134. package/dist/recording-controller/index.js +21 -2
  135. package/dist/recording-controller/index.js.map +1 -1
  136. package/dist/recording-controller/util.js +9 -8
  137. package/dist/recording-controller/util.js.map +1 -1
  138. package/dist/roap/index.js +25 -29
  139. package/dist/roap/index.js.map +1 -1
  140. package/dist/roap/request.js +111 -89
  141. package/dist/roap/request.js.map +1 -1
  142. package/dist/roap/turnDiscovery.js +97 -36
  143. package/dist/roap/turnDiscovery.js.map +1 -1
  144. package/dist/rtcMetrics/constants.js +12 -0
  145. package/dist/rtcMetrics/constants.js.map +1 -0
  146. package/dist/rtcMetrics/index.js +117 -0
  147. package/dist/rtcMetrics/index.js.map +1 -0
  148. package/dist/statsAnalyzer/global.js +1 -93
  149. package/dist/statsAnalyzer/global.js.map +1 -1
  150. package/dist/statsAnalyzer/index.js +326 -311
  151. package/dist/statsAnalyzer/index.js.map +1 -1
  152. package/dist/statsAnalyzer/mqaUtil.js +90 -53
  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/breakout.d.ts +8 -0
  158. package/dist/types/breakouts/collection.d.ts +5 -0
  159. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  160. package/dist/types/breakouts/events.d.ts +8 -0
  161. package/dist/types/breakouts/index.d.ts +5 -0
  162. package/dist/types/breakouts/request.d.ts +22 -0
  163. package/dist/types/breakouts/utils.d.ts +15 -0
  164. package/dist/types/common/browser-detection.d.ts +9 -0
  165. package/dist/types/common/collection.d.ts +48 -0
  166. package/dist/types/common/config.d.ts +2 -0
  167. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  168. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  169. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  170. package/dist/types/common/errors/media.d.ts +15 -0
  171. package/dist/types/common/errors/parameter.d.ts +15 -0
  172. package/dist/types/common/errors/password-error.d.ts +15 -0
  173. package/dist/types/common/errors/permission.d.ts +14 -0
  174. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  175. package/dist/types/common/errors/reconnection.d.ts +15 -0
  176. package/dist/types/common/errors/stats.d.ts +15 -0
  177. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  178. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  179. package/dist/types/common/events/events-scope.d.ts +17 -0
  180. package/dist/types/common/events/events.d.ts +12 -0
  181. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  182. package/dist/types/common/events/util.d.ts +2 -0
  183. package/dist/types/common/logs/logger-config.d.ts +2 -0
  184. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  185. package/dist/types/common/logs/request.d.ts +34 -0
  186. package/dist/types/common/queue.d.ts +34 -0
  187. package/dist/types/config.d.ts +72 -0
  188. package/dist/types/constants.d.ts +1028 -0
  189. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  190. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  191. package/dist/types/controls-options-manager/index.d.ts +136 -0
  192. package/dist/types/controls-options-manager/types.d.ts +43 -0
  193. package/dist/types/controls-options-manager/util.d.ts +1 -0
  194. package/dist/types/index.d.ts +7 -0
  195. package/dist/types/interpretation/collection.d.ts +5 -0
  196. package/dist/types/interpretation/index.d.ts +5 -0
  197. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  198. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  199. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  200. package/dist/types/locus-info/fullState.d.ts +2 -0
  201. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  202. package/dist/types/locus-info/index.d.ts +322 -0
  203. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  204. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  205. package/dist/types/locus-info/parser.d.ts +271 -0
  206. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  207. package/dist/types/media/index.d.ts +34 -0
  208. package/dist/types/media/properties.d.ts +93 -0
  209. package/dist/types/media/util.d.ts +2 -0
  210. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  211. package/dist/types/meeting/in-meeting-actions.d.ts +163 -0
  212. package/dist/types/meeting/index.d.ts +1512 -0
  213. package/dist/types/meeting/locusMediaRequest.d.ts +75 -0
  214. package/dist/types/meeting/muteState.d.ts +184 -0
  215. package/dist/types/meeting/request.d.ts +289 -0
  216. package/dist/types/meeting/request.type.d.ts +11 -0
  217. package/dist/types/meeting/state.d.ts +9 -0
  218. package/dist/types/meeting/util.d.ts +94 -0
  219. package/dist/types/meeting-info/collection.d.ts +20 -0
  220. package/dist/types/meeting-info/index.d.ts +62 -0
  221. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  222. package/dist/types/meeting-info/request.d.ts +22 -0
  223. package/dist/types/meeting-info/util.d.ts +2 -0
  224. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  225. package/dist/types/meetings/collection.d.ts +31 -0
  226. package/dist/types/meetings/index.d.ts +361 -0
  227. package/dist/types/meetings/meetings.types.d.ts +4 -0
  228. package/dist/types/meetings/request.d.ts +27 -0
  229. package/dist/types/meetings/util.d.ts +18 -0
  230. package/dist/types/member/index.d.ts +159 -0
  231. package/dist/types/member/types.d.ts +32 -0
  232. package/dist/types/member/util.d.ts +2 -0
  233. package/dist/types/members/collection.d.ts +29 -0
  234. package/dist/types/members/index.d.ts +353 -0
  235. package/dist/types/members/request.d.ts +114 -0
  236. package/dist/types/members/types.d.ts +24 -0
  237. package/dist/types/members/util.d.ts +210 -0
  238. package/dist/types/metrics/constants.d.ts +55 -0
  239. package/dist/types/metrics/index.d.ts +45 -0
  240. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  241. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  242. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  243. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  244. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  245. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  246. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  247. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  248. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  249. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  250. package/dist/types/reachability/index.d.ts +158 -0
  251. package/dist/types/reachability/request.d.ts +39 -0
  252. package/dist/types/reactions/constants.d.ts +3 -0
  253. package/dist/types/reactions/reactions.d.ts +4 -0
  254. package/dist/types/reactions/reactions.type.d.ts +52 -0
  255. package/dist/types/reconnection-manager/index.d.ts +126 -0
  256. package/dist/types/recording-controller/enums.d.ts +7 -0
  257. package/dist/types/recording-controller/index.d.ts +207 -0
  258. package/dist/types/recording-controller/util.d.ts +14 -0
  259. package/dist/types/roap/index.d.ts +77 -0
  260. package/dist/types/roap/request.d.ts +38 -0
  261. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  262. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  263. package/dist/types/rtcMetrics/index.d.ts +47 -0
  264. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  265. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  266. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  267. package/dist/types/transcription/index.d.ts +64 -0
  268. package/package.json +23 -20
  269. package/src/annotation/annotation.types.ts +50 -0
  270. package/src/annotation/constants.ts +36 -0
  271. package/src/annotation/index.ts +328 -0
  272. package/src/breakouts/README.md +44 -14
  273. package/src/breakouts/breakout.ts +87 -9
  274. package/src/breakouts/edit-lock-error.ts +25 -0
  275. package/src/breakouts/events.ts +56 -0
  276. package/src/breakouts/index.ts +710 -10
  277. package/src/breakouts/request.ts +55 -0
  278. package/src/breakouts/utils.ts +57 -0
  279. package/src/common/errors/webex-errors.ts +6 -2
  280. package/src/common/logs/logger-proxy.ts +1 -1
  281. package/src/common/queue.ts +22 -8
  282. package/src/config.ts +2 -7
  283. package/src/constants.ts +175 -21
  284. package/src/controls-options-manager/constants.ts +5 -0
  285. package/src/controls-options-manager/enums.ts +18 -0
  286. package/src/controls-options-manager/index.ts +278 -0
  287. package/src/controls-options-manager/types.ts +59 -0
  288. package/src/controls-options-manager/util.ts +300 -0
  289. package/src/index.ts +39 -0
  290. package/src/interpretation/README.md +60 -0
  291. package/src/interpretation/collection.ts +19 -0
  292. package/src/interpretation/index.ts +332 -0
  293. package/src/interpretation/siLanguage.ts +18 -0
  294. package/src/locus-info/controlsUtils.ts +108 -0
  295. package/src/locus-info/index.ts +381 -59
  296. package/src/locus-info/infoUtils.ts +10 -2
  297. package/src/locus-info/mediaSharesUtils.ts +48 -0
  298. package/src/locus-info/parser.ts +224 -39
  299. package/src/locus-info/selfUtils.ts +81 -5
  300. package/src/media/index.ts +89 -109
  301. package/src/media/properties.ts +49 -90
  302. package/src/mediaQualityMetrics/config.ts +379 -377
  303. package/src/meeting/in-meeting-actions.ts +179 -3
  304. package/src/meeting/index.ts +2062 -2137
  305. package/src/meeting/locusMediaRequest.ts +314 -0
  306. package/src/meeting/muteState.ts +227 -130
  307. package/src/meeting/request.ts +157 -116
  308. package/src/meeting/util.ts +555 -396
  309. package/src/meeting-info/index.ts +54 -8
  310. package/src/meeting-info/meeting-info-v2.ts +148 -14
  311. package/src/meeting-info/utilv2.ts +13 -3
  312. package/src/meetings/collection.ts +20 -0
  313. package/src/meetings/index.ts +397 -102
  314. package/src/meetings/meetings.types.ts +12 -0
  315. package/src/meetings/request.ts +2 -0
  316. package/src/meetings/util.ts +103 -4
  317. package/src/member/index.ts +49 -0
  318. package/src/member/types.ts +38 -0
  319. package/src/member/util.ts +127 -25
  320. package/src/members/collection.ts +8 -0
  321. package/src/members/index.ts +107 -6
  322. package/src/members/request.ts +97 -17
  323. package/src/members/types.ts +28 -0
  324. package/src/members/util.ts +319 -240
  325. package/src/metrics/constants.ts +2 -4
  326. package/src/metrics/index.ts +1 -490
  327. package/src/multistream/mediaRequestManager.ts +289 -79
  328. package/src/multistream/receiveSlot.ts +55 -18
  329. package/src/multistream/receiveSlotManager.ts +46 -24
  330. package/src/multistream/remoteMedia.ts +27 -2
  331. package/src/multistream/remoteMediaGroup.ts +59 -0
  332. package/src/multistream/remoteMediaManager.ts +113 -32
  333. package/src/networkQualityMonitor/index.ts +6 -6
  334. package/src/reachability/index.ts +76 -18
  335. package/src/reachability/request.ts +16 -7
  336. package/src/reconnection-manager/index.ts +68 -43
  337. package/src/recording-controller/index.ts +20 -3
  338. package/src/recording-controller/util.ts +26 -9
  339. package/src/roap/index.ts +25 -30
  340. package/src/roap/request.ts +103 -95
  341. package/src/roap/turnDiscovery.ts +51 -25
  342. package/src/rtcMetrics/constants.ts +3 -0
  343. package/src/rtcMetrics/index.ts +100 -0
  344. package/src/statsAnalyzer/global.ts +1 -94
  345. package/src/statsAnalyzer/index.ts +376 -386
  346. package/src/statsAnalyzer/mqaUtil.ts +100 -99
  347. package/test/integration/spec/converged-space-meetings.js +233 -0
  348. package/test/integration/spec/journey.js +336 -259
  349. package/test/integration/spec/space-meeting.js +77 -4
  350. package/test/unit/spec/annotation/index.ts +418 -0
  351. package/test/unit/spec/breakouts/breakout.ts +142 -24
  352. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  353. package/test/unit/spec/breakouts/events.ts +89 -0
  354. package/test/unit/spec/breakouts/index.ts +1545 -48
  355. package/test/unit/spec/breakouts/request.ts +104 -0
  356. package/test/unit/spec/breakouts/utils.js +72 -0
  357. package/test/unit/spec/common/queue.js +31 -2
  358. package/test/unit/spec/controls-options-manager/index.js +287 -0
  359. package/test/unit/spec/controls-options-manager/util.js +582 -0
  360. package/test/unit/spec/fixture/locus.js +1 -0
  361. package/test/unit/spec/interpretation/collection.ts +15 -0
  362. package/test/unit/spec/interpretation/index.ts +589 -0
  363. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  364. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  365. package/test/unit/spec/locus-info/index.js +1169 -36
  366. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  367. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  368. package/test/unit/spec/locus-info/parser.js +62 -22
  369. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  370. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  371. package/test/unit/spec/media/index.ts +138 -28
  372. package/test/unit/spec/meeting/in-meeting-actions.ts +89 -3
  373. package/test/unit/spec/meeting/index.js +3510 -1747
  374. package/test/unit/spec/meeting/locusMediaRequest.ts +443 -0
  375. package/test/unit/spec/meeting/muteState.js +370 -208
  376. package/test/unit/spec/meeting/request.js +417 -45
  377. package/test/unit/spec/meeting/utils.js +601 -53
  378. package/test/unit/spec/meeting-info/index.js +181 -0
  379. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  380. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  381. package/test/unit/spec/meetings/collection.js +14 -0
  382. package/test/unit/spec/meetings/index.js +874 -150
  383. package/test/unit/spec/meetings/utils.js +206 -2
  384. package/test/unit/spec/member/index.js +58 -4
  385. package/test/unit/spec/member/util.js +479 -35
  386. package/test/unit/spec/members/index.js +319 -1
  387. package/test/unit/spec/members/request.js +206 -27
  388. package/test/unit/spec/members/utils.js +184 -0
  389. package/test/unit/spec/metrics/index.js +1 -50
  390. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  391. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  392. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  393. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  394. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  395. package/test/unit/spec/multistream/remoteMediaManager.ts +318 -0
  396. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  397. package/test/unit/spec/reachability/index.ts +185 -7
  398. package/test/unit/spec/reachability/request.js +68 -0
  399. package/test/unit/spec/reconnection-manager/index.js +59 -6
  400. package/test/unit/spec/recording-controller/index.js +294 -218
  401. package/test/unit/spec/recording-controller/util.js +223 -96
  402. package/test/unit/spec/roap/index.ts +27 -51
  403. package/test/unit/spec/roap/request.ts +202 -85
  404. package/test/unit/spec/roap/turnDiscovery.ts +36 -8
  405. package/test/unit/spec/rtcMetrics/index.ts +68 -0
  406. package/test/unit/spec/stats-analyzer/index.js +92 -41
  407. package/test/utils/constants.js +9 -0
  408. package/test/utils/integrationTestUtils.js +46 -0
  409. package/test/utils/testUtils.js +0 -45
  410. package/test/utils/webex-config.js +4 -0
  411. package/test/utils/webex-test-users.js +6 -3
  412. package/dist/meeting/effectsState.js +0 -262
  413. package/dist/meeting/effectsState.js.map +0 -1
  414. package/dist/metrics/config.js +0 -299
  415. package/dist/metrics/config.js.map +0 -1
  416. package/src/index.js +0 -16
  417. package/src/meeting/effectsState.ts +0 -211
  418. package/src/metrics/config.ts +0 -495
  419. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -0,0 +1,443 @@
1
+ import sinon from 'sinon';
2
+ import {assert} from '@webex/test-helper-chai';
3
+ import { cloneDeep, defer } from 'lodash';
4
+
5
+ import MockWebex from '@webex/test-helper-mock-webex';
6
+ import Meetings from '@webex/plugin-meetings';
7
+ import { LocalMuteRequest, LocusMediaRequest, RoapRequest } from "@webex/plugin-meetings/src/meeting/locusMediaRequest";
8
+ import testUtils from '../../../utils/testUtils';
9
+ import { Defer } from '@webex/common';
10
+ import { IP_VERSION } from '../../../../src/constants';
11
+
12
+ describe('LocusMediaRequest.send()', () => {
13
+ let locusMediaRequest: LocusMediaRequest;
14
+ let webexRequestStub;
15
+ let mockWebex;
16
+
17
+ const fakeLocusResponse = {
18
+ locus: { something: 'whatever'}
19
+ };
20
+
21
+ const exampleRoapRequestBody:RoapRequest = {
22
+ type: 'RoapMessage',
23
+ mediaId: 'mediaId',
24
+ selfUrl: 'fakeMeetingSelfUrl',
25
+ roapMessage: {
26
+ messageType: 'OFFER',
27
+ sdps: ['sdp'],
28
+ version: '2',
29
+ seq: 1,
30
+ tieBreaker: 0xfffffffe,
31
+ },
32
+ reachability: {
33
+ 'wjfkm.wjfkm.*': {udp:{reachable: true}, tcp:{reachable:false}},
34
+ '1eb65fdf-9643-417f-9974-ad72cae0e10f.59268c12-7a04-4b23-a1a1-4c74be03019a.*': {udp:{reachable: false}, tcp:{reachable:true}},
35
+ },
36
+ joinCookie: {
37
+ anycastEntryPoint: 'aws-eu-west-1',
38
+ clientIpAddress: 'some ip',
39
+ timeShot: '2023-05-23T08:03:49Z',
40
+ },
41
+ ipVersion: IP_VERSION.only_ipv4,
42
+ };
43
+
44
+ const createExpectedRoapBody = (expectedMessageType, expectedMute:{audioMuted: boolean, videoMuted: boolean}) => {
45
+ return {
46
+ device: { url: 'deviceUrl', deviceType: 'deviceType', regionCode: 'regionCode' },
47
+ correlationId: 'correlationId',
48
+ localMedias: [
49
+ {
50
+ localSdp: `{"audioMuted":${expectedMute.audioMuted},"videoMuted":${expectedMute.videoMuted},"roapMessage":{"messageType":"${expectedMessageType}","sdps":["sdp"],"version":"2","seq":1,"tieBreaker":4294967294},"reachability":{"wjfkm.wjfkm.*":{"udp":{"reachable":true},"tcp":{"reachable":false}},"1eb65fdf-9643-417f-9974-ad72cae0e10f.59268c12-7a04-4b23-a1a1-4c74be03019a.*":{"udp":{"reachable":false},"tcp":{"reachable":true}}}}`,
51
+ mediaId: 'mediaId'
52
+ }
53
+ ],
54
+ clientMediaPreferences: {
55
+ preferTranscoding: true,
56
+ ipver: 4,
57
+ joinCookie: {
58
+ anycastEntryPoint: 'aws-eu-west-1',
59
+ clientIpAddress: 'some ip',
60
+ timeShot: '2023-05-23T08:03:49Z'
61
+ }
62
+ }
63
+ };
64
+ };
65
+
66
+ const exampleLocalMuteRequestBody:LocalMuteRequest = {
67
+ type: 'LocalMute',
68
+ mediaId: 'mediaId',
69
+ selfUrl: 'fakeMeetingSelfUrl',
70
+ muteOptions: {},
71
+ ipVersion: IP_VERSION.only_ipv6
72
+ };
73
+
74
+ const createExpectedLocalMuteBody = (expectedMute:{audioMuted: boolean, videoMuted: boolean}, sequence = undefined) => {
75
+ const body: any = {
76
+ device: {
77
+ url: 'deviceUrl',
78
+ deviceType: 'deviceType',
79
+ regionCode: 'regionCode',
80
+ },
81
+ correlationId: 'correlationId',
82
+ usingResource: null,
83
+ respOnlySdp: true,
84
+ localMedias: [
85
+ {
86
+ mediaId: 'mediaId',
87
+ localSdp: `{"audioMuted":${expectedMute.audioMuted},"videoMuted":${expectedMute.videoMuted}}`,
88
+ },
89
+ ],
90
+ clientMediaPreferences: {
91
+ preferTranscoding: true,
92
+ ipver: 6,
93
+ },
94
+ };
95
+
96
+ if (sequence) {
97
+ body.sequence = sequence;
98
+ }
99
+
100
+ return body;
101
+ };
102
+
103
+ beforeEach(() => {
104
+ mockWebex = new MockWebex({
105
+ children: {
106
+ meetings: Meetings,
107
+ },
108
+ });
109
+
110
+ locusMediaRequest = new LocusMediaRequest({
111
+ device: {
112
+ url: 'deviceUrl',
113
+ deviceType: 'deviceType',
114
+ regionCode: 'regionCode',
115
+ },
116
+ correlationId: 'correlationId',
117
+ preferTranscoding: true,
118
+ }, {
119
+ parent: mockWebex,
120
+ });
121
+ webexRequestStub = sinon.stub(locusMediaRequest, 'request').resolves(fakeLocusResponse);
122
+ })
123
+
124
+ const sendLocalMute = (muteOptions, overrides={}) => locusMediaRequest.send({...exampleLocalMuteRequestBody, ...overrides, muteOptions});
125
+
126
+ const sendRoapMessage = (messageType) => {
127
+ const request = cloneDeep(exampleRoapRequestBody);
128
+
129
+ request.roapMessage.messageType = messageType;
130
+ return locusMediaRequest.send(request);
131
+ }
132
+
133
+ /** Helper function that makes sure the LocusMediaRequest.confluenceState is 'created' */
134
+ const ensureConfluenceCreated = async () => {
135
+ await sendRoapMessage('OFFER');
136
+
137
+ webexRequestStub.resetHistory();
138
+ }
139
+
140
+ it('sends a roap message', async () => {
141
+ const result = await sendRoapMessage('OFFER');
142
+
143
+ assert.equal(result, fakeLocusResponse);
144
+
145
+ assert.calledOnceWithExactly(webexRequestStub, {
146
+ method: 'PUT',
147
+ uri: 'fakeMeetingSelfUrl/media',
148
+ body: createExpectedRoapBody('OFFER', {audioMuted: true, videoMuted: true}),
149
+ });
150
+ });
151
+
152
+ it('sends a local mute request', async () => {
153
+ await ensureConfluenceCreated();
154
+
155
+ const result = await sendLocalMute({audioMuted: false, videoMuted: false});
156
+
157
+ assert.equal(result, fakeLocusResponse);
158
+
159
+ assert.calledOnceWithExactly(webexRequestStub, {
160
+ method: 'PUT',
161
+ uri: 'fakeMeetingSelfUrl/media',
162
+ body: createExpectedLocalMuteBody({audioMuted: false, videoMuted: false}),
163
+ });
164
+ });
165
+
166
+ it('sends a local mute request with sequence', async () => {
167
+ await ensureConfluenceCreated();
168
+
169
+ const sequence = {some: 'sequence data'};
170
+
171
+ const result = await sendLocalMute({audioMuted: false, videoMuted: false}, {sequence});
172
+
173
+ assert.equal(result, fakeLocusResponse);
174
+
175
+ assert.calledOnceWithExactly(webexRequestStub, {
176
+ method: 'PUT',
177
+ uri: 'fakeMeetingSelfUrl/media',
178
+ body: createExpectedLocalMuteBody({audioMuted: false, videoMuted: false}, sequence),
179
+ });
180
+ });
181
+
182
+ it('sends a local mute request with the last audio/video mute values when called multiple times in same processing cycle', async () => {
183
+ await ensureConfluenceCreated();
184
+
185
+ let result1;
186
+ let result2;
187
+
188
+ const promise1 = sendLocalMute({audioMuted: true, videoMuted: false})
189
+ .then((result) => {
190
+ result1 = result;
191
+ });
192
+
193
+ const promise2 = sendLocalMute({audioMuted: false, videoMuted: true})
194
+ .then((result) => {
195
+ result2 = result;
196
+ });
197
+
198
+ await testUtils.flushPromises();
199
+
200
+ await promise1;
201
+ await promise2;
202
+ assert.equal(result1, fakeLocusResponse);
203
+ assert.equal(result2, fakeLocusResponse);
204
+
205
+ assert.calledOnceWithExactly(webexRequestStub, {
206
+ method: 'PUT',
207
+ uri: 'fakeMeetingSelfUrl/media',
208
+ body: createExpectedLocalMuteBody({audioMuted: false, videoMuted: true}),
209
+ });
210
+
211
+ });
212
+
213
+ it('sends a local mute request with the last audio/video mute values', async () => {
214
+ await ensureConfluenceCreated();
215
+
216
+ await Promise.all([
217
+ sendLocalMute({audioMuted: undefined, videoMuted: false}),
218
+ sendLocalMute({audioMuted: true, videoMuted: undefined}),
219
+ sendLocalMute({audioMuted: false, videoMuted: true}),
220
+ sendLocalMute({audioMuted: true, videoMuted: false}),
221
+ ]);
222
+
223
+ assert.calledOnceWithExactly(webexRequestStub, {
224
+ method: 'PUT',
225
+ uri: 'fakeMeetingSelfUrl/media',
226
+ body: createExpectedLocalMuteBody({audioMuted: true, videoMuted: false}),
227
+ });
228
+
229
+ });
230
+
231
+ it('sends only roap when roap and local mute are requested', async () => {
232
+ await Promise.all([
233
+ sendLocalMute({audioMuted: false, videoMuted: undefined}),
234
+ sendRoapMessage('OFFER'),
235
+ sendLocalMute({audioMuted: true, videoMuted: false}),
236
+ ]);
237
+
238
+ /* check that only the roap message was sent and it had the last
239
+ values for audio and video mute
240
+ */
241
+ assert.calledOnceWithExactly(webexRequestStub, {
242
+ method: 'PUT',
243
+ uri: 'fakeMeetingSelfUrl/media',
244
+ body: createExpectedRoapBody('OFFER', {audioMuted: true, videoMuted: false}),
245
+ });
246
+ });
247
+
248
+ describe('queueing', () => {
249
+ let clock;
250
+ let requestsToLocus;
251
+ let results;
252
+
253
+ beforeEach(() => {
254
+ clock = sinon.useFakeTimers();
255
+ requestsToLocus = [];
256
+ results = [];
257
+
258
+ // setup the mock so that each new request that we send to Locus,
259
+ // returns a promise that we control from this test
260
+ webexRequestStub.callsFake(() => {
261
+ const defer = new Defer();
262
+ requestsToLocus.push(defer);
263
+ return defer.promise;
264
+ });
265
+ });
266
+
267
+ afterEach(() => {
268
+ clock.restore();
269
+ });
270
+
271
+ /** LocusMediaRequest.send() uses Lodash.defer(), so it only starts sending any requests
272
+ * after the processing cycle from which it was called is finished.
273
+ * This helper function waits for this to happen - it's needed, because we're using
274
+ * fake timers in these tests
275
+ */
276
+ const ensureQueueProcessingIsStarted = () => {
277
+ clock.tick(1);
278
+ }
279
+ it('queues requests if there is one already in progress', async () => {
280
+ results.push(sendRoapMessage('OFFER'));
281
+
282
+ ensureQueueProcessingIsStarted();
283
+
284
+ // check that OFFER has been sent out
285
+ assert.calledWith(webexRequestStub, {
286
+ method: 'PUT',
287
+ uri: 'fakeMeetingSelfUrl/media',
288
+ body: createExpectedRoapBody('OFFER', {audioMuted: true, videoMuted: true}),
289
+ });
290
+
291
+ webexRequestStub.resetHistory();
292
+
293
+ // at this point the request should be sent out and "in progress",
294
+ // so any further calls should be queued
295
+ results.push(sendRoapMessage('OK'));
296
+
297
+ // OK should not be sent out yet, only queued
298
+ assert.notCalled(webexRequestStub);
299
+
300
+ // now simulate the first locus request (offer) to resolve,
301
+ // so that the next request from the queue (ok) can be sent out
302
+ requestsToLocus[0].resolve();
303
+ await testUtils.flushPromises();
304
+ ensureQueueProcessingIsStarted();
305
+
306
+ // verify OK was sent out
307
+ assert.calledWith(webexRequestStub, {
308
+ method: 'PUT',
309
+ uri: 'fakeMeetingSelfUrl/media',
310
+ body: createExpectedRoapBody('OK', {audioMuted: true, videoMuted: true}),
311
+ });
312
+
313
+ // promise returned by the first call to send OFFER should be resolved by now
314
+ await results[0];
315
+
316
+ // simulate Locus sending http response to OK
317
+ requestsToLocus[1].resolve();
318
+ await results[1];
319
+ });
320
+
321
+ it('combines local mute requests into a single /media request to Locus when queueing', async () => {
322
+ results.push(sendRoapMessage('OFFER'));
323
+ results.push(sendLocalMute({audioMuted: false, videoMuted: false}));
324
+
325
+ ensureQueueProcessingIsStarted();
326
+
327
+ // check that OFFER and local mute have been combined into
328
+ // a single OFFER request with the right mute values
329
+ assert.calledOnceWithExactly(webexRequestStub, {
330
+ method: 'PUT',
331
+ uri: 'fakeMeetingSelfUrl/media',
332
+ body: createExpectedRoapBody('OFFER', {audioMuted: false, videoMuted: false}),
333
+ });
334
+
335
+ webexRequestStub.resetHistory();
336
+
337
+ // at this point the request should be sent out and "in progress",
338
+ // so any further calls should be queued
339
+ results.push(sendLocalMute({audioMuted: true, videoMuted: false}));
340
+ results.push(sendRoapMessage('OK'));
341
+ results.push(sendLocalMute({audioMuted: false, videoMuted: true}));
342
+
343
+ // nothing should be sent out yet, only queued
344
+ assert.notCalled(webexRequestStub);
345
+
346
+ // now simulate the first locus request (offer) to resolve,
347
+ // so that the next request from the queue (ok) can be sent out
348
+ requestsToLocus[0].resolve();
349
+ await testUtils.flushPromises();
350
+ ensureQueueProcessingIsStarted();
351
+
352
+ // verify OK was sent out
353
+ assert.calledOnceWithExactly(webexRequestStub, {
354
+ method: 'PUT',
355
+ uri: 'fakeMeetingSelfUrl/media',
356
+ body: createExpectedRoapBody('OK', {audioMuted: false, videoMuted: true}),
357
+ });
358
+
359
+ // promise returned by the first call to send OFFER should be resolved by now
360
+ await results[0];
361
+
362
+ // simulate Locus sending http response to OK
363
+ requestsToLocus[1].resolve();
364
+ await results[1];
365
+ });
366
+
367
+ describe('confluence creation', () => {
368
+ it('resolves without sending the request if LocalMute is requested before Roap Offer is sent (confluence state is "not created")', async () => {
369
+ const result = await sendLocalMute({audioMuted: false, videoMuted: true});
370
+
371
+ assert.notCalled(webexRequestStub);
372
+ assert.deepEqual(result, {});
373
+ });
374
+
375
+ it('queues LocalMute if requested after first Roap Offer was sent but before it got http response (confluence state is "creation in progress")', async () => {
376
+ let result;
377
+
378
+ // send roap offer so that confluence state is "creation in progress"
379
+ sendRoapMessage('OFFER');
380
+
381
+ ensureQueueProcessingIsStarted();
382
+
383
+ sendLocalMute({audioMuted: false, videoMuted: true})
384
+ .then((response) => {
385
+ result = response;
386
+ });
387
+
388
+ // only roap offer should have been sent so far
389
+ assert.calledOnceWithExactly(webexRequestStub, {
390
+ method: 'PUT',
391
+ uri: 'fakeMeetingSelfUrl/media',
392
+ body: createExpectedRoapBody('OFFER', {audioMuted: true, videoMuted: true}),
393
+ });
394
+ assert.equal(result, undefined); // sendLocalMute shouldn't resolve yet, as the request should be queued
395
+
396
+ // now let the Offer be completed - so confluence state will be "complete"
397
+ webexRequestStub.resetHistory();
398
+ requestsToLocus[0].resolve({});
399
+ await testUtils.flushPromises();
400
+
401
+ // now the queued up local mute request should have been sent out
402
+ assert.calledOnceWithExactly(webexRequestStub, {
403
+ method: 'PUT',
404
+ uri: 'fakeMeetingSelfUrl/media',
405
+ body: createExpectedLocalMuteBody({audioMuted: false, videoMuted: true}),
406
+ });
407
+
408
+ // check also the result once Locus replies to local mute
409
+ const fakeLocusResponse = { response: 'ok'};
410
+ requestsToLocus[1].resolve(fakeLocusResponse);
411
+ await testUtils.flushPromises();
412
+ assert.deepEqual(result, fakeLocusResponse);
413
+ });
414
+ });
415
+
416
+ it('sends LocalMute request if Offer was already sent and Locus replied (confluence state is "completed")', async () => {
417
+ let result;
418
+
419
+ // send roap offer and ensure it's completed
420
+ sendRoapMessage('OFFER');
421
+ ensureQueueProcessingIsStarted();
422
+ requestsToLocus[0].resolve({});
423
+ await testUtils.flushPromises();
424
+ webexRequestStub.resetHistory();
425
+
426
+ // now send local mute
427
+ sendLocalMute({audioMuted: false, videoMuted: true})
428
+ .then((response) => {
429
+ result = response;
430
+ });
431
+
432
+ ensureQueueProcessingIsStarted();
433
+
434
+ // it should be sent out
435
+ assert.calledOnceWithExactly(webexRequestStub, {
436
+ method: 'PUT',
437
+ uri: 'fakeMeetingSelfUrl/media',
438
+ body: createExpectedLocalMuteBody({audioMuted: false, videoMuted: true}),
439
+ });
440
+ });
441
+
442
+ });
443
+ })