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":"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"}
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
- await new Promise((resolve, reject) => {
939
- directDataConsumer.on('message', (message, ppid) => {
940
- try {
941
- expect(message.toString('utf8')).toBe('hello');
942
- expect(ppid).toBe(51);
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('hello',
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.1",
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.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 (!this->pipe)
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
- // This is a piped DataConsumer, so instead of verifying subchannels locally,
547
- // encode the subchannels and required subchannel at the beginning of the
548
- // message payload so the receiving PipeTransport can decode them and apply
549
- // them to its own DataConsumers.
550
- else
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
- RTC::SubchannelsCodec::EncodeSubchannels(message, subchannels, requiredSubchannel);
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();