@webex/plugin-meetings 3.0.0-beta.14 → 3.0.0-beta.140

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 (519) hide show
  1. package/README.md +45 -1
  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 +48 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +355 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +193 -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 +43 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +1012 -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 +5 -26
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +5 -26
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +6 -27
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +5 -26
  37. package/dist/common/errors/media.js.map +1 -1
  38. package/dist/common/errors/parameter.js +5 -33
  39. package/dist/common/errors/parameter.js.map +1 -1
  40. package/dist/common/errors/password-error.js +5 -26
  41. package/dist/common/errors/password-error.js.map +1 -1
  42. package/dist/common/errors/permission.js +4 -25
  43. package/dist/common/errors/permission.js.map +1 -1
  44. package/dist/common/errors/reconnection-in-progress.js +0 -17
  45. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  46. package/dist/common/errors/reconnection.js +5 -26
  47. package/dist/common/errors/reconnection.js.map +1 -1
  48. package/dist/common/errors/stats.js +5 -26
  49. package/dist/common/errors/stats.js.map +1 -1
  50. package/dist/common/errors/webex-errors.js +6 -41
  51. package/dist/common/errors/webex-errors.js.map +1 -1
  52. package/dist/common/errors/webex-meetings-error.js +1 -24
  53. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  54. package/dist/common/events/events-scope.js +0 -22
  55. package/dist/common/events/events-scope.js.map +1 -1
  56. package/dist/common/events/events.js +0 -23
  57. package/dist/common/events/events.js.map +1 -1
  58. package/dist/common/events/trigger-proxy.js +0 -12
  59. package/dist/common/events/trigger-proxy.js.map +1 -1
  60. package/dist/common/events/util.js +0 -15
  61. package/dist/common/events/util.js.map +1 -1
  62. package/dist/common/logs/logger-config.js +0 -4
  63. package/dist/common/logs/logger-config.js.map +1 -1
  64. package/dist/common/logs/logger-proxy.js +1 -8
  65. package/dist/common/logs/logger-proxy.js.map +1 -1
  66. package/dist/common/logs/request.js +35 -61
  67. package/dist/common/logs/request.js.map +1 -1
  68. package/dist/common/queue.js +4 -14
  69. package/dist/common/queue.js.map +1 -1
  70. package/dist/config.js +6 -6
  71. package/dist/config.js.map +1 -1
  72. package/dist/constants.js +204 -53
  73. package/dist/constants.js.map +1 -1
  74. package/dist/controls-options-manager/constants.js +14 -0
  75. package/dist/controls-options-manager/constants.js.map +1 -0
  76. package/dist/controls-options-manager/enums.js +27 -0
  77. package/dist/controls-options-manager/enums.js.map +1 -0
  78. package/dist/controls-options-manager/index.js +297 -0
  79. package/dist/controls-options-manager/index.js.map +1 -0
  80. package/dist/controls-options-manager/types.js +7 -0
  81. package/dist/controls-options-manager/types.js.map +1 -0
  82. package/dist/controls-options-manager/util.js +300 -0
  83. package/dist/controls-options-manager/util.js.map +1 -0
  84. package/dist/index.js +72 -17
  85. package/dist/index.js.map +1 -1
  86. package/dist/locus-info/controlsUtils.js +100 -29
  87. package/dist/locus-info/controlsUtils.js.map +1 -1
  88. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  89. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  90. package/dist/locus-info/fullState.js +0 -15
  91. package/dist/locus-info/fullState.js.map +1 -1
  92. package/dist/locus-info/hostUtils.js +4 -12
  93. package/dist/locus-info/hostUtils.js.map +1 -1
  94. package/dist/locus-info/index.js +398 -216
  95. package/dist/locus-info/index.js.map +1 -1
  96. package/dist/locus-info/infoUtils.js +0 -38
  97. package/dist/locus-info/infoUtils.js.map +1 -1
  98. package/dist/locus-info/mediaSharesUtils.js +54 -38
  99. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  100. package/dist/locus-info/parser.js +89 -124
  101. package/dist/locus-info/parser.js.map +1 -1
  102. package/dist/locus-info/selfUtils.js +94 -92
  103. package/dist/locus-info/selfUtils.js.map +1 -1
  104. package/dist/media/index.js +55 -165
  105. package/dist/media/index.js.map +1 -1
  106. package/dist/media/properties.js +71 -117
  107. package/dist/media/properties.js.map +1 -1
  108. package/dist/media/util.js +2 -9
  109. package/dist/media/util.js.map +1 -1
  110. package/dist/mediaQualityMetrics/config.js +505 -495
  111. package/dist/mediaQualityMetrics/config.js.map +1 -1
  112. package/dist/meeting/in-meeting-actions.js +77 -14
  113. package/dist/meeting/in-meeting-actions.js.map +1 -1
  114. package/dist/meeting/index.js +2576 -2455
  115. package/dist/meeting/index.js.map +1 -1
  116. package/dist/meeting/locusMediaRequest.js +291 -0
  117. package/dist/meeting/locusMediaRequest.js.map +1 -0
  118. package/dist/meeting/muteState.js +292 -138
  119. package/dist/meeting/muteState.js.map +1 -1
  120. package/dist/meeting/request.js +296 -342
  121. package/dist/meeting/request.js.map +1 -1
  122. package/dist/meeting/request.type.js +0 -1
  123. package/dist/meeting/request.type.js.map +1 -1
  124. package/dist/meeting/state.js +21 -31
  125. package/dist/meeting/state.js.map +1 -1
  126. package/dist/meeting/util.js +463 -583
  127. package/dist/meeting/util.js.map +1 -1
  128. package/dist/meeting-info/collection.js +3 -25
  129. package/dist/meeting-info/collection.js.map +1 -1
  130. package/dist/meeting-info/index.js +10 -33
  131. package/dist/meeting-info/index.js.map +1 -1
  132. package/dist/meeting-info/meeting-info-v2.js +305 -286
  133. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  134. package/dist/meeting-info/request.js +1 -16
  135. package/dist/meeting-info/request.js.map +1 -1
  136. package/dist/meeting-info/util.js +98 -183
  137. package/dist/meeting-info/util.js.map +1 -1
  138. package/dist/meeting-info/utilv2.js +156 -232
  139. package/dist/meeting-info/utilv2.js.map +1 -1
  140. package/dist/meetings/collection.js +24 -20
  141. package/dist/meetings/collection.js.map +1 -1
  142. package/dist/meetings/index.js +692 -593
  143. package/dist/meetings/index.js.map +1 -1
  144. package/dist/meetings/request.js +23 -42
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +186 -155
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.js +89 -88
  149. package/dist/member/index.js.map +1 -1
  150. package/dist/member/types.js +15 -0
  151. package/dist/member/types.js.map +1 -0
  152. package/dist/member/util.js +101 -69
  153. package/dist/member/util.js.map +1 -1
  154. package/dist/members/collection.js +12 -12
  155. package/dist/members/collection.js.map +1 -1
  156. package/dist/members/index.js +166 -205
  157. package/dist/members/index.js.map +1 -1
  158. package/dist/members/request.js +120 -85
  159. package/dist/members/request.js.map +1 -1
  160. package/dist/members/types.js +15 -0
  161. package/dist/members/types.js.map +1 -0
  162. package/dist/members/util.js +314 -260
  163. package/dist/members/util.js.map +1 -1
  164. package/dist/metrics/config.js +50 -16
  165. package/dist/metrics/config.js.map +1 -1
  166. package/dist/metrics/constants.js +4 -7
  167. package/dist/metrics/constants.js.map +1 -1
  168. package/dist/metrics/index.js +93 -162
  169. package/dist/metrics/index.js.map +1 -1
  170. package/dist/multistream/mediaRequestManager.js +167 -50
  171. package/dist/multistream/mediaRequestManager.js.map +1 -1
  172. package/dist/multistream/receiveSlot.js +58 -65
  173. package/dist/multistream/receiveSlot.js.map +1 -1
  174. package/dist/multistream/receiveSlotManager.js +74 -93
  175. package/dist/multistream/receiveSlotManager.js.map +1 -1
  176. package/dist/multistream/remoteMedia.js +55 -74
  177. package/dist/multistream/remoteMedia.js.map +1 -1
  178. package/dist/multistream/remoteMediaGroup.js +14 -40
  179. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  180. package/dist/multistream/remoteMediaManager.js +481 -442
  181. package/dist/multistream/remoteMediaManager.js.map +1 -1
  182. package/dist/networkQualityMonitor/index.js +32 -59
  183. package/dist/networkQualityMonitor/index.js.map +1 -1
  184. package/dist/personal-meeting-room/index.js +10 -45
  185. package/dist/personal-meeting-room/index.js.map +1 -1
  186. package/dist/personal-meeting-room/request.js +2 -33
  187. package/dist/personal-meeting-room/request.js.map +1 -1
  188. package/dist/personal-meeting-room/util.js +0 -13
  189. package/dist/personal-meeting-room/util.js.map +1 -1
  190. package/dist/reachability/index.js +190 -199
  191. package/dist/reachability/index.js.map +1 -1
  192. package/dist/reachability/request.js +14 -23
  193. package/dist/reachability/request.js.map +1 -1
  194. package/dist/reactions/constants.js +13 -0
  195. package/dist/reactions/constants.js.map +1 -0
  196. package/dist/reactions/reactions.js +2 -4
  197. package/dist/reactions/reactions.js.map +1 -1
  198. package/dist/reactions/reactions.type.js +19 -23
  199. package/dist/reactions/reactions.type.js.map +1 -1
  200. package/dist/reconnection-manager/index.js +326 -465
  201. package/dist/reconnection-manager/index.js.map +1 -1
  202. package/dist/recording-controller/enums.js +17 -0
  203. package/dist/recording-controller/enums.js.map +1 -0
  204. package/dist/recording-controller/index.js +343 -0
  205. package/dist/recording-controller/index.js.map +1 -0
  206. package/dist/recording-controller/util.js +63 -0
  207. package/dist/recording-controller/util.js.map +1 -0
  208. package/dist/roap/index.js +31 -75
  209. package/dist/roap/index.js.map +1 -1
  210. package/dist/roap/request.js +129 -136
  211. package/dist/roap/request.js.map +1 -1
  212. package/dist/roap/turnDiscovery.js +143 -103
  213. package/dist/roap/turnDiscovery.js.map +1 -1
  214. package/dist/statsAnalyzer/global.js +1 -95
  215. package/dist/statsAnalyzer/global.js.map +1 -1
  216. package/dist/statsAnalyzer/index.js +369 -462
  217. package/dist/statsAnalyzer/index.js.map +1 -1
  218. package/dist/statsAnalyzer/mqaUtil.js +144 -94
  219. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  220. package/dist/transcription/index.js +13 -45
  221. package/dist/transcription/index.js.map +1 -1
  222. package/dist/types/annotation/annotation.types.d.ts +35 -0
  223. package/dist/types/annotation/constants.d.ts +31 -0
  224. package/dist/types/annotation/index.d.ts +124 -0
  225. package/dist/types/breakouts/breakout.d.ts +8 -0
  226. package/dist/types/breakouts/collection.d.ts +5 -0
  227. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  228. package/dist/types/breakouts/events.d.ts +2 -0
  229. package/dist/types/breakouts/index.d.ts +5 -0
  230. package/dist/types/breakouts/request.d.ts +22 -0
  231. package/dist/types/breakouts/utils.d.ts +15 -0
  232. package/dist/types/common/browser-detection.d.ts +9 -0
  233. package/dist/types/common/collection.d.ts +48 -0
  234. package/dist/types/common/config.d.ts +2 -0
  235. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  236. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  237. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  238. package/dist/types/common/errors/media.d.ts +15 -0
  239. package/dist/types/common/errors/parameter.d.ts +15 -0
  240. package/dist/types/common/errors/password-error.d.ts +15 -0
  241. package/dist/types/common/errors/permission.d.ts +14 -0
  242. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  243. package/dist/types/common/errors/reconnection.d.ts +15 -0
  244. package/dist/types/common/errors/stats.d.ts +15 -0
  245. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  246. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  247. package/dist/types/common/events/events-scope.d.ts +17 -0
  248. package/dist/types/common/events/events.d.ts +12 -0
  249. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  250. package/dist/types/common/events/util.d.ts +2 -0
  251. package/dist/types/common/logs/logger-config.d.ts +2 -0
  252. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  253. package/dist/types/common/logs/request.d.ts +34 -0
  254. package/dist/types/common/queue.d.ts +32 -0
  255. package/dist/types/config.d.ts +78 -0
  256. package/dist/types/constants.d.ts +994 -0
  257. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  258. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  259. package/dist/types/controls-options-manager/index.d.ts +136 -0
  260. package/dist/types/controls-options-manager/types.d.ts +43 -0
  261. package/dist/types/controls-options-manager/util.d.ts +1 -0
  262. package/dist/types/index.d.ts +7 -0
  263. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  264. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  265. package/dist/types/locus-info/fullState.d.ts +2 -0
  266. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  267. package/dist/types/locus-info/index.d.ts +315 -0
  268. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  269. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  270. package/dist/types/locus-info/parser.d.ts +212 -0
  271. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  272. package/dist/types/media/index.d.ts +34 -0
  273. package/dist/types/media/properties.d.ts +108 -0
  274. package/dist/types/media/util.d.ts +2 -0
  275. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  276. package/dist/types/meeting/in-meeting-actions.d.ts +147 -0
  277. package/dist/types/meeting/index.d.ts +1762 -0
  278. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  279. package/dist/types/meeting/muteState.d.ts +186 -0
  280. package/dist/types/meeting/request.d.ts +269 -0
  281. package/dist/types/meeting/request.type.d.ts +11 -0
  282. package/dist/types/meeting/state.d.ts +9 -0
  283. package/dist/types/meeting/util.d.ts +76 -0
  284. package/dist/types/meeting-info/collection.d.ts +20 -0
  285. package/dist/types/meeting-info/index.d.ts +57 -0
  286. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  287. package/dist/types/meeting-info/request.d.ts +22 -0
  288. package/dist/types/meeting-info/util.d.ts +2 -0
  289. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  290. package/dist/types/meetings/collection.d.ts +31 -0
  291. package/dist/types/meetings/index.d.ts +345 -0
  292. package/dist/types/meetings/request.d.ts +27 -0
  293. package/dist/types/meetings/util.d.ts +18 -0
  294. package/dist/types/member/index.d.ts +157 -0
  295. package/dist/types/member/types.d.ts +21 -0
  296. package/dist/types/member/util.d.ts +2 -0
  297. package/dist/types/members/collection.d.ts +29 -0
  298. package/dist/types/members/index.d.ts +353 -0
  299. package/dist/types/members/request.d.ts +114 -0
  300. package/dist/types/members/types.d.ts +24 -0
  301. package/dist/types/members/util.d.ts +210 -0
  302. package/dist/types/metrics/config.d.ts +195 -0
  303. package/dist/types/metrics/constants.d.ts +55 -0
  304. package/dist/types/metrics/index.d.ts +169 -0
  305. package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
  306. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  307. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  308. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  309. package/dist/types/multistream/remoteMediaGroup.d.ts +48 -0
  310. package/dist/types/multistream/remoteMediaManager.d.ts +267 -0
  311. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  312. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  313. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  314. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  315. package/dist/types/reachability/index.d.ts +152 -0
  316. package/dist/types/reachability/request.d.ts +37 -0
  317. package/dist/types/reactions/constants.d.ts +3 -0
  318. package/dist/types/reactions/reactions.d.ts +4 -0
  319. package/dist/types/reactions/reactions.type.d.ts +52 -0
  320. package/dist/types/reconnection-manager/index.d.ts +126 -0
  321. package/dist/types/recording-controller/enums.d.ts +7 -0
  322. package/dist/types/recording-controller/index.d.ts +193 -0
  323. package/dist/types/recording-controller/util.d.ts +13 -0
  324. package/dist/types/roap/index.d.ts +77 -0
  325. package/dist/types/roap/request.d.ts +36 -0
  326. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  327. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  328. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  329. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  330. package/dist/types/transcription/index.d.ts +64 -0
  331. package/internal-README.md +7 -6
  332. package/package.json +28 -21
  333. package/src/annotation/annotation.types.ts +42 -0
  334. package/src/annotation/constants.ts +36 -0
  335. package/src/annotation/index.ts +339 -0
  336. package/src/breakouts/README.md +220 -0
  337. package/src/breakouts/breakout.ts +163 -0
  338. package/src/breakouts/collection.ts +19 -0
  339. package/src/breakouts/edit-lock-error.ts +25 -0
  340. package/src/breakouts/events.ts +37 -0
  341. package/src/breakouts/index.ts +888 -0
  342. package/src/breakouts/request.ts +55 -0
  343. package/src/breakouts/utils.ts +57 -0
  344. package/src/common/browser-detection.ts +9 -6
  345. package/src/common/collection.ts +3 -1
  346. package/src/common/errors/captcha-error.ts +6 -6
  347. package/src/common/errors/intent-to-join.ts +6 -6
  348. package/src/common/errors/join-meeting.ts +12 -8
  349. package/src/common/errors/media.ts +6 -6
  350. package/src/common/errors/parameter.ts +9 -6
  351. package/src/common/errors/password-error.ts +6 -6
  352. package/src/common/errors/permission.ts +5 -5
  353. package/src/common/errors/reconnection.ts +6 -6
  354. package/src/common/errors/stats.ts +6 -6
  355. package/src/common/errors/webex-errors.ts +7 -5
  356. package/src/common/errors/webex-meetings-error.ts +1 -1
  357. package/src/common/events/events-scope.ts +5 -1
  358. package/src/common/events/events.ts +5 -1
  359. package/src/common/events/trigger-proxy.ts +8 -3
  360. package/src/common/events/util.ts +1 -2
  361. package/src/common/logs/logger-proxy.ts +22 -11
  362. package/src/common/logs/request.ts +11 -8
  363. package/src/config.ts +16 -12
  364. package/src/constants.ts +154 -7
  365. package/src/controls-options-manager/constants.ts +5 -0
  366. package/src/controls-options-manager/enums.ts +18 -0
  367. package/src/controls-options-manager/index.ts +278 -0
  368. package/src/controls-options-manager/types.ts +59 -0
  369. package/src/controls-options-manager/util.ts +286 -0
  370. package/src/index.ts +33 -0
  371. package/src/locus-info/controlsUtils.ts +142 -24
  372. package/src/locus-info/fullState.ts +15 -11
  373. package/src/locus-info/hostUtils.ts +4 -3
  374. package/src/locus-info/index.ts +335 -55
  375. package/src/locus-info/infoUtils.ts +12 -4
  376. package/src/locus-info/mediaSharesUtils.ts +52 -4
  377. package/src/locus-info/parser.ts +47 -69
  378. package/src/locus-info/selfUtils.ts +175 -56
  379. package/src/media/index.ts +139 -196
  380. package/src/media/properties.ts +43 -36
  381. package/src/media/util.ts +1 -1
  382. package/src/mediaQualityMetrics/config.ts +380 -378
  383. package/src/meeting/in-meeting-actions.ts +159 -3
  384. package/src/meeting/index.ts +2809 -1589
  385. package/src/meeting/locusMediaRequest.ts +309 -0
  386. package/src/meeting/muteState.ts +290 -72
  387. package/src/meeting/request.ts +229 -182
  388. package/src/meeting/request.type.ts +10 -8
  389. package/src/meeting/state.ts +45 -30
  390. package/src/meeting/util.ts +445 -395
  391. package/src/meeting-info/collection.ts +2 -1
  392. package/src/meeting-info/index.ts +32 -30
  393. package/src/meeting-info/meeting-info-v2.ts +235 -116
  394. package/src/meeting-info/request.ts +9 -3
  395. package/src/meeting-info/util.ts +54 -46
  396. package/src/meeting-info/utilv2.ts +71 -55
  397. package/src/meetings/collection.ts +21 -1
  398. package/src/meetings/index.ts +771 -437
  399. package/src/meetings/request.ts +29 -25
  400. package/src/meetings/util.ts +132 -33
  401. package/src/member/index.ts +95 -49
  402. package/src/member/types.ts +24 -0
  403. package/src/member/util.ts +106 -13
  404. package/src/members/collection.ts +8 -1
  405. package/src/members/index.ts +288 -130
  406. package/src/members/request.ts +144 -31
  407. package/src/members/types.ts +28 -0
  408. package/src/members/util.ts +316 -235
  409. package/src/metrics/config.ts +302 -90
  410. package/src/metrics/constants.ts +2 -6
  411. package/src/metrics/index.ts +124 -95
  412. package/src/multistream/mediaRequestManager.ts +203 -45
  413. package/src/multistream/receiveSlot.ts +69 -26
  414. package/src/multistream/receiveSlotManager.ts +62 -38
  415. package/src/multistream/remoteMedia.ts +30 -4
  416. package/src/multistream/remoteMediaGroup.ts +11 -3
  417. package/src/multistream/remoteMediaManager.ts +245 -66
  418. package/src/networkQualityMonitor/index.ts +24 -27
  419. package/src/personal-meeting-room/index.ts +12 -16
  420. package/src/personal-meeting-room/request.ts +10 -3
  421. package/src/personal-meeting-room/util.ts +3 -3
  422. package/src/reachability/index.ts +131 -79
  423. package/src/reachability/request.ts +43 -34
  424. package/src/reactions/constants.ts +4 -0
  425. package/src/reactions/reactions.ts +8 -8
  426. package/src/reactions/reactions.type.ts +31 -5
  427. package/src/reconnection-manager/index.ts +193 -112
  428. package/src/recording-controller/enums.ts +8 -0
  429. package/src/recording-controller/index.ts +315 -0
  430. package/src/recording-controller/util.ts +58 -0
  431. package/src/roap/index.ts +53 -53
  432. package/src/roap/request.ts +77 -65
  433. package/src/roap/turnDiscovery.ts +101 -48
  434. package/src/statsAnalyzer/global.ts +8 -104
  435. package/src/statsAnalyzer/index.ts +624 -377
  436. package/src/statsAnalyzer/mqaUtil.ts +203 -90
  437. package/src/transcription/index.ts +34 -32
  438. package/test/integration/spec/converged-space-meetings.js +177 -0
  439. package/test/integration/spec/journey.js +670 -466
  440. package/test/integration/spec/space-meeting.js +320 -204
  441. package/test/integration/spec/transcription.js +7 -8
  442. package/test/unit/spec/annotation/index.ts +433 -0
  443. package/test/unit/spec/breakouts/breakout.ts +203 -0
  444. package/test/unit/spec/breakouts/collection.ts +15 -0
  445. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  446. package/test/unit/spec/breakouts/events.ts +77 -0
  447. package/test/unit/spec/breakouts/index.ts +1685 -0
  448. package/test/unit/spec/breakouts/request.ts +104 -0
  449. package/test/unit/spec/breakouts/utils.js +72 -0
  450. package/test/unit/spec/common/browser-detection.js +9 -28
  451. package/test/unit/spec/controls-options-manager/index.js +287 -0
  452. package/test/unit/spec/controls-options-manager/util.js +518 -0
  453. package/test/unit/spec/fixture/locus.js +93 -90
  454. package/test/unit/spec/locus-info/controlsUtils.js +305 -32
  455. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  456. package/test/unit/spec/locus-info/index.js +615 -5
  457. package/test/unit/spec/locus-info/infoUtils.js +26 -33
  458. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  459. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  460. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  461. package/test/unit/spec/locus-info/parser.js +3 -9
  462. package/test/unit/spec/locus-info/selfConstant.js +110 -103
  463. package/test/unit/spec/locus-info/selfUtils.js +221 -12
  464. package/test/unit/spec/media/index.ts +104 -8
  465. package/test/unit/spec/media/properties.ts +9 -9
  466. package/test/unit/spec/meeting/in-meeting-actions.ts +76 -3
  467. package/test/unit/spec/meeting/index.js +3077 -923
  468. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  469. package/test/unit/spec/meeting/muteState.js +421 -94
  470. package/test/unit/spec/meeting/request.js +408 -85
  471. package/test/unit/spec/meeting/utils.js +326 -189
  472. package/test/unit/spec/meeting-info/meetinginfov2.js +481 -76
  473. package/test/unit/spec/meeting-info/request.js +7 -9
  474. package/test/unit/spec/meeting-info/util.js +11 -12
  475. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  476. package/test/unit/spec/meetings/collection.js +15 -1
  477. package/test/unit/spec/meetings/index.js +1126 -328
  478. package/test/unit/spec/meetings/utils.js +220 -14
  479. package/test/unit/spec/member/index.js +24 -1
  480. package/test/unit/spec/member/util.js +383 -32
  481. package/test/unit/spec/members/index.js +424 -55
  482. package/test/unit/spec/members/request.js +228 -40
  483. package/test/unit/spec/members/utils.js +191 -4
  484. package/test/unit/spec/metrics/index.js +113 -20
  485. package/test/unit/spec/multistream/mediaRequestManager.ts +650 -105
  486. package/test/unit/spec/multistream/receiveSlot.ts +76 -17
  487. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  488. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  489. package/test/unit/spec/multistream/remoteMediaGroup.ts +52 -5
  490. package/test/unit/spec/multistream/remoteMediaManager.ts +585 -65
  491. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  492. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  493. package/test/unit/spec/reachability/index.ts +176 -27
  494. package/test/unit/spec/reachability/request.js +66 -0
  495. package/test/unit/spec/reconnection-manager/index.js +62 -31
  496. package/test/unit/spec/recording-controller/index.js +231 -0
  497. package/test/unit/spec/recording-controller/util.js +102 -0
  498. package/test/unit/spec/roap/index.ts +19 -49
  499. package/test/unit/spec/roap/request.ts +187 -0
  500. package/test/unit/spec/roap/turnDiscovery.ts +92 -50
  501. package/test/unit/spec/stats-analyzer/index.js +116 -60
  502. package/test/utils/cmr.js +44 -42
  503. package/test/utils/constants.js +9 -0
  504. package/test/utils/integrationTestUtils.js +64 -0
  505. package/test/utils/testUtils.js +63 -99
  506. package/test/utils/webex-config.js +22 -18
  507. package/test/utils/webex-test-users.js +57 -50
  508. package/tsconfig.json +6 -0
  509. package/dist/media/internal-media-core-wrapper.js +0 -22
  510. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  511. package/dist/meeting/effectsState.js +0 -334
  512. package/dist/meeting/effectsState.js.map +0 -1
  513. package/dist/multistream/multistreamMedia.js +0 -116
  514. package/dist/multistream/multistreamMedia.js.map +0 -1
  515. package/src/index.js +0 -15
  516. package/src/media/internal-media-core-wrapper.ts +0 -9
  517. package/src/meeting/effectsState.ts +0 -211
  518. package/src/multistream/multistreamMedia.ts +0 -92
  519. package/test/unit/spec/meeting/effectsState.js +0 -291
