@webex/plugin-meetings 3.0.0-beta.30 → 3.0.0-beta.301

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 +3767 -2924
  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 +256 -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 +22 -0
  87. package/dist/meetings/collection.js.map +1 -1
  88. package/dist/meetings/index.js +402 -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 +84 -73
  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 +188 -21
  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 +460 -508
  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 +8 -0
  188. package/dist/types/meetings/index.d.ts +90 -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 +216 -18
  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 +3112 -2527
  260. package/src/meeting/locusMediaRequest.ts +313 -0
  261. package/src/meeting/muteState.ts +229 -131
  262. package/src/meeting/request.ts +172 -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 +20 -0
  269. package/src/meetings/index.ts +434 -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 +103 -87
  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 +5146 -1933
  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 +440 -45
  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 +14 -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 +112 -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
@@ -53,7 +53,12 @@ describe('plugin-meetings', () => {
53
53
  beforeEach(() => {
54
54
  const networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
55
55
 
56
- statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor, defaultStats);
56
+ statsAnalyzer = new StatsAnalyzer(
57
+ initialConfig,
58
+ () => ({}),
59
+ networkQualityMonitor,
60
+ defaultStats
61
+ );
57
62
 
58
63
  sandBoxSpy = sandbox.spy(
59
64
  statsAnalyzer.networkQualityMonitor,
@@ -84,6 +89,7 @@ describe('plugin-meetings', () => {
84
89
  let pc;
85
90
  let networkQualityMonitor;
86
91
  let statsAnalyzer;
92
+ let mqeData;
87
93
 
88
94
  let receivedEventsData = {
89
95
  local: {},
@@ -119,6 +125,21 @@ describe('plugin-meetings', () => {
119
125
  packetsSent: 0,
120
126
  bytesSent: 1,
121
127
  },
128
+ {
129
+ type: 'candidate-pair',
130
+ state: 'succeeded',
131
+ localCandidateId: 'fake-candidate-id'
132
+ },
133
+ {
134
+ type: 'candidate-pair',
135
+ state: 'failed',
136
+ localCandidateId: 'bad-candidate-id'
137
+ },
138
+ {
139
+ type: 'local-candidate',
140
+ id: 'fake-candidate-id',
141
+ protocol: 'tcp'
142
+ },
122
143
  ],
123
144
  },
124
145
  ],
@@ -130,6 +151,21 @@ describe('plugin-meetings', () => {
130
151
  packetsReceived: 0,
131
152
  bytesReceived: 1,
132
153
  },
154
+ {
155
+ type: 'candidate-pair',
156
+ state: 'succeeded',
157
+ localCandidateId: 'fake-candidate-id'
158
+ },
159
+ {
160
+ type: 'candidate-pair',
161
+ state: 'failed',
162
+ localCandidateId: 'bad-candidate-id'
163
+ },
164
+ {
165
+ type: 'local-candidate',
166
+ id: 'fake-candidate-id',
167
+ protocol: 'tcp'
168
+ },
133
169
  ],
134
170
  },
135
171
  ],
@@ -143,6 +179,21 @@ describe('plugin-meetings', () => {
143
179
  framesSent: 0,
144
180
  bytesSent: 1,
145
181
  },
182
+ {
183
+ type: 'candidate-pair',
184
+ state: 'succeeded',
185
+ localCandidateId: 'fake-candidate-id'
186
+ },
187
+ {
188
+ type: 'candidate-pair',
189
+ state: 'failed',
190
+ localCandidateId: 'bad-candidate-id'
191
+ },
192
+ {
193
+ type: 'local-candidate',
194
+ id: 'fake-candidate-id',
195
+ protocol: 'tcp'
196
+ },
146
197
  ],
147
198
  },
148
199
  ],
@@ -153,6 +204,24 @@ describe('plugin-meetings', () => {
153
204
  type: 'inbound-rtp',
154
205
  framesDecoded: 0,
155
206
  bytesReceived: 1,
207
+ frameHeight: 720,
208
+ frameWidth: 1280,
209
+ framesReceived: 1,
210
+ },
211
+ {
212
+ type: 'candidate-pair',
213
+ state: 'succeeded',
214
+ localCandidateId: 'fake-candidate-id'
215
+ },
216
+ {
217
+ type: 'candidate-pair',
218
+ state: 'failed',
219
+ localCandidateId: 'bad-candidate-id'
220
+ },
221
+ {
222
+ type: 'local-candidate',
223
+ id: 'fake-candidate-id',
224
+ protocol: 'tcp'
156
225
  },
157
226
  ],
158
227
  },
