@webex/plugin-meetings 3.12.0-next.7 → 3.12.0-next.70
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/AGENTS.md +9 -0
- package/dist/aiEnableRequest/index.js +15 -2
- package/dist/aiEnableRequest/index.js.map +1 -1
- package/dist/breakouts/breakout.js +8 -3
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/index.js +26 -2
- package/dist/breakouts/index.js.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/constants.js +30 -7
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +11 -1
- package/dist/controls-options-manager/constants.js.map +1 -1
- package/dist/controls-options-manager/index.js +38 -24
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/util.js +91 -0
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/hashTree/constants.js +13 -1
- package/dist/hashTree/constants.js.map +1 -1
- package/dist/hashTree/hashTreeParser.js +880 -382
- package/dist/hashTree/hashTreeParser.js.map +1 -1
- package/dist/hashTree/utils.js +42 -0
- package/dist/hashTree/utils.js.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/interceptors/dataChannelAuthToken.js +75 -15
- package/dist/interceptors/dataChannelAuthToken.js.map +1 -1
- package/dist/interceptors/locusRetry.js +23 -8
- package/dist/interceptors/locusRetry.js.map +1 -1
- package/dist/interpretation/index.js +10 -1
- package/dist/interpretation/index.js.map +1 -1
- package/dist/interpretation/interpretation.types.js +7 -0
- package/dist/interpretation/interpretation.types.js.map +1 -0
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/controlsUtils.js +4 -1
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +298 -87
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/types.js +19 -0
- package/dist/locus-info/types.js.map +1 -1
- package/dist/media/index.js +3 -1
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +1 -0
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +3 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +1046 -689
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +10 -1
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +5 -2
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +20 -2
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +2 -2
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meetings/index.js +231 -78
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +6 -1
- package/dist/meetings/meetings.types.js.map +1 -1
- package/dist/meetings/request.js +39 -0
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +79 -5
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +10 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js.map +1 -1
- package/dist/member/util.js +3 -0
- package/dist/member/util.js.map +1 -1
- package/dist/metrics/constants.js +4 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/multistream/codec/constants.js +63 -0
- package/dist/multistream/codec/constants.js.map +1 -0
- package/dist/multistream/mediaRequestManager.js +62 -15
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +9 -0
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/recording-controller/index.js +1 -3
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/types/config.d.ts +2 -0
- package/dist/types/constants.d.ts +9 -1
- package/dist/types/controls-options-manager/constants.d.ts +6 -1
- package/dist/types/controls-options-manager/index.d.ts +10 -0
- package/dist/types/hashTree/constants.d.ts +2 -0
- package/dist/types/hashTree/hashTreeParser.d.ts +146 -17
- package/dist/types/hashTree/utils.d.ts +18 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/interceptors/locusRetry.d.ts +4 -4
- package/dist/types/interpretation/interpretation.types.d.ts +10 -0
- package/dist/types/locus-info/index.d.ts +50 -6
- package/dist/types/locus-info/types.d.ts +21 -1
- package/dist/types/media/properties.d.ts +1 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +2 -0
- package/dist/types/meeting/index.d.ts +78 -5
- package/dist/types/meeting/request.d.ts +1 -0
- package/dist/types/meeting/util.d.ts +8 -0
- package/dist/types/meetings/index.d.ts +30 -2
- package/dist/types/meetings/meetings.types.d.ts +15 -0
- package/dist/types/meetings/request.d.ts +14 -0
- package/dist/types/member/index.d.ts +1 -0
- package/dist/types/member/types.d.ts +1 -0
- package/dist/types/member/util.d.ts +1 -0
- package/dist/types/metrics/constants.d.ts +3 -0
- package/dist/types/multistream/codec/constants.d.ts +7 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +22 -5
- package/dist/types/reactions/reactions.type.d.ts +3 -0
- package/dist/webinar/index.js +305 -159
- package/dist/webinar/index.js.map +1 -1
- package/package.json +22 -22
- package/src/aiEnableRequest/index.ts +16 -0
- package/src/breakouts/breakout.ts +3 -1
- package/src/breakouts/index.ts +31 -0
- package/src/config.ts +2 -0
- package/src/constants.ts +13 -2
- package/src/controls-options-manager/constants.ts +14 -1
- package/src/controls-options-manager/index.ts +47 -24
- package/src/controls-options-manager/util.ts +81 -1
- package/src/hashTree/constants.ts +16 -0
- package/src/hashTree/hashTreeParser.ts +580 -196
- package/src/hashTree/utils.ts +36 -0
- package/src/index.ts +6 -0
- package/src/interceptors/dataChannelAuthToken.ts +88 -12
- package/src/interceptors/locusRetry.ts +25 -4
- package/src/interpretation/index.ts +27 -9
- package/src/interpretation/interpretation.types.ts +11 -0
- package/src/locus-info/controlsUtils.ts +3 -1
- package/src/locus-info/index.ts +293 -97
- package/src/locus-info/types.ts +25 -1
- package/src/media/index.ts +3 -0
- package/src/media/properties.ts +1 -0
- package/src/meeting/in-meeting-actions.ts +4 -0
- package/src/meeting/index.ts +386 -48
- package/src/meeting/muteState.ts +10 -1
- package/src/meeting/request.ts +11 -0
- package/src/meeting/util.ts +21 -2
- package/src/meeting-info/meeting-info-v2.ts +4 -2
- package/src/meetings/index.ts +134 -44
- package/src/meetings/meetings.types.ts +19 -0
- package/src/meetings/request.ts +43 -0
- package/src/meetings/util.ts +97 -1
- package/src/member/index.ts +10 -0
- package/src/member/types.ts +1 -0
- package/src/member/util.ts +3 -0
- package/src/metrics/constants.ts +3 -0
- package/src/multistream/codec/constants.ts +58 -0
- package/src/multistream/mediaRequestManager.ts +119 -28
- package/src/multistream/receiveSlot.ts +18 -0
- package/src/reactions/reactions.type.ts +3 -0
- package/src/recording-controller/index.ts +1 -2
- package/src/webinar/index.ts +214 -36
- package/test/unit/spec/aiEnableRequest/index.ts +86 -0
- package/test/unit/spec/breakouts/breakout.ts +9 -3
- package/test/unit/spec/breakouts/index.ts +49 -0
- package/test/unit/spec/controls-options-manager/index.js +140 -29
- package/test/unit/spec/controls-options-manager/util.js +165 -0
- package/test/unit/spec/hashTree/hashTreeParser.ts +1838 -180
- package/test/unit/spec/hashTree/utils.ts +125 -1
- package/test/unit/spec/interceptors/dataChannelAuthToken.ts +196 -0
- package/test/unit/spec/interceptors/locusRetry.ts +205 -4
- package/test/unit/spec/interpretation/index.ts +26 -4
- package/test/unit/spec/locus-info/controlsUtils.js +172 -57
- package/test/unit/spec/locus-info/index.js +487 -81
- package/test/unit/spec/media/index.ts +31 -0
- package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
- package/test/unit/spec/meeting/index.js +1240 -37
- package/test/unit/spec/meeting/muteState.js +81 -0
- package/test/unit/spec/meeting/request.js +12 -0
- package/test/unit/spec/meeting/utils.js +33 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +19 -10
- package/test/unit/spec/meetings/index.js +360 -10
- package/test/unit/spec/meetings/request.js +141 -0
- package/test/unit/spec/meetings/utils.js +189 -0
- package/test/unit/spec/member/index.js +7 -0
- package/test/unit/spec/member/util.js +24 -0
- package/test/unit/spec/multistream/mediaRequestManager.ts +501 -37
- package/test/unit/spec/recording-controller/index.js +9 -8
- package/test/unit/spec/webinar/index.ts +329 -28
|
@@ -11,6 +11,7 @@ describe('plugin-meetings', () => {
|
|
|
11
11
|
let audio;
|
|
12
12
|
let video;
|
|
13
13
|
let originalRemoteUpdateAudioVideo;
|
|
14
|
+
let originalUpdateLocusFromApiResponse;
|
|
14
15
|
|
|
15
16
|
const fakeLocusResponse = {body: {locus: {info: 'this is a fake locus'}}};
|
|
16
17
|
|
|
@@ -45,6 +46,7 @@ describe('plugin-meetings', () => {
|
|
|
45
46
|
};
|
|
46
47
|
|
|
47
48
|
originalRemoteUpdateAudioVideo = MeetingUtil.remoteUpdateAudioVideo;
|
|
49
|
+
originalUpdateLocusFromApiResponse = MeetingUtil.updateLocusFromApiResponse;
|
|
48
50
|
|
|
49
51
|
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().resolves(fakeLocusResponse);
|
|
50
52
|
MeetingUtil.updateLocusFromApiResponse = sinon.stub();
|
|
@@ -57,6 +59,7 @@ describe('plugin-meetings', () => {
|
|
|
57
59
|
|
|
58
60
|
afterEach(() => {
|
|
59
61
|
MeetingUtil.remoteUpdateAudioVideo = originalRemoteUpdateAudioVideo;
|
|
62
|
+
MeetingUtil.updateLocusFromApiResponse = originalUpdateLocusFromApiResponse;
|
|
60
63
|
});
|
|
61
64
|
|
|
62
65
|
describe('mute state library', () => {
|
|
@@ -109,6 +112,82 @@ describe('plugin-meetings', () => {
|
|
|
109
112
|
assert.isTrue(audio.isRemotelyMuted());
|
|
110
113
|
});
|
|
111
114
|
|
|
115
|
+
it('does not unmute the local stream when server clears remote mute while user is locally muted (breakout -> main regression)', async () => {
|
|
116
|
+
// Panelist is locally muted before joining a breakout.
|
|
117
|
+
meeting.mediaProperties.audioStream.userMuted = true;
|
|
118
|
+
audio.handleLocalStreamChange(meeting);
|
|
119
|
+
await testUtils.flushPromises();
|
|
120
|
+
|
|
121
|
+
// Server applied a remote mute at some point.
|
|
122
|
+
audio.handleServerRemoteMuteUpdate(meeting, true, true);
|
|
123
|
+
assert.isTrue(audio.isRemotelyMuted());
|
|
124
|
+
|
|
125
|
+
meeting.mediaProperties.audioStream.setServerMuted.resetHistory();
|
|
126
|
+
|
|
127
|
+
// Now the user returns from breakout to main, and Locus clears the remote mute.
|
|
128
|
+
audio.handleServerRemoteMuteUpdate(meeting, false, true);
|
|
129
|
+
|
|
130
|
+
// Stream must NOT be force-unmuted - user's local mute intent must be preserved.
|
|
131
|
+
// The stale remoteMute=false must not trigger setServerMuted again.
|
|
132
|
+
assert.notCalled(meeting.mediaProperties.audioStream.setServerMuted);
|
|
133
|
+
assert.isFalse(audio.isRemotelyMuted());
|
|
134
|
+
assert.isTrue(audio.isMuted());
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it('does not touch the local stream when remote mute stays false (no transition)', async () => {
|
|
138
|
+
// No remote mute has been applied yet (initial state has server.remoteMute=false).
|
|
139
|
+
meeting.mediaProperties.audioStream.setServerMuted.resetHistory();
|
|
140
|
+
|
|
141
|
+
audio.handleServerRemoteMuteUpdate(meeting, false, true);
|
|
142
|
+
|
|
143
|
+
// setServerMuted must not be called - there is no remoteMute transition to act on.
|
|
144
|
+
assert.notCalled(meeting.mediaProperties.audioStream.setServerMuted);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('keeps isMuted() true when a stale remoteMute=false replays after remote mute', async () => {
|
|
148
|
+
// User was unmuted by host (userMuted=false locally).
|
|
149
|
+
meeting.mediaProperties.audioStream.userMuted = false;
|
|
150
|
+
audio.handleLocalStreamChange(meeting);
|
|
151
|
+
await testUtils.flushPromises();
|
|
152
|
+
|
|
153
|
+
// Host then hard-mutes the user.
|
|
154
|
+
audio.handleServerRemoteMuteUpdate(meeting, true, true);
|
|
155
|
+
await testUtils.flushPromises();
|
|
156
|
+
assert.isTrue(audio.isMuted());
|
|
157
|
+
|
|
158
|
+
meeting.mediaProperties.audioStream.setServerMuted.resetHistory();
|
|
159
|
+
|
|
160
|
+
// BO -> main replays a stale remoteMute=false from the locus cache.
|
|
161
|
+
audio.handleServerRemoteMuteUpdate(meeting, false, true);
|
|
162
|
+
|
|
163
|
+
// isMuted() must remain true (client.localMute is the safety net),
|
|
164
|
+
// and the stream must not be force-unmuted.
|
|
165
|
+
assert.isTrue(audio.isMuted());
|
|
166
|
+
assert.isFalse(audio.isRemotelyMuted());
|
|
167
|
+
assert.notCalled(meeting.mediaProperties.audioStream.setServerMuted);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it('syncs client mute intent back to server on stale remoteMute=false', async () => {
|
|
171
|
+
// client wants mute (localMute=true) but server's
|
|
172
|
+
// local-mute is out of sync (=false) - e.g. an attendee promoted to panelist whose
|
|
173
|
+
// server-side mute state got mis-set during promotion. remoteMute is currently true.
|
|
174
|
+
audio.state.client.localMute = true;
|
|
175
|
+
audio.state.server.localMute = false;
|
|
176
|
+
audio.state.server.remoteMute = true;
|
|
177
|
+
|
|
178
|
+
MeetingUtil.remoteUpdateAudioVideo.resetHistory();
|
|
179
|
+
|
|
180
|
+
// Stale event after BO -> main clears remoteMute.
|
|
181
|
+
audio.handleServerRemoteMuteUpdate(meeting, false, true);
|
|
182
|
+
await testUtils.flushPromises();
|
|
183
|
+
|
|
184
|
+
// applyClientStateToServer must detect the mismatch and push local mute back
|
|
185
|
+
// to server, so server.controls.audio.muted stays true for other participants' tiles.
|
|
186
|
+
assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
|
|
187
|
+
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, true, undefined);
|
|
188
|
+
assert.isTrue(audio.isMuted());
|
|
189
|
+
});
|
|
190
|
+
|
|
112
191
|
it('does local audio unmute if localAudioUnmuteRequired is received', async () => {
|
|
113
192
|
// first we need to have the local stream user muted
|
|
114
193
|
meeting.mediaProperties.audioStream.userMuted = true;
|
|
@@ -826,6 +905,8 @@ describe('plugin-meetings', () => {
|
|
|
826
905
|
it('does not do anything if current state is already the same', async () => {
|
|
827
906
|
// set it up so that we are remotely muted (so that a sync to server would do a remote unmute)
|
|
828
907
|
audio.handleServerRemoteMuteUpdate(meeting, true, true);
|
|
908
|
+
await testUtils.flushPromises();
|
|
909
|
+
resetStubHistory();
|
|
829
910
|
|
|
830
911
|
// audio is already enabled and we call to enable it again
|
|
831
912
|
audio.enable(meeting, true);
|
|
@@ -347,6 +347,18 @@ describe('plugin-meetings', () => {
|
|
|
347
347
|
'ANNOTATION_ON_SHARE_SUPPORTED',
|
|
348
348
|
]);
|
|
349
349
|
});
|
|
350
|
+
it('adds deviceCapabilities to request when simultaneous interpretation is enabled', async () => {
|
|
351
|
+
await meetingsRequest.joinMeeting({
|
|
352
|
+
enableSimultaneousInterpretation: true,
|
|
353
|
+
});
|
|
354
|
+
const requestParams = meetingsRequest.request.getCall(0).args[0];
|
|
355
|
+
assert.deepEqual(requestParams.body.deviceCapabilities, [
|
|
356
|
+
'HOST_CONTROL_SI_SUPPORTED',
|
|
357
|
+
'INTERPRETER_CONTROL_SI_SUPPORTED',
|
|
358
|
+
'SI_HANDOVER_SUPPORTED',
|
|
359
|
+
'SIGN_INTERPRETER_SUPPORTED',
|
|
360
|
+
]);
|
|
361
|
+
});
|
|
350
362
|
it('does not add deviceCapabilities to request when breakouts and live annotation are not supported', async () => {
|
|
351
363
|
await meetingsRequest.joinMeeting({});
|
|
352
364
|
|
|
@@ -60,6 +60,7 @@ describe('plugin-meetings', () => {
|
|
|
60
60
|
meeting.annotaion = {cleanUp: sinon.stub()};
|
|
61
61
|
meeting.getWebexObject = sinon.stub().returns(webex);
|
|
62
62
|
meeting.simultaneousInterpretation = {cleanUp: sinon.stub()};
|
|
63
|
+
meeting.locusInfo = {cleanUp: sinon.stub()};
|
|
63
64
|
meeting.trigger = sinon.stub();
|
|
64
65
|
meeting.webex = webex;
|
|
65
66
|
meeting.webex.internal.newMetrics.callDiagnosticMetrics =
|
|
@@ -89,6 +90,7 @@ describe('plugin-meetings', () => {
|
|
|
89
90
|
assert.calledOnceWithExactly(meeting.cleanupLLMConneciton, {throwOnError: false});
|
|
90
91
|
assert.calledOnce(meeting.breakouts.cleanUp);
|
|
91
92
|
assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
|
|
93
|
+
assert.calledOnce(meeting.locusInfo.cleanUp);
|
|
92
94
|
assert.calledOnce(webex.internal.device.meetingEnded);
|
|
93
95
|
assert.calledOnceWithExactly(
|
|
94
96
|
meeting.webex.internal.newMetrics.callDiagnosticMetrics.clearEventLimitsForCorrelationId,
|
|
@@ -110,6 +112,7 @@ describe('plugin-meetings', () => {
|
|
|
110
112
|
assert.notCalled(meeting.cleanupLLMConneciton);
|
|
111
113
|
assert.calledOnce(meeting.breakouts.cleanUp);
|
|
112
114
|
assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
|
|
115
|
+
assert.calledOnce(meeting.locusInfo.cleanUp);
|
|
113
116
|
assert.calledOnce(webex.internal.device.meetingEnded);
|
|
114
117
|
assert.calledOnceWithExactly(
|
|
115
118
|
meeting.webex.internal.newMetrics.callDiagnosticMetrics.clearEventLimitsForCorrelationId,
|
|
@@ -130,6 +133,7 @@ describe('plugin-meetings', () => {
|
|
|
130
133
|
assert.notCalled(meeting.cleanupLLMConneciton);
|
|
131
134
|
assert.calledOnce(meeting.breakouts.cleanUp);
|
|
132
135
|
assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
|
|
136
|
+
assert.calledOnce(meeting.locusInfo.cleanUp);
|
|
133
137
|
assert.calledOnce(webex.internal.device.meetingEnded);
|
|
134
138
|
assert.calledOnceWithExactly(
|
|
135
139
|
meeting.webex.internal.newMetrics.callDiagnosticMetrics.clearEventLimitsForCorrelationId,
|
|
@@ -272,6 +276,31 @@ describe('plugin-meetings', () => {
|
|
|
272
276
|
assert.notCalled(meeting.locusInfo.handleLocusAPIResponse);
|
|
273
277
|
});
|
|
274
278
|
|
|
279
|
+
it('should call handleLocusAPIResponse when response body is an unwrapped LocusDTO', () => {
|
|
280
|
+
const meeting = {
|
|
281
|
+
locusInfo: {
|
|
282
|
+
handleLocusAPIResponse: sinon.stub(),
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
const originalResponse = {
|
|
287
|
+
body: {
|
|
288
|
+
url: 'https://locus-a.wbx2.com/locus/api/v1/loci/some-id',
|
|
289
|
+
participants: [],
|
|
290
|
+
self: {},
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
const response = MeetingUtil.updateLocusFromApiResponse(meeting, originalResponse);
|
|
295
|
+
|
|
296
|
+
assert.deepEqual(response, originalResponse);
|
|
297
|
+
assert.calledOnceWithExactly(
|
|
298
|
+
meeting.locusInfo.handleLocusAPIResponse,
|
|
299
|
+
meeting,
|
|
300
|
+
originalResponse.body
|
|
301
|
+
);
|
|
302
|
+
});
|
|
303
|
+
|
|
275
304
|
it('should work with an undefined meeting', () => {
|
|
276
305
|
const originalResponse = {
|
|
277
306
|
body: {
|
|
@@ -1146,6 +1175,10 @@ describe('plugin-meetings', () => {
|
|
|
1146
1175
|
{functionName: 'canSelectSpokenLanguages', displayHint: 'DISPLAY_NON_ENGLISH_ASR'},
|
|
1147
1176
|
{functionName: 'waitingForOthersToJoin', displayHint: 'WAITING_FOR_OTHERS'},
|
|
1148
1177
|
{functionName: 'showAutoEndMeetingWarning', displayHint: 'SHOW_AUTO_END_MEETING_WARNING'},
|
|
1178
|
+
{
|
|
1179
|
+
functionName: 'isAnonymizeDisplayNamesEnabled',
|
|
1180
|
+
displayHint: 'ANONYMOUS_DISPLAY_NAMES_ENABLED',
|
|
1181
|
+
},
|
|
1149
1182
|
].forEach(({functionName, displayHint}) => {
|
|
1150
1183
|
describe(functionName, () => {
|
|
1151
1184
|
it('works as expected', () => {
|
|
@@ -654,7 +654,7 @@ describe('plugin-meetings', () => {
|
|
|
654
654
|
meetingInfo.createAdhocSpaceMeeting,
|
|
655
655
|
'conversationUrl',
|
|
656
656
|
installedOrgID,
|
|
657
|
-
null
|
|
657
|
+
null
|
|
658
658
|
);
|
|
659
659
|
assert.notCalled(webex.request);
|
|
660
660
|
meetingInfo.createAdhocSpaceMeeting.restore();
|
|
@@ -1068,13 +1068,16 @@ describe('plugin-meetings', () => {
|
|
|
1068
1068
|
await runTest(423006, true);
|
|
1069
1069
|
});
|
|
1070
1070
|
|
|
1071
|
+
it('should throw MeetingInfoV2CaptchaError for 423 response (wbxappapi code 423008)', async () => {
|
|
1072
|
+
await runTest(423008, true);
|
|
1073
|
+
});
|
|
1074
|
+
|
|
1071
1075
|
it('should throw MeetingInfoV2CaptchaError for 423 response (wbxappapi code 423001)', async () => {
|
|
1072
1076
|
await runTest(423001, false);
|
|
1073
1077
|
});
|
|
1074
1078
|
});
|
|
1075
1079
|
|
|
1076
1080
|
describe('should stop call fetchMeetingInfo if siteFullUrl is empty for 404 response', () => {
|
|
1077
|
-
|
|
1078
1081
|
const runTest = async (wbxAppApiCode, expectedIsPasswordRequired) => {
|
|
1079
1082
|
webex.request = sinon.stub().rejects({
|
|
1080
1083
|
statusCode: 404,
|
|
@@ -1082,12 +1085,11 @@ describe('plugin-meetings', () => {
|
|
|
1082
1085
|
code: wbxAppApiCode,
|
|
1083
1086
|
message: 'Alternate Meeting Server',
|
|
1084
1087
|
data: {
|
|
1085
|
-
|
|
1086
|
-
}
|
|
1088
|
+
siteFullUrl: '',
|
|
1089
|
+
},
|
|
1087
1090
|
},
|
|
1088
1091
|
});
|
|
1089
1092
|
|
|
1090
|
-
|
|
1091
1093
|
try {
|
|
1092
1094
|
await meetingInfo.fetchMeetingInfo('1234323', DESTINATION_TYPE.MEETING_ID, 'abc', {
|
|
1093
1095
|
id: '999',
|
|
@@ -1097,7 +1099,7 @@ describe('plugin-meetings', () => {
|
|
|
1097
1099
|
} catch (err) {
|
|
1098
1100
|
assert(Metrics.sendBehavioralMetric.calledOnce);
|
|
1099
1101
|
assert.deepEqual(err.body.data, {
|
|
1100
|
-
siteFullUrl: ''
|
|
1102
|
+
siteFullUrl: '',
|
|
1101
1103
|
});
|
|
1102
1104
|
}
|
|
1103
1105
|
};
|
|
@@ -1107,7 +1109,6 @@ describe('plugin-meetings', () => {
|
|
|
1107
1109
|
});
|
|
1108
1110
|
});
|
|
1109
1111
|
|
|
1110
|
-
|
|
1111
1112
|
it('should throw an error and not fetch with an "empty" body', async () => {
|
|
1112
1113
|
const body = {supportHostKey: 'foo', supportCountryList: 'bar'};
|
|
1113
1114
|
const requestResponse = {statusCode: 200, body};
|
|
@@ -1176,7 +1177,11 @@ describe('plugin-meetings', () => {
|
|
|
1176
1177
|
body: conversation,
|
|
1177
1178
|
});
|
|
1178
1179
|
|
|
1179
|
-
const result = await meetingInfo.createAdhocSpaceMeeting(
|
|
1180
|
+
const result = await meetingInfo.createAdhocSpaceMeeting(
|
|
1181
|
+
conversationUrl,
|
|
1182
|
+
installedOrgID,
|
|
1183
|
+
classificationId
|
|
1184
|
+
);
|
|
1180
1185
|
|
|
1181
1186
|
assert.calledWith(webex.request, {
|
|
1182
1187
|
uri: conversationUrl,
|
|
@@ -1210,7 +1215,11 @@ describe('plugin-meetings', () => {
|
|
|
1210
1215
|
webex.request = sinon.stub().resolves({
|
|
1211
1216
|
body: conversation,
|
|
1212
1217
|
});
|
|
1213
|
-
await meetingInfo.createAdhocSpaceMeeting(
|
|
1218
|
+
await meetingInfo.createAdhocSpaceMeeting(
|
|
1219
|
+
conversationUrl,
|
|
1220
|
+
installedOrgID,
|
|
1221
|
+
classificationId
|
|
1222
|
+
);
|
|
1214
1223
|
|
|
1215
1224
|
assert.calledWith(webex.request, {
|
|
1216
1225
|
uri: conversationUrl,
|
|
@@ -1282,7 +1291,7 @@ describe('plugin-meetings', () => {
|
|
|
1282
1291
|
{errorCode: 423007},
|
|
1283
1292
|
{errorCode: 403026},
|
|
1284
1293
|
{errorCode: 403037},
|
|
1285
|
-
{errorCode:
|
|
1294
|
+
{errorCode: 403106},
|
|
1286
1295
|
],
|
|
1287
1296
|
({errorCode}) => {
|
|
1288
1297
|
it(`should throw a MeetingInfoV2JoinWebinarError for error code ${errorCode}`, async () => {
|