@webex/plugin-meetings 2.59.7 → 2.59.8-next.1
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/common/browser-detection.js +2 -2
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +2 -2
- package/dist/common/collection.js.map +1 -1
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/constants.js +0 -2
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/index.js +2 -2
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +6 -6
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +18 -18
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/parser.js +2 -2
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/meeting/index.js +28 -51
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/request.js +2 -2
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +4 -4
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +2 -2
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meetings/collection.js +2 -2
- package/dist/meetings/collection.js.map +1 -1
- package/dist/members/index.js +2 -2
- package/dist/members/index.js.map +1 -1
- package/dist/metrics/constants.js +0 -2
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +2 -2
- package/dist/metrics/index.js.map +1 -1
- package/dist/reachability/index.js +9 -2
- package/dist/reachability/index.js.map +1 -1
- package/dist/roap/index.js +12 -13
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/turnDiscovery.js +44 -130
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +12 -4
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +14 -56
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +15 -15
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/package.json +22 -21
- package/src/config.ts +2 -2
- package/src/constants.ts +0 -2
- package/src/meeting/index.ts +0 -35
- package/src/metrics/constants.ts +0 -2
- package/src/roap/index.ts +10 -14
- package/src/roap/turnDiscovery.ts +20 -48
- package/src/statsAnalyzer/global.ts +10 -2
- package/src/statsAnalyzer/index.ts +17 -80
- package/test/unit/spec/meeting/index.js +6 -77
- package/test/unit/spec/roap/index.ts +80 -84
- package/test/unit/spec/roap/turnDiscovery.ts +0 -21
- package/test/unit/spec/stats-analyzer/index.js +0 -151
- 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/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/reconnection-in-progress.d.ts +0 -9
- 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 -926
- 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/util.d.ts +0 -7
- package/dist/index.d.ts +0 -4
- 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/meeting/effectsState.d.ts +0 -42
- package/dist/meeting/in-meeting-actions.d.ts +0 -79
- package/dist/meeting/index.d.ts +0 -1622
- package/dist/meeting/muteState.d.ts +0 -116
- package/dist/meeting/request.d.ts +0 -255
- package/dist/meeting/state.d.ts +0 -9
- package/dist/meeting/util.d.ts +0 -2
- 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/request.d.ts +0 -27
- package/dist/meetings/util.d.ts +0 -18
- package/dist/member/index.d.ts +0 -147
- package/dist/member/member.types.d.ts +0 -11
- package/dist/member/util.d.ts +0 -2
- package/dist/members/collection.d.ts +0 -24
- package/dist/members/index.d.ts +0 -298
- package/dist/members/request.d.ts +0 -50
- package/dist/members/util.d.ts +0 -2
- package/dist/metrics/config.d.ts +0 -169
- package/dist/metrics/constants.d.ts +0 -59
- package/dist/metrics/index.d.ts +0 -152
- package/dist/networkQualityMonitor/index.d.ts +0 -70
- package/dist/peer-connection-manager/index.d.ts +0 -6
- package/dist/peer-connection-manager/util.d.ts +0 -6
- 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/index.d.ts +0 -139
- package/dist/reachability/request.d.ts +0 -35
- 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/handler.d.ts +0 -47
- 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/turnDiscovery.d.ts +0 -81
- package/dist/roap/util.d.ts +0 -2
- package/dist/statsAnalyzer/global.d.ts +0 -118
- package/dist/statsAnalyzer/index.d.ts +0 -193
- package/dist/statsAnalyzer/mqaUtil.d.ts +0 -22
- package/dist/transcription/index.d.ts +0 -64
|
@@ -1329,71 +1329,6 @@ describe('plugin-meetings', () => {
|
|
|
1329
1329
|
data: {intervalData: fakeData, networkType: 'wifi'},
|
|
1330
1330
|
});
|
|
1331
1331
|
});
|
|
1332
|
-
it('NO_FRAMES_SENT triggers "meeting:noFramesSent" event and sends metrics', async () => {
|
|
1333
|
-
meeting.mediaProperties.mediaDirection = {sendVideo: true};
|
|
1334
|
-
statsAnalyzerStub.emit(
|
|
1335
|
-
{file: 'test', function: 'test'},
|
|
1336
|
-
StatsAnalyzerModule.EVENTS.NO_FRAMES_SENT,
|
|
1337
|
-
{mediaType: 'video'}
|
|
1338
|
-
);
|
|
1339
|
-
|
|
1340
|
-
assert.calledWith(
|
|
1341
|
-
TriggerProxy.trigger,
|
|
1342
|
-
sinon.match.instanceOf(Meeting),
|
|
1343
|
-
{
|
|
1344
|
-
file: 'meeting/index',
|
|
1345
|
-
function: 'compareLastStatsResult',
|
|
1346
|
-
},
|
|
1347
|
-
EVENT_TRIGGERS.MEETING_NO_FRAMES_SENT,
|
|
1348
|
-
{
|
|
1349
|
-
mediaType: 'video',
|
|
1350
|
-
}
|
|
1351
|
-
);
|
|
1352
|
-
assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.NO_FRAMES_SENT);
|
|
1353
|
-
});
|
|
1354
|
-
it('NO_FRAMES_SENT triggers "meeting:noFramesSent" event and sends metrics for share', async () => {
|
|
1355
|
-
meeting.mediaProperties.mediaDirection = {sendShare: true};
|
|
1356
|
-
statsAnalyzerStub.emit(
|
|
1357
|
-
{file: 'test', function: 'test'},
|
|
1358
|
-
StatsAnalyzerModule.EVENTS.NO_FRAMES_SENT,
|
|
1359
|
-
{mediaType: 'share'}
|
|
1360
|
-
);
|
|
1361
|
-
|
|
1362
|
-
assert.calledWith(
|
|
1363
|
-
TriggerProxy.trigger,
|
|
1364
|
-
sinon.match.instanceOf(Meeting),
|
|
1365
|
-
{
|
|
1366
|
-
file: 'meeting/index',
|
|
1367
|
-
function: 'compareLastStatsResult',
|
|
1368
|
-
},
|
|
1369
|
-
EVENT_TRIGGERS.MEETING_NO_FRAMES_SENT,
|
|
1370
|
-
{
|
|
1371
|
-
mediaType: 'share',
|
|
1372
|
-
}
|
|
1373
|
-
);
|
|
1374
|
-
assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.NO_FRAMES_SENT);
|
|
1375
|
-
});
|
|
1376
|
-
it('NO_VIDEO_ENCODED triggers "meeting:noVideoEncoded" event and sends metrics', async () => {
|
|
1377
|
-
statsAnalyzerStub.emit(
|
|
1378
|
-
{file: 'test', function: 'test'},
|
|
1379
|
-
StatsAnalyzerModule.EVENTS.NO_VIDEO_ENCODED,
|
|
1380
|
-
{mediaType: 'video'}
|
|
1381
|
-
);
|
|
1382
|
-
|
|
1383
|
-
assert.calledWith(
|
|
1384
|
-
TriggerProxy.trigger,
|
|
1385
|
-
sinon.match.instanceOf(Meeting),
|
|
1386
|
-
{
|
|
1387
|
-
file: 'meeting/index',
|
|
1388
|
-
function: 'compareLastStatsResult',
|
|
1389
|
-
},
|
|
1390
|
-
EVENT_TRIGGERS.MEETING_NO_VIDEO_ENCODED,
|
|
1391
|
-
{
|
|
1392
|
-
mediaType: 'video',
|
|
1393
|
-
}
|
|
1394
|
-
);
|
|
1395
|
-
assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.NO_VIDEO_ENCODED);
|
|
1396
|
-
});
|
|
1397
1332
|
});
|
|
1398
1333
|
});
|
|
1399
1334
|
describe('#acknowledge', () => {
|
|
@@ -3711,17 +3646,14 @@ describe('plugin-meetings', () => {
|
|
|
3711
3646
|
describe('#setUpLocusServicesListener', () => {
|
|
3712
3647
|
it('listens to the locus services update event', (done) => {
|
|
3713
3648
|
const newLocusServices = {
|
|
3714
|
-
|
|
3715
|
-
|
|
3716
|
-
|
|
3649
|
+
services: {
|
|
3650
|
+
record: {
|
|
3651
|
+
url: 'url',
|
|
3652
|
+
}
|
|
3717
3653
|
},
|
|
3718
|
-
},
|
|
3719
3654
|
};
|
|
3720
3655
|
|
|
3721
|
-
meeting.recordingController = {
|
|
3722
|
-
setServiceUrl: sinon.stub().returns(undefined),
|
|
3723
|
-
setSessionId: sinon.stub().returns(undefined),
|
|
3724
|
-
};
|
|
3656
|
+
meeting.recordingController = {setServiceUrl: sinon.stub().returns(undefined), setSessionId: sinon.stub().returns(undefined)};
|
|
3725
3657
|
|
|
3726
3658
|
meeting.locusInfo.emit(
|
|
3727
3659
|
{function: 'test', file: 'test'},
|
|
@@ -3729,10 +3661,7 @@ describe('plugin-meetings', () => {
|
|
|
3729
3661
|
newLocusServices
|
|
3730
3662
|
);
|
|
3731
3663
|
|
|
3732
|
-
assert.calledWith(
|
|
3733
|
-
meeting.recordingController.setServiceUrl,
|
|
3734
|
-
newLocusServices.services.record.url
|
|
3735
|
-
);
|
|
3664
|
+
assert.calledWith(meeting.recordingController.setServiceUrl, newLocusServices.services.record.url);
|
|
3736
3665
|
assert.calledOnce(meeting.recordingController.setSessionId);
|
|
3737
3666
|
done();
|
|
3738
3667
|
});
|
|
@@ -41,92 +41,88 @@ describe('Roap', () => {
|
|
|
41
41
|
describe('sendRoapMediaRequest', () => {
|
|
42
42
|
let sendRoapStub;
|
|
43
43
|
let roapHandlerSubmitStub;
|
|
44
|
-
|
|
44
|
+
|
|
45
|
+
const meeting = {
|
|
46
|
+
id: 'some meeting id',
|
|
47
|
+
correlationId: 'correlation id',
|
|
48
|
+
selfUrl: 'self url',
|
|
49
|
+
mediaId: 'media id',
|
|
50
|
+
audio:{
|
|
51
|
+
isLocallyMuted: () => true,
|
|
52
|
+
},
|
|
53
|
+
video:{
|
|
54
|
+
isLocallyMuted: () => false,
|
|
55
|
+
},
|
|
56
|
+
setRoapSeq: sinon.stub(),
|
|
57
|
+
config: {experimental: {enableTurnDiscovery: false}},
|
|
58
|
+
};
|
|
45
59
|
|
|
46
60
|
beforeEach(() => {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
selfUrl: 'self url',
|
|
51
|
-
mediaId: 'media id',
|
|
52
|
-
audio: {
|
|
53
|
-
isLocallyMuted: () => true,
|
|
54
|
-
},
|
|
55
|
-
video: {
|
|
56
|
-
isLocallyMuted: () => false,
|
|
57
|
-
},
|
|
58
|
-
setRoapSeq: sinon.stub(),
|
|
59
|
-
config: {experimental: {enableTurnDiscovery: false}},
|
|
60
|
-
webex: {meetings: {reachability: {isAnyClusterReachable: () => true}}},
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
beforeEach(() => {
|
|
64
|
-
sendRoapStub = sinon.stub(RoapRequest.prototype, 'sendRoap').resolves({});
|
|
65
|
-
roapHandlerSubmitStub = sinon.stub(RoapHandler.prototype, 'submit');
|
|
66
|
-
meeting.setRoapSeq.resetHistory();
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
afterEach(() => {
|
|
70
|
-
sinon.restore();
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
[
|
|
74
|
-
{reconnect: true, turnDiscoverySkipped: false, expectEmptyMediaId: false},
|
|
75
|
-
{reconnect: true, turnDiscoverySkipped: true, expectEmptyMediaId: true},
|
|
76
|
-
{reconnect: false, turnDiscoverySkipped: false, expectEmptyMediaId: false},
|
|
77
|
-
{reconnect: false, turnDiscoverySkipped: true, expectEmptyMediaId: false},
|
|
78
|
-
].forEach(({reconnect, turnDiscoverySkipped, expectEmptyMediaId}) =>
|
|
79
|
-
it(`sends roap OFFER with ${expectEmptyMediaId ? 'empty ' : ''}mediaId when ${
|
|
80
|
-
reconnect ? '' : 'not '
|
|
81
|
-
}reconnecting and TURN discovery is ${
|
|
82
|
-
turnDiscoverySkipped ? 'skipped' : 'not skipped'
|
|
83
|
-
}`, async () => {
|
|
84
|
-
const roap = new Roap({}, {parent: 'fake'});
|
|
85
|
-
|
|
86
|
-
sinon.stub(roap.turnDiscovery, 'isSkipped').resolves(turnDiscoverySkipped);
|
|
87
|
-
|
|
88
|
-
await roap.sendRoapMediaRequest({
|
|
89
|
-
meeting,
|
|
90
|
-
sdp: 'sdp',
|
|
91
|
-
reconnect,
|
|
92
|
-
roapSeq: 1,
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
const expectedRoapMessage = {
|
|
96
|
-
messageType: 'OFFER',
|
|
97
|
-
sdps: ['sdp'],
|
|
98
|
-
version: '2',
|
|
99
|
-
seq: 2,
|
|
100
|
-
tieBreaker: 4294967294,
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
assert.calledOnce(sendRoapStub);
|
|
104
|
-
assert.calledWith(sendRoapStub, {
|
|
105
|
-
roapMessage: expectedRoapMessage,
|
|
106
|
-
correlationId: meeting.correlationId,
|
|
107
|
-
locusSelfUrl: meeting.selfUrl,
|
|
108
|
-
mediaId: expectEmptyMediaId ? '' : meeting.mediaId,
|
|
109
|
-
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
110
|
-
videoMuted: meeting.video?.isLocallyMuted(),
|
|
111
|
-
meetingId: meeting.id,
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
assert.calledTwice(roapHandlerSubmitStub);
|
|
115
|
-
assert.calledWith(roapHandlerSubmitStub, {
|
|
116
|
-
type: ROAP.SEND_ROAP_MSG,
|
|
117
|
-
msg: expectedRoapMessage,
|
|
118
|
-
correlationId: meeting.correlationId,
|
|
119
|
-
});
|
|
120
|
-
assert.calledWith(roapHandlerSubmitStub, {
|
|
121
|
-
type: ROAP.SEND_ROAP_MSG_SUCCESS,
|
|
122
|
-
seq: 2,
|
|
123
|
-
correlationId: meeting.correlationId,
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
assert.calledOnce(meeting.setRoapSeq);
|
|
127
|
-
assert.calledWith(meeting.setRoapSeq, 2);
|
|
128
|
-
})
|
|
129
|
-
);
|
|
61
|
+
sendRoapStub = sinon.stub(RoapRequest.prototype, 'sendRoap').resolves({});
|
|
62
|
+
roapHandlerSubmitStub = sinon.stub(RoapHandler.prototype, 'submit');
|
|
63
|
+
meeting.setRoapSeq.resetHistory();
|
|
130
64
|
});
|
|
65
|
+
|
|
66
|
+
afterEach(() => {
|
|
67
|
+
sinon.restore();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
[
|
|
71
|
+
{reconnect: true, enableTurnDiscovery: true, expectEmptyMediaId: false},
|
|
72
|
+
{reconnect: true, enableTurnDiscovery: false, expectEmptyMediaId: true},
|
|
73
|
+
{reconnect: false, enableTurnDiscovery: true, expectEmptyMediaId: false},
|
|
74
|
+
{reconnect: false, enableTurnDiscovery: false, expectEmptyMediaId: false},
|
|
75
|
+
].forEach(({reconnect, enableTurnDiscovery, expectEmptyMediaId}) =>
|
|
76
|
+
it(`sends roap OFFER with ${expectEmptyMediaId ? 'empty ' : ''}mediaId when ${
|
|
77
|
+
reconnect ? '' : 'not '
|
|
78
|
+
}reconnecting and TURN discovery is ${
|
|
79
|
+
enableTurnDiscovery ? 'enabled' : 'disabled'
|
|
80
|
+
}`, async () => {
|
|
81
|
+
meeting.config.experimental.enableTurnDiscovery = enableTurnDiscovery;
|
|
82
|
+
|
|
83
|
+
const roap = new Roap({}, {parent: 'fake'});
|
|
84
|
+
|
|
85
|
+
await roap.sendRoapMediaRequest({
|
|
86
|
+
meeting,
|
|
87
|
+
sdp: 'sdp',
|
|
88
|
+
reconnect,
|
|
89
|
+
roapSeq: 1,
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const expectedRoapMessage = {
|
|
93
|
+
messageType: 'OFFER',
|
|
94
|
+
sdps: ['sdp'],
|
|
95
|
+
version: '2',
|
|
96
|
+
seq: 2,
|
|
97
|
+
tieBreaker: 4294967294,
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
assert.calledOnce(sendRoapStub);
|
|
101
|
+
assert.calledWith(sendRoapStub, {
|
|
102
|
+
roapMessage: expectedRoapMessage,
|
|
103
|
+
correlationId: meeting.correlationId,
|
|
104
|
+
locusSelfUrl: meeting.selfUrl,
|
|
105
|
+
mediaId: expectEmptyMediaId ? '' : meeting.mediaId,
|
|
106
|
+
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
107
|
+
videoMuted: meeting.video?.isLocallyMuted(),
|
|
108
|
+
meetingId: meeting.id,
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
assert.calledTwice(roapHandlerSubmitStub);
|
|
112
|
+
assert.calledWith(roapHandlerSubmitStub, {
|
|
113
|
+
type: ROAP.SEND_ROAP_MSG,
|
|
114
|
+
msg: expectedRoapMessage,
|
|
115
|
+
correlationId: meeting.correlationId,
|
|
116
|
+
});
|
|
117
|
+
assert.calledWith(roapHandlerSubmitStub, {
|
|
118
|
+
type: ROAP.SEND_ROAP_MSG_SUCCESS,
|
|
119
|
+
seq: 2,
|
|
120
|
+
correlationId: meeting.correlationId,
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
assert.calledOnce(meeting.setRoapSeq);
|
|
124
|
+
assert.calledWith(meeting.setRoapSeq, 2);
|
|
125
|
+
})
|
|
126
|
+
);
|
|
131
127
|
});
|
|
132
128
|
});
|
|
@@ -352,27 +352,6 @@ describe('TurnDiscovery', () => {
|
|
|
352
352
|
});
|
|
353
353
|
});
|
|
354
354
|
|
|
355
|
-
describe('isSkipped', () => {
|
|
356
|
-
[
|
|
357
|
-
{enabledInConfig: true, isAnyClusterReachable: true, expectedIsSkipped: true},
|
|
358
|
-
{enabledInConfig: true, isAnyClusterReachable: false, expectedIsSkipped: false},
|
|
359
|
-
{enabledInConfig: false, isAnyClusterReachable: true, expectedIsSkipped: true},
|
|
360
|
-
{enabledInConfig: false, isAnyClusterReachable: false, expectedIsSkipped: true},
|
|
361
|
-
].forEach(({enabledInConfig, isAnyClusterReachable, expectedIsSkipped}) => {
|
|
362
|
-
it(`returns ${expectedIsSkipped} when TURN discovery is ${enabledInConfig ? '' : 'not '} enabled in config and isAnyClusterReachable() returns ${isAnyClusterReachable ? 'true' : 'false'}`, async () => {
|
|
363
|
-
testMeeting.config.experimental.enableTurnDiscovery = enabledInConfig;
|
|
364
|
-
|
|
365
|
-
sinon.stub(testMeeting.webex.meetings.reachability, 'isAnyClusterReachable').resolves(isAnyClusterReachable);
|
|
366
|
-
|
|
367
|
-
const td = new TurnDiscovery(mockRoapRequest);
|
|
368
|
-
|
|
369
|
-
const isSkipped = await td.isSkipped(testMeeting);
|
|
370
|
-
|
|
371
|
-
assert.equal(isSkipped, expectedIsSkipped);
|
|
372
|
-
})
|
|
373
|
-
})
|
|
374
|
-
})
|
|
375
|
-
|
|
376
355
|
describe('handleTurnDiscoveryResponse', () => {
|
|
377
356
|
it("doesn't do anything if turn discovery was not started", () => {
|
|
378
357
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
@@ -82,22 +82,6 @@ describe('plugin-meetings', () => {
|
|
|
82
82
|
let pc;
|
|
83
83
|
let networkQualityMonitor;
|
|
84
84
|
let statsAnalyzer;
|
|
85
|
-
const statusResultOutboundRTP = {
|
|
86
|
-
type: 'outbound-rtp',
|
|
87
|
-
frameHeight: 720,
|
|
88
|
-
frameWidth: 1280,
|
|
89
|
-
packetsLost: 11,
|
|
90
|
-
framesSent: 105,
|
|
91
|
-
hugeFramesSent: 1,
|
|
92
|
-
framesEncoded: 102,
|
|
93
|
-
rttThreshold: 501,
|
|
94
|
-
jitterThreshold: 501,
|
|
95
|
-
jitterBufferDelay: 288.131459,
|
|
96
|
-
jitterBufferEmittedCount: 4013,
|
|
97
|
-
trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
|
|
98
|
-
bytesSent: 1233,
|
|
99
|
-
totalPacketsSent: 100,
|
|
100
|
-
};
|
|
101
85
|
|
|
102
86
|
let receivedEventsData = {
|
|
103
87
|
local: {},
|
|
@@ -193,12 +177,6 @@ describe('plugin-meetings', () => {
|
|
|
193
177
|
statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STOPPED, (data) => {
|
|
194
178
|
receivedEventsData.remote.stopped = data;
|
|
195
179
|
});
|
|
196
|
-
statsAnalyzer.on(EVENTS.NO_FRAMES_SENT, (data) => {
|
|
197
|
-
receivedEventsData.noFramesSent = data;
|
|
198
|
-
});
|
|
199
|
-
statsAnalyzer.on(EVENTS.NO_VIDEO_ENCODED, (data) => {
|
|
200
|
-
receivedEventsData.noVideoEncoded = data;
|
|
201
|
-
});
|
|
202
180
|
});
|
|
203
181
|
|
|
204
182
|
afterEach(() => {
|
|
@@ -304,135 +282,6 @@ describe('plugin-meetings', () => {
|
|
|
304
282
|
|
|
305
283
|
checkReceivedEvent({expected: {remote: {stopped: {type: 'video'}}}});
|
|
306
284
|
});
|
|
307
|
-
|
|
308
|
-
const checkStats = (type) => {
|
|
309
|
-
const statsResult = {
|
|
310
|
-
height: 720,
|
|
311
|
-
width: 1280,
|
|
312
|
-
jitterBufferDelay: 288.131459,
|
|
313
|
-
jitterBufferEmittedCount: 4013,
|
|
314
|
-
trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
|
|
315
|
-
avgJitterDelay: 0.07179951632195365,
|
|
316
|
-
};
|
|
317
|
-
if (type === 'inbound-rtp') {
|
|
318
|
-
statsResult.framesDecoded = 4013;
|
|
319
|
-
statsResult.framesDropped = 0;
|
|
320
|
-
statsResult.framesReceived = 4016;
|
|
321
|
-
assert.deepEqual(statsAnalyzer.statsResults.resolutions.video.recv, statsResult);
|
|
322
|
-
} else if (type === 'outbound-rtp') {
|
|
323
|
-
statsResult.framesSent = 105;
|
|
324
|
-
statsResult.hugeFramesSent = 1;
|
|
325
|
-
assert.deepEqual(statsAnalyzer.statsResults.resolutions.video.send, statsResult);
|
|
326
|
-
}
|
|
327
|
-
};
|
|
328
|
-
|
|
329
|
-
it('processes track results and populate statsResults.resolutions object when type is inbound-rtp with video', async () => {
|
|
330
|
-
await startStatsAnalyzer({expected: {receiveVideo: true}});
|
|
331
|
-
const statusResultInboundRTP = {
|
|
332
|
-
type: 'inbound-rtp',
|
|
333
|
-
frameHeight: 720,
|
|
334
|
-
frameWidth: 1280,
|
|
335
|
-
packetsLost: 11,
|
|
336
|
-
rttThreshold: 501,
|
|
337
|
-
jitterThreshold: 501,
|
|
338
|
-
framesDecoded: 4013,
|
|
339
|
-
framesDropped: 0,
|
|
340
|
-
framesReceived: 4016,
|
|
341
|
-
jitterBufferDelay: 288.131459,
|
|
342
|
-
jitterBufferEmittedCount: 4013,
|
|
343
|
-
trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
|
|
344
|
-
};
|
|
345
|
-
await statsAnalyzer.parseGetStatsResult(statusResultInboundRTP, 'video');
|
|
346
|
-
checkStats('inbound-rtp');
|
|
347
|
-
});
|
|
348
|
-
it('processes track results and populate statsResults.resolutions object when type is outbound-rtp with video', async () => {
|
|
349
|
-
await startStatsAnalyzer({expected: {receiveVideo: true}});
|
|
350
|
-
|
|
351
|
-
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
|
|
352
|
-
checkStats('outbound-rtp');
|
|
353
|
-
});
|
|
354
|
-
|
|
355
|
-
it('doesnot processes track results with audio', async () => {
|
|
356
|
-
await startStatsAnalyzer({expected: {receiveAudio: true}});
|
|
357
|
-
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'audio');
|
|
358
|
-
assert.deepEqual(statsAnalyzer.statsResults.resolutions.audio, undefined);
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
it('emits NO_FRAMES_ENCODED when frames are not being encoded', async () => {
|
|
362
|
-
const expected = {mediaType: 'video'};
|
|
363
|
-
await startStatsAnalyzer({expected: {sendVideo: true}});
|
|
364
|
-
|
|
365
|
-
statsAnalyzer.lastStatsResults.video.send = {framesEncoded: 102, totalPacketsSent: 106};
|
|
366
|
-
|
|
367
|
-
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
|
|
368
|
-
|
|
369
|
-
statsAnalyzer.compareLastStatsResult();
|
|
370
|
-
assert.deepEqual(receivedEventsData.noVideoEncoded, expected);
|
|
371
|
-
});
|
|
372
|
-
|
|
373
|
-
it('emits NO_FRAMES_SENT when frames are not being sent but frames are being encoded', async () => {
|
|
374
|
-
await startStatsAnalyzer({expected: {sendVideo: true}});
|
|
375
|
-
|
|
376
|
-
const expected = {mediaType: 'video'};
|
|
377
|
-
|
|
378
|
-
statsAnalyzer.lastStatsResults.video.send = {
|
|
379
|
-
framesEncoded: 10,
|
|
380
|
-
framesSent: 105,
|
|
381
|
-
totalPacketsSent: 106,
|
|
382
|
-
};
|
|
383
|
-
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
|
|
384
|
-
|
|
385
|
-
statsAnalyzer.compareLastStatsResult();
|
|
386
|
-
assert.deepEqual(receivedEventsData.noFramesSent, expected);
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
it('doesnot emits NO_FRAMES_SENT when last emitted event is LOCAL_MEDIA_STOPPED', async () => {
|
|
390
|
-
statsAnalyzer.lastEmittedStartStopEvent.video.local = EVENTS.LOCAL_MEDIA_STOPPED;
|
|
391
|
-
|
|
392
|
-
await startStatsAnalyzer({expected: {sendVideo: true}});
|
|
393
|
-
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
|
|
394
|
-
|
|
395
|
-
statsAnalyzer.compareLastStatsResult();
|
|
396
|
-
assert.deepEqual(receivedEventsData.noFramesSent, undefined);
|
|
397
|
-
});
|
|
398
|
-
|
|
399
|
-
it('emits NO_FRAMES_ENCODED when frames are not being encoded for share', async () => {
|
|
400
|
-
const expected = {mediaType: 'share'};
|
|
401
|
-
await startStatsAnalyzer({expected: {sendShare: true}});
|
|
402
|
-
|
|
403
|
-
statsAnalyzer.lastStatsResults.share.send = {framesEncoded: 102, totalPacketsSent: 106};
|
|
404
|
-
|
|
405
|
-
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
|
|
406
|
-
|
|
407
|
-
statsAnalyzer.compareLastStatsResult();
|
|
408
|
-
assert.deepEqual(receivedEventsData.noVideoEncoded, expected);
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
it('emits NO_FRAMES_SENT when frames are not being sent but frames are being encoded for share', async () => {
|
|
412
|
-
const expected = {mediaType: 'share'};
|
|
413
|
-
await startStatsAnalyzer({expected: {sendShare: true}});
|
|
414
|
-
|
|
415
|
-
statsAnalyzer.lastStatsResults.share.send = {
|
|
416
|
-
framesEncoded: 10,
|
|
417
|
-
framesSent: 105,
|
|
418
|
-
totalPacketsSent: 106,
|
|
419
|
-
};
|
|
420
|
-
|
|
421
|
-
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
|
|
422
|
-
|
|
423
|
-
statsAnalyzer.compareLastStatsResult();
|
|
424
|
-
assert.deepEqual(receivedEventsData.noFramesSent, expected);
|
|
425
|
-
});
|
|
426
|
-
|
|
427
|
-
it('doesnot emits NO_FRAMES_SENT when last emitted event is LOCAL_MEDIA_STOPPED for share', async () => {
|
|
428
|
-
statsAnalyzer.lastEmittedStartStopEvent.video.local = EVENTS.LOCAL_MEDIA_STOPPED;
|
|
429
|
-
|
|
430
|
-
await startStatsAnalyzer({expected: {sendShare: true}});
|
|
431
|
-
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
|
|
432
|
-
|
|
433
|
-
statsAnalyzer.compareLastStatsResult();
|
|
434
|
-
assert.deepEqual(receivedEventsData.noFramesSent, undefined);
|
|
435
|
-
});
|
|
436
285
|
});
|
|
437
286
|
});
|
|
438
287
|
});
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/// <reference types="lodash" />
|
|
2
|
-
declare const _default: ((agent?: any) => {
|
|
3
|
-
getOSName: () => any;
|
|
4
|
-
getOSVersion: () => any;
|
|
5
|
-
getBrowserName: () => any;
|
|
6
|
-
getBrowserVersion: () => any;
|
|
7
|
-
isBrowser: (name: any) => boolean;
|
|
8
|
-
}) & import("lodash").MemoizedFunction;
|
|
9
|
-
export default _default;
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @class Collection
|
|
3
|
-
*/
|
|
4
|
-
export default class Collection {
|
|
5
|
-
namespace: string;
|
|
6
|
-
propertyName: string;
|
|
7
|
-
/**
|
|
8
|
-
* @param {String} property
|
|
9
|
-
* @memberof Collection
|
|
10
|
-
*/
|
|
11
|
-
constructor(property: string);
|
|
12
|
-
/**
|
|
13
|
-
* @param {String} id ID of the thing stuffed into the collection at id location
|
|
14
|
-
* @returns {Any} returns whatever is being stuffed into the collection
|
|
15
|
-
* @public
|
|
16
|
-
* @memberof Collection
|
|
17
|
-
*/
|
|
18
|
-
get(id: string): any;
|
|
19
|
-
/**
|
|
20
|
-
* @param {String} id the id of the meeting info instance to add to the collection
|
|
21
|
-
* @param {Any} value the thing to set in the collection
|
|
22
|
-
* @returns {Any} returns the thing just put in the collection
|
|
23
|
-
* @public
|
|
24
|
-
* @memberof Collection
|
|
25
|
-
*/
|
|
26
|
-
set(id: string, value: any): any;
|
|
27
|
-
/**
|
|
28
|
-
* remove the thing at the id
|
|
29
|
-
* @param {String} id ID of the thing you wish to delete from the collection
|
|
30
|
-
* @returns {undefined}
|
|
31
|
-
* @public
|
|
32
|
-
* @memberof Collection
|
|
33
|
-
*/
|
|
34
|
-
delete(id: string): void;
|
|
35
|
-
/**
|
|
36
|
-
* @returns {Object} returns an object map of things stuffed into the collection
|
|
37
|
-
* @public
|
|
38
|
-
* @memberof Collection
|
|
39
|
-
*/
|
|
40
|
-
getAll(): any;
|
|
41
|
-
/**
|
|
42
|
-
* @param {Object} set the replacement object
|
|
43
|
-
* @returns {Object} returns an object map of things stuffed into the collection
|
|
44
|
-
* @public
|
|
45
|
-
* @memberof Collection
|
|
46
|
-
*/
|
|
47
|
-
setAll(set: object): any;
|
|
48
|
-
}
|
package/dist/common/config.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Extended Error object to signify captcha related errors
|
|
3
|
-
*/
|
|
4
|
-
export default class CaptchaError extends Error {
|
|
5
|
-
code: any;
|
|
6
|
-
error: any;
|
|
7
|
-
sdkMessage: any;
|
|
8
|
-
/**
|
|
9
|
-
*
|
|
10
|
-
* @constructor
|
|
11
|
-
* @param {String} [message]
|
|
12
|
-
* @param {Object} [error]
|
|
13
|
-
*/
|
|
14
|
-
constructor(message?: string, error?: any);
|
|
15
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Extended Error object to signify the intent to join for unclaimed PMR scenarios
|
|
3
|
-
*/
|
|
4
|
-
export default class IntentToJoinError extends Error {
|
|
5
|
-
code: any;
|
|
6
|
-
error: any;
|
|
7
|
-
joinIntentRequired: any;
|
|
8
|
-
sdkMessage: any;
|
|
9
|
-
/**
|
|
10
|
-
*
|
|
11
|
-
* @constructor
|
|
12
|
-
* @param {String} [message]
|
|
13
|
-
* @param {Object} [error]
|
|
14
|
-
*/
|
|
15
|
-
constructor(message?: string, error?: any);
|
|
16
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Extended Error object to signify a join meeting error
|
|
3
|
-
*/
|
|
4
|
-
export default class JoinMeetingError extends Error {
|
|
5
|
-
code: any;
|
|
6
|
-
error: any;
|
|
7
|
-
joinOptions: any;
|
|
8
|
-
sdkMessage: any;
|
|
9
|
-
/**
|
|
10
|
-
*
|
|
11
|
-
* @constructor
|
|
12
|
-
* @param {Object} [options]
|
|
13
|
-
* @param {String} [message]
|
|
14
|
-
* @param {Object} [error]
|
|
15
|
-
*/
|
|
16
|
-
constructor(options?: object, message?: string, error?: any);
|
|
17
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Extended Error object for media errors
|
|
3
|
-
*/
|
|
4
|
-
export default class MediaError extends Error {
|
|
5
|
-
code: any;
|
|
6
|
-
error: any;
|
|
7
|
-
sdkMessage: any;
|
|
8
|
-
/**
|
|
9
|
-
*
|
|
10
|
-
* @constructor
|
|
11
|
-
* @param {String} [message]
|
|
12
|
-
* @param {Object} [error]
|
|
13
|
-
*/
|
|
14
|
-
constructor(message?: string, error?: any);
|
|
15
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Extended Error object for general parameter errors
|
|
3
|
-
*/
|
|
4
|
-
export default class ParameterError extends Error {
|
|
5
|
-
sdkMessage: string;
|
|
6
|
-
error: null;
|
|
7
|
-
code: number;
|
|
8
|
-
/**
|
|
9
|
-
*
|
|
10
|
-
* @constructor
|
|
11
|
-
* @param {String} [message]
|
|
12
|
-
* @param {Object} [error]
|
|
13
|
-
*/
|
|
14
|
-
constructor(message?: string, error?: any);
|
|
15
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Extended Error object to signify password related errors
|
|
3
|
-
*/
|
|
4
|
-
export default class PasswordError extends Error {
|
|
5
|
-
code: any;
|
|
6
|
-
error: any;
|
|
7
|
-
sdkMessage: any;
|
|
8
|
-
/**
|
|
9
|
-
*
|
|
10
|
-
* @constructor
|
|
11
|
-
* @param {String} [message]
|
|
12
|
-
* @param {Object} [error]
|
|
13
|
-
*/
|
|
14
|
-
constructor(message?: string, error?: any);
|
|
15
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Extended Error object for general parameter errors
|
|
3
|
-
*/
|
|
4
|
-
export default class PermissionError extends Error {
|
|
5
|
-
code: any;
|
|
6
|
-
error: any;
|
|
7
|
-
sdkMessage: any;
|
|
8
|
-
/**
|
|
9
|
-
* @constructor
|
|
10
|
-
* @param {String} [message]
|
|
11
|
-
* @param {Object} [error]
|
|
12
|
-
*/
|
|
13
|
-
constructor(message?: string, error?: any);
|
|
14
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Extended Error object to signify the intent to join for unclaimed PMR scenarios
|
|
3
|
-
*/
|
|
4
|
-
export default class ReconnectionError extends Error {
|
|
5
|
-
code: any;
|
|
6
|
-
error: any;
|
|
7
|
-
sdkMessage: any;
|
|
8
|
-
/**
|
|
9
|
-
*
|
|
10
|
-
* @constructor
|
|
11
|
-
* @param {String} [message]
|
|
12
|
-
* @param {Object} [error]
|
|
13
|
-
*/
|
|
14
|
-
constructor(message?: string, error?: any);
|
|
15
|
-
}
|