@@ -184,7 +253,7 @@ describe('plugin-meetings', () => {
184
253
 
185
254
  networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
186
255
 
187
- statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor);
256
+ statsAnalyzer = new StatsAnalyzer(initialConfig, () => ({}), networkQualityMonitor);
188
257
 
189
258
  statsAnalyzer.on(EVENTS.LOCAL_MEDIA_STARTED, (data) => {
190
259
  receivedEventsData.local.started = data;
@@ -198,6 +267,9 @@ describe('plugin-meetings', () => {
198
267
  statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STOPPED, (data) => {
199
268
  receivedEventsData.remote.stopped = data;
200
269
  });
270
+ statsAnalyzer.on(EVENTS.MEDIA_QUALITY, ({data}) => {
271
+ mqeData = data;
272
+ });
201
273
  });
202
274
 
203
275
  afterEach(() => {
@@ -224,6 +296,12 @@ describe('plugin-meetings', () => {
224
296
  assert.deepEqual(receivedEventsData.remote.stopped, expected.remote?.stopped);
225
297
  };
226
298
 
299
+ const checkMqeData = () => {
300
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedFrameSize, 3600);
301
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedHeight, 720);
302
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedWidth, 1280);
303
+ };
304
+
227
305
  it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for audio', async () => {
228
306
  await startStatsAnalyzer({expected: {sendAudio: true}});
229
307
 
@@ -303,6 +381,38 @@ describe('plugin-meetings', () => {
303
381
 
304
382
  checkReceivedEvent({expected: {remote: {stopped: {type: 'video'}}}});
305
383
  });
384
+
385
+ it('emits the correct MEDIA_QUALITY events', async () => {
386
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
387
+
388
+ await progressTime();
389
+
390
+ // Check that the mqe data has been emitted and is correctly computed.
391
+ checkMqeData();
392
+ });
393
+
394
+ it('emits the correct transportType in MEDIA_QUALITY events', async () => {
395
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
396
+
397
+ await progressTime();
398
+
399
+ assert.strictEqual(mqeData.audioTransmit[0].common.transportType, 'TCP');
400
+ assert.strictEqual(mqeData.videoReceive[0].common.transportType, 'TCP');
401
+ });
402
+
403
+ it('emits the correct transportType in MEDIA_QUALITY events when using a TURN server', async () => {
404
+ fakeStats.audio.senders[0].report[3].relayProtocol = 'tls';
405
+ fakeStats.video.senders[0].report[3].relayProtocol = 'tls';
406
+ fakeStats.audio.receivers[0].report[3].relayProtocol = 'tls';
407
+ fakeStats.video.receivers[0].report[3].relayProtocol = 'tls';
408
+
409
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
410
+
411
+ await progressTime();
412
+
413
+ assert.strictEqual(mqeData.audioTransmit[0].common.transportType, 'TLS');
414
+ assert.strictEqual(mqeData.videoReceive[0].common.transportType, 'TLS');
415
+ });
306
416
  });
307
417
  });
308
418
  });
