@webex/plugin-meetings 3.8.1 → 3.9.0-next.2
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 +26 -13
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/constants.js +32 -3
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +1 -0
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/types.js.map +1 -1
- package/dist/controls-options-manager/util.js +26 -0
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/controlsUtils.js +11 -3
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +69 -85
- package/dist/locus-info/index.js.map +1 -1
- package/dist/media/index.js +2 -2
- package/dist/media/index.js.map +1 -1
- package/dist/meeting/brbState.js +17 -14
- package/dist/meeting/brbState.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +11 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +476 -284
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/request.js +19 -0
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js.map +1 -1
- package/dist/{rtcMetrics/constants.js → meeting/type.js} +1 -5
- package/dist/meeting/type.js.map +1 -0
- package/dist/meeting/util.js +68 -2
- package/dist/meeting/util.js.map +1 -1
- package/dist/meetings/index.js +35 -33
- package/dist/meetings/index.js.map +1 -1
- package/dist/members/index.js +11 -9
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +3 -3
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.js +18 -6
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +1 -0
- package/dist/metrics/constants.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +1 -1
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +34 -5
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +42 -2
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +32 -2
- package/dist/multistream/sendSlotManager.js.map +1 -1
- package/dist/reachability/index.js +5 -10
- package/dist/reachability/index.js.map +1 -1
- package/dist/types/constants.d.ts +28 -0
- package/dist/types/controls-options-manager/enums.d.ts +2 -1
- package/dist/types/controls-options-manager/types.d.ts +4 -1
- package/dist/types/locus-info/index.d.ts +0 -9
- package/dist/types/meeting/brbState.d.ts +0 -1
- package/dist/types/meeting/in-meeting-actions.d.ts +10 -0
- package/dist/types/meeting/index.d.ts +47 -19
- package/dist/types/meeting/request.d.ts +9 -1
- package/dist/types/meeting/request.type.d.ts +74 -0
- package/dist/types/meeting/type.d.ts +9 -0
- package/dist/types/meeting/util.d.ts +3 -0
- package/dist/types/members/index.d.ts +10 -7
- package/dist/types/members/request.d.ts +1 -1
- package/dist/types/members/util.d.ts +7 -3
- package/dist/types/metrics/constants.d.ts +1 -0
- package/dist/types/multistream/remoteMedia.d.ts +20 -1
- package/dist/types/multistream/remoteMediaGroup.d.ts +11 -0
- package/dist/types/multistream/sendSlotManager.d.ts +16 -0
- package/dist/types/reachability/index.d.ts +2 -2
- package/dist/webinar/index.js +1 -1
- package/package.json +24 -25
- package/src/constants.ts +32 -2
- package/src/controls-options-manager/enums.ts +1 -0
- package/src/controls-options-manager/types.ts +6 -1
- package/src/controls-options-manager/util.ts +31 -0
- package/src/locus-info/controlsUtils.ts +15 -0
- package/src/locus-info/index.ts +89 -86
- package/src/media/index.ts +2 -2
- package/src/meeting/brbState.ts +13 -9
- package/src/meeting/in-meeting-actions.ts +21 -0
- package/src/meeting/index.ts +271 -71
- package/src/meeting/request.ts +16 -0
- package/src/meeting/request.type.ts +64 -0
- package/src/meeting/type.ts +9 -0
- package/src/meeting/util.ts +73 -2
- package/src/meetings/index.ts +3 -2
- package/src/members/index.ts +13 -10
- package/src/members/request.ts +2 -2
- package/src/members/util.ts +16 -4
- package/src/metrics/constants.ts +1 -0
- package/src/multistream/mediaRequestManager.ts +7 -7
- package/src/multistream/remoteMedia.ts +34 -4
- package/src/multistream/remoteMediaGroup.ts +37 -2
- package/src/multistream/sendSlotManager.ts +34 -2
- package/src/reachability/index.ts +5 -13
- package/test/unit/spec/controls-options-manager/util.js +58 -0
- package/test/unit/spec/locus-info/controlsUtils.js +52 -0
- package/test/unit/spec/locus-info/index.js +240 -82
- package/test/unit/spec/media/index.ts +107 -0
- package/test/unit/spec/meeting/brbState.ts +23 -4
- package/test/unit/spec/meeting/in-meeting-actions.ts +10 -0
- package/test/unit/spec/meeting/index.js +954 -85
- package/test/unit/spec/meeting/request.js +71 -0
- package/test/unit/spec/meeting/utils.js +122 -1
- package/test/unit/spec/meetings/index.js +2 -0
- package/test/unit/spec/members/index.js +68 -9
- package/test/unit/spec/members/request.js +2 -2
- package/test/unit/spec/members/utils.js +27 -7
- package/test/unit/spec/multistream/mediaRequestManager.ts +19 -6
- package/test/unit/spec/multistream/remoteMedia.ts +66 -2
- package/test/unit/spec/multistream/sendSlotManager.ts +59 -0
- package/test/unit/spec/reachability/index.ts +2 -6
- package/dist/annotation/annotation.types.d.ts +0 -42
- package/dist/annotation/constants.d.ts +0 -31
- package/dist/annotation/index.d.ts +0 -117
- package/dist/breakouts/breakout.d.ts +0 -8
- package/dist/breakouts/collection.d.ts +0 -5
- package/dist/breakouts/edit-lock-error.d.ts +0 -15
- package/dist/breakouts/events.d.ts +0 -8
- package/dist/breakouts/index.d.ts +0 -5
- package/dist/breakouts/request.d.ts +0 -22
- package/dist/breakouts/utils.d.ts +0 -15
- package/dist/common/browser-detection.d.ts +0 -9
- package/dist/common/collection.d.ts +0 -48
- package/dist/common/config.d.ts +0 -2
- package/dist/common/errors/captcha-error.d.ts +0 -15
- package/dist/common/errors/intent-to-join.d.ts +0 -16
- package/dist/common/errors/join-meeting.d.ts +0 -17
- package/dist/common/errors/media.d.ts +0 -15
- package/dist/common/errors/no-meeting-info.d.ts +0 -14
- package/dist/common/errors/parameter.d.ts +0 -15
- package/dist/common/errors/password-error.d.ts +0 -15
- package/dist/common/errors/permission.d.ts +0 -14
- package/dist/common/errors/reclaim-host-role-error.d.ts +0 -60
- package/dist/common/errors/reclaim-host-role-error.js +0 -158
- package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
- package/dist/common/errors/reclaim-host-role-errors.d.ts +0 -60
- package/dist/common/errors/reconnection-in-progress.d.ts +0 -9
- package/dist/common/errors/reconnection-in-progress.js +0 -35
- package/dist/common/errors/reconnection-in-progress.js.map +0 -1
- package/dist/common/errors/reconnection.d.ts +0 -15
- package/dist/common/errors/stats.d.ts +0 -15
- package/dist/common/errors/webex-errors.d.ts +0 -81
- package/dist/common/errors/webex-meetings-error.d.ts +0 -20
- package/dist/common/events/events-scope.d.ts +0 -17
- package/dist/common/events/events.d.ts +0 -12
- package/dist/common/events/trigger-proxy.d.ts +0 -2
- package/dist/common/events/util.d.ts +0 -2
- package/dist/common/logs/logger-config.d.ts +0 -2
- package/dist/common/logs/logger-proxy.d.ts +0 -2
- package/dist/common/logs/request.d.ts +0 -34
- package/dist/common/queue.d.ts +0 -32
- package/dist/config.d.ts +0 -73
- package/dist/constants.d.ts +0 -952
- package/dist/controls-options-manager/constants.d.ts +0 -4
- package/dist/controls-options-manager/enums.d.ts +0 -5
- package/dist/controls-options-manager/index.d.ts +0 -120
- package/dist/controls-options-manager/types.d.ts +0 -43
- package/dist/controls-options-manager/util.d.ts +0 -7
- package/dist/index.d.ts +0 -4
- package/dist/interceptors/index.d.ts +0 -2
- package/dist/interceptors/locusRetry.d.ts +0 -27
- package/dist/interpretation/collection.d.ts +0 -5
- package/dist/interpretation/index.d.ts +0 -5
- package/dist/interpretation/siLanguage.d.ts +0 -5
- package/dist/locus-info/controlsUtils.d.ts +0 -2
- package/dist/locus-info/embeddedAppsUtils.d.ts +0 -2
- package/dist/locus-info/fullState.d.ts +0 -2
- package/dist/locus-info/hostUtils.d.ts +0 -2
- package/dist/locus-info/index.d.ts +0 -269
- package/dist/locus-info/infoUtils.d.ts +0 -2
- package/dist/locus-info/mediaSharesUtils.d.ts +0 -2
- package/dist/locus-info/parser.d.ts +0 -212
- package/dist/locus-info/selfUtils.d.ts +0 -2
- package/dist/media/index.d.ts +0 -32
- package/dist/media/properties.d.ts +0 -108
- package/dist/media/util.d.ts +0 -2
- package/dist/mediaQualityMetrics/config.d.ts +0 -233
- package/dist/mediaQualityMetrics/config.js +0 -513
- package/dist/mediaQualityMetrics/config.js.map +0 -1
- package/dist/meeting/effectsState.d.ts +0 -42
- package/dist/meeting/effectsState.js +0 -260
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/meeting/in-meeting-actions.d.ts +0 -79
- package/dist/meeting/index.d.ts +0 -1622
- package/dist/meeting/locusMediaRequest.d.ts +0 -74
- package/dist/meeting/muteState.d.ts +0 -116
- package/dist/meeting/request.d.ts +0 -257
- package/dist/meeting/request.type.d.ts +0 -11
- package/dist/meeting/state.d.ts +0 -9
- package/dist/meeting/util.d.ts +0 -2
- package/dist/meeting/voicea-meeting.d.ts +0 -16
- package/dist/meeting-info/collection.d.ts +0 -20
- package/dist/meeting-info/index.d.ts +0 -57
- package/dist/meeting-info/meeting-info-v2.d.ts +0 -93
- package/dist/meeting-info/request.d.ts +0 -22
- package/dist/meeting-info/util.d.ts +0 -2
- package/dist/meeting-info/utilv2.d.ts +0 -2
- package/dist/meetings/collection.d.ts +0 -23
- package/dist/meetings/index.d.ts +0 -296
- package/dist/meetings/meetings.types.d.ts +0 -4
- package/dist/meetings/request.d.ts +0 -27
- package/dist/meetings/util.d.ts +0 -18
- package/dist/member/index.d.ts +0 -148
- package/dist/member/member.types.d.ts +0 -11
- package/dist/member/member.types.js +0 -18
- package/dist/member/member.types.js.map +0 -1
- package/dist/member/types.d.ts +0 -32
- package/dist/member/util.d.ts +0 -2
- package/dist/members/collection.d.ts +0 -24
- package/dist/members/index.d.ts +0 -308
- package/dist/members/request.d.ts +0 -58
- package/dist/members/types.d.ts +0 -25
- package/dist/members/util.d.ts +0 -2
- package/dist/metrics/config.d.ts +0 -169
- package/dist/metrics/config.js +0 -289
- package/dist/metrics/config.js.map +0 -1
- package/dist/metrics/constants.d.ts +0 -59
- package/dist/metrics/index.d.ts +0 -152
- package/dist/multistream/mediaRequestManager.d.ts +0 -119
- package/dist/multistream/receiveSlot.d.ts +0 -68
- package/dist/multistream/receiveSlotManager.d.ts +0 -56
- package/dist/multistream/remoteMedia.d.ts +0 -72
- package/dist/multistream/remoteMediaGroup.d.ts +0 -49
- package/dist/multistream/remoteMediaManager.d.ts +0 -300
- package/dist/multistream/sendSlotManager.d.ts +0 -69
- package/dist/networkQualityMonitor/index.d.ts +0 -70
- package/dist/networkQualityMonitor/index.js +0 -226
- package/dist/networkQualityMonitor/index.js.map +0 -1
- package/dist/peer-connection-manager/index.d.ts +0 -6
- package/dist/peer-connection-manager/index.js +0 -671
- package/dist/peer-connection-manager/index.js.map +0 -1
- package/dist/peer-connection-manager/util.d.ts +0 -6
- package/dist/peer-connection-manager/util.js +0 -110
- package/dist/peer-connection-manager/util.js.map +0 -1
- package/dist/personal-meeting-room/index.d.ts +0 -47
- package/dist/personal-meeting-room/request.d.ts +0 -14
- package/dist/personal-meeting-room/util.d.ts +0 -2
- package/dist/reachability/clusterReachability.d.ts +0 -109
- package/dist/reachability/index.d.ts +0 -139
- package/dist/reachability/request.d.ts +0 -35
- package/dist/reachability/util.d.ts +0 -8
- package/dist/reactions/constants.d.ts +0 -3
- package/dist/reactions/reactions.d.ts +0 -4
- package/dist/reactions/reactions.type.d.ts +0 -32
- package/dist/reconnection-manager/index.d.ts +0 -112
- package/dist/recording-controller/enums.d.ts +0 -7
- package/dist/recording-controller/index.d.ts +0 -193
- package/dist/recording-controller/util.d.ts +0 -13
- package/dist/roap/collection.d.ts +0 -10
- package/dist/roap/collection.js +0 -63
- package/dist/roap/collection.js.map +0 -1
- package/dist/roap/handler.d.ts +0 -47
- package/dist/roap/handler.js +0 -279
- package/dist/roap/handler.js.map +0 -1
- package/dist/roap/index.d.ts +0 -116
- package/dist/roap/request.d.ts +0 -35
- package/dist/roap/state.d.ts +0 -9
- package/dist/roap/state.js +0 -127
- package/dist/roap/state.js.map +0 -1
- package/dist/roap/turnDiscovery.d.ts +0 -81
- package/dist/roap/util.d.ts +0 -2
- package/dist/roap/util.js +0 -76
- package/dist/roap/util.js.map +0 -1
- package/dist/rtcMetrics/constants.d.ts +0 -4
- package/dist/rtcMetrics/constants.js.map +0 -1
- package/dist/rtcMetrics/index.d.ts +0 -61
- package/dist/rtcMetrics/index.js +0 -197
- package/dist/rtcMetrics/index.js.map +0 -1
- package/dist/statsAnalyzer/global.d.ts +0 -118
- package/dist/statsAnalyzer/global.js +0 -127
- package/dist/statsAnalyzer/global.js.map +0 -1
- package/dist/statsAnalyzer/index.d.ts +0 -193
- package/dist/statsAnalyzer/index.js +0 -1019
- package/dist/statsAnalyzer/index.js.map +0 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +0 -22
- package/dist/statsAnalyzer/mqaUtil.js +0 -181
- package/dist/statsAnalyzer/mqaUtil.js.map +0 -1
- package/dist/transcription/index.d.ts +0 -64
- package/dist/types/common/errors/reconnection-in-progress.d.ts +0 -9
- package/dist/types/mediaQualityMetrics/config.d.ts +0 -241
- package/dist/types/networkQualityMonitor/index.d.ts +0 -70
- package/dist/types/rtcMetrics/constants.d.ts +0 -4
- package/dist/types/rtcMetrics/index.d.ts +0 -71
- package/dist/types/statsAnalyzer/global.d.ts +0 -36
- package/dist/types/statsAnalyzer/index.d.ts +0 -217
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -48
- package/dist/webinar/collection.d.ts +0 -16
- package/dist/webinar/index.d.ts +0 -5
@@ -826,4 +826,75 @@ describe('plugin-meetings', () => {
|
|
826
826
|
});
|
827
827
|
});
|
828
828
|
});
|
829
|
+
|
830
|
+
describe('#synchronizeStage', () => {
|
831
|
+
[
|
832
|
+
['an unset stage', {overrideDefault: false}],
|
833
|
+
[
|
834
|
+
'a minimally set stage',
|
835
|
+
{
|
836
|
+
overrideDefault: true,
|
837
|
+
lockAttendeeViewOnStageOnly: false,
|
838
|
+
stageParameters: {
|
839
|
+
activeSpeakerProportion: 0.5,
|
840
|
+
showActiveSpeaker: {show: false, order: 0},
|
841
|
+
stageManagerType: 0,
|
842
|
+
},
|
843
|
+
},
|
844
|
+
],
|
845
|
+
[
|
846
|
+
'a fully set stage',
|
847
|
+
{
|
848
|
+
overrideDefault: true,
|
849
|
+
lockAttendeeViewOnStageOnly: true,
|
850
|
+
stageParameters: {
|
851
|
+
activeSpeakerProportion: 0.6,
|
852
|
+
importantParticipants: [
|
853
|
+
{mainCsi: 11111111, participantId: uuidv4(), order: 1},
|
854
|
+
{mainCsi: 22222222, participantId: uuidv4(), order: 2},
|
855
|
+
{mainCsi: 33333333, participantId: uuidv4(), order: 3},
|
856
|
+
{mainCsi: 44444444, participantId: uuidv4(), order: 4},
|
857
|
+
{mainCsi: 55555555, participantId: uuidv4(), order: 5},
|
858
|
+
{mainCsi: 66666666, participantId: uuidv4(), order: 6},
|
859
|
+
{mainCsi: 77777777, participantId: uuidv4(), order: 7},
|
860
|
+
{mainCsi: 88888888, participantId: uuidv4(), order: 8},
|
861
|
+
],
|
862
|
+
showActiveSpeaker: {show: true, order: 0},
|
863
|
+
stageManagerType: 7,
|
864
|
+
},
|
865
|
+
customLayouts: {
|
866
|
+
background: {url: `https://test.wbx2.com/background/${uuidv4()}.jpg`},
|
867
|
+
logo: {url: `https://test.wbx2.com/logo/${uuidv4()}.png`, position: 'UpperMiddle'},
|
868
|
+
},
|
869
|
+
nameLabelStyle: {
|
870
|
+
accentColor: '#00A3FF',
|
871
|
+
background: {color: 'rgba(0, 163, 255, 1)'},
|
872
|
+
border: {color: 'rgba(0, 163, 255, 1)'},
|
873
|
+
content: {
|
874
|
+
displayName: {color: 'rgba(255, 255, 255, 0.95)'},
|
875
|
+
subtitle: {color: 'rgba(255, 255, 255, 0.7)'},
|
876
|
+
},
|
877
|
+
decoration: {color: 'rgba(255, 255, 255, 0.95)'},
|
878
|
+
fadeOut: {delay: 15},
|
879
|
+
type: 'PrimaryInverted',
|
880
|
+
},
|
881
|
+
},
|
882
|
+
],
|
883
|
+
].forEach(([description, videoLayout]) => {
|
884
|
+
it(`sends request to synchronize the stage with ${description} video layout`, async () => {
|
885
|
+
const locusUrl = `https://locus-test.wbx2.com/locus/api/v1/loci/${uuidv4()}`;
|
886
|
+
|
887
|
+
const synchronizePromise = meetingsRequest.synchronizeStage(locusUrl, videoLayout);
|
888
|
+
|
889
|
+
assert.exists(synchronizePromise.then);
|
890
|
+
await synchronizePromise;
|
891
|
+
|
892
|
+
checkRequest({
|
893
|
+
method: 'PATCH',
|
894
|
+
uri: `${locusUrl}/controls`,
|
895
|
+
body: {videoLayout},
|
896
|
+
});
|
897
|
+
});
|
898
|
+
});
|
899
|
+
});
|
829
900
|
});
|
@@ -3,12 +3,14 @@ import sinon from 'sinon';
|
|
3
3
|
import {assert} from '@webex/test-helper-chai';
|
4
4
|
import Meetings from '@webex/plugin-meetings';
|
5
5
|
import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
|
6
|
-
import {LOCAL_SHARE_ERRORS} from '@webex/plugin-meetings/src/constants';
|
6
|
+
import {LOCAL_SHARE_ERRORS, PASSWORD_STATUS} from '@webex/plugin-meetings/src/constants';
|
7
7
|
import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
|
8
8
|
import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
|
9
9
|
import {SELF_POLICY, IP_VERSION} from '@webex/plugin-meetings/src/constants';
|
10
10
|
import MockWebex from '@webex/test-helper-mock-webex';
|
11
11
|
import * as BrowserDetectionModule from '@webex/plugin-meetings/src/common/browser-detection';
|
12
|
+
import PasswordError from '@webex/plugin-meetings/src/common/errors/password-error';
|
13
|
+
import CaptchaError from '@webex/plugin-meetings/src/common/errors/captcha-error';
|
12
14
|
|
13
15
|
describe('plugin-meetings', () => {
|
14
16
|
let webex;
|
@@ -57,6 +59,10 @@ describe('plugin-meetings', () => {
|
|
57
59
|
meeting.getWebexObject = sinon.stub().returns(webex);
|
58
60
|
meeting.simultaneousInterpretation = {cleanUp: sinon.stub()};
|
59
61
|
meeting.trigger = sinon.stub();
|
62
|
+
meeting.webex = webex;
|
63
|
+
meeting.webex.internal.newMetrics.callDiagnosticMetrics =
|
64
|
+
meeting.webex.internal.newMetrics.callDiagnosticMetrics || {};
|
65
|
+
meeting.webex.internal.newMetrics.callDiagnosticMetrics.clearEventLimitsForCorrelationId = sinon.stub();
|
60
66
|
});
|
61
67
|
|
62
68
|
afterEach(() => {
|
@@ -81,6 +87,10 @@ describe('plugin-meetings', () => {
|
|
81
87
|
assert.calledOnce(meeting.breakouts.cleanUp);
|
82
88
|
assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
|
83
89
|
assert.calledOnce(webex.internal.device.meetingEnded);
|
90
|
+
assert.calledOnceWithExactly(
|
91
|
+
meeting.webex.internal.newMetrics.callDiagnosticMetrics.clearEventLimitsForCorrelationId,
|
92
|
+
meeting.correlationId
|
93
|
+
);
|
84
94
|
});
|
85
95
|
|
86
96
|
it('do clean up on meeting object with LLM disabled', async () => {
|
@@ -98,6 +108,10 @@ describe('plugin-meetings', () => {
|
|
98
108
|
assert.calledOnce(meeting.breakouts.cleanUp);
|
99
109
|
assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
|
100
110
|
assert.calledOnce(webex.internal.device.meetingEnded);
|
111
|
+
assert.calledOnceWithExactly(
|
112
|
+
meeting.webex.internal.newMetrics.callDiagnosticMetrics.clearEventLimitsForCorrelationId,
|
113
|
+
meeting.correlationId
|
114
|
+
);
|
101
115
|
});
|
102
116
|
|
103
117
|
it('do clean up on meeting object with no config', async () => {
|
@@ -114,6 +128,10 @@ describe('plugin-meetings', () => {
|
|
114
128
|
assert.calledOnce(meeting.breakouts.cleanUp);
|
115
129
|
assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
|
116
130
|
assert.calledOnce(webex.internal.device.meetingEnded);
|
131
|
+
assert.calledOnceWithExactly(
|
132
|
+
meeting.webex.internal.newMetrics.callDiagnosticMetrics.clearEventLimitsForCorrelationId,
|
133
|
+
meeting.correlationId
|
134
|
+
);
|
117
135
|
});
|
118
136
|
});
|
119
137
|
|
@@ -622,6 +640,28 @@ describe('plugin-meetings', () => {
|
|
622
640
|
|
623
641
|
assert.equal(parameter.locusClusterUrl, 'locusClusterUrl');
|
624
642
|
});
|
643
|
+
|
644
|
+
it('should post client event with error when join fails', async () => {
|
645
|
+
const joinError = new Error('Join failed');
|
646
|
+
meeting.meetingRequest.joinMeeting.rejects(joinError);
|
647
|
+
meeting.meetingInfo = { meetingLookupUrl: 'test-lookup-url' };
|
648
|
+
|
649
|
+
try {
|
650
|
+
await MeetingUtil.joinMeeting(meeting, {});
|
651
|
+
assert.fail('Expected joinMeeting to throw an error');
|
652
|
+
} catch (error) {
|
653
|
+
assert.equal(error, joinError);
|
654
|
+
|
655
|
+
// Verify error client event was submitted
|
656
|
+
assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
|
657
|
+
name: 'client.locus.join.response',
|
658
|
+
payload: {
|
659
|
+
identifiers: { meetingLookupUrl: 'test-lookup-url' },
|
660
|
+
},
|
661
|
+
options: { meetingId: meeting.id, rawError: joinError },
|
662
|
+
});
|
663
|
+
}
|
664
|
+
});
|
625
665
|
});
|
626
666
|
|
627
667
|
describe('joinMeetingOptions', () => {
|
@@ -661,6 +701,82 @@ describe('plugin-meetings', () => {
|
|
661
701
|
joinMeetingSpy.restore();
|
662
702
|
}
|
663
703
|
});
|
704
|
+
|
705
|
+
it('should submit client event and reject with PasswordError when password is required', async () => {
|
706
|
+
const meeting = {
|
707
|
+
id: 'meeting-id',
|
708
|
+
passwordStatus: PASSWORD_STATUS.REQUIRED,
|
709
|
+
resourceId: null,
|
710
|
+
requiredCaptcha: null,
|
711
|
+
getWebexObject: sinon.stub().returns(webex),
|
712
|
+
};
|
713
|
+
|
714
|
+
try {
|
715
|
+
await MeetingUtil.joinMeetingOptions(meeting, {});
|
716
|
+
assert.fail('Expected joinMeetingOptions to throw PasswordError');
|
717
|
+
} catch (error) {
|
718
|
+
assert.instanceOf(error, PasswordError);
|
719
|
+
|
720
|
+
// Verify client event was submitted with error details
|
721
|
+
assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
|
722
|
+
name: 'client.meetinginfo.response',
|
723
|
+
options: {
|
724
|
+
meetingId: meeting.id,
|
725
|
+
},
|
726
|
+
payload: {
|
727
|
+
errors: [
|
728
|
+
{
|
729
|
+
fatal: false,
|
730
|
+
category: 'expected',
|
731
|
+
name: 'other',
|
732
|
+
shownToUser: false,
|
733
|
+
errorCode: error.code,
|
734
|
+
errorDescription: error.name,
|
735
|
+
rawErrorMessage: error.sdkMessage,
|
736
|
+
},
|
737
|
+
],
|
738
|
+
},
|
739
|
+
});
|
740
|
+
}
|
741
|
+
});
|
742
|
+
|
743
|
+
it('should submit client event and reject with CaptchaError when captcha is required', async () => {
|
744
|
+
const meeting = {
|
745
|
+
id: 'meeting-id',
|
746
|
+
passwordStatus: null,
|
747
|
+
resourceId: null,
|
748
|
+
requiredCaptcha: {captchaId: 'test-captcha'},
|
749
|
+
getWebexObject: sinon.stub().returns(webex),
|
750
|
+
};
|
751
|
+
|
752
|
+
try {
|
753
|
+
await MeetingUtil.joinMeetingOptions(meeting, {});
|
754
|
+
assert.fail('Expected joinMeetingOptions to throw CaptchaError');
|
755
|
+
} catch (error) {
|
756
|
+
assert.instanceOf(error, CaptchaError);
|
757
|
+
|
758
|
+
// Verify client event was submitted with error details
|
759
|
+
assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
|
760
|
+
name: 'client.meetinginfo.response',
|
761
|
+
options: {
|
762
|
+
meetingId: meeting.id,
|
763
|
+
},
|
764
|
+
payload: {
|
765
|
+
errors: [
|
766
|
+
{
|
767
|
+
fatal: false,
|
768
|
+
category: 'expected',
|
769
|
+
name: 'other',
|
770
|
+
shownToUser: false,
|
771
|
+
errorCode: error.code,
|
772
|
+
errorDescription: error.name,
|
773
|
+
rawErrorMessage: error.sdkMessage,
|
774
|
+
},
|
775
|
+
],
|
776
|
+
},
|
777
|
+
});
|
778
|
+
}
|
779
|
+
});
|
664
780
|
});
|
665
781
|
|
666
782
|
describe('getUserDisplayHintsFromLocusInfo', () => {
|
@@ -850,6 +966,11 @@ describe('plugin-meetings', () => {
|
|
850
966
|
{functionName: 'isClosedCaptionActive', displayHint: 'CAPTION_STATUS_ACTIVE'},
|
851
967
|
{functionName: 'canStartManualCaption', displayHint: 'MANUAL_CAPTION_START'},
|
852
968
|
{functionName: 'canStopManualCaption', displayHint: 'MANUAL_CAPTION_STOP'},
|
969
|
+
|
970
|
+
{functionName: 'isLocalRecordingStarted',displayHint:'LOCAL_RECORDING_STATUS_STARTED'},
|
971
|
+
{functionName: 'isLocalRecordingStopped', displayHint: 'LOCAL_RECORDING_STATUS_STOPPED'},
|
972
|
+
{functionName: 'isLocalRecordingPaused', displayHint: 'LOCAL_RECORDING_STATUS_PAUSED'},
|
973
|
+
|
853
974
|
{functionName: 'isManualCaptionActive', displayHint: 'MANUAL_CAPTION_STATUS_ACTIVE'},
|
854
975
|
{functionName: 'isWebexAssistantActive', displayHint: 'WEBEX_ASSISTANT_STATUS_ACTIVE'},
|
855
976
|
{functionName: 'canViewCaptionPanel', displayHint: 'ENABLE_CAPTION_PANEL'},
|
@@ -189,6 +189,7 @@ describe('plugin-meetings', () => {
|
|
189
189
|
},
|
190
190
|
callDiagnosticMetrics: {
|
191
191
|
clearErrorCache: sinon.stub(),
|
192
|
+
clearEventLimits: sinon.stub(),
|
192
193
|
},
|
193
194
|
},
|
194
195
|
});
|
@@ -1716,6 +1717,7 @@ describe('plugin-meetings', () => {
|
|
1716
1717
|
{file: 'meetings', function: 'fetchMeetingInfo'},
|
1717
1718
|
'meeting:meetingInfoAvailable'
|
1718
1719
|
);
|
1720
|
+
assert.equal(webex.meetings.meetingCollection.get(meeting.id), meeting);
|
1719
1721
|
};
|
1720
1722
|
|
1721
1723
|
it('creates the meeting from a successful meeting info fetch promise testing', async () => {
|
@@ -176,6 +176,56 @@ describe('plugin-meetings', () => {
|
|
176
176
|
assert.calledOnce(MembersUtil.isInvalidInvitee);
|
177
177
|
assert.isFalse(MembersUtil.isInvalidInvitee({email: 'sip:test@cisco.com'}), 'SIP email should be valid');
|
178
178
|
});
|
179
|
+
|
180
|
+
it('should skip email validation if skipEmailValidation is true', async () => {
|
181
|
+
sandbox.spy(MembersUtil, 'isInvalidInvitee');
|
182
|
+
|
183
|
+
const members = createMembers({url: true});
|
184
|
+
|
185
|
+
await members.addMember({email: '8618578675309', skipEmailValidation: true});
|
186
|
+
|
187
|
+
assert.notCalled(MembersUtil.isInvalidInvitee);
|
188
|
+
});
|
189
|
+
|
190
|
+
it('should not skip email validation if skipEmailValidation is not equal true', async () => {
|
191
|
+
sandbox.spy(MembersUtil, 'isInvalidInvitee');
|
192
|
+
|
193
|
+
const members = createMembers({url: true});
|
194
|
+
|
195
|
+
await members.addMember({email: '86185786@ds.com'});
|
196
|
+
|
197
|
+
assert.called(MembersUtil.isInvalidInvitee);
|
198
|
+
});
|
199
|
+
|
200
|
+
it('should accept valid phone with isInternalNumber', async () => {
|
201
|
+
sandbox.spy(MembersUtil, 'isInvalidInvitee');
|
202
|
+
|
203
|
+
const members = createMembers({url: true});
|
204
|
+
|
205
|
+
await members.addMember({phoneNumber: '+8618578675309', isInternalNumber: false});
|
206
|
+
|
207
|
+
assert.calledOnce(MembersUtil.isInvalidInvitee);
|
208
|
+
assert.isFalse(MembersUtil.isInvalidInvitee({ phoneNumber: '+8618578675309', isInternalNumber: false }));
|
209
|
+
assert.isTrue(MembersUtil.isInvalidInvitee({ phoneNumber: '18578675309', isInternalNumber: false }));
|
210
|
+
assert.isFalse(MembersUtil.isInvalidInvitee({phoneNumber: '18578675309', isInternalNumber: true}));
|
211
|
+
assert.isTrue(MembersUtil.isInvalidInvitee({phoneNumber: '+8618578675309', isInternalNumber: true}));
|
212
|
+
});
|
213
|
+
|
214
|
+
it('should not crash if params is undefined', async () => {
|
215
|
+
sandbox.spy(MembersUtil, 'isInvalidInvitee');
|
216
|
+
|
217
|
+
const members = createMembers({url: true});
|
218
|
+
|
219
|
+
try {
|
220
|
+
await members.addMember(undefined);
|
221
|
+
} catch (err) {
|
222
|
+
assert.instanceOf(err, ParameterError);
|
223
|
+
|
224
|
+
assert.equal(err.message, 'The invitee must be defined with either a valid email, emailAddress or phoneNumber property.');
|
225
|
+
}
|
226
|
+
|
227
|
+
assert.called(MembersUtil.isInvalidInvitee);
|
228
|
+
});
|
179
229
|
});
|
180
230
|
|
181
231
|
describe('#admitMembers', () => {
|
@@ -465,29 +515,38 @@ describe('plugin-meetings', () => {
|
|
465
515
|
});
|
466
516
|
});
|
467
517
|
|
468
|
-
describe('#
|
518
|
+
describe('#cancelInviteByMemberId', () => {
|
469
519
|
const memberId = uuid.v4();
|
470
|
-
it('should invoke
|
471
|
-
sandbox.spy(MembersUtil, '
|
520
|
+
it('should invoke cancelInviteByMemberIdOptions from MembersUtil when cancelInviteByMemberId is called with valid params', async () => {
|
521
|
+
sandbox.spy(MembersUtil, 'cancelInviteByMemberIdOptions');
|
522
|
+
|
523
|
+
const members = createMembers({url: url1});
|
524
|
+
|
525
|
+
await members.cancelInviteByMemberId({memberId});
|
526
|
+
assert.calledOnce(MembersUtil.cancelInviteByMemberIdOptions);
|
527
|
+
});
|
528
|
+
|
529
|
+
it('should invoke cancelInviteByMemberIdOptions from MembersUtil when cancelInviteByMemberId is called with isInternalNumber', async () => {
|
530
|
+
sandbox.spy(MembersUtil, 'cancelInviteByMemberIdOptions');
|
472
531
|
|
473
532
|
const members = createMembers({url: url1});
|
474
533
|
|
475
|
-
await members.
|
476
|
-
assert.calledOnce(MembersUtil.
|
534
|
+
await members.cancelInviteByMemberId({memberId, isInternalNumber: true});
|
535
|
+
assert.calledOnce(MembersUtil.cancelInviteByMemberIdOptions);
|
477
536
|
});
|
478
537
|
|
479
538
|
it('should throw a rejection if there is no locus url', async () => {
|
480
539
|
const members = createMembers({url: false});
|
481
540
|
|
482
|
-
assert.isRejected(members.
|
541
|
+
assert.isRejected(members.cancelInviteByMemberId({memberId}));
|
483
542
|
});
|
484
543
|
|
485
544
|
it('should throw a rejection if memberId is not provided', async () => {
|
486
545
|
const members = createMembers({url: url1});
|
487
546
|
|
488
|
-
assert.isRejected(members.
|
489
|
-
assert.isRejected(members.
|
490
|
-
assert.isRejected(members.
|
547
|
+
assert.isRejected(members.cancelInviteByMemberId({}));
|
548
|
+
assert.isRejected(members.cancelInviteByMemberId({memberId: null}));
|
549
|
+
assert.isRejected(members.cancelInviteByMemberId({memberId: undefined}));
|
491
550
|
});
|
492
551
|
});
|
493
552
|
|
@@ -221,7 +221,7 @@ describe('plugin-meetings', () => {
|
|
221
221
|
});
|
222
222
|
});
|
223
223
|
|
224
|
-
describe('#
|
224
|
+
describe('#cancelInviteByMemberId', () => {
|
225
225
|
const memberId = uuid.v4();
|
226
226
|
it('sends a PUT to the locus endpoint', async () => {
|
227
227
|
const options = {
|
@@ -231,7 +231,7 @@ describe('plugin-meetings', () => {
|
|
231
231
|
locusUrl: url1,
|
232
232
|
};
|
233
233
|
|
234
|
-
await membersRequest.
|
234
|
+
await membersRequest.cancelInviteByMemberId(options);
|
235
235
|
|
236
236
|
checkRequest({
|
237
237
|
method: 'PUT',
|
@@ -302,6 +302,26 @@ describe('plugin-meetings', () => {
|
|
302
302
|
});
|
303
303
|
});
|
304
304
|
|
305
|
+
it('returns the correct body with phone number and isInternalNumber', () => {
|
306
|
+
const options = {
|
307
|
+
invitee: {
|
308
|
+
phoneNumber: '1234567890',
|
309
|
+
isInternalNumber: false
|
310
|
+
},
|
311
|
+
alertIfActive: false,
|
312
|
+
};
|
313
|
+
|
314
|
+
assert.deepEqual(MembersUtil.getAddMemberBody(options), {
|
315
|
+
invitees: [
|
316
|
+
{
|
317
|
+
address: '1234567890',
|
318
|
+
isInternalNumber: false
|
319
|
+
},
|
320
|
+
],
|
321
|
+
alertIfActive: false,
|
322
|
+
});
|
323
|
+
});
|
324
|
+
|
305
325
|
it('returns the correct body with fallback to email', () => {
|
306
326
|
const options = {
|
307
327
|
invitee: {
|
@@ -391,14 +411,14 @@ describe('plugin-meetings', () => {
|
|
391
411
|
});
|
392
412
|
});
|
393
413
|
|
394
|
-
describe('#
|
414
|
+
describe('#cancelInviteByMemberIdOptions', () => {
|
395
415
|
it('returns the correct options', () => {
|
396
416
|
const locusUrl = 'TestLocusUrl';
|
397
417
|
const memberId = 'test';
|
398
|
-
const invitee = {memberId};
|
418
|
+
const invitee = {memberId, isInternalNumber: false};
|
399
419
|
|
400
420
|
assert.deepEqual(
|
401
|
-
MembersUtil.
|
421
|
+
MembersUtil.cancelInviteByMemberIdOptions(
|
402
422
|
invitee,
|
403
423
|
locusUrl
|
404
424
|
),
|
@@ -410,22 +430,22 @@ describe('plugin-meetings', () => {
|
|
410
430
|
});
|
411
431
|
});
|
412
432
|
|
413
|
-
describe('#
|
433
|
+
describe('#generateCancelInviteByMemberIdRequestParams', () => {
|
414
434
|
it('returns the correct params', () => {
|
415
435
|
const locusUrl = 'TestLocusUrl';
|
416
436
|
const memberId = 'test';
|
417
437
|
const options = {
|
418
438
|
locusUrl,
|
419
|
-
invitee: {memberId}
|
439
|
+
invitee: {memberId, isInternalNumber: false}
|
420
440
|
};
|
421
441
|
const body = {
|
422
442
|
actionType: 'REMOVE',
|
423
|
-
invitees: [{address: options.invitee.memberId}],
|
443
|
+
invitees: [{address: options.invitee.memberId, isInternalNumber: false}],
|
424
444
|
};
|
425
445
|
|
426
446
|
const uri = options.locusUrl;
|
427
447
|
|
428
|
-
assert.deepEqual(MembersUtil.
|
448
|
+
assert.deepEqual(MembersUtil.generateCancelInviteByMemberIdRequestParams(options), {
|
429
449
|
method: HTTP_VERBS.PUT,
|
430
450
|
uri,
|
431
451
|
body,
|
@@ -3,7 +3,7 @@ import {MediaRequestManager} from '@webex/plugin-meetings/src/multistream/mediaR
|
|
3
3
|
import {ReceiveSlot} from '@webex/plugin-meetings/src/multistream/receiveSlot';
|
4
4
|
import sinon from 'sinon';
|
5
5
|
import {assert} from '@webex/test-helper-chai';
|
6
|
-
import {getMaxFs} from '@webex/plugin-meetings/src/multistream/remoteMedia';
|
6
|
+
import {getMaxFs, MAX_FS_VALUES} from '@webex/plugin-meetings/src/multistream/remoteMedia';
|
7
7
|
import FakeTimers from '@sinonjs/fake-timers';
|
8
8
|
import * as InternalMediaCoreModule from '@webex/internal-media-core';
|
9
9
|
import { expect } from 'chai';
|
@@ -36,12 +36,15 @@ describe('MediaRequestManager', () => {
|
|
36
36
|
const CROSS_POLICY_DUPLICATION = true;
|
37
37
|
const MAX_FPS = 3000;
|
38
38
|
const MAX_FS_360p = 920;
|
39
|
+
const MAX_FS_540p = 2040;
|
39
40
|
const MAX_FS_720p = 3600;
|
40
41
|
const MAX_FS_1080p = 8192;
|
41
42
|
const MAX_MBPS_360p = 27600;
|
43
|
+
const MAX_MBPS_540p = 61200;
|
42
44
|
const MAX_MBPS_720p = 108000;
|
43
45
|
const MAX_MBPS_1080p = 245760;
|
44
46
|
const MAX_PAYLOADBITSPS_360p = 640000;
|
47
|
+
const MAX_PAYLOADBITSPS_540p = 880000;
|
45
48
|
const MAX_PAYLOADBITSPS_720p = 2500000;
|
46
49
|
const MAX_PAYLOADBITSPS_1080p = 4000000;
|
47
50
|
|
@@ -82,7 +85,14 @@ describe('MediaRequestManager', () => {
|
|
82
85
|
});
|
83
86
|
|
84
87
|
// helper function for adding an active speaker request
|
85
|
-
const addActiveSpeakerRequest = (
|
88
|
+
const addActiveSpeakerRequest = (
|
89
|
+
priority,
|
90
|
+
receiveSlots,
|
91
|
+
maxFs,
|
92
|
+
commit = false,
|
93
|
+
preferLiveVideo = true,
|
94
|
+
namedMediaGroups = undefined
|
95
|
+
) =>
|
86
96
|
mediaRequestManager.addRequest(
|
87
97
|
{
|
88
98
|
policyInfo: {
|
@@ -216,6 +226,9 @@ describe('MediaRequestManager', () => {
|
|
216
226
|
},
|
217
227
|
false
|
218
228
|
);
|
229
|
+
|
230
|
+
|
231
|
+
|
219
232
|
mediaRequestManager.addRequest(
|
220
233
|
{
|
221
234
|
policyInfo: {
|
@@ -892,15 +905,15 @@ describe('MediaRequestManager', () => {
|
|
892
905
|
// request 10 "large" 1080p streams
|
893
906
|
addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 10), getMaxFs('large'), true);
|
894
907
|
|
895
|
-
// check that resulting requests are 10
|
908
|
+
// check that resulting requests are 10 540p streams
|
896
909
|
checkMediaRequestsSent([
|
897
910
|
{
|
898
911
|
policy: 'active-speaker',
|
899
912
|
priority: 255,
|
900
913
|
receiveSlots: fakeWcmeSlots.slice(0, 10),
|
901
|
-
maxPayloadBitsPerSecond:
|
902
|
-
maxFs:
|
903
|
-
maxMbps:
|
914
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_540p,
|
915
|
+
maxFs: MAX_FS_VALUES['540p'],
|
916
|
+
maxMbps: MAX_MBPS_540p,
|
904
917
|
},
|
905
918
|
]);
|
906
919
|
});
|
@@ -3,7 +3,7 @@ import 'jsdom-global/register';
|
|
3
3
|
import EventEmitter from 'events';
|
4
4
|
|
5
5
|
import {MediaType} from '@webex/internal-media-core';
|
6
|
-
import {RemoteMedia, RemoteMediaEvents} from '@webex/plugin-meetings/src/multistream/remoteMedia';
|
6
|
+
import {RemoteMedia, RemoteMediaEvents, RemoteVideoResolution} from '@webex/plugin-meetings/src/multistream/remoteMedia';
|
7
7
|
import {ReceiveSlotEvents} from '@webex/plugin-meetings/src/multistream/receiveSlot';
|
8
8
|
import sinon from 'sinon';
|
9
9
|
import {assert} from '@webex/test-helper-chai';
|
@@ -257,7 +257,9 @@ describe('RemoteMedia', () => {
|
|
257
257
|
{height: 198, fs: 920}, // 360p
|
258
258
|
{height: 360, fs: 920},
|
259
259
|
{height: 395, fs: 920},
|
260
|
-
{height: 396, fs:
|
260
|
+
{height: 396, fs: 2040}, // 540p
|
261
|
+
{height: 540, fs: 2040},
|
262
|
+
{height: 610, fs: 3600}, // 720p
|
261
263
|
{height: 720, fs: 3600},
|
262
264
|
{height: 721, fs: 8192}, // 1080p
|
263
265
|
{height: 1080, fs: 8192},
|
@@ -271,4 +273,66 @@ describe('RemoteMedia', () => {
|
|
271
273
|
}
|
272
274
|
);
|
273
275
|
});
|
276
|
+
|
277
|
+
describe('getEffectiveMaxFs()', () => {
|
278
|
+
it('returns maxFrameSize when it is greater than 0', () => {
|
279
|
+
remoteMedia.setSizeHint(960, 540);
|
280
|
+
|
281
|
+
const result = remoteMedia.getEffectiveMaxFs();
|
282
|
+
|
283
|
+
assert.strictEqual(result, 2040);
|
284
|
+
});
|
285
|
+
|
286
|
+
it('returns getMaxFs result when maxFrameSize is 0 and resolution is provided', () => {
|
287
|
+
remoteMedia.setSizeHint(0, 0);
|
288
|
+
|
289
|
+
// remoteMedia was created with {resolution: 'medium'} in beforeEach
|
290
|
+
|
291
|
+
const result = remoteMedia.getEffectiveMaxFs();
|
292
|
+
|
293
|
+
// 'medium' resolution should map to 720p which is 3600
|
294
|
+
assert.strictEqual(result, 3600);
|
295
|
+
});
|
296
|
+
|
297
|
+
it('returns undefined when maxFrameSize is 0 and no resolution is provided', () => {
|
298
|
+
remoteMedia.setSizeHint(0, 0);
|
299
|
+
|
300
|
+
// Create a new RemoteMedia without resolution option
|
301
|
+
const remoteMediaWithoutResolution = new RemoteMedia(fakeReceiveSlot, fakeMediaRequestManager);
|
302
|
+
|
303
|
+
const result = remoteMediaWithoutResolution.getEffectiveMaxFs();
|
304
|
+
|
305
|
+
assert.strictEqual(result, undefined);
|
306
|
+
});
|
307
|
+
|
308
|
+
it('prioritizes maxFrameSize over resolution option', () => {
|
309
|
+
remoteMedia.setSizeHint(640, 360);
|
310
|
+
// remoteMedia was created with {resolution: 'medium'} in beforeEach
|
311
|
+
|
312
|
+
const result = remoteMedia.getEffectiveMaxFs();
|
313
|
+
|
314
|
+
// Should return maxFrameSize (500) instead of resolution-based value (3600)
|
315
|
+
assert.strictEqual(result, 920);
|
316
|
+
});
|
317
|
+
|
318
|
+
it('works correctly with different resolution options', () => {
|
319
|
+
const testCases: Array<{ resolution: RemoteVideoResolution; expected: number }> = [
|
320
|
+
{ resolution: 'thumbnail', expected: 60 },
|
321
|
+
{ resolution: 'very small', expected: 240 },
|
322
|
+
{ resolution: 'small', expected: 920 },
|
323
|
+
{ resolution: 'medium', expected: 3600 },
|
324
|
+
{ resolution: 'large', expected: 8192 },
|
325
|
+
{ resolution: 'best', expected: 8192 },
|
326
|
+
];
|
327
|
+
|
328
|
+
testCases.forEach(({ resolution, expected }) => {
|
329
|
+
const testRemoteMedia = new RemoteMedia(fakeReceiveSlot, fakeMediaRequestManager, { resolution });
|
330
|
+
testRemoteMedia.setSizeHint(0, 0); // Ensure maxFrameSize doesn't interfere
|
331
|
+
|
332
|
+
const result = testRemoteMedia.getEffectiveMaxFs();
|
333
|
+
|
334
|
+
assert.strictEqual(result, expected, `Failed for resolution: ${resolution}`);
|
335
|
+
});
|
336
|
+
});
|
337
|
+
});
|
274
338
|
});
|