@webex/plugin-meetings 3.8.1 → 3.9.0-next.10
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 +84 -91
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/parser.js +4 -1
- package/dist/locus-info/parser.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 +484 -287
- 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 +14 -11
- 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 +25 -8
- 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 +8 -13
- 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 +2 -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 +12 -8
- package/dist/types/members/request.d.ts +1 -1
- package/dist/types/members/util.d.ts +13 -6
- 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 +103 -92
- package/src/locus-info/parser.ts +5 -1
- 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 +278 -73
- 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 +22 -12
- package/src/members/request.ts +2 -2
- package/src/members/util.ts +34 -6
- 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 +8 -16
- 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 +247 -89
- package/test/unit/spec/locus-info/parser.js +3 -2
- 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 +976 -91
- 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 +98 -11
- package/test/unit/spec/members/request.js +57 -2
- package/test/unit/spec/members/utils.js +139 -17
- 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 +160 -9
- 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');
|
472
522
|
|
473
523
|
const members = createMembers({url: url1});
|
474
524
|
|
475
|
-
await members.
|
476
|
-
assert.calledOnce(MembersUtil.
|
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');
|
531
|
+
|
532
|
+
const members = createMembers({url: url1});
|
533
|
+
|
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
|
|
@@ -914,7 +973,8 @@ describe('plugin-meetings', () => {
|
|
914
973
|
expectedMemberId,
|
915
974
|
expectedRequestingParticipantId,
|
916
975
|
expectedAlias,
|
917
|
-
expectedLocusUrl
|
976
|
+
expectedLocusUrl,
|
977
|
+
expectedSuffix
|
918
978
|
) => {
|
919
979
|
await assert.isFulfilled(resultPromise);
|
920
980
|
assert.calledOnceWithExactly(
|
@@ -922,13 +982,15 @@ describe('plugin-meetings', () => {
|
|
922
982
|
expectedMemberId,
|
923
983
|
expectedRequestingParticipantId,
|
924
984
|
expectedAlias,
|
925
|
-
expectedLocusUrl
|
985
|
+
expectedLocusUrl,
|
986
|
+
expectedSuffix
|
926
987
|
);
|
927
988
|
assert.calledOnceWithExactly(spies.editDisplayNameMember, {
|
928
989
|
memberId: expectedMemberId,
|
929
990
|
requestingParticipantId: expectedRequestingParticipantId,
|
930
991
|
alias: expectedAlias,
|
931
992
|
locusUrl: expectedLocusUrl,
|
993
|
+
suffix: expectedSuffix,
|
932
994
|
});
|
933
995
|
assert.strictEqual(resultPromise, spies.editDisplayNameMember.getCall(0).returnValue);
|
934
996
|
};
|
@@ -958,6 +1020,31 @@ describe('plugin-meetings', () => {
|
|
958
1020
|
});
|
959
1021
|
|
960
1022
|
it('should make the correct request when called with respective parameters', async () => {
|
1023
|
+
const requestingParticipantId = uuid.v4();
|
1024
|
+
const memberId = uuid.v4();
|
1025
|
+
const alias = 'aliasName';
|
1026
|
+
const suffix = 'suffixName';
|
1027
|
+
const {members, spies} = setup(url1);
|
1028
|
+
|
1029
|
+
const resultPromise = members.editDisplayName(
|
1030
|
+
memberId,
|
1031
|
+
requestingParticipantId,
|
1032
|
+
alias,
|
1033
|
+
suffix
|
1034
|
+
);
|
1035
|
+
|
1036
|
+
await checkValid(
|
1037
|
+
resultPromise,
|
1038
|
+
spies,
|
1039
|
+
memberId,
|
1040
|
+
requestingParticipantId,
|
1041
|
+
alias,
|
1042
|
+
url1,
|
1043
|
+
suffix
|
1044
|
+
);
|
1045
|
+
});
|
1046
|
+
|
1047
|
+
it('should make the correct request when called with respective parameters - no suffix', async () => {
|
961
1048
|
const requestingParticipantId = uuid.v4();
|
962
1049
|
const memberId = uuid.v4();
|
963
1050
|
const alias = 'aliasName';
|
@@ -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',
|
@@ -429,6 +429,61 @@ describe('plugin-meetings', () => {
|
|
429
429
|
},
|
430
430
|
});
|
431
431
|
});
|
432
|
+
|
433
|
+
it('sends a POST request to the locus endpoint with suffix empty string', async () => {
|
434
|
+
const locusUrl = url1;
|
435
|
+
const memberId = 'test1';
|
436
|
+
const requestingParticipantId = 'test2';
|
437
|
+
const aliasValue = 'alias';
|
438
|
+
|
439
|
+
const options = {
|
440
|
+
memberId,
|
441
|
+
requestingParticipantId,
|
442
|
+
alias: aliasValue,
|
443
|
+
locusUrl,
|
444
|
+
suffix: '',
|
445
|
+
};
|
446
|
+
|
447
|
+
await membersRequest.editDisplayNameMember(options);
|
448
|
+
|
449
|
+
checkRequest({
|
450
|
+
method: 'POST',
|
451
|
+
uri: `${locusUrl}/participant/${memberId}/alias`,
|
452
|
+
body: {
|
453
|
+
aliasValue,
|
454
|
+
requestingParticipantId,
|
455
|
+
suffixValue: '',
|
456
|
+
},
|
457
|
+
});
|
458
|
+
});
|
459
|
+
|
460
|
+
it('sends a POST request to the locus endpoint with suffixValue', async () => {
|
461
|
+
const locusUrl = url1;
|
462
|
+
const memberId = 'test1';
|
463
|
+
const requestingParticipantId = 'test2';
|
464
|
+
const aliasValue = 'alias';
|
465
|
+
const suffixValue = 'suffix';
|
466
|
+
|
467
|
+
const options = {
|
468
|
+
memberId,
|
469
|
+
requestingParticipantId,
|
470
|
+
alias: aliasValue,
|
471
|
+
locusUrl,
|
472
|
+
suffix: suffixValue,
|
473
|
+
};
|
474
|
+
|
475
|
+
await membersRequest.editDisplayNameMember(options);
|
476
|
+
|
477
|
+
checkRequest({
|
478
|
+
method: 'POST',
|
479
|
+
uri: `${locusUrl}/participant/${memberId}/alias`,
|
480
|
+
body: {
|
481
|
+
aliasValue,
|
482
|
+
requestingParticipantId,
|
483
|
+
suffixValue,
|
484
|
+
},
|
485
|
+
});
|
486
|
+
});
|
432
487
|
});
|
433
488
|
|
434
489
|
describe('#moveToLobby', () => {
|