@@ -0,0 +1,13 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import WebinarCollection from '@webex/plugin-meetings/src/webinar/collection';
3
+
4
+ describe('plugin-meetings', () => {
5
+ describe('WebinarCollection', () => {
6
+ it('the webinar collection is as expected', () => {
7
+ const collection = new WebinarCollection();
8
+
9
+ assert.equal(collection.namespace, 'Meetings');
10
+ assert.equal(collection.mainIndex, 'sessionId');
11
+ });
12
+ });
13
+ });
@@ -0,0 +1,60 @@
1
+ import {assert, expect} from '@webex/test-helper-chai';
2
+ import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
3
+ import Webinar from '@webex/plugin-meetings/src/webinar';
4
+ import MockWebex from '@webex/test-helper-mock-webex';
5
+ import sinon from 'sinon';
6
+
7
+ describe('plugin-meetings', () => {
8
+ describe('Webinar', () => {
9
+
10
+ let webex;
11
+ let webinar;
12
+
13
+ beforeEach(() => {
14
+ // @ts-ignore
15
+ webex = new MockWebex({});
16
+ webex.internal.mercury.on = sinon.stub();
17
+ webinar = new Webinar({}, {parent: webex});
18
+ webinar.locusUrl = 'locusUrl';
19
+ webex.request = sinon.stub().returns(Promise.resolve('REQUEST_RETURN_VALUE'));
20
+ webex.meetings = {};
21
+ webex.meetings.getMeetingByType = sinon.stub();
22
+ });
23
+
24
+ describe('#locusUrlUpdate', () => {
25
+ it('sets the locus url', () => {
26
+ webinar.locusUrlUpdate('newUrl');
27
+
28
+ assert.equal(webinar.locusUrl, 'newUrl');
29
+ });
30
+ });
31
+
32
+ describe('#webcastUrlUpdate', () => {
33
+ it('sets the webcast url', () => {
34
+ webinar.webcastUrlUpdate('newUrl');
35
+
36
+ assert.equal(webinar.webcastUrl, 'newUrl');
37
+ });
38
+ });
39
+
40
+ describe('#webinarAttendeesSearchingUrlUpdate', () => {
41
+ it('sets the webinarAttendeesSearching url', () => {
42
+ webinar.webinarAttendeesSearchingUrlUpdate('newUrl');
43
+
44
+ assert.equal(webinar.webinarAttendeesSearchingUrl, 'newUrl');
45
+ });
46
+ });
47
+
48
+ describe('#updateCanManageWebcast', () => {
49
+ it('update canManageWebcast', () => {
50
+ webinar.updateCanManageWebcast(true);
51
+
52
+ assert.equal(webinar.canManageWebcast, true);
53
+
54
+ webinar.updateCanManageWebcast(false);
55
+
56
+ assert.equal(webinar.canManageWebcast, false);
57
+ });
58
+ });
59
+ })
60
+ })
@@ -0,0 +1,46 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import {Defer} from '@webex/common';
3
+
4
+ const addMedia = async (user, options = {}) => {
5
+
6
+ const {microphone, camera} = options;
7
+
8
+ if (options.multistream) {
9
+ await user.meeting.addMedia({localStreams: {microphone, camera}});
10
+ } else {
11
+ const mediaReadyPromises = Array.isArray(options.expectedMediaReadyTypes)
12
+ ? options.expectedMediaReadyTypes.reduce((output, expectedMediaReadyType) => {
13
+ if (typeof expectedMediaReadyType !== 'string') {
14
+ return output;
15
+ }
16
+
17
+ output[expectedMediaReadyType] = new Defer();
18
+
19
+ return output;
20
+ }, {})
21
+ : {remoteAudio: new Defer(), remoteVideo: new Defer()};
22
+
23
+ const mediaReady = (media) => {
24
+ if (!media) {
25
+ return;
26
+ }
27
+ if (mediaReadyPromises[media.type]) {
28
+ mediaReadyPromises[media.type].resolve();
29
+ }
30
+ };
31
+
32
+ user.meeting.on('media:ready', mediaReady);
33
+
34
+ await user.meeting.addMedia({localStreams: {microphone, camera}});
35
+ await Promise.all(Object.values(mediaReadyPromises).map((defer) => defer.promise));
36
+ };
37
+
38
+
39
+ assert.exists(user.meeting.mediaProperties.audioStream, 'audioStream not present');
40
+ assert.exists(user.meeting.mediaProperties.videoStream, 'videoStream not present');
41
+
42
+ };
43
+
44
+ export default {
45
+ addMedia
46
+ };
@@ -1,5 +1,3 @@
1
- import {assert} from '@webex/test-helper-chai';
2
- import {Defer} from '@webex/common';
3
1
 
4
2
  const max = 30000;
5
3
  const waitForSpy = (spy, event) => {
@@ -195,56 +193,7 @@ const delayedTest = (callback, timeout) =>
195
193
  }, timeout);
196
194
  });
197
195
 
