v158 · webtransport · congestion control

A hint, not a guarantee

Two failure edges define this feature. A string outside the WebTransportCongestionControl enum is a WebIDL violation — the constructor must throw TypeError before touching the network. And a valid preference the user agent cannot optimise for is silently resolved to "default": the spec even marks the option a feature at risk because, at the time of writing, no browser ships a genuinely low-latency-optimised algorithm. Both edges run for real below.

Chrome targets congestionControl for Chrome 158 behind the WebTransportCongestionControl runtime flag (--enable-blink-features=WebTransportCongestionControl, or chrome://flags/#enable-experimental-web-platform-features). On a pre-158 build this page's first test is the most honest probe there is: the bogus value not throwing proves the dictionary member is being ignored entirely.

Edge 1 · An invalid enum value must throw TypeError

This probe can genuinely return false. A build that parses the option throws on { congestionControl: "bogus" }; a build that ignores unknown dictionary members constructs happily — which is exactly how WebIDL treats members it has never heard of, and exactly why "the constructor accepted my option" proves nothing about support.

Not run yet.

Edge 2 · Requested-but-unsatisfied resolves to "default"

For each valid enum value, construct a real session and compare requested with granted. The spec allows only two answers per row: the requested value itself, or "default". Anything else — including undefined — is this build not implementing the attribute.

Satisfied-or-default, tested per enum value
requestedgranted (attribute)spec-legal?
Not run yet.

Edge 3 · Read the enum without bucketing unknown values

Today's vocabulary is "default" | "throughput" | "low-latency" — but enums grow. A reader that treats "anything that isn't throughput" as default will silently misreport a future value. This page's reader refuses to guess:

function describeCongestionControl(value) {
  switch (value) {
    case "default":      return "no preference granted";
    case "throughput":   return "optimised for throughput";
    case "low-latency":  return "optimised for low latency";
    default:
      // Log the ACTUAL value — never bucket what you don't know.
      return "unrecognised value " + JSON.stringify(value) +
             " — vocabulary newer than this code";
  }
}

Not run yet.

see also