Changing the order without an opt-in flag like this has backwards compat 
concerns, even if WebRTC allows other orders, the other endpoint might be a 
server with hardcoded assumptions about order, or there could be other 
app-specific reasons why order matters. So it needs to be opt-in. Basides, 
creating dummy data channels and trusting that the remote endpoint doesn't 
use them isn't very eloquent.

On Tuesday, February 10, 2026 at 3:06:07 PM UTC+1 Robert Flack wrote:

> Thanks for the simple examples!
>
> > The remote endpoint (whether they support alwaysNegotiateDataChannels or 
> not) is able to process SDP regardless of the m-line order, which is why I 
> don't think there are any backwards/cross compatibility issues with this 
> beyond the usual of having to feature detect with pc.getConfiguration().
>
> If this works regardless could we make your simple example work when you 
> create the data channel first?
>
> const pc = new RTCPeerConnection();
> pc.createDataChannel(...);
> pc.addTransceiver('video');
> await pc.setLocalDescription();
>
> Or is there a reason this would not be compatible, besides not matching 
> the prior spec?
>
> > So in short, this API makes life a little less complex, saying you're 
> interested in data channels whether or not you want to create that data 
> channel now or later (without re-negotiating).
>
> This is where I feel like we could have done with a shorter name, e.g. 
> just dataChannels: true or something.. If it's something that most 
> developers will always want to use, then it would be nice to be as simple 
> as possible.
>
> On Tue, Feb 10, 2026 at 7:03 AM Philip Jägenstedt <[email protected]> 
> wrote:
>
>> LGTM2
>>
>> Thank you Henrik for the worked example. Being able to ensure consistent 
>> SDP (with m=application first) and avoid renegotiation makes a lot of 
>> sense. It's unfortunate that predictable behavior is an opt-in, but I guess 
>> that's necessary since otherwise m=application would always be in the SDP 
>> even when not requested, which would be weird and risky too.
>>
>> On Tue, Feb 10, 2026 at 12:55 PM 'Henrik Boström' via blink-dev <
>> [email protected]> wrote:
>>
>>> I'll also shime in to try to explain how this works, example:
>>>
>>> const pc = new RTCPeerConnection({alwaysNegotiateDataChannels:true});
>>> pc.addTransceiver('video');
>>> await pc.setLocalDescription();  // Creates SDP offer
>>> console.log(pc.localDescription.sdp);  // Prints the resulting SDP
>>>
>>> This will print SDP with the following m= sections and in the following 
>>> order (note that real SDP contains more text, but this is the relevant part 
>>> of it all):
>>> m=application
>>> m=video
>>>
>>> The benefit of negotiating the m=application first like this is that 
>>> upon completing the offer-answer dance with a remote endpoint, it is 
>>> possible for either endpoint to perform pc.createDataChannel() and for that 
>>> data channel to show up on the other side (via the pc.ondatachannel event 
>>> handler). Once the m-line is negotiated, we can create any data channels 
>>> without having to re-negotiate the SDP. This does not happen if SDP was 
>>> negotiated without the m=application line.
>>>
>>> Today, to force the m=application line to show up, you have to 
>>> createDataChannel *before* creating the SDP offer. E.g.
>>>
>>> const pc = new RTCPeerConnection();
>>> pc.createDataChannel(...);
>>> pc.addTransceiver('video');
>>> await pc.setLocalDescription();
>>>
>>> Here the order, while well define, is less predictable to the web 
>>> application, and the result is - mostly for historical reasons - 
>>> surprisingly reversed from the API call order:
>>> m=video
>>> m=application
>>>
>>> So if you want the m=application line to not depend on how many 
>>> transceivers you happened to have had at the time when you created the 
>>> initial offer, you'd have to actually may two separate SDP offer-answer 
>>> exchanges, adding both complexity and another round-trip time to your call 
>>> setup just for the sake of locking in an order that shouldn't really 
>>> matter, but due to its unpredictable nature could cause application bugs 
>>> (Google Meet being an example of who had a bug here).
>>>
>>> const pc = new RTCPeerConnection();
>>> pc.createDataChannel(...);
>>> await pc.setLocalDescription();  // Lock in m= application first
>>> /* ... complete negotiation to remote endpoint */
>>> pc.addTransceiver('video');
>>> await pc.setLocalDescription();  // Follow-up offer...
>>>
>>> Note that this headache is just for the local endpoint that is creating 
>>> the SDP offer. The remote endpoint (whether they support 
>>> alwaysNegotiateDataChannels or not) is able to process SDP regardless of 
>>> the m-line order, which is why I don't think there are any backwards/cross 
>>> compatibility issues with this beyond the usual of having to feature detect 
>>> with pc.getConfiguration(). And once the order is "locked in", it stays 
>>> that way for both endpoints, regardless of who creates the next offer.
>>>
>>> So in short, this API makes life a little less complex, saying you're 
>>> interested in data channels whether or not you want to create that data 
>>> channel now or later (without re-negotiating).
>>>
>>> On Monday, February 9, 2026 at 8:11:56 PM UTC+1 Alex Russell wrote:
>>>
>>>> Thanks, this is helpful. LGTM1 conditional on getting this example and 
>>>> the value it provides into an Explainer.
>>>>
>>>> Popping up a level, we need the WebRTC community writ large to get more 
>>>> comfortable with writing out this sort of example code to explain problems 
>>>> and solutions. Without it, we're always going to be delayed when Chromium 
>>>> is asked to ship first. We're judging our compat risk for changes in light 
>>>> of first-mover disadvantage, and so we need collateral of this sort to 
>>>> ensure that both the API OWNERSD and web developers overall can follow the 
>>>> thread of "why is this here?"
>>>>
>>>> Best,
>>>>
>>>> Alex
>>>>
>>>> On Monday, February 9, 2026 at 1:47:19 AM UTC-8 
>>>> [email protected] wrote:
>>>>
>>>>> Hey Alex,
>>>>>
>>>>> Am Mi., 4. Feb. 2026 um 17:16 Uhr schrieb Alex Russell <
>>>>> [email protected]>:
>>>>>
>>>>>> Hey all,
>>>>>>
>>>>>> Thanks for the replies. I'm mostly confused about how intently we 
>>>>>> need this. What applications does this improve? How? 
>>>>>>
>>>>>
>>>>> Take mediasoup, a popular opensource WebRTC server. It spends, because 
>>>>> this has been a problem since 2017 as described under "Never disable 
>>>>> audio"
>>>>>   https://webrtchacks.com/webrtc-sdp-inaki-baz-castillo/
>>>>> a lot (well, more than setting a boolean) of effort to make sure the 
>>>>> datachannel m-section is placed first in the SDP.
>>>>> mediasoup could add a "chrome 148 handler" here 
>>>>> <https://github.com/versatica/mediasoup-client/tree/v3/src/handlers> that 
>>>>> sets the boolean and reduces the number of renegotiations.
>>>>>
>>>>> Google Meet too, not creating the "ignored" data channel will save 
>>>>> ~213 bytes per second on getStats memory (usually every second) ;-)
>>>>>
>>>>> This whole mess is due to the backward compat rules from ~2012. 
>>>>> Created headache in 2017. Still a footgun in 2025. Less so moving forward 
>>>>> hopefully.
>>>>>
>>>>> Seeing a block of before/after example code that shows the problem in 
>>>>>> situ is usually how we get a minimal sense of how this will play out for 
>>>>>> customers.
>>>>>>
>>>>>
>>>>> The most visual example I could come up with is this:
>>>>>   https://jsfiddle.net/fippo/9f0gte7x/3/
>>>>> Negotiates a connection, adds audio/video/data. Then stops the audio 
>>>>> transceiver and renegotiates with a delay.
>>>>> You'll see the video freeze for four seconds (which is measured in the 
>>>>> statistics too).
>>>>> Stopping the transceiver associated with the transport stops the video 
>>>>> flow to the remote and causes a freeze on the remote end until 
>>>>> renegotiation happens.
>>>>> With the constraint that does not because the transport (associated 
>>>>> with the datachannel) is not affected by stopping the transceiver.
>>>>>
>>>>> Not having that, and being asked to ship this first, raises the risk, 
>>>>>> particularly absent customers/developers telling us how this is going to 
>>>>>> make lives better.
>>>>>>
>>>>>
>>>>> Chromium "shipping first" is inevitable in WebRTC. Looking at the 
>>>>> commit counts of libWebRTC which is what all major engines use for the 
>>>>> last 
>>>>> five years (data from October here 
>>>>> <https://github.com/w3c/webrtc-extensions/issues/213#issuecomment-3396184330>
>>>>> ):
>>>>>   Google: 10000+ commits
>>>>>   Microsoft: 234
>>>>>   Firefox: 34
>>>>>   Safari: 0
>>>>> "web developers" have obviously noticed that too.
>>>>>
>>>>> cheers
>>>>>
>>>>> Philipp
>>>>>
>>>> Best,
>>>>>>
>>>>>> Alex
>>>>>>
>>>>>> On Wednesday, February 4, 2026 at 4:41:30 AM UTC-8 PhistucK wrote:
>>>>>>
>>>>> > But you're saying that I have no way of knowing up front if it's one 
>>>>>>> or the other.
>>>>>>> I think there is, but it is not pretty - calling 
>>>>>>> peerConnection.createOffer() will generate that SDP message and you 
>>>>>>> can parse it a bit to see if the data channel (m=application) shows 
>>>>>>> up first - that means the boolean worked.
>>>>>>> Of course, parsing the SDP is a pretty big hammer just for knowing 
>>>>>>> whether the boolean is supported...
>>>>>>> Looks like new RTCPeerConnection({alwaysNegotiateDataChannels: 
>>>>>>> true}) does not fail to create a peer connection at the moment, so 
>>>>>>> unsupported constraints cannot easily be feature-tested.
>>>>>>> Perhaps using a getter rather than a simple true ({get 
>>>>>>> alwaysNegotiateDataChannels() 
>>>>>>> { isConstraintSupported = true; return true; }}) would also work.
>>>>>>>
>>>>>>>
>>>>>>> ☆*PhistucK*
>>>>>>>
>>>>>>>
>>>>>>> On Wed, Feb 4, 2026 at 4:20 AM Yoav Weiss (@Shopify) <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>>> A potentially silly question, due to my complete ignorance of 
>>>>>>>> WebRTC protocol negotiations:
>>>>>>>> If I'm planning to use this new boolean, that means that I may or 
>>>>>>>> may not want to negotiate a data channel.
>>>>>>>> If the other side doesn't support the boolean, I need to create a 
>>>>>>>> dummy data channel. If it does, I don't need to create one.
>>>>>>>> But you're saying that I have no way of knowing up front if it's 
>>>>>>>> one or the other.
>>>>>>>>
>>>>>>>> So how would developers know if they need to create a dummy 
>>>>>>>> channel? Is there some response to this boolean that indicates support 
>>>>>>>> or 
>>>>>>>> lack-thereof? If so, presumably it's not too late to create the dummy 
>>>>>>>> channel at that point?
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Tuesday, February 3, 2026 at 1:57:19 PM UTC+1 
>>>>>>>> [email protected] wrote:
>>>>>>>>
>>>>>>>>> Alex,
>>>>>>>>>
>>>>>>>>> this boils down to WebRTCs notion that the "SDP" is a " blob".  
>>>>>>>>> Which makes the API look easy but from the amount of fighting over 
>>>>>>>>> the 
>>>>>>>>> plan-b deprecation, "sdp munging" or even the question when 
>>>>>>>>> inbound-rtp 
>>>>>>>>> stats appear, this is causing trouble since this "blob" controls a 
>>>>>>>>> ton of 
>>>>>>>>> behavior.
>>>>>>>>>
>>>>>>>>> Developers can parse the SDP, e.g. like 
>>>>>>>>>   https://jsfiddle.net/fippo/kct3dy46/
>>>>>>>>> which with the new option set should return ["application", 
>>>>>>>>> "video"] instead of ["video", "application"].
>>>>>>>>>
>>>>>>>>> The opt-in boolean avoids changing the default behavior so no 
>>>>>>>>> surprises unless you use it.
>>>>>>>>> If you opt in you also (implicitly) agree that you are ready to 
>>>>>>>>> deal with the feature not being supported.
>>>>>>>>> So the other end that is parsing and processing the SDP you 
>>>>>>>>> generate is today receiving
>>>>>>>>>   audio-video-data
>>>>>>>>> without the opt-in and you ensure it works with
>>>>>>>>>   data-audio-video
>>>>>>>>> but you will still need to support the old way.
>>>>>>>>> I am not worried about browsers where we deal with only two SDP 
>>>>>>>>> parsers and both are well written robust enough to deal with.
>>>>>>>>>
>>>>>>>>> cheers
>>>>>>>>>
>>>>>>>>> Philipp
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Am Mo., 2. Feb. 2026 um 21:04 Uhr schrieb Alex Russell <
>>>>>>>>> [email protected]>:
>>>>>>>>>
>>>>>>>>>> It's a little concerning that there's no explainer and no 
>>>>>>>>>> (reasonable?) example code. How can developers debug that they're 
>>>>>>>>>> getting 
>>>>>>>>>> the intended behaviour? Will they be surprised by the change(s) 
>>>>>>>>>> and/or 
>>>>>>>>>> across browsers?
>>>>>>>>>>
>>>>>>>>>> Best,
>>>>>>>>>>
>>>>>>>>>> Alex
>>>>>>>>>>
>>>>>>>>>> On Friday, January 30, 2026 at 2:16:03 AM UTC-8 
>>>>>>>>>> [email protected] wrote:
>>>>>>>>>>
>>>>>>>>>>> Am Di., 27. Jan. 2026 um 09:27 Uhr schrieb Henrik Boström <
>>>>>>>>>>> [email protected]>:
>>>>>>>>>>>
>>>>>>>>>>>> This feature is only needed by the endpoint that creates the 
>>>>>>>>>>>> initial offer and decides the m= section order, i.e. the other 
>>>>>>>>>>>> endpoint - 
>>>>>>>>>>>> whether they support this feature or not - will accept the m= 
>>>>>>>>>>>> section order 
>>>>>>>>>>>> that is on offer. Once the order is decided, it is "locked in" by 
>>>>>>>>>>>> both 
>>>>>>>>>>>> endpoints, as per old SDP rules. So it should be cross-browser 
>>>>>>>>>>>> compatible 
>>>>>>>>>>>> and backwards-compatible, here's me setting SDP with m= 
>>>>>>>>>>>> application line 
>>>>>>>>>>>> first and the offer is accepted: 
>>>>>>>>>>>> https://jsfiddle.net/henbos/oweu42yz/
>>>>>>>>>>>>
>>>>>>>>>>>> As for if the browser that is creating this offer supports the 
>>>>>>>>>>>> feature, you can feature detect by testing it on a throwaway 
>>>>>>>>>>>> RTCPeerConnection object that you immediately close afterwards.
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Throwaway peerconnections are an antipattern too ;-)
>>>>>>>>>>> Since RTCConfiguration is not exposed on window one can not 
>>>>>>>>>>> feature detect upfront but one can call pc.getConfiguration() to 
>>>>>>>>>>> see if 
>>>>>>>>>>> this had an effect after creating the connection and then adapt if 
>>>>>>>>>>> necessary (i.e. create the not-quite-throwaway channel)
>>>>>>>>>>> Not sure I would bother with feature detection, the other side 
>>>>>>>>>>> should support the resulting SDP both with the new behavior of 
>>>>>>>>>>> datachannels 
>>>>>>>>>>> being first or the current behavior so opt-in should be fine with 
>>>>>>>>>>> fallback 
>>>>>>>>>>> to the current status quo.
>>>>>>>>>>>  
>>>>>>>>>>>
>>>>>>>>>>>> On Monday, January 26, 2026 at 4:46:05 PM UTC+1 Robert Flack 
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> On Mon, Jan 26, 2026 at 10:25 AM Robert Flack <
>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Sorry, quick followup, keeping always in the name would make 
>>>>>>>>>>>>>> sense if it was explained that because this is negotiated first 
>>>>>>>>>>>>>> it ensures 
>>>>>>>>>>>>>> that we at least will always negotiate a data channel even if 
>>>>>>>>>>>>>> audio and 
>>>>>>>>>>>>>> video fail.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Mon, Jan 26, 2026 at 10:23 AM Robert Flack <
>>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Thank you for the explanation. I definitely agree that this 
>>>>>>>>>>>>>>> sounds very important. My concern remains that the parameter 
>>>>>>>>>>>>>>> name and 
>>>>>>>>>>>>>>> developer documentation does not convey this and without this 
>>>>>>>>>>>>>>> context it's 
>>>>>>>>>>>>>>> unclear why I should use this. As an example, the config 
>>>>>>>>>>>>>>> parameter could 
>>>>>>>>>>>>>>> just be called negotiateDataChannels, as a cue that this will 
>>>>>>>>>>>>>>> ensure your 
>>>>>>>>>>>>>>> connection is configured to support creating data channels. It 
>>>>>>>>>>>>>>> would be 
>>>>>>>>>>>>>>> worth also explaining why you want to do this, with a short 
>>>>>>>>>>>>>>> snippet showing 
>>>>>>>>>>>>>>> how a data channel can be added later.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>> Negotiating datachannels is already an overloaded term - the SDP 
>>>>>>>>>>> negotiates support and datachannels themselves are negotiated 
>>>>>>>>>>> in-band but 
>>>>>>>>>>> can also be negotiated out-of-band.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>>>>> The spec says that it is negotiated before audio or video 
>>>>>>>>>>>>>>> but doesn't explain why you might want to do this - i.e. to 
>>>>>>>>>>>>>>> ensure that you 
>>>>>>>>>>>>>>> can negotiate a connection even if the audio or video channels 
>>>>>>>>>>>>>>> fail to 
>>>>>>>>>>>>>>> negotiate a compatible codec.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> TLDR; I'm not opposed to this feature - after learning what 
>>>>>>>>>>>>>>> it does and why, I agree we need it. I just think it would be 
>>>>>>>>>>>>>>> very hard for 
>>>>>>>>>>>>>>> someone reading about this to understand that they should use 
>>>>>>>>>>>>>>> it to resolve 
>>>>>>>>>>>>>>> these issues.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>> The WebRTC samples <https://github.com/webrtc/samples> have 
>>>>>>>>>>> always been great for showing how a feature works but in this case 
>>>>>>>>>>> even I 
>>>>>>>>>>> have a hard time coming up with a good sample.
>>>>>>>>>>> Adoption is more likely from opensource projects currently 
>>>>>>>>>>> working around this like MediaSoup and then it trickles down from 
>>>>>>>>>>> there. 
>>>>>>>>>>> Who knows, maybe Google Meet might drive adoption just to get rid 
>>>>>>>>>>> of the 
>>>>>>>>>>> "ignored" datachannel ;-)
>>>>>>>>>>>
>>>>>>>>>>> I have updated the description accordingly.
>>>>>>>>>>>
>>>>>>>>>>> cheers
>>>>>>>>>>>
>>>>>>>>>>> Philipp
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Mon, Jan 26, 2026 at 7:31 AM Henrik Boström <
>>>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> This simple API plugs a missing piece of functionality: 
>>>>>>>>>>>>>>>> there is no way to tell WebRTC that you may want to use data 
>>>>>>>>>>>>>>>> channels at 
>>>>>>>>>>>>>>>> some point in the future without having to re-negotiate, so 
>>>>>>>>>>>>>>>> the only way to 
>>>>>>>>>>>>>>>> ensure you negotiate data channels unconditionally is to 
>>>>>>>>>>>>>>>> create these dummy 
>>>>>>>>>>>>>>>> data channels not to be intended for use that you have to 
>>>>>>>>>>>>>>>> manually ignore 
>>>>>>>>>>>>>>>> at the other endpoint, both with regards to events firing and 
>>>>>>>>>>>>>>>> when parsing 
>>>>>>>>>>>>>>>> statistics.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Creating dummy data channels is a workaround to a mistake 
>>>>>>>>>>>>>>>> in the API in my opinion, and I would support it even if all 
>>>>>>>>>>>>>>>> that it 
>>>>>>>>>>>>>>>> achieved was API ergonomics.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> But it does achieve something more than the workaround is 
>>>>>>>>>>>>>>>> able to: placing the m= application line at the top. The fact 
>>>>>>>>>>>>>>>> that the 
>>>>>>>>>>>>>>>> order of m= sections is more predictable reduces the risk of 
>>>>>>>>>>>>>>>> application 
>>>>>>>>>>>>>>>> bugs. I believe Google Meet had a serious regression a few 
>>>>>>>>>>>>>>>> years ago where 
>>>>>>>>>>>>>>>> the m= section order was something not what we expected 
>>>>>>>>>>>>>>>> causing the SDP 
>>>>>>>>>>>>>>>> parser to fail and the call to be disconnected. It's also a 
>>>>>>>>>>>>>>>> good idea that 
>>>>>>>>>>>>>>>> the m= application line gets tagged, avoiding risk of 
>>>>>>>>>>>>>>>> rejecting the whole 
>>>>>>>>>>>>>>>> bundle if the wrong m= section is rejected.
>>>>>>>>>>>>>>>> On Thursday, January 22, 2026 at 3:20:18 PM UTC+1 Philipp 
>>>>>>>>>>>>>>>> Hancke wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> bear with me while I try to explain 15 years of history...
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Am Mi., 21. Jan. 2026 um 16:39 Uhr schrieb Rick Byers <
>>>>>>>>>>>>>>>>> [email protected]>:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> This is generally why we require explainers. Part of the 
>>>>>>>>>>>>>>>>>> point of this launch process is ensuring we've got the 
>>>>>>>>>>>>>>>>>> public material for 
>>>>>>>>>>>>>>>>>> web developers to understand the feature. Harald can you 
>>>>>>>>>>>>>>>>>> post an explainer 
>>>>>>>>>>>>>>>>>> somewhere which includes answers to Rob's questions?
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>    Rick
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> On Wed, Jan 21, 2026 at 9:30 AM Robert Flack <
>>>>>>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> The specification just says "alwaysNegotiateDataChannels 
>>>>>>>>>>>>>>>>>>> defines a way for the application to negotiate data 
>>>>>>>>>>>>>>>>>>> channels in the SDP 
>>>>>>>>>>>>>>>>>>> offer before creating a datachannel". 
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> I'm finding it a bit hard to reason about what this means 
>>>>>>>>>>>>>>>>>>> for me as a developer. I.e. when should I set it and how 
>>>>>>>>>>>>>>>>>>> does this change 
>>>>>>>>>>>>>>>>>>> the connection?
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Lets say you create a RTCPeerConnection. Create an offer 
>>>>>>>>>>>>>>>>> and call setLocalDescription. Send it to your peer. You get 
>>>>>>>>>>>>>>>>> an answer from 
>>>>>>>>>>>>>>>>> the peer and feed it into setRemoteDescription.
>>>>>>>>>>>>>>>>> You might wonder why it does not result in a connection.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Next, you create a datachannel. Your datachannel never 
>>>>>>>>>>>>>>>>> opens because after adding the datachannel (only the first!) 
>>>>>>>>>>>>>>>>> you need to 
>>>>>>>>>>>>>>>>> call createOffer/setLocalDescription and call 
>>>>>>>>>>>>>>>>> setRemoteDescription with the 
>>>>>>>>>>>>>>>>> answer.
>>>>>>>>>>>>>>>>> "web developers" are notably confused:
>>>>>>>>>>>>>>>>>   
>>>>>>>>>>>>>>>>> https://stackoverflow.com/questions/79737908/how-do-i-create-a-data-channel-in-webrtc-js-firefox-115-6-esr
>>>>>>>>>>>>>>>>> Now your connection gets established. If you add another 
>>>>>>>>>>>>>>>>> data channel you do *not* need to do this negotiation again 
>>>>>>>>>>>>>>>>> (thankfully; 
>>>>>>>>>>>>>>>>> adding audio or video tracks requires negotiation).
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> In this case using the boolean flag is saving you one 
>>>>>>>>>>>>>>>>> round of negotiation.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> In many applications you do not know if you want to use a 
>>>>>>>>>>>>>>>>> datachannel but since you might, you preemptively create one 
>>>>>>>>>>>>>>>>> and throw it 
>>>>>>>>>>>>>>>>> away. You can see that e.g. in Google Meet which calls
>>>>>>>>>>>>>>>>>    pc.createDataChannel("ignored", {reliable: true})
>>>>>>>>>>>>>>>>> It never uses that channel but it shows up in the getStats 
>>>>>>>>>>>>>>>>> API every time.
>>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Does this mean that a data channel will be negotiated 
>>>>>>>>>>>>>>>>>>> without calling createDataChannel?
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> The underlying SCTP association will be negotiated and can 
>>>>>>>>>>>>>>>>> be used by subsequent calls to createDataChannel without 
>>>>>>>>>>>>>>>>> renegotiation.
>>>>>>>>>>>>>>>>> This currently means exchanging four packets over the 
>>>>>>>>>>>>>>>>> network (but that upfront cost might go away later this year).
>>>>>>>>>>>>>>>>> Everything is set up to just work.
>>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Will that requested datachannel result in a datachannel 
>>>>>>>>>>>>>>>>>>> event or does my code still need to call createDataChannel? 
>>>>>>>>>>>>>>>>>>> If the latter, 
>>>>>>>>>>>>>>>>>>> is this a performance optimization? 
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Part of it is a performance / ergonomics optimization. But 
>>>>>>>>>>>>>>>>> behold, there comes the 2011 backward compat angle below.
>>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Would I choose this when data is more important to 
>>>>>>>>>>>>>>>>>>> connect first rather than e.g. voice / video?
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Lets say you have a stream from getUserMedia with audio 
>>>>>>>>>>>>>>>>> and video and would also like to have a datachannel.
>>>>>>>>>>>>>>>>> You call pc.createDataChannel and then iterate over the 
>>>>>>>>>>>>>>>>> MediaStream's getTracks and call pc.addTrack with each.
>>>>>>>>>>>>>>>>> Because data channels were new and fancy in 2011 and 
>>>>>>>>>>>>>>>>> backward compat was a concern this results in SDP (due to 
>>>>>>>>>>>>>>>>> rules in RFC 
>>>>>>>>>>>>>>>>> 8829) which puts the datachannel bits in the SDP after the 
>>>>>>>>>>>>>>>>> audio and video 
>>>>>>>>>>>>>>>>> bits (and in Safari the order of audio and video bits depend 
>>>>>>>>>>>>>>>>> on the lexical 
>>>>>>>>>>>>>>>>> ordering of the random uuid of the MediaStreamTrack) so the 
>>>>>>>>>>>>>>>>> SDP looks 
>>>>>>>>>>>>>>>>> roughly like this:
>>>>>>>>>>>>>>>>>   v=0 (6 more lines)
>>>>>>>>>>>>>>>>>   m=audio 9 UDP/TLS/RTP/SAVPF 63 111 (23 more lines) 
>>>>>>>>>>>>>>>>> direction=sendonly mid=0
>>>>>>>>>>>>>>>>>   m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 45 46 
>>>>>>>>>>>>>>>>> (63 more lines) direction=sendonly mid=1
>>>>>>>>>>>>>>>>>   m=application 9 UDP/DTLS/SCTP webrtc-datachannel (9 more 
>>>>>>>>>>>>>>>>> lines) direction=sendrecv mid=2
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Which is ok but you are probably scratching your head why 
>>>>>>>>>>>>>>>>> this order does not match the order of calls (or why in 
>>>>>>>>>>>>>>>>> Safari you get 
>>>>>>>>>>>>>>>>> video-audio-application half the time)
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> https://www.rfc-editor.org/rfc/rfc8829.html#name-initial-offers
>>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>>> specifies this (search for "Lastly, ") but does not provide 
>>>>>>>>>>>>>>>>> much of a 
>>>>>>>>>>>>>>>>> rationale. https://github.com/w3c/webrtc-pc/issues/735 
>>>>>>>>>>>>>>>>> has some 2016 rationale.
>>>>>>>>>>>>>>>>> Now that seems like an odd choice but had little 
>>>>>>>>>>>>>>>>> consequence until...
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> The linked tracking bug 
>>>>>>>>>>>>>>>>>>> <https://issues.chromium.org/433898678> appears to be a 
>>>>>>>>>>>>>>>>>>> chrome-only bug report with a particular demo that doesn't 
>>>>>>>>>>>>>>>>>>> use the 
>>>>>>>>>>>>>>>>>>> alwaysNegotiateDataChannels attribute and works on Firefox. 
>>>>>>>>>>>>>>>>>>> I don't quite 
>>>>>>>>>>>>>>>>>>> understand what the new configuration extension has to do 
>>>>>>>>>>>>>>>>>>> with the original 
>>>>>>>>>>>>>>>>>>> bug report.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> WebRTC added APIs that allow you to negotiate codecs at 
>>>>>>>>>>>>>>>>> some point. This can result in a situation where you end up 
>>>>>>>>>>>>>>>>> with a 
>>>>>>>>>>>>>>>>> incompatible set of video codecs (see the bug) and if those 
>>>>>>>>>>>>>>>>> happen to be 
>>>>>>>>>>>>>>>>> first in the SDP this "m=" line will be marked as "rejected" 
>>>>>>>>>>>>>>>>> and can not be 
>>>>>>>>>>>>>>>>> used to convey the transport information anymore.
>>>>>>>>>>>>>>>>> At best this results in another round of negotiation to 
>>>>>>>>>>>>>>>>> satisfy
>>>>>>>>>>>>>>>>>   
>>>>>>>>>>>>>>>>> https://datatracker.ietf.org/doc/html/rfc8843#name-rejecting-a-media-descripti
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Now 
>>>>>>>>>>>>>>>>>   
>>>>>>>>>>>>>>>>> https://datatracker.ietf.org/doc/html/rfc8843#section-7.2.1
>>>>>>>>>>>>>>>>> actually provides a recommendation on how to avoid this: 
>>>>>>>>>>>>>>>>> you pick something that is "unlikely to be rejected by the 
>>>>>>>>>>>>>>>>> remote side".
>>>>>>>>>>>>>>>>> The browser does not have an API that would lead to it 
>>>>>>>>>>>>>>>>> rejecting a datachannel m= line (which can happen for audio 
>>>>>>>>>>>>>>>>> and video)
>>>>>>>>>>>>>>>>> So it would be great to pick this datachannel m= line as 
>>>>>>>>>>>>>>>>> "offerer tagged" which avoids this headache.
>>>>>>>>>>>>>>>>> But that requires (unless you want to risk more breakage) 
>>>>>>>>>>>>>>>>> putting this m= line first which is conflicts with the rules 
>>>>>>>>>>>>>>>>> of RFC 8829.
>>>>>>>>>>>>>>>>> The alternative is going through at least two rounds of 
>>>>>>>>>>>>>>>>> negotiation (which involves the remote end), the first 
>>>>>>>>>>>>>>>>> datachannel only and 
>>>>>>>>>>>>>>>>> then adding media.
>>>>>>>>>>>>>>>>> Hence you need a way to opt-in which is the boolean in the 
>>>>>>>>>>>>>>>>> RTCConfiguration.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>> It sounds like you're saying here that this may not be 
>>>>>>>>>>>>> backwards compatible and if the other end doesn't support it you 
>>>>>>>>>>>>> may not be 
>>>>>>>>>>>>> able to establish a connection. If so, is it possible for the 
>>>>>>>>>>>>> developer to 
>>>>>>>>>>>>> feature detect whether the browser supports this so that they may 
>>>>>>>>>>>>> determine 
>>>>>>>>>>>>> whether both ends support this or not before setting it?
>>>>>>>>>>>>>
>>>>>>>>>>>>> Would you like to hear more about why WebRTC is so weird? (a 
>>>>>>>>>>>>>>>>> lot of this boils down to "SDP is not an opaque blob)
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> On Wed, Jan 21, 2026 at 6:31 AM 'Philipp Hancke' via 
>>>>>>>>>>>>>>>>>>> blink-dev <[email protected]> wrote:
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *tContact emails*
>>>>>>>>>>>>>>>>>>>> [email protected], [email protected]
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *Specification*
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> https://w3c.github.io/webrtc-extensions/#always-negotiating-datachannels
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *Summary*
>>>>>>>>>>>>>>>>>>>> Implement 
>>>>>>>>>>>>>>>>>>>> https://w3c.github.io/webrtc-extensions/#always-negotiating-datachannels
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *Blink component*
>>>>>>>>>>>>>>>>>>>> Blink>WebRTC 
>>>>>>>>>>>>>>>>>>>> <https://issues.chromium.org/issues?q=customfield1222907:%22Blink%3EWebRTC%22>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *Web Feature ID*
>>>>>>>>>>>>>>>>>>>> Missing feature
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *TAG review status*
>>>>>>>>>>>>>>>>>>>> Not applicable (incremental addition to WebRTC)
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *Risks*
>>>>>>>>>>>>>>>>>>>> *Interoperability and Compatibility*
>>>>>>>>>>>>>>>>>>>> *No information provided*
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *Gecko*: No signal (
>>>>>>>>>>>>>>>>>>>> https://github.com/mozilla/standards-positions/issues/1335
>>>>>>>>>>>>>>>>>>>> )
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *WebKit*: No signal (
>>>>>>>>>>>>>>>>>>>> https://github.com/WebKit/standards-positions/issues/599
>>>>>>>>>>>>>>>>>>>> )
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *Web developers*: No signals
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *Will this feature be supported on all six Blink 
>>>>>>>>>>>>>>>>>>>> platforms (Windows, Mac, Linux, ChromeOS, Android, and 
>>>>>>>>>>>>>>>>>>>> Android WebView)?*
>>>>>>>>>>>>>>>>>>>> Yes
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *Is this feature fully tested by web-platform-tests 
>>>>>>>>>>>>>>>>>>>> <https://chromium.googlesource.com/chromium/src/+/main/docs/testing/web_platform_tests.md>?*
>>>>>>>>>>>>>>>>>>>> Yes, a WPT is part of 
>>>>>>>>>>>>>>>>>>>> https://chromium-review.googlesource.com/c/chromium/src/+/7080041
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *Rollout plan*
>>>>>>>>>>>>>>>>>>>> Will ship enabled for all users
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *Requires code in //chrome?*
>>>>>>>>>>>>>>>>>>>> False
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *Tracking bug*
>>>>>>>>>>>>>>>>>>>> https://issues.chromium.org/issues/433898678
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *Estimated milestones*
>>>>>>>>>>>>>>>>>>>> Shipping on desktop 146
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> *Link to entry on the Chrome Platform Status*
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> https://chromestatus.com/feature/5113419982307328?gate=6516338099093504
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> This intent message was generated by Chrome Platform 
>>>>>>>>>>>>>>>>>>>> Status <https://chromestatus.com/>.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> -- 
>>>>>>>>>>>>>>>>>>>> You received this message because you are subscribed to 
>>>>>>>>>>>>>>>>>>>> the Google Groups "blink-dev" group.
>>>>>>>>>>>>>>>>>>>> To unsubscribe from this group and stop receiving 
>>>>>>>>>>>>>>>>>>>> emails from it, send an email to 
>>>>>>>>>>>>>>>>>>>> [email protected].
>>>>>>>>>>>>>>>>>>>> To view this discussion visit 
>>>>>>>>>>>>>>>>>>>> https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CADxkKiKuE79-xWUFiO9NCy%2Big9Pvn1oi6fVbkdomFLo4--bJQw%40mail.gmail.com
>>>>>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>>>>>> <https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CADxkKiKuE79-xWUFiO9NCy%2Big9Pvn1oi6fVbkdomFLo4--bJQw%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>>>>>>>>>>>>>>> .
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> -- 
>>>>>>>>>>>>>>>>>>> You received this message because you are subscribed to 
>>>>>>>>>>>>>>>>>>> the Google Groups "blink-dev" group.
>>>>>>>>>>>>>>>>>>> To unsubscribe from this group and stop receiving emails 
>>>>>>>>>>>>>>>>>>> from it, send an email to [email protected].
>>>>>>>>>>>>>>>>>>> To view this discussion visit 
>>>>>>>>>>>>>>>>>>> https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAJh39TPTxV5evdFUMnmfQE3aP2siNXNSZVpBr8wBitT56-nFCQ%40mail.gmail.com
>>>>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>>>>> <https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAJh39TPTxV5evdFUMnmfQE3aP2siNXNSZVpBr8wBitT56-nFCQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>>>>>>>>>>>>>> .
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> -- 
>>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>>> Groups "blink-dev" group.
>>>>>>>>
>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>>> send an email to [email protected].
>>>>>>>
>>>>>>>
>>>>>>>> To view this discussion visit 
>>>>>>>> https://groups.google.com/a/chromium.org/d/msgid/blink-dev/44ea71a3-1710-4b0f-97f7-6df551fbe7efn%40chromium.org
>>>>>>>>  
>>>>>>>> <https://groups.google.com/a/chromium.org/d/msgid/blink-dev/44ea71a3-1710-4b0f-97f7-6df551fbe7efn%40chromium.org?utm_medium=email&utm_source=footer>
>>>>>>>> .
>>>>>>>>
>>>>>>> -- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "blink-dev" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to [email protected].
>>> To view this discussion visit 
>>> https://groups.google.com/a/chromium.org/d/msgid/blink-dev/576c13ae-6ee8-4b08-bc6d-cceb3007fd3an%40chromium.org
>>>  
>>> <https://groups.google.com/a/chromium.org/d/msgid/blink-dev/576c13ae-6ee8-4b08-bc6d-cceb3007fd3an%40chromium.org?utm_medium=email&utm_source=footer>
>>> .
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/a/chromium.org/d/msgid/blink-dev/384dcb28-c77f-4a98-9cce-14e3e65af005n%40chromium.org.

Reply via email to