198
- const addMedia = (user, options = {}) => {
199
- const mediaReadyPromises = Array.isArray(options.expectedMediaReadyTypes)
200
- ? options.expectedMediaReadyTypes.reduce((output, expectedMediaReadyType) => {
201
- if (typeof expectedMediaReadyType !== 'string') {
202
- return output;
203
- }
204
-
205
- output[expectedMediaReadyType] = new Defer();
206
-
207
- return output;
208
- }, {})
209
- : {local: new Defer(), remoteAudio: new Defer(), remoteVideo: new Defer()};
210
-
211
- const mediaReady = (media) => {
212
- if (!media) {
213
- return;
214
- }
215
- if (mediaReadyPromises[media.type]) {
216
- mediaReadyPromises[media.type].resolve();
217
- }
218
- };
219
196
 
220
- user.meeting.on('media:ready', mediaReady);
221
-
222
- return user.meeting
223
- .getMediaStreams({
224
- sendAudio: true,
225
- sendVideo: true,
226
- sendShare: false,
227
- })
228
- .then(([localStream, localShare]) =>
229
- user.meeting.addMedia({
230
- mediaSettings: {
231
- sendAudio: true,
232
- sendVideo: true,
233
- sendShare: false,
234
- receiveShare: true,
235
- receiveAudio: true,
236
- receiveVideo: true,
237
- },
238
- localShare,
239
- localStream,
240
- })
241
- )
242
- .then(() => Promise.all(Object.values(mediaReadyPromises).map((defer) => defer.promise)))
243
- .then(() => {
244
- assert.exists(user.meeting.mediaProperties.audioTrack, 'audioTrack not present');
245
- assert.exists(user.meeting.mediaProperties.videoTrack, 'videoTrack not present');
246
- });
247
- };
248
197
 
249
198
  const waitUntil = (waitTime) =>
