@webex/plugin-meetings 2.59.5 → 2.59.6-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/meeting-info/meeting-info-v2.js +7 -1
- package/dist/meeting-info/meeting-info-v2.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/meeting-info/meeting-info-v2.ts +1 -1
- 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/meeting-info/meetinginfov2.js +1 -1
- 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 -1621
- 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', () => {
|
|
@@ -3670,17 +3605,14 @@ describe('plugin-meetings', () => {
|
|
|
3670
3605
|
describe('#setUpLocusServicesListener', () => {
|
|
3671
3606
|
it('listens to the locus services update event', (done) => {
|
|
3672
3607
|
const newLocusServices = {
|
|
3673
|
-
|
|
3674
|
-
|
|
3675
|
-
|
|
3608
|
+
services: {
|
|
3609
|
+
record: {
|
|
3610
|
+
url: 'url',
|
|
3611
|
+
}
|
|
3676
3612
|
},
|
|
3677
|
-
},
|
|
3678
3613
|
};
|
|
3679
3614
|
|
|
3680
|
-
meeting.recordingController = {
|
|
3681
|
-
setServiceUrl: sinon.stub().returns(undefined),
|
|
3682
|
-
setSessionId: sinon.stub().returns(undefined),
|
|
3683
|
-
};
|
|
3615
|
+
meeting.recordingController = {setServiceUrl: sinon.stub().returns(undefined), setSessionId: sinon.stub().returns(undefined)};
|
|
3684
3616
|
|
|
3685
3617
|
meeting.locusInfo.emit(
|
|
3686
3618
|
{function: 'test', file: 'test'},
|
|
@@ -3688,10 +3620,7 @@ describe('plugin-meetings', () => {
|
|
|
3688
3620
|
newLocusServices
|
|
3689
3621
|
);
|
|
3690
3622
|
|
|
3691
|
-
assert.calledWith(
|
|
3692
|
-
meeting.recordingController.setServiceUrl,
|
|
3693
|
-
newLocusServices.services.record.url
|
|
3694
|
-
);
|
|
3623
|
+
assert.calledWith(meeting.recordingController.setServiceUrl, newLocusServices.services.record.url);
|
|
3695
3624
|
assert.calledOnce(meeting.recordingController.setSessionId);
|
|
3696
3625
|
done();
|
|
3697
3626
|
});
|
|
@@ -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
|
-
}
|