Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

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

### 3.15.6

Expand Down
72 changes: 42 additions & 30 deletions node/src/Transport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -830,37 +830,8 @@ export abstract class TransportImpl<
let sctpStreamParameters: SctpStreamParameters | undefined;
let sctpStreamId: number;

// If this is not a DirectTransport, use sctpStreamParameters from the
// DataProducer (if type 'sctp') unless they are given in method parameters.
if (this.type !== 'direct') {
type = 'sctp';

sctpStreamParameters =
utils.clone<SctpStreamParameters | undefined>(
dataProducer.sctpStreamParameters
) ?? ({} as SctpStreamParameters);

// Override if given.
if (ordered !== undefined) {
sctpStreamParameters.ordered = ordered;
}

if (maxPacketLifeTime !== undefined) {
sctpStreamParameters.maxPacketLifeTime = maxPacketLifeTime;
}

if (maxRetransmits !== undefined) {
sctpStreamParameters.maxRetransmits = maxRetransmits;
}

// This may throw.
sctpStreamId = this.getNextSctpStreamId();

this.#sctpStreamIds![sctpStreamId] = 1;
sctpStreamParameters.streamId = sctpStreamId;
}
// If this is a DirectTransport, sctpStreamParameters must not be used.
else {
if (this.type === 'direct') {
type = 'direct';

if (
Expand All @@ -873,6 +844,47 @@ export abstract class TransportImpl<
);
}
}
// If this is not a DirectTransport, use sctpStreamParameters from the
// DataProducer (if type 'sctp') unless they are given in method parameters.
// If the DataProducer is type 'sctp' and no sctpStreamParameters are given,
// generate proper ones.
else {
type = 'sctp';

// This may throw.
sctpStreamId = this.getNextSctpStreamId();

sctpStreamParameters = dataProducer.sctpStreamParameters
? utils.clone<SctpStreamParameters>(dataProducer.sctpStreamParameters)
: {
streamId: sctpStreamId,
ordered: true,
};

this.#sctpStreamIds![sctpStreamId] = 1;
sctpStreamParameters.streamId = sctpStreamId;

if (ordered !== undefined) {
sctpStreamParameters.ordered = ordered;

if (ordered) {
sctpStreamParameters.maxPacketLifeTime = undefined;
sctpStreamParameters.maxRetransmits = undefined;
}
}

if (!ordered) {
if (maxPacketLifeTime !== undefined) {
sctpStreamParameters.ordered = false;
sctpStreamParameters.maxPacketLifeTime = maxPacketLifeTime;
}

if (maxRetransmits !== undefined) {
sctpStreamParameters.ordered = false;
sctpStreamParameters.maxRetransmits = maxRetransmits;
}
}
}

const { label, protocol } = dataProducer;
const dataConsumerId = utils.generateUUIDv4();
Expand Down
Loading