250
199
  new Promise((resolve) => {
@@ -286,7 +235,6 @@ export default {
286
235
  waitForEvents,
287
236
  checkParticipantUpdatedStatus,
288
237
  delayedPromise,
289
- addMedia,
290
238
  waitUntil,
291
239
  delayedTest,
292
240
  flushPromises,
@@ -1,262 +0,0 @@
1
- "use strict";
2
-
3
- var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
- var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
5
- _Object$defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.default = void 0;
9
- var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
10
- var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
11
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
12
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
13
- var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
14
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
15
- var _internalMediaCore = require("@webex/internal-media-core");
16
- var _constants = _interopRequireDefault(require("../metrics/constants"));
17
- var _metrics = _interopRequireDefault(require("../metrics"));
18
- var _util = _interopRequireDefault(require("../media/util"));
19
- var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
20
- var _constants2 = require("../constants");
21
- /* eslint-disable no-param-reassign */
22
-
23
- var createEffectsState = function createEffectsState(type) {
24
- _loggerProxy.default.logger.info("Meeting:effectState#createEffectsState --> creating effectsState for effect ".concat(type));
25
- return new EffectsState(type);
26
- };
27
-
28
- /* The purpose of this class is to manage the effects state(for eg., BNR).
29
- */
30
- var EffectsState = /*#__PURE__*/function () {
31
- function EffectsState(type) {
32
- (0, _classCallCheck2.default)(this, EffectsState);
33
- (0, _defineProperty2.default)(this, "effectType", void 0);
34
- (0, _defineProperty2.default)(this, "pendingPromiseReject", void 0);
35
- (0, _defineProperty2.default)(this, "pendingPromiseResolve", void 0);
36
- (0, _defineProperty2.default)(this, "state", void 0);
37
- this.effectType = type;
38
- this.state = {
39
- bnr: {
40
- enabled: _constants2.BNR_STATUS.NOT_ENABLED
41
- },
42
- callToWebrtcBNRInProgress: false
43
- };
44
- // these 2 hold the resolve, reject methods for the promise we returned to the client in last handleClientRequest() call
45
- this.pendingPromiseResolve = null;
46
- this.pendingPromiseReject = null;
47
- }
48
-
49
- /**
50
- * @memberof EffectsState
51
- * @param {Boolean} [isEnable] true for enableBNR, false for disableBNR request
52
- * @param {Object} [meeting] the meeting object
53
- * @returns {Promise}
54
- */
55
- (0, _createClass2.default)(EffectsState, [{
56
- key: "handleClientRequest",
57
- value: function () {
58
- var _handleClientRequest = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(isEnable, meeting) {
59
- var _this = this;
60
- return _regenerator.default.wrap(function _callee$(_context) {
61
- while (1) switch (_context.prev = _context.next) {
62
- case 0:
63
- return _context.abrupt("return", new _promise.default(function (resolve, reject) {
64
- if (_this.pendingPromiseResolve) {
65
- // resolve the last promise we returned to the client as the client has issued a new request that has superseded the previous one
66
- _this.pendingPromiseResolve();
67
- }
68
- _this.pendingPromiseResolve = resolve;
69
- _this.pendingPromiseReject = reject;
70
- if (isEnable) _this.enableBNR(meeting);else _this.disableBNR(meeting);
71
- }));
72
- case 1:
73
- case "end":
74
- return _context.stop();
75
- }
76
- }, _callee);
77
- }));
78
- function handleClientRequest(_x, _x2) {
79
- return _handleClientRequest.apply(this, arguments);
80
- }
81
- return handleClientRequest;
82
- }()
83
- /**
84
- * Internal API to return status of BNR
85
- * @memberof EffectsState
86
- * @returns {Boolean}
87
- * @public
88
- * @memberof Meeting
89
- */
90
- }, {
91
- key: "isBnrEnabled",
92
- value: function isBnrEnabled() {
93
- return this.state.bnr.enabled === _constants2.BNR_STATUS.ENABLED;
94
- }
95
- }, {
96
- key: "resolvePromise",
97
- value: function resolvePromise() {
98
- if (this.pendingPromiseResolve) {
99
- this.pendingPromiseResolve(true);
100
- }
101
- this.pendingPromiseResolve = null;
102
- this.pendingPromiseReject = null;
103
- }
104
- }, {
105
- key: "rejectPromise",
106
- value: function rejectPromise(e) {
107
- if (this.pendingPromiseReject) {
108
- this.pendingPromiseReject(e);
109
- }
110
- this.pendingPromiseResolve = null;
111
- this.pendingPromiseReject = null;
112
- }
113
-
114
- /**
115
- * enableBNR API
116
- * @param {Object} meeting the meeting object
117
- * @returns {Promise<Boolean>}
118
- * @public
119
- * @memberof EffectsState
120
- */
121
- }, {
122
- key: "enableBNR",
123
- value: function () {
124
- var _enableBNR = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(meeting) {
125
- var bnr, audioStream;
126
- return _regenerator.default.wrap(function _callee2$(_context2) {
127
- while (1) switch (_context2.prev = _context2.next) {
128
- case 0:
129
- _loggerProxy.default.logger.info('Meeting:effectState#enableBNR. Enable BNR called');
130
- if (!this.isBnrEnabled()) {
131
- _context2.next = 4;
132
- break;
133
- }
134
- _loggerProxy.default.logger.warn('Meeting:index#enableBNR. BNR is already enabled');
135
- return _context2.abrupt("return", this.resolvePromise());
136
- case 4:
137
- if (!this.state.callToWebrtcBNRInProgress) {
138
- _context2.next = 7;
139
- break;
140
- }
141
- _loggerProxy.default.logger.warn('Meeting:effectState#enableBNR. Call to WebRTC in progress, we need to wait for it to complete');
142
- return _context2.abrupt("return", this.resolvePromise());
143
- case 7:
144
- bnr = this.state.bnr;
145
- _context2.prev = 8;
146
- bnr.enabled = _constants2.BNR_STATUS.SHOULD_ENABLE;
147
- this.state.callToWebrtcBNRInProgress = true;
148
- audioStream = _util.default.createMediaStream([meeting.mediaProperties.audioTrack]);
149
- _loggerProxy.default.logger.info('Meeting:effectState#enableBNR. MediaStream created from meeting & sent to updateAudio');
150
- _context2.next = 15;
151
- return meeting.updateAudio({
152
- sendAudio: true,
153
- receiveAudio: meeting.mediaProperties.mediaDirection.receiveAudio,
154
- stream: audioStream
155
- });
156
- case 15:
157
- _loggerProxy.default.logger.info('Meeting:effectState#enableBNR. Updated meeting audio with bnr enabled track');
158
- bnr.enabled = _constants2.BNR_STATUS.ENABLED;
159
- this.state.callToWebrtcBNRInProgress = false;
160
- _metrics.default.sendBehavioralMetric(_constants.default.ENABLE_BNR_SUCCESS);
161
- _context2.next = 29;
162
- break;
163
- case 21:
164
- _context2.prev = 21;
165
- _context2.t0 = _context2["catch"](8);
166
- bnr.enabled = _constants2.BNR_STATUS.NOT_ENABLED;
167
- this.state.callToWebrtcBNRInProgress = false;
168
- _loggerProxy.default.logger.error('Meeting:index#enableBNR.', _context2.t0);
169
- _metrics.default.sendBehavioralMetric(_constants.default.ENABLE_BNR_FAILURE, {
170
- reason: _context2.t0.message,
171
- stack: _context2.t0.stack
172
- });
173
- this.rejectPromise(_context2.t0);
174
- throw _context2.t0;
175
- case 29:
176
- return _context2.abrupt("return", this.resolvePromise());
177
- case 30:
178
- case "end":
179
- return _context2.stop();
180
- }
181
- }, _callee2, this, [[8, 21]]);
182
- }));
183
- function enableBNR(_x3) {
184
- return _enableBNR.apply(this, arguments);
185
- }
186
- return enableBNR;
187
- }()
188
- /**
189
- * disableBNR API
190
- * @param {Object} meeting the meeting object
191
- * @returns {Promise<Boolean>}
192
- * @public
193
- * @memberof EffectsState
194
- */
195
- }, {
196
- key: "disableBNR",
197
- value: function () {
198
- var _disableBNR = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(meeting) {
199
- var bnr, audioTrack, audioStream;
200
- return _regenerator.default.wrap(function _callee3$(_context3) {
201
- while (1) switch (_context3.prev = _context3.next) {
202
- case 0:
203
- _loggerProxy.default.logger.info('Meeting:effectState#disableBNR. Disable BNR called');
204
- bnr = this.state.bnr;
205
- _context3.prev = 2;
206
- if (!this.state.callToWebrtcBNRInProgress) {
207
- _context3.next = 6;
208
- break;
209
- }
210
- _loggerProxy.default.logger.info('Meeting:effectState#disableBNR. Call to WebRTC in progress, we need to wait for it to complete');
211
- return _context3.abrupt("return", this.resolvePromise());
212
- case 6:
213
- bnr.enabled = _constants2.BNR_STATUS.SHOULD_DISABLE;
214
- this.state.callToWebrtcBNRInProgress = true;
215
-
216
- // @ts-ignore - disableBNR does not expect an argument
217
- audioTrack = _internalMediaCore.Media.Effects.BNR.disableBNR(meeting.mediaProperties.audioTrack);
218
- audioStream = _util.default.createMediaStream([audioTrack]);
219
- _loggerProxy.default.logger.info('Meeting:effectState#disableBNR. Raw media track obtained from WebRTC & sent to updateAudio');
220
- _context3.next = 13;
221
- return meeting.updateAudio({
222
- sendAudio: true,
223
- receiveAudio: meeting.mediaProperties.mediaDirection.receiveAudio,
224
- stream: audioStream
225
- });
226
- case 13:
227
- bnr.enabled = _constants2.BNR_STATUS.NOT_ENABLED;
228
- this.state.callToWebrtcBNRInProgress = false;
229
- _metrics.default.sendBehavioralMetric(_constants.default.DISABLE_BNR_SUCCESS);
230
- _context3.next = 26;
231
- break;
232
- case 18:
233
- _context3.prev = 18;
234
- _context3.t0 = _context3["catch"](2);
235
- bnr.enabled = _constants2.BNR_STATUS.ENABLED;
236
- this.state.callToWebrtcBNRInProgress = false;
237
- _loggerProxy.default.logger.error("Meeting:index#disableBNR. ".concat(_context3.t0));
238
- _metrics.default.sendBehavioralMetric(_constants.default.DISABLE_BNR_FAILURE, {
239
- reason: _context3.t0.message,
240
- stack: _context3.t0.stack
241
- });
242
- this.rejectPromise(_context3.t0);
243
- throw _context3.t0;
244
- case 26:
245
- return _context3.abrupt("return", this.resolvePromise());
246
- case 27:
247
- case "end":
248
- return _context3.stop();
249
- }
250
- }, _callee3, this, [[2, 18]]);
251
- }));
252
- function disableBNR(_x4) {
253
- return _disableBNR.apply(this, arguments);
254
- }
255
- return disableBNR;
256
- }()
257
- }]);
258
- return EffectsState;
259
- }();
260
- var _default = createEffectsState;
261
- exports.default = _default;
262
- //# sourceMappingURL=effectsState.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["createEffectsState","type","LoggerProxy","logger","info","EffectsState","effectType","state","bnr","enabled","BNR_STATUS","NOT_ENABLED","callToWebrtcBNRInProgress","pendingPromiseResolve","pendingPromiseReject","isEnable","meeting","resolve","reject","enableBNR","disableBNR","ENABLED","e","isBnrEnabled","warn","resolvePromise","SHOULD_ENABLE","audioStream","MediaUtil","createMediaStream","mediaProperties","audioTrack","updateAudio","sendAudio","receiveAudio","mediaDirection","stream","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","ENABLE_BNR_SUCCESS","error","ENABLE_BNR_FAILURE","reason","message","stack","rejectPromise","SHOULD_DISABLE","WebRTCMedia","Effects","BNR","DISABLE_BNR_SUCCESS","DISABLE_BNR_FAILURE"],"sources":["effectsState.ts"],"sourcesContent":["/* eslint-disable no-param-reassign */\nimport {Media as WebRTCMedia} from '@webex/internal-media-core';\n\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport Metrics from '../metrics';\nimport MediaUtil from '../media/util';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {BNR_STATUS} from '../constants';\n\nconst createEffectsState = (type: any) => {\n LoggerProxy.logger.info(\n `Meeting:effectState#createEffectsState --> creating effectsState for effect ${type}`\n );\n\n return new EffectsState(type);\n};\n\n/* The purpose of this class is to manage the effects state(for eg., BNR).\n */\nclass EffectsState {\n effectType: any;\n pendingPromiseReject: any;\n pendingPromiseResolve: any;\n state: any;\n\n constructor(type: any) {\n this.effectType = type;\n this.state = {\n bnr: {\n enabled: BNR_STATUS.NOT_ENABLED,\n },\n callToWebrtcBNRInProgress: false,\n };\n // these 2 hold the resolve, reject methods for the promise we returned to the client in last handleClientRequest() call\n this.pendingPromiseResolve = null;\n this.pendingPromiseReject = null;\n }\n\n /**\n * @memberof EffectsState\n * @param {Boolean} [isEnable] true for enableBNR, false for disableBNR request\n * @param {Object} [meeting] the meeting object\n * @returns {Promise}\n */\n async handleClientRequest(isEnable?: boolean, meeting?: object) {\n return new Promise((resolve, reject) => {\n if (this.pendingPromiseResolve) {\n // resolve the last promise we returned to the client as the client has issued a new request that has superseded the previous one\n this.pendingPromiseResolve();\n }\n this.pendingPromiseResolve = resolve;\n this.pendingPromiseReject = reject;\n\n if (isEnable) this.enableBNR(meeting);\n else this.disableBNR(meeting);\n });\n }\n\n /**\n * Internal API to return status of BNR\n * @memberof EffectsState\n * @returns {Boolean}\n * @public\n * @memberof Meeting\n */\n public isBnrEnabled() {\n return this.state.bnr.enabled === BNR_STATUS.ENABLED;\n }\n\n resolvePromise() {\n if (this.pendingPromiseResolve) {\n this.pendingPromiseResolve(true);\n }\n this.pendingPromiseResolve = null;\n this.pendingPromiseReject = null;\n }\n\n rejectPromise(e) {\n if (this.pendingPromiseReject) {\n this.pendingPromiseReject(e);\n }\n this.pendingPromiseResolve = null;\n this.pendingPromiseReject = null;\n }\n\n /**\n * enableBNR API\n * @param {Object} meeting the meeting object\n * @returns {Promise<Boolean>}\n * @public\n * @memberof EffectsState\n */\n public async enableBNR(meeting: any) {\n LoggerProxy.logger.info('Meeting:effectState#enableBNR. Enable BNR called');\n\n if (this.isBnrEnabled()) {\n LoggerProxy.logger.warn('Meeting:index#enableBNR. BNR is already enabled');\n\n return this.resolvePromise();\n }\n\n if (this.state.callToWebrtcBNRInProgress) {\n LoggerProxy.logger.warn(\n 'Meeting:effectState#enableBNR. Call to WebRTC in progress, we need to wait for it to complete'\n );\n\n return this.resolvePromise();\n }\n\n const {bnr} = this.state;\n\n try {\n bnr.enabled = BNR_STATUS.SHOULD_ENABLE;\n this.state.callToWebrtcBNRInProgress = true;\n const audioStream = MediaUtil.createMediaStream([meeting.mediaProperties.audioTrack]);\n\n LoggerProxy.logger.info(\n 'Meeting:effectState#enableBNR. MediaStream created from meeting & sent to updateAudio'\n );\n await meeting.updateAudio({\n sendAudio: true,\n receiveAudio: meeting.mediaProperties.mediaDirection.receiveAudio,\n stream: audioStream,\n });\n\n LoggerProxy.logger.info(\n 'Meeting:effectState#enableBNR. Updated meeting audio with bnr enabled track'\n );\n bnr.enabled = BNR_STATUS.ENABLED;\n this.state.callToWebrtcBNRInProgress = false;\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ENABLE_BNR_SUCCESS);\n } catch (error) {\n bnr.enabled = BNR_STATUS.NOT_ENABLED;\n this.state.callToWebrtcBNRInProgress = false;\n LoggerProxy.logger.error('Meeting:index#enableBNR.', error);\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ENABLE_BNR_FAILURE, {\n reason: error.message,\n stack: error.stack,\n });\n this.rejectPromise(error);\n\n throw error;\n }\n\n return this.resolvePromise();\n }\n\n /**\n * disableBNR API\n * @param {Object} meeting the meeting object\n * @returns {Promise<Boolean>}\n * @public\n * @memberof EffectsState\n */\n public async disableBNR(meeting: any) {\n LoggerProxy.logger.info('Meeting:effectState#disableBNR. Disable BNR called');\n\n const {bnr} = this.state;\n\n try {\n if (this.state.callToWebrtcBNRInProgress) {\n LoggerProxy.logger.info(\n 'Meeting:effectState#disableBNR. Call to WebRTC in progress, we need to wait for it to complete'\n );\n\n return this.resolvePromise();\n }\n\n bnr.enabled = BNR_STATUS.SHOULD_DISABLE;\n this.state.callToWebrtcBNRInProgress = true;\n\n // @ts-ignore - disableBNR does not expect an argument\n const audioTrack = WebRTCMedia.Effects.BNR.disableBNR(meeting.mediaProperties.audioTrack);\n\n const audioStream = MediaUtil.createMediaStream([audioTrack]);\n\n LoggerProxy.logger.info(\n 'Meeting:effectState#disableBNR. Raw media track obtained from WebRTC & sent to updateAudio'\n );\n\n await meeting.updateAudio({\n sendAudio: true,\n receiveAudio: meeting.mediaProperties.mediaDirection.receiveAudio,\n stream: audioStream,\n });\n\n bnr.enabled = BNR_STATUS.NOT_ENABLED;\n\n this.state.callToWebrtcBNRInProgress = false;\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.DISABLE_BNR_SUCCESS);\n } catch (error) {\n bnr.enabled = BNR_STATUS.ENABLED;\n this.state.callToWebrtcBNRInProgress = false;\n LoggerProxy.logger.error(`Meeting:index#disableBNR. ${error}`);\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.DISABLE_BNR_FAILURE, {\n reason: error.message,\n stack: error.stack,\n });\n this.rejectPromise(error);\n\n throw error;\n }\n\n return this.resolvePromise();\n }\n}\n\nexport default createEffectsState;\n"],"mappings":"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"}