Skip to content

Commit 5e6f6b5

Browse files
authored
Set max incoming SCTP message size (#370)
# Details - Fixes #369 - In receive transports, munge local SDP answer to set desired max SCTP message size (obtained from the mediasoup `Transport`'s SCTP parameters).
1 parent 5b7624d commit 5e6f6b5

8 files changed

Lines changed: 149 additions & 101 deletions

File tree

src/Transport.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -765,11 +765,13 @@ export class Transport<
765765
return this._awaitQueue.push(async () => {
766766
const { dataChannel, sctpStreamParameters } =
767767
await this._handler.sendDataChannel({
768-
ordered,
769-
maxPacketLifeTime,
770-
maxRetransmits,
771-
label,
772-
protocol,
768+
sctpStreamParameters: {
769+
ordered,
770+
maxPacketLifeTime,
771+
maxRetransmits,
772+
label,
773+
protocol,
774+
},
773775
});
774776

775777
// This will fill sctpStreamParameters's missing fields with default values.
@@ -849,6 +851,7 @@ export class Transport<
849851
// Enqueue command.
850852
return this._awaitQueue.push(async () => {
851853
const { dataChannel } = await this._handler.receiveDataChannel({
854+
maxMessageSize: this._maxSctpMessageSize!,
852855
sctpStreamParameters: clonedSctpStreamParameters,
853856
label,
854857
protocol,

src/handlers/Chrome111.ts

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -827,27 +827,26 @@ export class Chrome111
827827
}
828828

829829
async sendDataChannel({
830-
ordered,
831-
maxPacketLifeTime,
832-
maxRetransmits,
833-
label,
834-
protocol,
830+
sctpStreamParameters,
835831
}: HandlerSendDataChannelOptions): Promise<HandlerSendDataChannelResult> {
836832
this.assertNotClosed();
837833
this.assertSendDirection();
838834

839835
const options = {
840836
negotiated: true,
841837
id: this._nextSendSctpStreamId,
842-
ordered,
843-
maxPacketLifeTime,
844-
maxRetransmits,
845-
protocol,
838+
ordered: sctpStreamParameters.ordered,
839+
maxPacketLifeTime: sctpStreamParameters.maxPacketLifeTime,
840+
maxRetransmits: sctpStreamParameters.maxRetransmits,
841+
protocol: sctpStreamParameters.protocol,
846842
};
847843

848844
logger.debug('sendDataChannel() [options:%o]', options);
849845

850-
const dataChannel = this._pc.createDataChannel(label!, options);
846+
const dataChannel = this._pc.createDataChannel(
847+
sctpStreamParameters.label!,
848+
options
849+
);
851850

852851
// Increase next id.
853852
this._nextSendSctpStreamId =
@@ -893,14 +892,14 @@ export class Chrome111
893892
this._hasDataChannelMediaSection = true;
894893
}
895894

896-
const sctpStreamParameters: SctpStreamParameters = {
895+
const newSctpStreamParameters: SctpStreamParameters = {
897896
streamId: options.id,
898897
ordered: options.ordered,
899898
maxPacketLifeTime: options.maxPacketLifeTime,
900899
maxRetransmits: options.maxRetransmits,
901900
};
902901

903-
return { dataChannel, sctpStreamParameters };
902+
return { dataChannel, sctpStreamParameters: newSctpStreamParameters };
904903
}
905904

906905
async receive(
@@ -1163,6 +1162,7 @@ export class Chrome111
11631162
}
11641163

11651164
async receiveDataChannel({
1165+
maxMessageSize,
11661166
sctpStreamParameters,
11671167
label,
11681168
protocol,
@@ -1207,19 +1207,28 @@ export class Chrome111
12071207

12081208
await this._pc.setRemoteDescription(offer);
12091209

1210-
const answer = await this._pc.createAnswer();
1210+
let answer = await this._pc.createAnswer();
1211+
const localSdpObject = sdpTransform.parse(answer.sdp!);
1212+
const answerMediaObject = localSdpObject.media.find(
1213+
m => m.type === 'application'
1214+
)!;
12111215

1212-
if (!this._transportReady) {
1213-
const localSdpObject = sdpTransform.parse(answer.sdp!);
1216+
answerMediaObject.maxMessageSize = maxMessageSize;
12141217

1218+
if (!this._transportReady) {
12151219
await this.setupTransport({
12161220
localDtlsRole: this._forcedLocalDtlsRole ?? 'client',
12171221
localSdpObject,
12181222
});
12191223
}
12201224

1225+
answer = {
1226+
type: 'answer',
1227+
sdp: sdpTransform.write(localSdpObject),
1228+
};
1229+
12211230
logger.debug(
1222-
'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]',
1231+
'receiveDataChannel() | calling pc.setLocalDescription() [answer:%o]',
12231232
answer
12241233
);
12251234

src/handlers/Chrome74.ts

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -850,27 +850,26 @@ export class Chrome74
850850
}
851851

852852
async sendDataChannel({
853-
ordered,
854-
maxPacketLifeTime,
855-
maxRetransmits,
856-
label,
857-
protocol,
853+
sctpStreamParameters,
858854
}: HandlerSendDataChannelOptions): Promise<HandlerSendDataChannelResult> {
859855
this.assertNotClosed();
860856
this.assertSendDirection();
861857

862858
const options = {
863859
negotiated: true,
864860
id: this._nextSendSctpStreamId,
865-
ordered,
866-
maxPacketLifeTime,
867-
maxRetransmits,
868-
protocol,
861+
ordered: sctpStreamParameters.ordered,
862+
maxPacketLifeTime: sctpStreamParameters.maxPacketLifeTime,
863+
maxRetransmits: sctpStreamParameters.maxRetransmits,
864+
protocol: sctpStreamParameters.protocol,
869865
};
870866

871867
logger.debug('sendDataChannel() [options:%o]', options);
872868

873-
const dataChannel = this._pc.createDataChannel(label!, options);
869+
const dataChannel = this._pc.createDataChannel(
870+
sctpStreamParameters.label!,
871+
options
872+
);
874873

875874
// Increase next id.
876875
this._nextSendSctpStreamId =
@@ -916,14 +915,14 @@ export class Chrome74
916915
this._hasDataChannelMediaSection = true;
917916
}
918917

919-
const sctpStreamParameters: SctpStreamParameters = {
918+
const newSctpStreamParameters: SctpStreamParameters = {
920919
streamId: options.id,
921920
ordered: options.ordered,
922921
maxPacketLifeTime: options.maxPacketLifeTime,
923922
maxRetransmits: options.maxRetransmits,
924923
};
925924

926-
return { dataChannel, sctpStreamParameters };
925+
return { dataChannel, sctpStreamParameters: newSctpStreamParameters };
927926
}
928927

929928
async receive(
@@ -1169,6 +1168,7 @@ export class Chrome74
11691168
}
11701169

11711170
async receiveDataChannel({
1171+
maxMessageSize,
11721172
sctpStreamParameters,
11731173
label,
11741174
protocol,
@@ -1213,19 +1213,28 @@ export class Chrome74
12131213

12141214
await this._pc.setRemoteDescription(offer);
12151215

1216-
const answer = await this._pc.createAnswer();
1216+
let answer = await this._pc.createAnswer();
1217+
const localSdpObject = sdpTransform.parse(answer.sdp!);
1218+
const answerMediaObject = localSdpObject.media.find(
1219+
m => m.type === 'application'
1220+
)!;
12171221

1218-
if (!this._transportReady) {
1219-
const localSdpObject = sdpTransform.parse(answer.sdp!);
1222+
answerMediaObject.maxMessageSize = maxMessageSize;
12201223

1224+
if (!this._transportReady) {
12211225
await this.setupTransport({
12221226
localDtlsRole: this._forcedLocalDtlsRole ?? 'client',
12231227
localSdpObject,
12241228
});
12251229
}
12261230

1231+
answer = {
1232+
type: 'answer',
1233+
sdp: sdpTransform.write(localSdpObject),
1234+
};
1235+
12271236
logger.debug(
1228-
'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]',
1237+
'receiveDataChannel() | calling pc.setLocalDescription() [answer:%o]',
12291238
answer
12301239
);
12311240

src/handlers/FakeHandler.ts

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -334,11 +334,7 @@ export class FakeHandler
334334
}
335335

336336
async sendDataChannel({
337-
ordered,
338-
maxPacketLifeTime,
339-
maxRetransmits,
340-
label,
341-
protocol,
337+
sctpStreamParameters,
342338
}: HandlerSendDataChannelOptions): Promise<HandlerSendDataChannelResult> {
343339
this.assertNotClosed();
344340

@@ -350,21 +346,21 @@ export class FakeHandler
350346

351347
const dataChannel = new FakeRTCDataChannel({
352348
id: this._nextSctpStreamId++,
353-
ordered,
354-
maxPacketLifeTime,
355-
maxRetransmits,
356-
label,
357-
protocol,
349+
ordered: sctpStreamParameters.ordered,
350+
maxPacketLifeTime: sctpStreamParameters.maxPacketLifeTime,
351+
maxRetransmits: sctpStreamParameters.maxRetransmits,
352+
label: sctpStreamParameters.label,
353+
protocol: sctpStreamParameters.protocol,
358354
});
359355

360-
const sctpStreamParameters = {
356+
const newSctpStreamParameters = {
361357
streamId: this._nextSctpStreamId,
362-
ordered: ordered,
363-
maxPacketLifeTime: maxPacketLifeTime,
364-
maxRetransmits: maxRetransmits,
358+
ordered: sctpStreamParameters.ordered,
359+
maxPacketLifeTime: sctpStreamParameters.maxPacketLifeTime,
360+
maxRetransmits: sctpStreamParameters.maxRetransmits,
365361
};
366362

367-
return { dataChannel, sctpStreamParameters };
363+
return { dataChannel, sctpStreamParameters: newSctpStreamParameters };
368364
}
369365

370366
async receive(
@@ -432,6 +428,7 @@ export class FakeHandler
432428
}
433429

434430
async receiveDataChannel({
431+
// maxMessageSize,
435432
sctpStreamParameters,
436433
label,
437434
protocol,

src/handlers/Firefox120.ts

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -798,27 +798,26 @@ export class Firefox120
798798
}
799799

800800
async sendDataChannel({
801-
ordered,
802-
maxPacketLifeTime,
803-
maxRetransmits,
804-
label,
805-
protocol,
801+
sctpStreamParameters,
806802
}: HandlerSendDataChannelOptions): Promise<HandlerSendDataChannelResult> {
807803
this.assertNotClosed();
808804
this.assertSendDirection();
809805

810806
const options = {
811807
negotiated: true,
812808
id: this._nextSendSctpStreamId,
813-
ordered,
814-
maxPacketLifeTime,
815-
maxRetransmits,
816-
protocol,
809+
ordered: sctpStreamParameters.ordered,
810+
maxPacketLifeTime: sctpStreamParameters.maxPacketLifeTime,
811+
maxRetransmits: sctpStreamParameters.maxRetransmits,
812+
protocol: sctpStreamParameters.protocol,
817813
};
818814

819815
logger.debug('sendDataChannel() [options:%o]', options);
820816

821-
const dataChannel = this._pc.createDataChannel(label!, options);
817+
const dataChannel = this._pc.createDataChannel(
818+
sctpStreamParameters.label!,
819+
options
820+
);
822821

823822
// Increase next id.
824823
this._nextSendSctpStreamId =
@@ -861,14 +860,14 @@ export class Firefox120
861860
this._hasDataChannelMediaSection = true;
862861
}
863862

864-
const sctpStreamParameters: SctpStreamParameters = {
863+
const newSctpStreamParameters: SctpStreamParameters = {
865864
streamId: options.id,
866865
ordered: options.ordered,
867866
maxPacketLifeTime: options.maxPacketLifeTime,
868867
maxRetransmits: options.maxRetransmits,
869868
};
870869

871-
return { dataChannel, sctpStreamParameters };
870+
return { dataChannel, sctpStreamParameters: newSctpStreamParameters };
872871
}
873872

874873
async receive(
@@ -1127,6 +1126,7 @@ export class Firefox120
11271126
}
11281127

11291128
async receiveDataChannel({
1129+
maxMessageSize,
11301130
sctpStreamParameters,
11311131
label,
11321132
protocol,
@@ -1171,16 +1171,25 @@ export class Firefox120
11711171

11721172
await this._pc.setRemoteDescription(offer);
11731173

1174-
const answer = await this._pc.createAnswer();
1174+
let answer = await this._pc.createAnswer();
1175+
const localSdpObject = sdpTransform.parse(answer.sdp!);
1176+
const answerMediaObject = localSdpObject.media.find(
1177+
m => m.type === 'application'
1178+
)!;
11751179

1176-
if (!this._transportReady) {
1177-
const localSdpObject = sdpTransform.parse(answer.sdp!);
1180+
answerMediaObject.maxMessageSize = maxMessageSize;
11781181

1182+
if (!this._transportReady) {
11791183
await this.setupTransport({ localDtlsRole: 'client', localSdpObject });
11801184
}
11811185

1186+
answer = {
1187+
type: 'answer',
1188+
sdp: sdpTransform.write(localSdpObject),
1189+
};
1190+
11821191
logger.debug(
1183-
'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]',
1192+
'receiveDataChannel() | calling pc.setLocalDescription() [answer:%o]',
11841193
answer
11851194
);
11861195

src/handlers/HandlerInterface.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,17 @@ export type HandlerReceiveResult = {
9595
rtpReceiver?: RTCRtpReceiver;
9696
};
9797

98-
export type HandlerSendDataChannelOptions = SctpStreamParameters;
98+
export type HandlerSendDataChannelOptions = {
99+
sctpStreamParameters: SctpStreamParameters;
100+
};
99101

100102
export type HandlerSendDataChannelResult = {
101103
dataChannel: RTCDataChannel;
102104
sctpStreamParameters: SctpStreamParameters;
103105
};
104106

105107
export type HandlerReceiveDataChannelOptions = {
108+
maxMessageSize: number;
106109
sctpStreamParameters: SctpStreamParameters;
107110
label?: string;
108111
protocol?: string;

0 commit comments

Comments
 (0)