Skip to content

Commit 06d7911

Browse files
authored
Fix wrong SCTP stream parameters in SCTP DataConsumer that consumes from a direct DataProducer (#1516)
1 parent 273f7bc commit 06d7911

File tree

8 files changed

+356
-161
lines changed

8 files changed

+356
-161
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
- CI: Remove redundant hosts `macos-14` and `windows-2022` from `mediasoup-worker-prebuild` job ([PR #1506](https://github.com/versatica/mediasoup/pull/1506)).
66
- Node: Modernize code ([PR #1513](https://github.com/versatica/mediasoup/pull/1513)).
7+
- Fix wrong SCTP stream parameters in SCTP `DataConsumer` that consumes from a direct `DataProducer` ([PR #1516](https://github.com/versatica/mediasoup/pull/1516)).
78

89
### 3.15.6
910

node/src/Transport.ts

Lines changed: 42 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -830,37 +830,8 @@ export abstract class TransportImpl<
830830
let sctpStreamParameters: SctpStreamParameters | undefined;
831831
let sctpStreamId: number;
832832

833-
// If this is not a DirectTransport, use sctpStreamParameters from the
834-
// DataProducer (if type 'sctp') unless they are given in method parameters.
835-
if (this.type !== 'direct') {
836-
type = 'sctp';
837-
838-
sctpStreamParameters =
839-
utils.clone<SctpStreamParameters | undefined>(
840-
dataProducer.sctpStreamParameters
841-
) ?? ({} as SctpStreamParameters);
842-
843-
// Override if given.
844-
if (ordered !== undefined) {
845-
sctpStreamParameters.ordered = ordered;
846-
}
847-
848-
if (maxPacketLifeTime !== undefined) {
849-
sctpStreamParameters.maxPacketLifeTime = maxPacketLifeTime;
850-
}
851-
852-
if (maxRetransmits !== undefined) {
853-
sctpStreamParameters.maxRetransmits = maxRetransmits;
854-
}
855-
856-
// This may throw.
857-
sctpStreamId = this.getNextSctpStreamId();
858-
859-
this.#sctpStreamIds![sctpStreamId] = 1;
860-
sctpStreamParameters.streamId = sctpStreamId;
861-
}
862833
// If this is a DirectTransport, sctpStreamParameters must not be used.
863-
else {
834+
if (this.type === 'direct') {
864835
type = 'direct';
865836

866837
if (
@@ -873,6 +844,47 @@ export abstract class TransportImpl<
873844
);
874845
}
875846
}
847+
// If this is not a DirectTransport, use sctpStreamParameters from the
848+
// DataProducer (if type 'sctp') unless they are given in method parameters.
849+
// If the DataProducer is type 'sctp' and no sctpStreamParameters are given,
850+
// generate proper ones.
851+
else {
852+
type = 'sctp';
853+
854+
// This may throw.
855+
sctpStreamId = this.getNextSctpStreamId();
856+
857+
sctpStreamParameters = dataProducer.sctpStreamParameters
858+
? utils.clone<SctpStreamParameters>(dataProducer.sctpStreamParameters)
859+
: {
860+
streamId: sctpStreamId,
861+
ordered: true,
862+
};
863+
864+
this.#sctpStreamIds![sctpStreamId] = 1;
865+
sctpStreamParameters.streamId = sctpStreamId;
866+
867+
if (ordered !== undefined) {
868+
sctpStreamParameters.ordered = ordered;
869+
870+
if (ordered) {
871+
sctpStreamParameters.maxPacketLifeTime = undefined;
872+
sctpStreamParameters.maxRetransmits = undefined;
873+
}
874+
}
875+
876+
if (!ordered) {
877+
if (maxPacketLifeTime !== undefined) {
878+
sctpStreamParameters.ordered = false;
879+
sctpStreamParameters.maxPacketLifeTime = maxPacketLifeTime;
880+
}
881+
882+
if (maxRetransmits !== undefined) {
883+
sctpStreamParameters.ordered = false;
884+
sctpStreamParameters.maxRetransmits = maxRetransmits;
885+
}
886+
}
887+
}
876888

877889
const { label, protocol } = dataProducer;
878890
const dataConsumerId = utils.generateUUIDv4();

0 commit comments

Comments
 (0)