@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.
- package/README.md +46 -8
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.js +49 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +342 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +94 -15
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/edit-lock-error.js +52 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.js +45 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +709 -35
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/utils.js +45 -1
- package/dist/breakouts/utils.js.map +1 -1
- package/dist/common/errors/no-meeting-info.js +51 -0
- package/dist/common/errors/no-meeting-info.js.map +1 -0
- package/dist/common/errors/reclaim-host-role-errors.js +158 -0
- package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
- package/dist/common/errors/webex-errors.js +48 -7
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +5 -1
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +24 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +5 -11
- package/dist/config.js.map +1 -1
- package/dist/constants.js +233 -29
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +14 -2
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.js +109 -15
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/types.js +7 -0
- package/dist/controls-options-manager/types.js.map +1 -0
- package/dist/controls-options-manager/util.js +309 -18
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.js +112 -1
- package/dist/index.js.map +1 -1
- package/dist/interpretation/collection.js +23 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +366 -0
- package/dist/interpretation/index.js.map +1 -0
- package/dist/interpretation/siLanguage.js +25 -0
- package/dist/interpretation/siLanguage.js.map +1 -0
- package/dist/locus-info/controlsUtils.js +91 -2
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +383 -62
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +7 -1
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +57 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +249 -72
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +89 -14
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +61 -116
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +73 -124
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +82 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +3767 -2924
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +292 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +230 -124
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +256 -196
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +601 -417
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js +73 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +192 -51
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/util.js +1 -1
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +36 -36
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +22 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +402 -115
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +7 -0
- package/dist/meetings/meetings.types.js.map +1 -0
- package/dist/meetings/request.js +2 -0
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +72 -6
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +58 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +25 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +132 -25
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +10 -0
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +102 -6
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +106 -38
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +15 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.js +326 -232
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +13 -5
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +1 -468
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +238 -49
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +29 -16
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +39 -36
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +44 -18
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +60 -3
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +209 -59
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +233 -0
- package/dist/multistream/sendSlotManager.js.map +1 -0
- package/dist/reachability/index.js +225 -59
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +17 -8
- package/dist/reachability/request.js.map +1 -1
- package/dist/reconnection-manager/index.js +201 -156
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/index.js +21 -2
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js +9 -8
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.js +62 -32
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +112 -97
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +95 -36
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.js +12 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.js +117 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/index.js +84 -73
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +11 -10
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +42 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +117 -0
- package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +8 -0
- package/dist/types/breakouts/utils.d.ts +14 -0
- package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
- package/dist/types/common/errors/webex-errors.d.ts +25 -1
- package/dist/types/common/logs/request.d.ts +2 -0
- package/dist/types/common/queue.d.ts +9 -7
- package/dist/types/config.d.ts +1 -7
- package/dist/types/constants.d.ts +188 -21
- package/dist/types/controls-options-manager/enums.d.ts +11 -1
- package/dist/types/controls-options-manager/index.d.ts +17 -1
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -7
- package/dist/types/index.d.ts +6 -4
- package/dist/types/interpretation/collection.d.ts +5 -0
- package/dist/types/interpretation/index.d.ts +5 -0
- package/dist/types/interpretation/siLanguage.d.ts +5 -0
- package/dist/types/locus-info/index.d.ts +57 -4
- package/dist/types/locus-info/parser.d.ts +67 -6
- package/dist/types/media/index.d.ts +2 -0
- package/dist/types/media/properties.d.ts +34 -48
- package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
- package/dist/types/meeting/index.d.ts +460 -508
- package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/types/meeting/muteState.d.ts +99 -23
- package/dist/types/meeting/request.d.ts +72 -43
- package/dist/types/meeting/util.d.ts +101 -1
- package/dist/types/meeting-info/index.d.ts +13 -1
- package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
- package/dist/types/meetings/collection.d.ts +8 -0
- package/dist/types/meetings/index.d.ts +90 -20
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/member/index.d.ts +14 -0
- package/dist/types/member/types.d.ts +32 -0
- package/dist/types/members/collection.d.ts +5 -0
- package/dist/types/members/index.d.ts +35 -2
- package/dist/types/members/request.d.ts +73 -9
- package/dist/types/members/types.d.ts +25 -0
- package/dist/types/members/util.d.ts +214 -1
- package/dist/types/metrics/constants.d.ts +12 -4
- package/dist/types/metrics/index.d.ts +4 -119
- package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
- package/dist/types/multistream/receiveSlot.d.ts +13 -11
- package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
- package/dist/types/multistream/remoteMedia.d.ts +8 -29
- package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
- package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
- package/dist/types/multistream/sendSlotManager.d.ts +61 -0
- package/dist/types/reachability/index.d.ts +61 -7
- package/dist/types/reachability/request.d.ts +7 -3
- package/dist/types/reconnection-manager/index.d.ts +9 -0
- package/dist/types/recording-controller/index.d.ts +15 -1
- package/dist/types/recording-controller/util.d.ts +5 -4
- package/dist/types/roap/index.d.ts +2 -1
- package/dist/types/roap/request.d.ts +15 -11
- package/dist/types/roap/turnDiscovery.d.ts +21 -3
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +47 -0
- package/dist/types/statsAnalyzer/index.d.ts +7 -1
- package/dist/types/webinar/collection.d.ts +16 -0
- package/dist/types/webinar/index.d.ts +5 -0
- package/dist/webinar/collection.js +44 -0
- package/dist/webinar/collection.js.map +1 -0
- package/dist/webinar/index.js +69 -0
- package/dist/webinar/index.js.map +1 -0
- package/package.json +23 -20
- package/src/annotation/annotation.types.ts +50 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +328 -0
- package/src/breakouts/README.md +42 -12
- package/src/breakouts/breakout.ts +67 -9
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +592 -20
- package/src/breakouts/utils.ts +42 -0
- package/src/common/errors/no-meeting-info.ts +24 -0
- package/src/common/errors/reclaim-host-role-errors.ts +134 -0
- package/src/common/errors/webex-errors.ts +44 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/logs/request.ts +5 -1
- package/src/common/queue.ts +22 -8
- package/src/config.ts +4 -10
- package/src/constants.ts +216 -18
- package/src/controls-options-manager/enums.ts +12 -0
- package/src/controls-options-manager/index.ts +116 -21
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +294 -14
- package/src/index.ts +40 -0
- package/src/interpretation/README.md +60 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +332 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +108 -0
- package/src/locus-info/index.ts +413 -59
- package/src/locus-info/infoUtils.ts +10 -2
- package/src/locus-info/mediaSharesUtils.ts +64 -0
- package/src/locus-info/parser.ts +258 -47
- package/src/locus-info/selfUtils.ts +81 -5
- package/src/media/index.ts +102 -122
- package/src/media/properties.ts +87 -110
- package/src/meeting/in-meeting-actions.ts +163 -3
- package/src/meeting/index.ts +3112 -2527
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +229 -131
- package/src/meeting/request.ts +172 -121
- package/src/meeting/util.ts +588 -394
- package/src/meeting-info/index.ts +81 -8
- package/src/meeting-info/meeting-info-v2.ts +170 -14
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +23 -23
- package/src/meetings/collection.ts +20 -0
- package/src/meetings/index.ts +434 -123
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +80 -11
- package/src/member/index.ts +58 -0
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +141 -25
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +134 -8
- package/src/members/request.ts +97 -17
- package/src/members/types.ts +29 -0
- package/src/members/util.ts +333 -240
- package/src/metrics/constants.ts +12 -4
- package/src/metrics/index.ts +1 -490
- package/src/multistream/mediaRequestManager.ts +289 -79
- package/src/multistream/receiveSlot.ts +31 -17
- package/src/multistream/receiveSlotManager.ts +34 -24
- package/src/multistream/remoteMedia.ts +27 -2
- package/src/multistream/remoteMediaGroup.ts +59 -0
- package/src/multistream/remoteMediaManager.ts +148 -30
- package/src/multistream/sendSlotManager.ts +170 -0
- package/src/reachability/index.ts +228 -37
- package/src/reachability/request.ts +17 -8
- package/src/reconnection-manager/index.ts +83 -56
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +63 -32
- package/src/roap/request.ts +100 -104
- package/src/roap/turnDiscovery.ts +48 -26
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +100 -0
- package/src/statsAnalyzer/index.ts +103 -87
- package/src/statsAnalyzer/mqaUtil.ts +13 -14
- package/src/webinar/collection.ts +31 -0
- package/src/webinar/index.ts +62 -0
- package/test/integration/spec/converged-space-meetings.js +60 -3
- package/test/integration/spec/journey.js +320 -261
- package/test/integration/spec/space-meeting.js +76 -3
- package/test/unit/spec/annotation/index.ts +418 -0
- package/test/unit/spec/breakouts/breakout.ts +118 -28
- package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1395 -69
- package/test/unit/spec/breakouts/utils.js +52 -1
- package/test/unit/spec/common/queue.js +31 -2
- package/test/unit/spec/controls-options-manager/index.js +163 -0
- package/test/unit/spec/controls-options-manager/util.js +576 -60
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +589 -0
- package/test/unit/spec/interpretation/siLanguage.ts +28 -0
- package/test/unit/spec/locus-info/controlsUtils.js +316 -43
- package/test/unit/spec/locus-info/index.js +1304 -33
- package/test/unit/spec/locus-info/infoUtils.js +37 -15
- package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
- package/test/unit/spec/locus-info/parser.js +116 -35
- package/test/unit/spec/locus-info/selfConstant.js +27 -4
- package/test/unit/spec/locus-info/selfUtils.js +208 -17
- package/test/unit/spec/media/index.ts +104 -37
- package/test/unit/spec/media/properties.ts +2 -2
- package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
- package/test/unit/spec/meeting/index.js +5146 -1933
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +408 -208
- package/test/unit/spec/meeting/request.js +440 -45
- package/test/unit/spec/meeting/utils.js +679 -64
- package/test/unit/spec/meeting-info/index.js +300 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +14 -0
- package/test/unit/spec/meetings/index.js +1011 -205
- package/test/unit/spec/meetings/utils.js +202 -2
- package/test/unit/spec/member/index.js +61 -6
- package/test/unit/spec/member/util.js +510 -34
- package/test/unit/spec/members/index.js +432 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +210 -0
- package/test/unit/spec/metrics/index.js +1 -50
- package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
- package/test/unit/spec/multistream/receiveSlot.ts +28 -20
- package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
- package/test/unit/spec/multistream/remoteMedia.ts +30 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
- package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
- package/test/unit/spec/reachability/index.ts +549 -9
- package/test/unit/spec/reachability/request.js +68 -0
- package/test/unit/spec/reconnection-manager/index.js +85 -9
- package/test/unit/spec/recording-controller/index.js +294 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +178 -64
- package/test/unit/spec/roap/request.ts +203 -85
- package/test/unit/spec/roap/turnDiscovery.ts +82 -36
- package/test/unit/spec/rtcMetrics/index.ts +73 -0
- package/test/unit/spec/stats-analyzer/index.js +112 -2
- package/test/unit/spec/webinar/collection.ts +13 -0
- package/test/unit/spec/webinar/index.ts +60 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -52
- package/dist/meeting/effectsState.js +0 -262
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.js +0 -299
- package/dist/metrics/config.js.map +0 -1
- package/dist/types/meeting/effectsState.d.ts +0 -42
- package/dist/types/metrics/config.d.ts +0 -178
- package/src/index.js +0 -16
- package/src/meeting/effectsState.ts +0 -211
- package/src/metrics/config.ts +0 -495
- 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(
|
|
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
|
+
};
|
package/test/utils/testUtils.js
CHANGED
|
@@ -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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"}
|