mediasoup-client 3.6.96 → 3.6.98
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/lib/Device.js +5 -6
- package/lib/Transport.d.ts +7 -0
- package/lib/Transport.d.ts.map +1 -1
- package/lib/Transport.js +21 -0
- package/lib/handlers/Chrome111.d.ts.map +1 -1
- package/lib/handlers/Chrome111.js +7 -8
- package/lib/handlers/Chrome55.d.ts.map +1 -1
- package/lib/handlers/Chrome55.js +7 -8
- package/lib/handlers/Chrome67.d.ts.map +1 -1
- package/lib/handlers/Chrome67.js +7 -8
- package/lib/handlers/Chrome70.d.ts.map +1 -1
- package/lib/handlers/Chrome70.js +7 -8
- package/lib/handlers/Chrome74.d.ts.map +1 -1
- package/lib/handlers/Chrome74.js +7 -8
- package/lib/handlers/FakeHandler.d.ts +2 -1
- package/lib/handlers/FakeHandler.d.ts.map +1 -1
- package/lib/handlers/FakeHandler.js +4 -0
- package/lib/handlers/Firefox60.d.ts.map +1 -1
- package/lib/handlers/Firefox60.js +3 -0
- package/lib/handlers/HandlerInterface.d.ts +2 -1
- package/lib/handlers/HandlerInterface.d.ts.map +1 -1
- package/lib/handlers/ReactNative.d.ts.map +1 -1
- package/lib/handlers/ReactNative.js +7 -8
- package/lib/handlers/ReactNativeUnifiedPlan.d.ts.map +1 -1
- package/lib/handlers/ReactNativeUnifiedPlan.js +8 -9
- package/lib/handlers/Safari11.d.ts.map +1 -1
- package/lib/handlers/Safari11.js +7 -8
- package/lib/handlers/Safari12.d.ts.map +1 -1
- package/lib/handlers/Safari12.js +7 -8
- package/lib/handlers/ortc/utils.js +1 -2
- package/lib/handlers/sdp/MediaSection.js +1 -2
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/tests/test.js +64 -44
- package/package.json +2 -2
package/lib/tests/test.js
CHANGED
|
@@ -212,7 +212,6 @@ test('transport.produce() without "connect" listener rejects', async () => {
|
|
|
212
212
|
.toThrow(Error);
|
|
213
213
|
}, 500);
|
|
214
214
|
test('transport.produce() succeeds', async () => {
|
|
215
|
-
var _a, _b;
|
|
216
215
|
const audioTrack = new fake_mediastreamtrack_1.FakeMediaStreamTrack({ kind: 'audio' });
|
|
217
216
|
const videoTrack = new fake_mediastreamtrack_1.FakeMediaStreamTrack({ kind: 'video' });
|
|
218
217
|
let audioProducerId;
|
|
@@ -307,12 +306,12 @@ test('transport.produce() succeeds', async () => {
|
|
|
307
306
|
encodings = audioProducer.rtpParameters.encodings;
|
|
308
307
|
expect(Array.isArray(encodings)).toBe(true);
|
|
309
308
|
expect(encodings.length).toBe(1);
|
|
310
|
-
expect(typeof
|
|
309
|
+
expect(typeof encodings?.[0]).toBe('object');
|
|
311
310
|
expect(Object.keys(encodings[0])).toEqual(['ssrc', 'dtx']);
|
|
312
|
-
expect(typeof
|
|
311
|
+
expect(typeof encodings?.[0].ssrc).toBe('number');
|
|
313
312
|
rtcp = audioProducer.rtpParameters.rtcp;
|
|
314
313
|
expect(typeof rtcp).toBe('object');
|
|
315
|
-
expect(typeof
|
|
314
|
+
expect(typeof rtcp?.cname).toBe('string');
|
|
316
315
|
expect(audioProducer.paused).toBe(true);
|
|
317
316
|
expect(audioProducer.maxSpatialLayer).toBe(undefined);
|
|
318
317
|
expect(audioProducer.appData).toEqual({ foo: 'FOO' });
|
|
@@ -401,19 +400,19 @@ test('transport.produce() succeeds', async () => {
|
|
|
401
400
|
encodings = videoProducer.rtpParameters.encodings;
|
|
402
401
|
expect(Array.isArray(encodings)).toBe(true);
|
|
403
402
|
expect(encodings.length).toBe(2);
|
|
404
|
-
expect(typeof
|
|
405
|
-
expect(typeof
|
|
406
|
-
expect(typeof
|
|
403
|
+
expect(typeof encodings?.[0]).toBe('object');
|
|
404
|
+
expect(typeof encodings?.[0].ssrc).toBe('number');
|
|
405
|
+
expect(typeof encodings?.[0].rtx).toBe('object');
|
|
407
406
|
expect(Object.keys(encodings[0].rtx)).toEqual(['ssrc']);
|
|
408
|
-
expect(typeof
|
|
409
|
-
expect(typeof
|
|
410
|
-
expect(typeof
|
|
411
|
-
expect(typeof
|
|
407
|
+
expect(typeof encodings?.[0].rtx?.ssrc).toBe('number');
|
|
408
|
+
expect(typeof encodings?.[1]).toBe('object');
|
|
409
|
+
expect(typeof encodings?.[1].ssrc).toBe('number');
|
|
410
|
+
expect(typeof encodings?.[1].rtx).toBe('object');
|
|
412
411
|
expect(Object.keys(encodings[1].rtx)).toEqual(['ssrc']);
|
|
413
|
-
expect(typeof
|
|
412
|
+
expect(typeof encodings?.[1].rtx?.ssrc).toBe('number');
|
|
414
413
|
rtcp = videoProducer.rtpParameters.rtcp;
|
|
415
414
|
expect(typeof rtcp).toBe('object');
|
|
416
|
-
expect(typeof
|
|
415
|
+
expect(typeof rtcp?.cname).toBe('string');
|
|
417
416
|
expect(videoProducer.paused).toBe(false);
|
|
418
417
|
expect(videoProducer.maxSpatialLayer).toBe(undefined);
|
|
419
418
|
expect(videoProducer.appData).toEqual({});
|
|
@@ -446,7 +445,6 @@ test('transport.produce() with a non object appData rejects with TypeError', asy
|
|
|
446
445
|
.toThrow(TypeError);
|
|
447
446
|
}, 500);
|
|
448
447
|
test('transport.consume() succeeds', async () => {
|
|
449
|
-
var _a;
|
|
450
448
|
const audioConsumerRemoteParameters = fakeParameters.generateConsumerRemoteParameters({ codecMimeType: 'audio/opus' });
|
|
451
449
|
const videoConsumerRemoteParameters = fakeParameters.generateConsumerRemoteParameters({ codecMimeType: 'video/VP8' });
|
|
452
450
|
let connectEventNumTimesCalled = 0;
|
|
@@ -517,12 +515,12 @@ test('transport.consume() succeeds', async () => {
|
|
|
517
515
|
encodings = audioConsumer.rtpParameters.encodings;
|
|
518
516
|
expect(Array.isArray(encodings)).toBe(true);
|
|
519
517
|
expect(encodings.length).toBe(1);
|
|
520
|
-
expect(typeof
|
|
518
|
+
expect(typeof encodings?.[0]).toBe('object');
|
|
521
519
|
expect(Object.keys(encodings[0])).toEqual(['ssrc', 'dtx']);
|
|
522
520
|
expect(typeof encodings[0].ssrc).toBe('number');
|
|
523
521
|
rtcp = audioProducer.rtpParameters.rtcp;
|
|
524
522
|
expect(typeof rtcp).toBe('object');
|
|
525
|
-
expect(typeof
|
|
523
|
+
expect(typeof rtcp?.cname).toBe('string');
|
|
526
524
|
expect(audioConsumer.paused).toBe(false);
|
|
527
525
|
expect(audioConsumer.appData).toEqual({ bar: 'BAR' });
|
|
528
526
|
videoConsumer = await recvTransport.consume({
|
|
@@ -602,15 +600,15 @@ test('transport.consume() succeeds', async () => {
|
|
|
602
600
|
encodings = videoConsumer.rtpParameters.encodings;
|
|
603
601
|
expect(Array.isArray(encodings)).toBe(true);
|
|
604
602
|
expect(encodings.length).toBe(1);
|
|
605
|
-
expect(typeof
|
|
603
|
+
expect(typeof encodings?.[0]).toBe('object');
|
|
606
604
|
expect(Object.keys(encodings[0])).toEqual(['ssrc', 'rtx', 'dtx']);
|
|
607
|
-
expect(typeof
|
|
608
|
-
expect(typeof
|
|
605
|
+
expect(typeof encodings?.[0].ssrc).toBe('number');
|
|
606
|
+
expect(typeof encodings?.[0].rtx).toBe('object');
|
|
609
607
|
expect(Object.keys(encodings[0].rtx)).toEqual(['ssrc']);
|
|
610
|
-
expect(typeof
|
|
608
|
+
expect(typeof encodings?.[0].rtx?.ssrc).toBe('number');
|
|
611
609
|
rtcp = videoConsumer.rtpParameters.rtcp;
|
|
612
610
|
expect(typeof rtcp).toBe('object');
|
|
613
|
-
expect(typeof
|
|
611
|
+
expect(typeof rtcp?.cname).toBe('string');
|
|
614
612
|
expect(videoConsumer.paused).toBe(false);
|
|
615
613
|
expect(videoConsumer.appData).toEqual({});
|
|
616
614
|
recvTransport.removeAllListeners('connect');
|
|
@@ -841,6 +839,36 @@ test('transport.updateIceServers() without iceServers rejects with TypeError', a
|
|
|
841
839
|
.rejects
|
|
842
840
|
.toThrow(TypeError);
|
|
843
841
|
}, 500);
|
|
842
|
+
test('ICE gathering state change fires "icegatheringstatechange" in live Transport', () => {
|
|
843
|
+
// NOTE: These tests are a bit flaky and we should isolate them. FakeHandler
|
|
844
|
+
// emits '@connectionstatechange' with value 'connecting' as soon as its
|
|
845
|
+
// private setupTransport() method is called (which has happens many times in
|
|
846
|
+
// tests above already). So here we have to reset it manually to test things.
|
|
847
|
+
// @ts-ignore
|
|
848
|
+
sendTransport.handler.setIceGatheringState('new');
|
|
849
|
+
// @ts-ignore
|
|
850
|
+
sendTransport.handler.setConnectionState('new');
|
|
851
|
+
let iceGatheringStateChangeEventNumTimesCalled = 0;
|
|
852
|
+
let connectionStateChangeEventNumTimesCalled = 0;
|
|
853
|
+
sendTransport.on('icegatheringstatechange', (iceGatheringState) => {
|
|
854
|
+
iceGatheringStateChangeEventNumTimesCalled++;
|
|
855
|
+
expect(iceGatheringState).toBe('complete');
|
|
856
|
+
expect(sendTransport.iceGatheringState).toBe('complete');
|
|
857
|
+
expect(sendTransport.connectionState).toBe('new');
|
|
858
|
+
});
|
|
859
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
860
|
+
sendTransport.on('connectionstatechange', (connectionState) => {
|
|
861
|
+
connectionStateChangeEventNumTimesCalled++;
|
|
862
|
+
});
|
|
863
|
+
// @ts-ignore
|
|
864
|
+
sendTransport.handler.setIceGatheringState('complete');
|
|
865
|
+
expect(iceGatheringStateChangeEventNumTimesCalled).toBe(1);
|
|
866
|
+
expect(connectionStateChangeEventNumTimesCalled).toBe(0);
|
|
867
|
+
expect(sendTransport.iceGatheringState).toBe('complete');
|
|
868
|
+
expect(sendTransport.connectionState).toBe('new');
|
|
869
|
+
sendTransport.removeAllListeners('icegatheringstatechange');
|
|
870
|
+
sendTransport.removeAllListeners('connectionstatechange');
|
|
871
|
+
});
|
|
844
872
|
test('connection state change fires "connectionstatechange" in live Transport', () => {
|
|
845
873
|
let connectionStateChangeEventNumTimesCalled = 0;
|
|
846
874
|
sendTransport.on('connectionstatechange', (connectionState) => {
|
|
@@ -854,20 +882,17 @@ test('connection state change fires "connectionstatechange" in live Transport',
|
|
|
854
882
|
sendTransport.removeAllListeners('connectionstatechange');
|
|
855
883
|
});
|
|
856
884
|
test('producer.pause() succeeds', () => {
|
|
857
|
-
var _a;
|
|
858
885
|
videoProducer.pause();
|
|
859
886
|
expect(videoProducer.paused).toBe(true);
|
|
860
887
|
// Track will be still enabled due to disableTrackOnPause: false.
|
|
861
|
-
expect(
|
|
888
|
+
expect(videoProducer.track?.enabled).toBe(true);
|
|
862
889
|
});
|
|
863
890
|
test('producer.resume() succeeds', () => {
|
|
864
|
-
var _a;
|
|
865
891
|
videoProducer.resume();
|
|
866
892
|
expect(videoProducer.paused).toBe(false);
|
|
867
|
-
expect(
|
|
893
|
+
expect(videoProducer.track?.enabled).toBe(true);
|
|
868
894
|
});
|
|
869
895
|
test('producer.replaceTrack() with a new track succeeds', async () => {
|
|
870
|
-
var _a;
|
|
871
896
|
// Have the audio Producer paused.
|
|
872
897
|
audioProducer.pause();
|
|
873
898
|
const audioProducerPreviousTrack = audioProducer.track;
|
|
@@ -876,8 +901,8 @@ test('producer.replaceTrack() with a new track succeeds', async () => {
|
|
|
876
901
|
.resolves
|
|
877
902
|
.toBe(undefined);
|
|
878
903
|
// Previous track must be 'live' due to stopTracks: false.
|
|
879
|
-
expect(audioProducerPreviousTrack
|
|
880
|
-
expect(
|
|
904
|
+
expect(audioProducerPreviousTrack?.readyState).toBe('live');
|
|
905
|
+
expect(audioProducer.track?.readyState).toBe('live');
|
|
881
906
|
expect(audioProducer.track).not.toBe(audioProducerPreviousTrack);
|
|
882
907
|
expect(audioProducer.track).toBe(newAudioTrack);
|
|
883
908
|
// Producer was already paused.
|
|
@@ -890,7 +915,7 @@ test('producer.replaceTrack() with a new track succeeds', async () => {
|
|
|
890
915
|
.resolves
|
|
891
916
|
.toBe(undefined);
|
|
892
917
|
// Previous track must be 'ended' due to stopTracks: true.
|
|
893
|
-
expect(videoProducerPreviousTrack
|
|
918
|
+
expect(videoProducerPreviousTrack?.readyState).toBe('ended');
|
|
894
919
|
expect(videoProducer.track).not.toBe(videoProducerPreviousTrack);
|
|
895
920
|
expect(videoProducer.track).toBe(newVideoTrack);
|
|
896
921
|
expect(videoProducer.paused).toBe(false);
|
|
@@ -903,7 +928,7 @@ test('producer.replaceTrack() with null succeeds', async () => {
|
|
|
903
928
|
.resolves
|
|
904
929
|
.toBe(undefined);
|
|
905
930
|
// Previous track must be 'live' due to stopTracks: false.
|
|
906
|
-
expect(audioProducerPreviousTrack
|
|
931
|
+
expect(audioProducerPreviousTrack?.readyState).toBe('live');
|
|
907
932
|
expect(audioProducer.track).toBeNull();
|
|
908
933
|
// Producer was already paused.
|
|
909
934
|
expect(audioProducer.paused).toBe(true);
|
|
@@ -919,26 +944,24 @@ test('producer.replaceTrack() with null succeeds', async () => {
|
|
|
919
944
|
// The given audio track was muted but the Producer was not, so the track
|
|
920
945
|
// must not be muted now.
|
|
921
946
|
expect(audioProducer.paused).toBe(false);
|
|
922
|
-
expect(audioProducerPreviousTrack
|
|
947
|
+
expect(audioProducerPreviousTrack?.enabled).toBe(true);
|
|
923
948
|
// Reset the audio paused state.
|
|
924
949
|
audioProducer.resume();
|
|
925
950
|
}, 500);
|
|
926
951
|
test('producer.replaceTrack() with an ended track rejects with InvalidStateError', async () => {
|
|
927
|
-
var _a;
|
|
928
952
|
const track = new fake_mediastreamtrack_1.FakeMediaStreamTrack({ kind: 'audio' });
|
|
929
953
|
track.stop();
|
|
930
954
|
await expect(videoProducer.replaceTrack({ track }))
|
|
931
955
|
.rejects
|
|
932
956
|
.toThrow(errors_1.InvalidStateError);
|
|
933
957
|
expect(track.readyState).toBe('ended');
|
|
934
|
-
expect(
|
|
958
|
+
expect(videoProducer.track?.readyState).toBe('live');
|
|
935
959
|
}, 500);
|
|
936
960
|
test('producer.replaceTrack() with the same track succeeds', async () => {
|
|
937
|
-
var _a;
|
|
938
961
|
await expect(audioProducer.replaceTrack({ track: audioProducer.track }))
|
|
939
962
|
.resolves
|
|
940
963
|
.toBe(undefined);
|
|
941
|
-
expect(
|
|
964
|
+
expect(audioProducer.track?.readyState).toBe('live');
|
|
942
965
|
}, 500);
|
|
943
966
|
test('producer.setMaxSpatialLayer() succeeds', async () => {
|
|
944
967
|
await expect(videoProducer.setMaxSpatialLayer(0))
|
|
@@ -987,11 +1010,10 @@ test('consumer.getStats() succeeds', async () => {
|
|
|
987
1010
|
expect(typeof stats).toBe('object');
|
|
988
1011
|
}, 500);
|
|
989
1012
|
test('producer.close() succeed', () => {
|
|
990
|
-
var _a;
|
|
991
1013
|
audioProducer.close();
|
|
992
1014
|
expect(audioProducer.closed).toBe(true);
|
|
993
1015
|
// Track will be still 'live' due to stopTracks: false.
|
|
994
|
-
expect(
|
|
1016
|
+
expect(audioProducer.track?.readyState).toBe('live');
|
|
995
1017
|
});
|
|
996
1018
|
test('producer.replaceTrack() rejects with InvalidStateError if closed', async () => {
|
|
997
1019
|
const audioTrack = new fake_mediastreamtrack_1.FakeMediaStreamTrack({ kind: 'audio' });
|
|
@@ -1160,7 +1182,6 @@ test('connection state change does not fire "connectionstatechange" in closed Tr
|
|
|
1160
1182
|
sendTransport.removeAllListeners('connectionstatechange');
|
|
1161
1183
|
});
|
|
1162
1184
|
test('RemoteSdp properly handles multiple streams of the same type in planB', async () => {
|
|
1163
|
-
var _a, _b, _c;
|
|
1164
1185
|
let sdp = undefined;
|
|
1165
1186
|
let sdpObject = undefined;
|
|
1166
1187
|
const remoteSdp = new RemoteSdp_1.RemoteSdp({ planB: true });
|
|
@@ -1180,7 +1201,7 @@ test('RemoteSdp properly handles multiple streams of the same type in planB', as
|
|
|
1180
1201
|
expect(sdpObject.media[0].rtp[0].codec).toBe('VP8');
|
|
1181
1202
|
expect(sdpObject.media[0].rtp[1].payload).toBe(102);
|
|
1182
1203
|
expect(sdpObject.media[0].rtp[1].codec).toBe('rtx');
|
|
1183
|
-
expect(
|
|
1204
|
+
expect(sdpObject.media[0].ssrcs?.length).toBe(4);
|
|
1184
1205
|
await remoteSdp.receive({
|
|
1185
1206
|
mid: 'video',
|
|
1186
1207
|
kind: 'video',
|
|
@@ -1201,7 +1222,7 @@ test('RemoteSdp properly handles multiple streams of the same type in planB', as
|
|
|
1201
1222
|
expect(sdpObject.media[0].rtp[2].codec).toBe('H264');
|
|
1202
1223
|
expect(sdpObject.media[0].rtp[3].payload).toBe(104);
|
|
1203
1224
|
expect(sdpObject.media[0].rtp[3].codec).toBe('rtx');
|
|
1204
|
-
expect(
|
|
1225
|
+
expect(sdpObject.media[0].ssrcs?.length).toBe(8);
|
|
1205
1226
|
await remoteSdp.planBStopReceiving({
|
|
1206
1227
|
mid: 'video',
|
|
1207
1228
|
offerRtpParameters: fakeParameters.generateConsumerRemoteParameters({ codecMimeType: 'video/H264' }).rtpParameters
|
|
@@ -1219,10 +1240,9 @@ test('RemoteSdp properly handles multiple streams of the same type in planB', as
|
|
|
1219
1240
|
expect(sdpObject.media[0].rtp[2].codec).toBe('H264');
|
|
1220
1241
|
expect(sdpObject.media[0].rtp[3].payload).toBe(104);
|
|
1221
1242
|
expect(sdpObject.media[0].rtp[3].codec).toBe('rtx');
|
|
1222
|
-
expect(
|
|
1243
|
+
expect(sdpObject.media[0].ssrcs?.length).toBe(4);
|
|
1223
1244
|
}, 500);
|
|
1224
1245
|
test('RemoteSdp does not duplicate codec descriptions', async () => {
|
|
1225
|
-
var _a, _b;
|
|
1226
1246
|
let sdp = undefined;
|
|
1227
1247
|
let sdpObject = undefined;
|
|
1228
1248
|
const remoteSdp = new RemoteSdp_1.RemoteSdp({ planB: true });
|
|
@@ -1242,7 +1262,7 @@ test('RemoteSdp does not duplicate codec descriptions', async () => {
|
|
|
1242
1262
|
expect(sdpObject.media[0].rtp[0].codec).toBe('VP8');
|
|
1243
1263
|
expect(sdpObject.media[0].rtp[1].payload).toBe(102);
|
|
1244
1264
|
expect(sdpObject.media[0].rtp[1].codec).toBe('rtx');
|
|
1245
|
-
expect(
|
|
1265
|
+
expect(sdpObject.media[0].ssrcs?.length).toBe(4);
|
|
1246
1266
|
await remoteSdp.receive({
|
|
1247
1267
|
mid: 'video',
|
|
1248
1268
|
kind: 'video',
|
|
@@ -1259,7 +1279,7 @@ test('RemoteSdp does not duplicate codec descriptions', async () => {
|
|
|
1259
1279
|
expect(sdpObject.media[0].rtp[0].codec).toBe('VP8');
|
|
1260
1280
|
expect(sdpObject.media[0].rtp[1].payload).toBe(102);
|
|
1261
1281
|
expect(sdpObject.media[0].rtp[1].codec).toBe('rtx');
|
|
1262
|
-
expect(
|
|
1282
|
+
expect(sdpObject.media[0].ssrcs?.length).toBe(8);
|
|
1263
1283
|
}, 500);
|
|
1264
1284
|
test('parseScalabilityMode() works', () => {
|
|
1265
1285
|
expect(parseScalabilityMode('L1T3')).toEqual({ spatialLayers: 1, temporalLayers: 3 });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mediasoup-client",
|
|
3
|
-
"version": "3.6.
|
|
3
|
+
"version": "3.6.98",
|
|
4
4
|
"description": "mediasoup client side JavaScript library",
|
|
5
5
|
"contributors": [
|
|
6
6
|
"Iñaki Baz Castillo <ibc@aliax.net> (https://inakibaz.me)",
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"@types/ua-parser-js": "^0.7.36",
|
|
80
80
|
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
81
81
|
"@typescript-eslint/parser": "^6.0.0",
|
|
82
|
-
"eslint": "^8.
|
|
82
|
+
"eslint": "^8.45.0",
|
|
83
83
|
"eslint-plugin-jest": "^27.2.3",
|
|
84
84
|
"jest": "^29.6.1",
|
|
85
85
|
"open-cli": "^7.2.0",
|