@webex/plugin-meetings 3.7.0 → 3.8.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/dist/annotation/index.js +17 -0
- package/dist/annotation/index.js.map +1 -1
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/common/errors/join-forbidden-error.js +52 -0
- package/dist/common/errors/join-forbidden-error.js.map +1 -0
- package/dist/common/errors/{webinar-registration-error.js → join-webinar-error.js} +12 -12
- package/dist/common/errors/join-webinar-error.js.map +1 -0
- package/dist/common/errors/multistream-not-supported-error.js +53 -0
- package/dist/common/errors/multistream-not-supported-error.js.map +1 -0
- package/dist/config.js +3 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js +69 -6
- package/dist/constants.js.map +1 -1
- package/dist/index.js +16 -11
- package/dist/index.js.map +1 -1
- package/dist/interpretation/index.js +4 -4
- package/dist/interpretation/index.js.map +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/index.js +14 -3
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/selfUtils.js +35 -17
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/MediaConnectionAwaiter.js +1 -0
- package/dist/media/MediaConnectionAwaiter.js.map +1 -1
- package/dist/media/properties.js +30 -16
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/brbState.js +167 -0
- package/dist/meeting/brbState.js.map +1 -0
- package/dist/meeting/in-meeting-actions.js +13 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +1373 -1052
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +32 -11
- package/dist/meeting/locusMediaRequest.js.map +1 -1
- package/dist/meeting/muteState.js +1 -6
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +51 -29
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js.map +1 -1
- package/dist/meeting/util.js +103 -67
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +115 -45
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/utilv2.js +6 -2
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/index.js +107 -55
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +2 -0
- package/dist/meetings/meetings.types.js.map +1 -1
- package/dist/meetings/util.js +1 -1
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +9 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js.map +1 -1
- package/dist/member/util.js +39 -28
- package/dist/member/util.js.map +1 -1
- package/dist/members/util.js +4 -2
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +6 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/multistream/remoteMedia.js +30 -15
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +40 -8
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +24 -0
- package/dist/multistream/sendSlotManager.js.map +1 -1
- package/dist/reachability/clusterReachability.js +12 -15
- package/dist/reachability/clusterReachability.js.map +1 -1
- package/dist/reachability/index.js +471 -140
- package/dist/reachability/index.js.map +1 -1
- package/dist/{rtcMetrics/constants.js → reachability/reachability.types.js} +1 -5
- package/dist/reachability/reachability.types.js.map +1 -0
- package/dist/reachability/request.js +21 -8
- package/dist/reachability/request.js.map +1 -1
- package/dist/recording-controller/enums.js +8 -4
- package/dist/recording-controller/enums.js.map +1 -1
- package/dist/recording-controller/index.js +18 -9
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js +13 -9
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.js +15 -15
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +45 -79
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +3 -6
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/types/annotation/index.d.ts +5 -0
- package/dist/types/common/errors/join-forbidden-error.d.ts +15 -0
- package/dist/types/common/errors/{webinar-registration-error.d.ts → join-webinar-error.d.ts} +2 -2
- package/dist/types/common/errors/multistream-not-supported-error.d.ts +17 -0
- package/dist/types/config.d.ts +2 -0
- package/dist/types/constants.d.ts +54 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/locus-info/index.d.ts +2 -1
- package/dist/types/meeting/brbState.d.ts +54 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +12 -0
- package/dist/types/meeting/index.d.ts +86 -14
- package/dist/types/meeting/locusMediaRequest.d.ts +6 -3
- package/dist/types/meeting/request.d.ts +14 -3
- package/dist/types/meeting/request.type.d.ts +6 -0
- package/dist/types/meeting/util.d.ts +3 -3
- package/dist/types/meeting-info/meeting-info-v2.d.ts +30 -5
- package/dist/types/meetings/index.d.ts +20 -2
- package/dist/types/meetings/meetings.types.d.ts +8 -0
- package/dist/types/member/index.d.ts +1 -0
- package/dist/types/member/types.d.ts +7 -0
- package/dist/types/members/util.d.ts +2 -0
- package/dist/types/metrics/constants.d.ts +6 -1
- package/dist/types/multistream/remoteMediaManager.d.ts +10 -1
- package/dist/types/multistream/sendSlotManager.d.ts +8 -1
- package/dist/types/reachability/clusterReachability.d.ts +1 -10
- package/dist/types/reachability/index.d.ts +83 -36
- package/dist/types/reachability/reachability.types.d.ts +64 -0
- package/dist/types/reachability/request.d.ts +5 -1
- package/dist/types/recording-controller/enums.d.ts +5 -2
- package/dist/types/recording-controller/index.d.ts +1 -0
- package/dist/types/recording-controller/util.d.ts +2 -1
- package/dist/types/roap/request.d.ts +1 -13
- package/dist/webinar/index.js +390 -7
- package/dist/webinar/index.js.map +1 -1
- package/package.json +23 -22
- package/src/annotation/index.ts +16 -0
- package/src/common/errors/join-forbidden-error.ts +26 -0
- package/src/common/errors/join-webinar-error.ts +24 -0
- package/src/common/errors/multistream-not-supported-error.ts +30 -0
- package/src/config.ts +2 -0
- package/src/constants.ts +62 -3
- package/src/index.ts +5 -3
- package/src/interpretation/index.ts +3 -3
- package/src/locus-info/index.ts +20 -3
- package/src/locus-info/selfUtils.ts +24 -6
- package/src/media/MediaConnectionAwaiter.ts +2 -0
- package/src/media/properties.ts +34 -13
- package/src/meeting/brbState.ts +169 -0
- package/src/meeting/in-meeting-actions.ts +25 -0
- package/src/meeting/index.ts +485 -88
- package/src/meeting/locusMediaRequest.ts +38 -12
- package/src/meeting/muteState.ts +1 -6
- package/src/meeting/request.ts +30 -12
- package/src/meeting/request.type.ts +7 -0
- package/src/meeting/util.ts +32 -13
- package/src/meeting-info/meeting-info-v2.ts +83 -12
- package/src/meeting-info/utilv2.ts +17 -3
- package/src/meetings/index.ts +79 -20
- package/src/meetings/meetings.types.ts +10 -0
- package/src/meetings/util.ts +2 -1
- package/src/member/index.ts +9 -0
- package/src/member/types.ts +8 -0
- package/src/member/util.ts +34 -24
- package/src/members/util.ts +1 -0
- package/src/metrics/constants.ts +6 -1
- package/src/multistream/remoteMedia.ts +28 -15
- package/src/multistream/remoteMediaManager.ts +32 -10
- package/src/multistream/sendSlotManager.ts +31 -0
- package/src/reachability/clusterReachability.ts +5 -15
- package/src/reachability/index.ts +315 -75
- package/src/reachability/reachability.types.ts +85 -0
- package/src/reachability/request.ts +55 -31
- package/src/recording-controller/enums.ts +5 -2
- package/src/recording-controller/index.ts +17 -4
- package/src/recording-controller/util.ts +28 -9
- package/src/roap/index.ts +14 -13
- package/src/roap/request.ts +30 -44
- package/src/roap/turnDiscovery.ts +2 -4
- package/src/webinar/index.ts +235 -9
- package/test/unit/spec/annotation/index.ts +46 -1
- package/test/unit/spec/interpretation/index.ts +39 -1
- package/test/unit/spec/locus-info/index.js +292 -60
- package/test/unit/spec/locus-info/selfConstant.js +7 -0
- package/test/unit/spec/locus-info/selfUtils.js +101 -1
- package/test/unit/spec/media/properties.ts +15 -0
- package/test/unit/spec/meeting/brbState.ts +114 -0
- package/test/unit/spec/meeting/in-meeting-actions.ts +15 -1
- package/test/unit/spec/meeting/index.js +908 -124
- package/test/unit/spec/meeting/locusMediaRequest.ts +111 -66
- package/test/unit/spec/meeting/muteState.js +0 -24
- package/test/unit/spec/meeting/request.js +3 -26
- package/test/unit/spec/meeting/utils.js +73 -28
- package/test/unit/spec/meeting-info/meetinginfov2.js +46 -4
- package/test/unit/spec/meeting-info/utilv2.js +26 -0
- package/test/unit/spec/meetings/index.js +172 -18
- package/test/unit/spec/meetings/utils.js +10 -0
- package/test/unit/spec/member/util.js +52 -11
- package/test/unit/spec/members/utils.js +95 -0
- package/test/unit/spec/multistream/remoteMedia.ts +11 -7
- package/test/unit/spec/multistream/remoteMediaManager.ts +397 -118
- package/test/unit/spec/reachability/clusterReachability.ts +7 -0
- package/test/unit/spec/reachability/index.ts +391 -9
- package/test/unit/spec/reachability/request.js +48 -12
- package/test/unit/spec/recording-controller/index.js +61 -5
- package/test/unit/spec/recording-controller/util.js +39 -3
- package/test/unit/spec/roap/index.ts +48 -1
- package/test/unit/spec/roap/request.ts +51 -109
- package/test/unit/spec/roap/turnDiscovery.ts +202 -147
- package/test/unit/spec/webinar/index.ts +509 -0
- package/dist/common/errors/webinar-registration-error.js.map +0 -1
- package/dist/networkQualityMonitor/index.js +0 -227
- package/dist/networkQualityMonitor/index.js.map +0 -1
- package/dist/rtcMetrics/constants.js.map +0 -1
- package/dist/rtcMetrics/index.js +0 -197
- package/dist/rtcMetrics/index.js.map +0 -1
- 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/src/common/errors/webinar-registration-error.ts +0 -27
|
@@ -221,7 +221,21 @@ describe('plugin-meetings', () => {
|
|
|
221
221
|
|
|
222
222
|
assert.calledWith(request.request, {
|
|
223
223
|
uri: `test/loci/id/recording`,
|
|
224
|
-
body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'start'}},
|
|
224
|
+
body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'start'}, recordingType: 'cloud'},
|
|
225
|
+
method: HTTP_VERBS.PUT,
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
assert.deepEqual(result, request.request.firstCall.returnValue);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
it('can start premise recording when the correct display hint is present', () => {
|
|
232
|
+
controller.setDisplayHints(['PREMISE_RECORDING_CONTROL_START']);
|
|
233
|
+
|
|
234
|
+
const result = controller.startRecording();
|
|
235
|
+
|
|
236
|
+
assert.calledWith(request.request, {
|
|
237
|
+
uri: `test/loci/id/recording`,
|
|
238
|
+
body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'start'}, recordingType: 'premise'},
|
|
225
239
|
method: HTTP_VERBS.PUT,
|
|
226
240
|
});
|
|
227
241
|
|
|
@@ -238,14 +252,28 @@ describe('plugin-meetings', () => {
|
|
|
238
252
|
assert.isRejected(result);
|
|
239
253
|
});
|
|
240
254
|
|
|
241
|
-
it('can
|
|
255
|
+
it('can stop recording when the correct display hint is present', () => {
|
|
242
256
|
controller.setDisplayHints(['RECORDING_CONTROL_STOP']);
|
|
243
257
|
|
|
244
258
|
const result = controller.stopRecording();
|
|
245
259
|
|
|
246
260
|
assert.calledWith(request.request, {
|
|
247
261
|
uri: `test/loci/id/recording`,
|
|
248
|
-
body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'stop'}},
|
|
262
|
+
body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'stop'}, recordingType: 'cloud'},
|
|
263
|
+
method: HTTP_VERBS.PUT,
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
assert.deepEqual(result, request.request.firstCall.returnValue);
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
it('can stop premise recording when the correct display hint is present', () => {
|
|
270
|
+
controller.setDisplayHints(['PREMISE_RECORDING_CONTROL_STOP']);
|
|
271
|
+
|
|
272
|
+
const result = controller.stopRecording();
|
|
273
|
+
|
|
274
|
+
assert.calledWith(request.request, {
|
|
275
|
+
uri: `test/loci/id/recording`,
|
|
276
|
+
body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'stop'}, recordingType: 'premise'},
|
|
249
277
|
method: HTTP_VERBS.PUT,
|
|
250
278
|
});
|
|
251
279
|
|
|
@@ -269,7 +297,21 @@ describe('plugin-meetings', () => {
|
|
|
269
297
|
|
|
270
298
|
assert.calledWith(request.request, {
|
|
271
299
|
uri: `test/loci/id/recording`,
|
|
272
|
-
body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'pause'}},
|
|
300
|
+
body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'pause'}, recordingType: 'cloud'},
|
|
301
|
+
method: HTTP_VERBS.PUT,
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
assert.deepEqual(result, request.request.firstCall.returnValue);
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
it('can pause premise recording when the correct display hint is present', () => {
|
|
308
|
+
controller.setDisplayHints(['PREMISE_RECORDING_CONTROL_PAUSE']);
|
|
309
|
+
|
|
310
|
+
const result = controller.pauseRecording();
|
|
311
|
+
|
|
312
|
+
assert.calledWith(request.request, {
|
|
313
|
+
uri: `test/loci/id/recording`,
|
|
314
|
+
body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'pause'}, recordingType: 'premise'},
|
|
273
315
|
method: HTTP_VERBS.PUT,
|
|
274
316
|
});
|
|
275
317
|
|
|
@@ -293,7 +335,21 @@ describe('plugin-meetings', () => {
|
|
|
293
335
|
|
|
294
336
|
assert.calledWith(request.request, {
|
|
295
337
|
uri: `test/loci/id/recording`,
|
|
296
|
-
body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'resume'}},
|
|
338
|
+
body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'resume'}, recordingType: 'cloud'},
|
|
339
|
+
method: HTTP_VERBS.PUT,
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
assert.deepEqual(result, request.request.firstCall.returnValue);
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
it('can resume premise recording when the correct display hint is present', () => {
|
|
346
|
+
controller.setDisplayHints(['PREMISE_RECORDING_CONTROL_RESUME']);
|
|
347
|
+
|
|
348
|
+
const result = controller.resumeRecording();
|
|
349
|
+
|
|
350
|
+
assert.calledWith(request.request, {
|
|
351
|
+
uri: `test/loci/id/recording`,
|
|
352
|
+
body: {meetingInfo: {locusSessionId: 'testId'}, recording: {action: 'resume'}, recordingType: 'premise'},
|
|
297
353
|
method: HTTP_VERBS.PUT,
|
|
298
354
|
});
|
|
299
355
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import RecordingUtil from '@webex/plugin-meetings/src/recording-controller/util';
|
|
2
|
-
import RecordingAction from '@webex/plugin-meetings/src/recording-controller/enums';
|
|
2
|
+
import { RecordingAction } from '@webex/plugin-meetings/src/recording-controller/enums';
|
|
3
3
|
import {SELF_POLICY} from '@webex/plugin-meetings/src/constants';
|
|
4
4
|
|
|
5
5
|
import {assert} from 'chai';
|
|
@@ -29,6 +29,15 @@ describe('plugin-meetings', () => {
|
|
|
29
29
|
);
|
|
30
30
|
});
|
|
31
31
|
|
|
32
|
+
it('can start premise recording when the correct display hint is present', () => {
|
|
33
|
+
locusInfo.parsedLocus.info.userDisplayHints.push('PREMISE_RECORDING_CONTROL_START');
|
|
34
|
+
|
|
35
|
+
assert.equal(
|
|
36
|
+
RecordingUtil.canUserStart(locusInfo.parsedLocus.info.userDisplayHints),
|
|
37
|
+
true
|
|
38
|
+
);
|
|
39
|
+
});
|
|
40
|
+
|
|
32
41
|
it('can start recording when the correct display hint is present and the policy is true', () => {
|
|
33
42
|
locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_START');
|
|
34
43
|
|
|
@@ -69,6 +78,15 @@ describe('plugin-meetings', () => {
|
|
|
69
78
|
);
|
|
70
79
|
});
|
|
71
80
|
|
|
81
|
+
it('can pause premise recording when the correct display hint is present', () => {
|
|
82
|
+
locusInfo.parsedLocus.info.userDisplayHints.push('PREMISE_RECORDING_CONTROL_PAUSE');
|
|
83
|
+
|
|
84
|
+
assert.equal(
|
|
85
|
+
RecordingUtil.canUserPause(locusInfo.parsedLocus.info.userDisplayHints),
|
|
86
|
+
true
|
|
87
|
+
);
|
|
88
|
+
});
|
|
89
|
+
|
|
72
90
|
it('can pause recording when the correct display hint is present and the policy is true', () => {
|
|
73
91
|
locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_PAUSE');
|
|
74
92
|
|
|
@@ -109,6 +127,15 @@ describe('plugin-meetings', () => {
|
|
|
109
127
|
);
|
|
110
128
|
});
|
|
111
129
|
|
|
130
|
+
it('can stop premise recording when the correct display hint is present', () => {
|
|
131
|
+
locusInfo.parsedLocus.info.userDisplayHints.push('PREMISE_RECORDING_CONTROL_STOP');
|
|
132
|
+
|
|
133
|
+
assert.equal(
|
|
134
|
+
RecordingUtil.canUserStop(locusInfo.parsedLocus.info.userDisplayHints),
|
|
135
|
+
true
|
|
136
|
+
);
|
|
137
|
+
});
|
|
138
|
+
|
|
112
139
|
it('can stop recording when the correct display hint is present and the policy is true', () => {
|
|
113
140
|
locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_STOP', {
|
|
114
141
|
[SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD]: true,
|
|
@@ -142,7 +169,7 @@ describe('plugin-meetings', () => {
|
|
|
142
169
|
});
|
|
143
170
|
|
|
144
171
|
describe('canUserResume', () => {
|
|
145
|
-
it('can
|
|
172
|
+
it('can resume recording when the correct display hint is present', () => {
|
|
146
173
|
locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_RESUME');
|
|
147
174
|
|
|
148
175
|
assert.equal(
|
|
@@ -151,7 +178,16 @@ describe('plugin-meetings', () => {
|
|
|
151
178
|
);
|
|
152
179
|
});
|
|
153
180
|
|
|
154
|
-
it('can
|
|
181
|
+
it('can resume premise recording when the correct display hint is present', () => {
|
|
182
|
+
locusInfo.parsedLocus.info.userDisplayHints.push('PREMISE_RECORDING_CONTROL_RESUME');
|
|
183
|
+
|
|
184
|
+
assert.equal(
|
|
185
|
+
RecordingUtil.canUserResume(locusInfo.parsedLocus.info.userDisplayHints),
|
|
186
|
+
true
|
|
187
|
+
);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('can resume recording when the correct display hint is present and the policy is true', () => {
|
|
155
191
|
locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_RESUME');
|
|
156
192
|
|
|
157
193
|
assert.equal(
|
|
@@ -161,7 +161,7 @@ describe('Roap', () => {
|
|
|
161
161
|
roapMessage: expectedRoapMessage,
|
|
162
162
|
locusSelfUrl: meeting.selfUrl,
|
|
163
163
|
mediaId: meeting.mediaId,
|
|
164
|
-
|
|
164
|
+
isMultistream: meeting.isMultistream,
|
|
165
165
|
locusMediaRequest: meeting.locusMediaRequest,
|
|
166
166
|
})
|
|
167
167
|
);
|
|
@@ -251,6 +251,53 @@ describe('Roap', () => {
|
|
|
251
251
|
);
|
|
252
252
|
});
|
|
253
253
|
|
|
254
|
+
it('handles the case when there is some other (not an answer) roap message type in the http response', async () => {
|
|
255
|
+
const roapError = {
|
|
256
|
+
seq: 1,
|
|
257
|
+
messageType: 'ERROR',
|
|
258
|
+
sdps: [],
|
|
259
|
+
errorType: 'error type',
|
|
260
|
+
errorCause: 'error cause',
|
|
261
|
+
headers: ['header1', 'header2'],
|
|
262
|
+
};
|
|
263
|
+
const fakeMediaConnections = [
|
|
264
|
+
{
|
|
265
|
+
remoteSdp: JSON.stringify({
|
|
266
|
+
roapMessage: roapError,
|
|
267
|
+
}),
|
|
268
|
+
},
|
|
269
|
+
];
|
|
270
|
+
|
|
271
|
+
sendRoapStub.resolves({
|
|
272
|
+
mediaConnections: fakeMediaConnections,
|
|
273
|
+
locus: fakeLocus,
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
const result = await roap.sendRoapMediaRequest({
|
|
277
|
+
meeting,
|
|
278
|
+
sdp: 'sdp',
|
|
279
|
+
reconnect: false,
|
|
280
|
+
seq: 1,
|
|
281
|
+
tieBreaker: 4294967294,
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
assert.calledOnce(sendRoapStub);
|
|
285
|
+
assert.calledOnceWithExactly(meeting.updateMediaConnections, fakeMediaConnections);
|
|
286
|
+
assert.deepEqual(result, {
|
|
287
|
+
locus: fakeLocus,
|
|
288
|
+
roapAnswer: undefined,
|
|
289
|
+
});
|
|
290
|
+
assert.calledOnceWithExactly(
|
|
291
|
+
Metrics.sendBehavioralMetric,
|
|
292
|
+
BEHAVIORAL_METRICS.ROAP_HTTP_RESPONSE_MISSING,
|
|
293
|
+
{
|
|
294
|
+
correlationId: meeting.correlationId,
|
|
295
|
+
messageType: 'ANSWER',
|
|
296
|
+
isMultistream: meeting.isMultistream,
|
|
297
|
+
}
|
|
298
|
+
);
|
|
299
|
+
});
|
|
300
|
+
|
|
254
301
|
describe('does not crash when http response is missing things', () => {
|
|
255
302
|
[
|
|
256
303
|
{mediaConnections: undefined, title: 'mediaConnections are undefined'},
|
|
@@ -4,6 +4,7 @@ import {assert} from '@webex/test-helper-chai';
|
|
|
4
4
|
import MockWebex from '@webex/test-helper-mock-webex';
|
|
5
5
|
import Meetings from '@webex/plugin-meetings';
|
|
6
6
|
import RoapRequest from '@webex/plugin-meetings/src/roap/request';
|
|
7
|
+
import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
|
|
7
8
|
import {IP_VERSION, REACHABILITY} from '@webex/plugin-meetings/src/constants';
|
|
8
9
|
|
|
9
10
|
describe('plugin-meetings/roap', () => {
|
|
@@ -23,6 +24,11 @@ describe('plugin-meetings/roap', () => {
|
|
|
23
24
|
regionCode: 'WEST-COAST',
|
|
24
25
|
};
|
|
25
26
|
|
|
27
|
+
webex.meetings.reachability = {
|
|
28
|
+
getReachabilityReportToAttachToRoap: sinon.stub().resolves({}),
|
|
29
|
+
getClientMediaPreferences: sinon.stub().resolves({}),
|
|
30
|
+
};
|
|
31
|
+
|
|
26
32
|
webex.internal = {
|
|
27
33
|
services: {
|
|
28
34
|
get: sinon.mock().returns(locusUrl),
|
|
@@ -36,6 +42,8 @@ describe('plugin-meetings/roap', () => {
|
|
|
36
42
|
},
|
|
37
43
|
};
|
|
38
44
|
|
|
45
|
+
sinon.stub(MeetingUtil, 'getIpVersion').returns(IP_VERSION.ipv4_and_ipv6);
|
|
46
|
+
|
|
39
47
|
// @ts-ignore
|
|
40
48
|
roapRequest = new RoapRequest({webex});
|
|
41
49
|
|
|
@@ -74,146 +82,80 @@ describe('plugin-meetings/roap', () => {
|
|
|
74
82
|
);
|
|
75
83
|
});
|
|
76
84
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
assert.deepEqual(res.localSdp, {
|
|
82
|
-
reachability: {
|
|
83
|
-
clusterId: {
|
|
84
|
-
udp: {
|
|
85
|
-
reachable: 'true',
|
|
86
|
-
latencyInMilliseconds: '10',
|
|
87
|
-
},
|
|
88
|
-
tcp: {
|
|
89
|
-
reachable: 'false',
|
|
90
|
-
},
|
|
91
|
-
xtls: {
|
|
92
|
-
untested: 'true',
|
|
93
|
-
}
|
|
94
|
-
},
|
|
95
|
-
},
|
|
96
|
-
});
|
|
97
|
-
assert.deepEqual(res.joinCookie, {
|
|
98
|
-
anycastEntryPoint: 'aws-eu-west-1',
|
|
99
|
-
});
|
|
100
|
-
});
|
|
85
|
+
afterEach(() => {
|
|
86
|
+
sinon.restore();
|
|
87
|
+
})
|
|
101
88
|
|
|
102
|
-
|
|
103
|
-
|
|
89
|
+
describe('sendRoap', () => {
|
|
90
|
+
it('includes clientMediaPreferences and reachability in the request correctly', async () => {
|
|
91
|
+
const locusMediaRequest = {send: sinon.stub().resolves({body: {locus: {}}})};
|
|
104
92
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
93
|
+
const FAKE_REACHABILITY_REPORT = {
|
|
94
|
+
id: 'fake reachability report',
|
|
95
|
+
};
|
|
96
|
+
const FAKE_CLIENT_MEDIA_PREFERENCES = {
|
|
97
|
+
id: 'fake client media preferences',
|
|
108
98
|
};
|
|
109
99
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
assert.deepEqual(result, {
|
|
113
|
-
joinCookie: undefined,
|
|
114
|
-
localSdp: {
|
|
115
|
-
some: 'attribute',
|
|
116
|
-
},
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
describe('sendRoap', () => {
|
|
122
|
-
it('includes joinCookie in the request correctly', async () => {
|
|
123
|
-
const locusMediaRequest = {send: sinon.stub().resolves({body: {locus: {}}})};
|
|
124
|
-
const ipVersion = IP_VERSION.unknown;
|
|
100
|
+
webex.meetings.reachability.getReachabilityReportToAttachToRoap.resolves(FAKE_REACHABILITY_REPORT);
|
|
101
|
+
webex.meetings.reachability.getClientMediaPreferences.resolves(FAKE_CLIENT_MEDIA_PREFERENCES);
|
|
125
102
|
|
|
126
103
|
await roapRequest.sendRoap({
|
|
127
104
|
locusSelfUrl: locusUrl,
|
|
128
|
-
ipVersion,
|
|
129
105
|
mediaId: 'mediaId',
|
|
130
106
|
roapMessage: {
|
|
131
107
|
seq: 'seq',
|
|
132
108
|
},
|
|
133
109
|
meetingId: 'meeting-id',
|
|
110
|
+
isMultistream: true,
|
|
134
111
|
locusMediaRequest,
|
|
135
112
|
});
|
|
136
113
|
|
|
114
|
+
assert.calledOnceWithExactly(webex.meetings.reachability.getReachabilityReportToAttachToRoap);
|
|
115
|
+
assert.calledOnceWithExactly(webex.meetings.reachability.getClientMediaPreferences, true, IP_VERSION.ipv4_and_ipv6);
|
|
116
|
+
|
|
137
117
|
const requestParams = locusMediaRequest.send.getCall(0).args[0];
|
|
138
118
|
assert.deepEqual(requestParams, {
|
|
139
119
|
type: 'RoapMessage',
|
|
140
120
|
selfUrl: locusUrl,
|
|
141
|
-
|
|
142
|
-
joinCookie: {
|
|
143
|
-
anycastEntryPoint: 'aws-eu-west-1',
|
|
144
|
-
},
|
|
121
|
+
clientMediaPreferences: FAKE_CLIENT_MEDIA_PREFERENCES,
|
|
145
122
|
mediaId: 'mediaId',
|
|
146
123
|
roapMessage: {
|
|
147
124
|
seq: 'seq',
|
|
148
125
|
},
|
|
149
|
-
reachability:
|
|
150
|
-
clusterId: {
|
|
151
|
-
tcp: {
|
|
152
|
-
reachable: 'false',
|
|
153
|
-
},
|
|
154
|
-
udp: {
|
|
155
|
-
latencyInMilliseconds: '10',
|
|
156
|
-
reachable: 'true',
|
|
157
|
-
},
|
|
158
|
-
xtls: {
|
|
159
|
-
untested: 'true',
|
|
160
|
-
},
|
|
161
|
-
},
|
|
162
|
-
},
|
|
126
|
+
reachability: FAKE_REACHABILITY_REPORT,
|
|
163
127
|
});
|
|
164
128
|
});
|
|
165
|
-
});
|
|
166
129
|
|
|
167
|
-
|
|
168
|
-
|
|
130
|
+
it('includes default clientMediaPreferences if calls to reachability fail', async () => {
|
|
131
|
+
const locusMediaRequest = {send: sinon.stub().resolves({body: {locus: {}}})};
|
|
169
132
|
|
|
170
|
-
|
|
171
|
-
new: 'sdp',
|
|
172
|
-
reachability: { someResult: 'whatever' }
|
|
173
|
-
};
|
|
174
|
-
const ipVersion = IP_VERSION.only_ipv6;
|
|
133
|
+
webex.meetings.reachability.getClientMediaPreferences.rejects(new Error('fake error'));
|
|
175
134
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
135
|
+
await roapRequest.sendRoap({
|
|
136
|
+
locusSelfUrl: locusUrl,
|
|
137
|
+
mediaId: 'mediaId',
|
|
138
|
+
roapMessage: {
|
|
139
|
+
seq: 'seq',
|
|
181
140
|
},
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
roapMessage: {
|
|
187
|
-
seq: 1,
|
|
188
|
-
},
|
|
189
|
-
locusSelfUrl: 'locusSelfUrl',
|
|
190
|
-
ipVersion,
|
|
191
|
-
mediaId: 'mediaId',
|
|
192
|
-
meetingId: 'meetingId',
|
|
193
|
-
preferTranscoding: true,
|
|
194
|
-
locusMediaRequest
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
const requestParams = locusMediaRequest.send.getCall(0).args[0];
|
|
141
|
+
meetingId: 'meeting-id',
|
|
142
|
+
isMultistream: true,
|
|
143
|
+
locusMediaRequest,
|
|
144
|
+
});
|
|
198
145
|
|
|
199
|
-
|
|
200
|
-
type: 'RoapMessage',
|
|
201
|
-
selfUrl: 'locusSelfUrl',
|
|
202
|
-
ipVersion,
|
|
203
|
-
joinCookie: {
|
|
204
|
-
anycastEntryPoint: 'aws-eu-west-1',
|
|
205
|
-
},
|
|
206
|
-
mediaId: 'mediaId',
|
|
207
|
-
roapMessage: {
|
|
208
|
-
seq: 1,
|
|
209
|
-
},
|
|
210
|
-
reachability: { someResult: 'whatever' },
|
|
211
|
-
});
|
|
146
|
+
assert.calledOnce(webex.meetings.reachability.getClientMediaPreferences);
|
|
212
147
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
148
|
+
const requestParams = locusMediaRequest.send.getCall(0).args[0];
|
|
149
|
+
assert.deepEqual(requestParams, {
|
|
150
|
+
type: 'RoapMessage',
|
|
151
|
+
selfUrl: locusUrl,
|
|
152
|
+
clientMediaPreferences: {ipver: 0, joinCookie: undefined, preferTranscoding: false},
|
|
153
|
+
mediaId: 'mediaId',
|
|
154
|
+
roapMessage: {
|
|
155
|
+
seq: 'seq',
|
|
156
|
+
},
|
|
157
|
+
reachability: undefined,
|
|
158
|
+
});
|
|
217
159
|
});
|
|
218
160
|
});
|
|
219
161
|
});
|