W3C WebRTC
WG Meeting
July 15, 2025
8 AM - 10 AM
1
Chairs: Jan-Ivar Bruaroey
Youenn Fablet
Guido Urdaneta
W3C WG IPR Policy
2
Welcome!
3
About this Virtual Meeting
4
W3C Code of Conduct
5
Virtual Interim Meeting Tips
This session is (still) being recorded
6
Understanding Document Status
7
Issues for Discussion Today
Time control:
8
Header Extension Control to MainSpec
Start Time: 08:10 AM
End Time: 08:25 AM
9
Issue #3060 - Why?
10
But really - Why?
The language in the spec around header extensions exposed on senders and receivers is unclear (#3056).
It should be defined in terms of internal slots, but this should be based on [[NegotiatedHeaderExtensions]] from the control spec (in webrtc-extensions)
Moving the control spec to the main spec is the easiest way to get to reference them.
11
Discussion (End Time: 08:25)
12
RtpTransport (Peter)
Start Time: 08:25 AM
End Time: 09:00 AM
13
Reminder about goals
Progress so far: Piecemeal RtpTransport
New Proposal: SimpleRtcTransport
What we lose (vs Piecemeal RtpTransport)
The transition from PeerConnection to SimpleRtcTransport is hard
Making the transition easier
In the spirit of webrtc-samples,
We will write example apps of how to use SimpleRtcTransport, as replacement for PeerConnection
From there, the developer change everything.
Your imagination is the limit.
Future conversation
Web Developer: I need PeerConnection to do X
Browser Vender: You can do that with SimpleRtcTransport
Web Developer: It looks hard moving from PeerConnection to SimpleTransport
Browser Vendor: Try this example app
Web Developer: Oh, that does everything I need to transition, and gives me all of the control I need to do X.
Browser Vender (quietly): I'm glad I didn't have to discuss this in the WebRTC WG for 3 years.
What network protocol?
What kind of API (Send and Receive Packets)?
const transport = new SimpleRtcTransport()
const remoteParameters = await doCustomSignalingSwap(transport.localParameters);
// … TODO: some p2p ICE-candidate-like exchange …
await transport.connect(remoteParameters);
transport.sendPacket(customPayload);
const receivedPackets = [new SimpleRtcTransportReceivedPacket(), …];
transport.onpacketsreceived = () => {
transport.readReceivedPackets(receivedPackets);
// … handle packet.payload for each packet
};
What kind of API (Custom Pacing and BWE)?
// … Same setup as before
const estimator = createCustomBandwidthEstimator();
const pacer = createCustomPacer();
transport.onreceivedfeedback = () => {
for (const ack in transport.readAcks()) {
estimator.processReceivedAcks(rtpAck);
}
// … use new BWE to control send rate (or use transport.bwe)
};
const [customPayload, sendTime] = await pacer.dequeue();
const sent = transport.sendPacket(customPayload, {sendTime});
pacer.handleSent(sent)
Questions for WebRTC WG
Discussion (End Time: 09:00)
24
DataChannel Transfer (Jan-Ivar)
Start Time: 09:00 AM
End Time: 09:30 AM
25
DataChannel transfer issues
26
Issue 3063: Data channels in workers get initialized on wrong thread
When SCTP connects, it queues a main-thread task to fire statechange with ALL* datachannel IDs initialized… (*but what about ones in workers?) Fiddle:
const channel = pc.createDataChannel("");
worker.postMessage({channel}, [channel]);
await pc.setLocalDescription();
pc.sctp.onstatechange =
() => console.log(channel.id); // 1 in Chrome, null in Safari
await remainingNegotiation(pc);�
// worker.js
onmessage = ({data: {channel}}) => {
console.log(channel.id); // 1 in Chrome, null in Safari
channel.onopen = () => console.log(channel.id); // 1 in both
};
Proposal: align with Safari
27
Issue 3062: Prevent GC of non-closed RTCDataChannels in workers
connection.[[DataChannels]] holds a strong reference to all (main-thread) data channels.
Proposal: extend this to workers somehow
Workers have their own GC, so maybe something like
28
Issue 3058: Avoid losing data channel events during transfer
Can it happen? The create an RTCDataChannel algorithm ends with this prose:
Inherently racy createDataChannel("seven", {negotiated: true, id: 7});
29
Title Goes Here
30
Discussion (End Time: 09:30)
31
Grab bag (Jan-Ivar)
Start Time: 09:30 AM
End Time: 09:55 AM
32
Grab bag for discussion today
33
Issue 3052: RTCPeerConnectionIceErrorEvent should not expose STUN reason phrase to JS
errorText exposes unauthenticated packet from the network to Javascript
Proposal:
change errorText
to anything BUT
the STUN reason,
or remove it?
34
Issue 3064 / PR 3066: RTCError constructor fails the copy constructor pattern
const err = new RTCError({errorDetail: "data-channel-failure"}, "foo");
const cpy = new RTCError(err, err.message);�
assert_equals(cpy.sdpLineNumber, err.sdpLineNumber); // Expected null, got 0
Easily fixed in
dictionary RTCErrorInit {
35
Issue 800: Can we delete webrtc-provisional-stats spec?
36
Discussion (End Time: 09:55)
37
Wrapup and Next Steps
Start Time: 09:55 AM
End Time: 10:00 AM
38
Next Steps
39
Thank you
Special thanks to:
WG Participants, Editors & Chairs
40