mediasoup 3.23.1 → 3.23.2
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/CHANGELOG.md
CHANGED
|
@@ -2,9 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
### NEXT
|
|
4
4
|
|
|
5
|
+
### 3.23.2
|
|
6
|
+
|
|
7
|
+
- Handle subchannels in pipe `DataConsumers` ([PR #1875](https://github.com/versatica/mediasoup/pull/1875)).
|
|
8
|
+
|
|
5
9
|
### 3.23.1
|
|
6
10
|
|
|
7
|
-
Worker: Fix, use `thread_local` buffer on `MS_ABORT()` ([PR#1873](https://github.com/versatica/mediasoup/pull/1873)).
|
|
11
|
+
- Worker: Fix, use `thread_local` buffer on `MS_ABORT()` ([PR#1873](https://github.com/versatica/mediasoup/pull/1873)).
|
|
8
12
|
|
|
9
13
|
### 3.23.0
|
|
10
14
|
|
|
@@ -33,8 +33,6 @@ export type DataConsumerOptions<DataConsumerAppData extends AppData = AppData> =
|
|
|
33
33
|
paused?: boolean;
|
|
34
34
|
/**
|
|
35
35
|
* Subchannels this data consumer initially subscribes to.
|
|
36
|
-
* Only used in case this data consumer receives messages from a local data
|
|
37
|
-
* producer that specifies subchannel(s) when calling send().
|
|
38
36
|
*/
|
|
39
37
|
subchannels?: number[];
|
|
40
38
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataConsumerTypes.d.ts","sourceRoot":"","sources":["../src/DataConsumerTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,MAAM,mBAAmB,CAAC,mBAAmB,SAAS,OAAO,GAAG,OAAO,IAC5E;IACC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB
|
|
1
|
+
{"version":3,"file":"DataConsumerTypes.d.ts","sourceRoot":"","sources":["../src/DataConsumerTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -926,7 +926,7 @@ test('transport.consumeData() for a pipe DataProducer succeeds with subchannels'
|
|
|
926
926
|
label: 'foo',
|
|
927
927
|
protocol: 'bar',
|
|
928
928
|
});
|
|
929
|
-
await ctx.router1.pipeToRouter({
|
|
929
|
+
const { pipeDataConsumer } = await ctx.router1.pipeToRouter({
|
|
930
930
|
dataProducerId: directDataProducer.id,
|
|
931
931
|
router: ctx.router2,
|
|
932
932
|
});
|
|
@@ -935,22 +935,53 @@ test('transport.consumeData() for a pipe DataProducer succeeds with subchannels'
|
|
|
935
935
|
dataProducerId: directDataProducer.id,
|
|
936
936
|
subchannels: [123, 666],
|
|
937
937
|
});
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
938
|
+
const receivedMessages = [];
|
|
939
|
+
directDataConsumer.on('message', message => {
|
|
940
|
+
const receivedMessage = message.toString('utf8');
|
|
941
|
+
receivedMessages.push(receivedMessage);
|
|
942
|
+
});
|
|
943
|
+
// The `pipeDataConsumer` is not subscribed to any subchannel, so it must allow
|
|
944
|
+
// the message to pass through and reach the final `directDataConsumer`.
|
|
945
|
+
directDataProducer.send('hello1',
|
|
946
|
+
/* ppid */ undefined,
|
|
947
|
+
/* subchannels */ [123, 124],
|
|
948
|
+
/* requiredSubchannel */ 666);
|
|
949
|
+
// Subscribe `pipeDataConsumer` to subchannels 123, 124 and 666.
|
|
950
|
+
await pipeDataConsumer.setSubchannels([123, 124, 666]);
|
|
951
|
+
// The `pipeDataConsumer` is subscribed to subchannels 123 and 666 so it must
|
|
952
|
+
// allow the message to pass through and reach the final `directDataConsumer`.
|
|
953
|
+
directDataProducer.send('hello2',
|
|
954
|
+
/* ppid */ undefined,
|
|
955
|
+
/* subchannels */ [123],
|
|
956
|
+
/* requiredSubchannel */ 666);
|
|
957
|
+
// The `pipeDataConsumer` is subscribed to subchannels 124 and 666 so it must
|
|
958
|
+
// allow the message to pass through, however the final `directDataConsumer`
|
|
959
|
+
// is not subscribed to subchannel 124 so the message must not reach it.
|
|
960
|
+
directDataProducer.send('hello3',
|
|
961
|
+
/* ppid */ undefined,
|
|
962
|
+
/* subchannels */ [124],
|
|
963
|
+
/* requiredSubchannel */ 666);
|
|
964
|
+
// The `pipeDataConsumer` is not subscribed to subchannel 125 so it must not
|
|
965
|
+
// allow the message to pass through.
|
|
966
|
+
directDataProducer.send('hello4',
|
|
967
|
+
/* ppid */ undefined,
|
|
968
|
+
/* subchannels */ [125],
|
|
969
|
+
/* requiredSubchannel */ 666);
|
|
970
|
+
// Send a message without subchannels so it's guaranteed that it will reach
|
|
971
|
+
// the final `directDataConsumer`. And wait for reception of this message so
|
|
972
|
+
// at this time we know that previous ones already reached the final
|
|
973
|
+
// `directDataConsumer`.
|
|
974
|
+
await new Promise(resolve => {
|
|
975
|
+
directDataConsumer.on('message', message => {
|
|
976
|
+
const receivedMessage = message.toString('utf8');
|
|
977
|
+
// Resolve once the last sent message is received.
|
|
978
|
+
if (receivedMessage === 'hello5') {
|
|
943
979
|
resolve();
|
|
944
980
|
}
|
|
945
|
-
catch (error) {
|
|
946
|
-
reject(error);
|
|
947
|
-
}
|
|
948
981
|
});
|
|
949
|
-
directDataProducer.send('
|
|
950
|
-
/* ppid */ undefined,
|
|
951
|
-
/* subchannels */ [123, 124],
|
|
952
|
-
/* requiredSubchannel */ 666);
|
|
982
|
+
directDataProducer.send('hello5');
|
|
953
983
|
});
|
|
984
|
+
expect(receivedMessages).toStrictEqual(['hello1', 'hello2', 'hello5']);
|
|
954
985
|
}, 2000);
|
|
955
986
|
test('dataProducer.close() is transmitted to pipe DataConsumer', async () => {
|
|
956
987
|
const { pipeDataProducer } = await ctx.router1.pipeToRouter({
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mediasoup",
|
|
3
|
-
"version": "3.23.
|
|
3
|
+
"version": "3.23.2",
|
|
4
4
|
"description": "Cutting Edge WebRTC Video Conferencing",
|
|
5
5
|
"contributors": [
|
|
6
6
|
"Iñaki Baz Castillo <ibc@aliax.net> (https://inakibaz.me)",
|
|
@@ -121,7 +121,7 @@
|
|
|
121
121
|
"@types/debug": "^4.1.13",
|
|
122
122
|
"@types/ini": "^4.1.1",
|
|
123
123
|
"@types/jest": "^30.0.0",
|
|
124
|
-
"@types/node": "^26.1.
|
|
124
|
+
"@types/node": "^26.1.2",
|
|
125
125
|
"eslint": "^10.8.0",
|
|
126
126
|
"eslint-config-prettier": "^10.1.8",
|
|
127
127
|
"eslint-plugin-jest": "^29.16.0",
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
#include "Logger.hpp"
|
|
6
6
|
#include "MediaSoupErrors.hpp"
|
|
7
7
|
#include "RTC/SubchannelsCodec.hpp"
|
|
8
|
+
#include <vector>
|
|
8
9
|
|
|
9
10
|
namespace RTC
|
|
10
11
|
{
|
|
@@ -500,7 +501,11 @@ namespace RTC
|
|
|
500
501
|
return false;
|
|
501
502
|
}
|
|
502
503
|
|
|
503
|
-
if
|
|
504
|
+
// Only verify subchannels if this is not a piped DataConsumer or if this is
|
|
505
|
+
// a piped DataConsumer and it's subscribed to at least one subchannel.
|
|
506
|
+
const bool verifySubchannels = !this->pipe || !this->subchannels.empty();
|
|
507
|
+
|
|
508
|
+
if (verifySubchannels)
|
|
504
509
|
{
|
|
505
510
|
// If a required subchannel is given, verify that this data consumer is
|
|
506
511
|
// subscribed to it.
|
|
@@ -543,13 +548,34 @@ namespace RTC
|
|
|
543
548
|
}
|
|
544
549
|
}
|
|
545
550
|
}
|
|
546
|
-
|
|
547
|
-
//
|
|
548
|
-
//
|
|
549
|
-
// them to its own DataConsumers.
|
|
550
|
-
|
|
551
|
+
|
|
552
|
+
// If this is a piped DataConsumer, encode given subchannels and required
|
|
553
|
+
// subchannel at the beginning of the message payload so the receiving
|
|
554
|
+
// PipeTransport can decode them and apply them to its own DataConsumers.
|
|
555
|
+
if (this->pipe)
|
|
551
556
|
{
|
|
552
|
-
|
|
557
|
+
// If subchannels were verified, encode just those this DataConsumer is
|
|
558
|
+
// subscribed to. Otherwise the receiving Router would deliver the message to
|
|
559
|
+
// DataConsumers subscribed to subchannels that this pipe does not carry.
|
|
560
|
+
const bool reduceSubchannels = verifySubchannels && !subchannels.empty();
|
|
561
|
+
|
|
562
|
+
std::vector<uint16_t> reducedSubchannels;
|
|
563
|
+
|
|
564
|
+
if (reduceSubchannels)
|
|
565
|
+
{
|
|
566
|
+
reducedSubchannels.reserve(subchannels.size());
|
|
567
|
+
|
|
568
|
+
for (const auto subchannel : subchannels)
|
|
569
|
+
{
|
|
570
|
+
if (this->subchannels.contains(subchannel))
|
|
571
|
+
{
|
|
572
|
+
reducedSubchannels.push_back(subchannel);
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
RTC::SubchannelsCodec::EncodeSubchannels(
|
|
578
|
+
message, reduceSubchannels ? reducedSubchannels : subchannels, requiredSubchannel);
|
|
553
579
|
}
|
|
554
580
|
|
|
555
581
|
const size_t messageLen = message.GetPayloadLength();
|