@@ -1,211 +0,0 @@
1
- /* eslint-disable no-param-reassign */
2
- import {Media as WebRTCMedia} from '@webex/internal-media-core';
3
-
4
- import BEHAVIORAL_METRICS from '../metrics/constants';
5
- import Metrics from '../metrics';
6
- import MediaUtil from '../media/util';
7
- import LoggerProxy from '../common/logs/logger-proxy';
8
- import {BNR_STATUS} from '../constants';
9
-
10
- const createEffectsState = (type: any) => {
11
- LoggerProxy.logger.info(`Meeting:effectState#createEffectsState --> creating effectsState for effect ${type}`);
12
-
13
- return new EffectsState(type);
14
- };
15
-
16
- /* The purpose of this class is to manage the effects state(for eg., BNR).
17
- */
18
- class EffectsState {
19
- effectType: any;
20
- pendingPromiseReject: any;
21
- pendingPromiseResolve: any;
22
- state: any;
23
-
24
- constructor(type: any) {
25
- this.effectType = type;
26
- this.state = {
27
- bnr: {
28
- enabled: BNR_STATUS.NOT_ENABLED
29
- },
30
- callToWebrtcBNRInProgress: false
31
- };
32
- // these 2 hold the resolve, reject methods for the promise we returned to the client in last handleClientRequest() call
33
- this.pendingPromiseResolve = null;
34
- this.pendingPromiseReject = null;
35
- }
36
-
37
- /**
38
- * @memberof EffectsState
39
- * @param {Boolean} [isEnable] true for enableBNR, false for disableBNR request
40
- * @param {Object} [meeting] the meeting object
41
- * @returns {Promise}
42
- */
43
- async handleClientRequest(isEnable?: boolean, meeting?: object) {
44
- return new Promise((resolve, reject) => {
45
- if (this.pendingPromiseResolve) {
46
- // resolve the last promise we returned to the client as the client has issued a new request that has superseded the previous one
47
- this.pendingPromiseResolve();
48
- }
49
- this.pendingPromiseResolve = resolve;
50
- this.pendingPromiseReject = reject;
51
-
52
- if (isEnable) this.enableBNR(meeting);
53
- else this.disableBNR(meeting);
54
- });
55
- }
56
-
57
- /**
58
- * Internal API to return status of BNR
59
- * @memberof EffectsState
60
- * @returns {Boolean}
61
- * @public
62
- * @memberof Meeting
63
- */
64
- public isBnrEnabled() {
65
- return this.state.bnr.enabled === BNR_STATUS.ENABLED;
66
- }
67
-
68
- resolvePromise() {
69
- if (this.pendingPromiseResolve) {
70
- this.pendingPromiseResolve(true);
71
- }
72
- this.pendingPromiseResolve = null;
73
- this.pendingPromiseReject = null;
74
- }
75
-
76
- rejectPromise(e) {
77
- if (this.pendingPromiseReject) {
78
- this.pendingPromiseReject(e);
79
- }
80
- this.pendingPromiseResolve = null;
81
- this.pendingPromiseReject = null;
82
- }
83
-
84
- /**
85
- * enableBNR API
86
- * @param {Object} meeting the meeting object
87
- * @returns {Promise<Boolean>}
88
- * @public
89
- * @memberof EffectsState
90
- */
91
- public async enableBNR(meeting: any) {
92
- LoggerProxy.logger.info('Meeting:effectState#enableBNR. Enable BNR called');
93
-
94
- if (this.isBnrEnabled()) {
95
- LoggerProxy.logger.warn('Meeting:index#enableBNR. BNR is already enabled');
96
-
97
- return this.resolvePromise();
98
- }
99
-
100
- if (this.state.callToWebrtcBNRInProgress) {
101
- LoggerProxy.logger.warn('Meeting:effectState#enableBNR. Call to WebRTC in progress, we need to wait for it to complete');
102
-
103
- return this.resolvePromise();
104
- }
105
-
106
- const {bnr} = this.state;
107
-
108
- try {
109
- bnr.enabled = BNR_STATUS.SHOULD_ENABLE;
110
- this.state.callToWebrtcBNRInProgress = true;
111
- const audioStream = MediaUtil.createMediaStream([meeting.mediaProperties.audioTrack]);
112
-
113
- LoggerProxy.logger.info('Meeting:effectState#enableBNR. MediaStream created from meeting & sent to updateAudio');
114
- await meeting.updateAudio({
115
- sendAudio: true,
116
- receiveAudio: meeting.mediaProperties.mediaDirection.receiveAudio,
117
- stream: audioStream
118
- });
119
-
120
- LoggerProxy.logger.info('Meeting:effectState#enableBNR. Updated meeting audio with bnr enabled track');
121
- bnr.enabled = BNR_STATUS.ENABLED;
122
- this.state.callToWebrtcBNRInProgress = false;
123
- Metrics.sendBehavioralMetric(
124
- BEHAVIORAL_METRICS.ENABLE_BNR_SUCCESS,
125
- );
126
- }
127
- catch (error) {
128
- bnr.enabled = BNR_STATUS.NOT_ENABLED;
129
- this.state.callToWebrtcBNRInProgress = false;
130
- LoggerProxy.logger.error('Meeting:index#enableBNR.', error);
131
-
132
- Metrics.sendBehavioralMetric(
133
- BEHAVIORAL_METRICS.ENABLE_BNR_FAILURE,
134
- {
135
- reason: error.message,
136
- stack: error.stack
137
- }
138
- );
139
- this.rejectPromise(error);
140
-
141
- throw error;
142
- }
143
-
144
- return this.resolvePromise();
145
- }
146
-
147
- /**
148
- * disableBNR API
149
- * @param {Object} meeting the meeting object
150
- * @returns {Promise<Boolean>}
151
- * @public
152
- * @memberof EffectsState
153
- */
154
- public async disableBNR(meeting: any) {
155
- LoggerProxy.logger.info('Meeting:effectState#disableBNR. Disable BNR called');
156
-
157
- const {bnr} = this.state;
158
-
159
- try {
160
- if (this.state.callToWebrtcBNRInProgress) {
161
- LoggerProxy.logger.info('Meeting:effectState#disableBNR. Call to WebRTC in progress, we need to wait for it to complete');
162
-
163
- return this.resolvePromise();
164
- }
165
-
166
- bnr.enabled = BNR_STATUS.SHOULD_DISABLE;
167
- this.state.callToWebrtcBNRInProgress = true;
168
-
169
- // @ts-ignore - disableBNR does not expect an argument
170
- const audioTrack = WebRTCMedia.Effects.BNR.disableBNR(meeting.mediaProperties.audioTrack);
171
-
172
- const audioStream = MediaUtil.createMediaStream([audioTrack]);
173
-
174
- LoggerProxy.logger.info('Meeting:effectState#disableBNR. Raw media track obtained from WebRTC & sent to updateAudio');
175
-
176
- await meeting.updateAudio({
177
- sendAudio: true,
178
- receiveAudio: meeting.mediaProperties.mediaDirection.receiveAudio,
179
- stream: audioStream
180
- });
181
-
182
- bnr.enabled = BNR_STATUS.NOT_ENABLED;
183
-
184
- this.state.callToWebrtcBNRInProgress = false;
185
-
186
- Metrics.sendBehavioralMetric(
187
- BEHAVIORAL_METRICS.DISABLE_BNR_SUCCESS
188
- );
189
- }
190
- catch (error) {
191
- bnr.enabled = BNR_STATUS.ENABLED;
192
- this.state.callToWebrtcBNRInProgress = false;
193
- LoggerProxy.logger.error(`Meeting:index#disableBNR. ${error}`);
194
-
195
- Metrics.sendBehavioralMetric(
196
- BEHAVIORAL_METRICS.DISABLE_BNR_FAILURE,
197
- {
198
- reason: error.message,
199
- stack: error.stack
200
- }
201
- );
202
- this.rejectPromise(error);
203
-
204
- throw error;
205
- }
206
-
207
- return this.resolvePromise();
208
- }
209
- }
210
-
211
- export default createEffectsState;
@@ -1,92 +0,0 @@
1
- /* eslint-disable import/prefer-default-export */
2
-
3
- import {AUDIO, VIDEO} from '../constants';
4
- import createMuteState from '../meeting/muteState';
5
- import Meeting from '../meeting';
6
-
7
- /**
8
- * Class wrapping all the multistream specific APIs that need to be exposed at meeting level.
9
- *
10
- */
11
- export class MultistreamMedia {
12
- private meeting: Meeting;
13
-
14
- /**
15
- * Constructor
16
- * @param {Meeting} meeting
17
- */
18
- constructor(meeting: Meeting) {
19
- this.meeting = meeting;
20
- }
21
-
22
- /**
23
- * throws if we don't have a media connection created
24
- */
25
- private checkMediaConnection() {
26
- if (this.meeting?.mediaProperties?.webrtcMediaConnection) {
27
- return;
28
- }
29
- throw new Error('Webrtc media connection is missing');
30
- }
31
-
32
- /**
33
- * Publishes a local track in the meeting
34
- *
35
- * @param {MediaStreamTrack} track
36
- * @returns {Promise}
37
- */
38
- publishTrack(track: MediaStreamTrack): Promise<void> {
39
- this.checkMediaConnection();
40
-
41
- /* todo: for now we don't support screen share (waiting for server to support bundling, see SPARK-377812)
42
- for sharing:
43
- we have to call meeting.stopFloorRequest() before unpublishing a track
44
- we have to call meeting.share() after publishing a track
45
- */
46
-
47
- // todo: depending on how muting is done with Local tracks, this code here might need to change...
48
-
49
- if (track.kind === 'audio') {
50
- this.meeting.setLocalAudioTrack(track);
51
- this.meeting.mediaProperties.mediaDirection.sendAudio = true;
52
-
53
- // audio state could be undefined if you have not sent audio before
54
- this.meeting.audio =
55
- this.meeting.audio ||
56
- createMuteState(AUDIO, this.meeting, this.meeting.mediaProperties.mediaDirection);
57
- } else if (track.kind === 'video') {
58
- this.meeting.setLocalVideoTrack(track);
59
- this.meeting.mediaProperties.mediaDirection.sendVideo = true;
60
-
61
- // video state could be undefined if you have not sent video before
62
- this.meeting.video =
63
- this.meeting.video ||
64
- createMuteState(VIDEO, this.meeting, this.meeting.mediaProperties.mediaDirection);
65
- }
66
-
67
- return this.meeting.mediaProperties.webrtcMediaConnection.publishTrack(track);
68
- }
69
-
70
- /**
71
- * Unpublishes a local track in the meeting
72
- *
73
- * @param {MediaStreamTrack} track
74
- * @returns {Promise}
75
- */
76
- unpublishTrack(track: MediaStreamTrack): Promise<void> {
77
- // todo: see todos in publishTrack() - they all apply here too:
78
- // screen sharing - SPARK-377812
79
- // muting etc
80
-
81
- if (track.kind === 'audio') {
82
- this.meeting.setLocalVideoTrack(null);
83
- this.meeting.mediaProperties.mediaDirection.sendAudio = false;
84
- } else if (track.kind === 'video') {
85
- this.meeting.setLocalAudioTrack(null);
86
- this.meeting.mediaProperties.mediaDirection.sendVideo = false;
87
- }
88
- this.checkMediaConnection();
89
-
90
- return this.meeting.mediaProperties.webrtcMediaConnection.unpublishTrack(track);
91
- }
92
- }
@@ -1,291 +0,0 @@
1
- /* eslint-disable camelcase */
2
- import {assert} from '@webex/test-helper-chai';
3
- import sinon from 'sinon';
4
- import MockWebex from '@webex/test-helper-mock-webex';
5
- import {BNR_STATUS} from '@webex/plugin-meetings/src/constants';
6
- import BEHAVIORAL_METRICS from '@webex/plugin-meetings/src/metrics/constants';
7
- import Meeting from '@webex/plugin-meetings/src/meeting';
8
- import Meetings from '@webex/plugin-meetings';
9
- import Metrics from '@webex/plugin-meetings/src/metrics';
10
- import MediaUtil from '@webex/plugin-meetings/src/media/util';
11
- import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
12
- import createEffectsState from '@webex/plugin-meetings/src/meeting/effectsState';
13
- import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
14
- import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
15
-
16
- describe('plugin-meetings', () => {
17
- const logger = {
18
- info: () => {},
19
- log: () => {},
20
- error: () => {},
21
- warn: () => {},
22
- trace: () => {},
23
- debug: () => {}
24
- };
25
-
26
- beforeEach(() => {
27
- sinon.stub(Metrics, 'sendBehavioralMetric');
28
- });
29
- afterEach(() => {
30
- sinon.restore();
31
- });
32
-
33
- Object.defineProperty(global.window.navigator, 'mediaDevices', {
34
- writable: true,
35
- value: {
36
- getSupportedConstraints: sinon.stub().returns({
37
- sampleRate: true
38
- })
39
- },
40
- });
41
- LoggerConfig.set({verboseEvents: true, enable: false});
42
- LoggerProxy.set(logger);
43
-
44
- let webex;
45
- let meeting;
46
- let uuid1;
47
-
48
- const fakeMediaTrack = () => ({
49
- id: Date.now().toString(),
50
- stop: () => {},
51
- readyState: 'live',
52
- enabled: true,
53
- getSettings: () => ({
54
- sampleRate: 48000
55
- })
56
- });
57
-
58
- class FakeMediaStream {
59
- constructor(tracks) {
60
- this.active = false;
61
- this.id = '5146425f-c240-48cc-b86b-27d422988fb7';
62
- this.tracks = tracks;
63
- }
64
-
65
- addTrack = () => undefined;
66
-
67
- getAudioTracks = () => this.tracks;
68
- }
69
-
70
- class FakeAudioContext {
71
- constructor() {
72
- this.state = 'running';
73
- this.baseLatency = 0.005333333333333333;
74
- this.currentTime = 2.7946666666666666;
75
- this.sampleRate = 48000;
76
- this.audioWorklet = {
77
- addModule: async () => undefined,
78
- };
79
- }
80
-
81
- onstatechange = null;
82
-
83
- createMediaStreamSource() {
84
- return {
85
- connect: () => undefined,
86
- mediaStream: {
87
- getAudioTracks() {
88
- // eslint-disable-next-line no-undef
89
- return [new MediaStreamTrack()];
90
- },
91
- },
92
- };
93
- }
94
-
95
- createMediaStreamDestination() {
96
- return {
97
- stream: {
98
- getAudioTracks() {
99
- // eslint-disable-next-line no-undef
100
- return [new MediaStreamTrack()];
101
- },
102
- },
103
- };
104
- }
105
- }
106
-
107
- class FakeAudioWorkletNode {
108
- constructor() {
109
- this.port = {
110
- postMessage: () => undefined,
111
- };
112
- }
113
-
114
- connect() {
115
- /* placeholder method */
116
- }
117
- }
118
-
119
- class FakeMediaStreamTrack {
120
- constructor() {
121
- this.kind = 'audio';
122
- this.enabled = true;
123
- this.label = 'Default - MacBook Pro Microphone (Built-in)';
124
- this.muted = false;
125
- this.readyState = 'live';
126
- this.contentHint = '';
127
- }
128
-
129
- getSettings() {
130
- return {
131
- sampleRate: 48000
132
- };
133
- }
134
- }
135
- Object.defineProperty(global, 'MediaStream', {
136
- writable: true,
137
- value: FakeMediaStream,
138
- });
139
-
140
- Object.defineProperty(global, 'AudioContext', {
141
- writable: true,
142
- value: FakeAudioContext,
143
- });
144
-
145
- Object.defineProperty(global, 'AudioWorkletNode', {
146
- writable: true,
147
- value: FakeAudioWorkletNode,
148
- });
149
-
150
- Object.defineProperty(global, 'MediaStreamTrack', {
151
- writable: true,
152
- value: FakeMediaStreamTrack,
153
- });
154
-
155
- let effects;
156
-
157
- beforeEach(() => {
158
- webex = new MockWebex({
159
- children: {
160
- meetings: Meetings
161
- }
162
- });
163
- meeting = new Meeting(
164
- {
165
- userId: uuid1
166
- },
167
- {
168
- parent: webex
169
- }
170
- );
171
-
172
- effects = createEffectsState('BNR');
173
- meeting.canUpdateMedia = sinon.stub().returns(true);
174
- MeetingUtil.validateOptions = sinon.stub().returns(Promise.resolve());
175
-
176
- meeting.addMedia = sinon.stub().returns(Promise.resolve());
177
- meeting.getMediaStreams = sinon.stub().returns(Promise.resolve());
178
- sinon.stub(meeting, 'effects').value(effects);
179
- sinon.replace(meeting, 'addMedia', () => {
180
- sinon.stub(meeting.mediaProperties, 'audioTrack').value(fakeMediaTrack());
181
- sinon.stub(meeting.mediaProperties, 'mediaDirection').value({
182
- receiveAudio: true
183
- });
184
- sinon.stub(meeting.mediaProperties, 'webrtcMediaConnection').value({updateSendReceiveOptions: sinon.stub()});
185
- });
186
- });
187
-
188
- describe('bnr effect library', () => {
189
- beforeEach(async () => {
190
- await meeting.getMediaStreams();
191
- await meeting.addMedia();
192
- });
193
- describe('#enableBNR', () => {
194
- it('should have #enableBnr', () => {
195
- assert.exists(effects.enableBNR);
196
- });
197
-
198
- it('does bnr effect enable on audio track', async () => {
199
- assert.isTrue(await effects.handleClientRequest(true, meeting));
200
- assert.equal(effects.state.bnr.enabled, BNR_STATUS.ENABLED);
201
-
202
- assert(Metrics.sendBehavioralMetric.calledOnce);
203
- assert.calledWith(
204
- Metrics.sendBehavioralMetric,
205
- BEHAVIORAL_METRICS.ENABLE_BNR_SUCCESS,
206
- );
207
- });
208
-
209
- it('does resolve request if bnr is already enabled', async () => {
210
- effects.state.bnr.enabled = BNR_STATUS.ENABLED;
211
- assert.isTrue(await effects.handleClientRequest(true, meeting));
212
- assert.equal(effects.state.bnr.enabled, BNR_STATUS.ENABLED);
213
- });
214
-
215
- it('if called twice, does bnr effect enable on audio track for the first request and resolves second', async () => {
216
- Promise.all([effects.handleClientRequest(true, meeting), effects.handleClientRequest(true, meeting)])
217
- .then((resolveFirst, resolveSecond) => {
218
- assert.isTrue(resolveFirst);
219
- assert.isTrue(resolveSecond);
220
- assert.calledOnce(MediaUtil.createMediaStream);
221
- });
222
- });
223
-
224
- it('should throw error for inappropriate sample rate and send error metrics', async () => {
225
- const fakeMediaTrack1 = () => ({
226
- id: Date.now().toString(),
227
- stop: () => {},
228
- readyState: 'live',
229
- getSettings: () => ({
230
- sampleRate: 49000
231
- })
232
- });
233
-
234
- sinon.stub(meeting.mediaProperties, 'audioTrack').value(fakeMediaTrack1());
235
-
236
- // eslint-disable-next-line no-undef
237
- MediaUtil.createMediaStream = sinon.stub().returns(new MediaStream([fakeMediaTrack1()]));
238
- try {
239
- await effects.handleClientRequest(true, meeting);
240
- }
241
- catch (err) {
242
- assert(Metrics.sendBehavioralMetric.calledOnce);
243
- assert.calledWith(
244
- Metrics.sendBehavioralMetric,
245
- BEHAVIORAL_METRICS.ENABLE_BNR_FAILURE, {
246
- reason: err.message,
247
- stack: err.stack
248
- }
249
- );
250
- assert.equal(err.message, 'Sample rate of 49000 is not supported.');
251
- }
252
- });
253
- });
254
-
255
- describe('#disableBNR', () => {
256
- beforeEach(() => {
257
- effects.state.bnr.enabled = BNR_STATUS.ENABLED;
258
- });
259
- it('should have #disableBnr', () => {
260
- assert.exists(effects.disableBNR);
261
- });
262
-
263
- it('does bnr disable on audio track', async () => {
264
- assert.isTrue(await effects.handleClientRequest(false, meeting));
265
- assert.equal(effects.state.bnr.enabled, BNR_STATUS.NOT_ENABLED);
266
-
267
- assert(Metrics.sendBehavioralMetric.calledOnce);
268
- assert.calledWith(
269
- Metrics.sendBehavioralMetric,
270
- BEHAVIORAL_METRICS.DISABLE_BNR_SUCCESS,
271
- );
272
- });
273
-
274
- it('reject request for disable bnr if not enabled', async () => {
275
- try {
276
- await effects.handleClientRequest(false, meeting);
277
- }
278
- catch (e) {
279
- assert.equal(e.message, 'Can not disable as BNR is not enabled');
280
- assert.equal(effects.state.bnr.enabled, BNR_STATUS.ENABLED);
281
-
282
- assert(Metrics.sendBehavioralMetric.calledOnce);
283
- assert.calledWith(
284
- Metrics.sendBehavioralMetric,
285
- BEHAVIORAL_METRICS.DISABLE_BNR_FAILURE,
286
- );
287
- }
288
- });
289
- });
290
- });
291
- });