Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
d5f7aa2
Bun.serve: add HTTP/3 (QUIC) listener via `h3: true`
Jarred-Sumner Apr 27, 2026
a0fc950
serve(h3): route HTTP/3 through RequestContext instead of a separate …
Jarred-Sumner Apr 27, 2026
33ac980
serve(h3): mirror static and file routes onto the H3 app
Jarred-Sumner Apr 27, 2026
768ff6d
serve(h3): fix UAF in tryEnd after synchronous stream close; adversar…
Jarred-Sumner Apr 27, 2026
d211992
serve(h3): fix 7 bugs from branch sweep
Jarred-Sumner Apr 27, 2026
6017dc6
serve(h3): production-readiness pass
Jarred-Sumner Apr 27, 2026
b3e8fc2
[autofix.ci] apply automated fixes
autofix-ci[bot] Apr 27, 2026
7ff1a21
LICENSE: add lsquic, ls-qpack, ls-hpack
Jarred-Sumner Apr 27, 2026
8706e4b
serve(h3): address review findings
Jarred-Sumner Apr 27, 2026
b1eacbd
Http3Request: no-arg getQuery() strips leading '?' to match HttpRequest
Jarred-Sumner Apr 27, 2026
6acf87b
serve(h3): second-round review fixes
Jarred-Sumner Apr 27, 2026
fa49794
quic.c: include <stdio.h> for fwrite/stderr in us_quic_log_buf
Jarred-Sumner Apr 27, 2026
4c57d66
quic.c: gate lsquic logger to BUN_DEBUG builds
Jarred-Sumner Apr 27, 2026
49fca0a
quic.c: drop dead <assert.h>; lift lsquic global init into the C++ layer
Jarred-Sumner Apr 27, 2026
d6f713e
serve(h3): drive lsquic from loop_post + drainMicrotasks instead of p…
Jarred-Sumner Apr 27, 2026
c5ff317
[autofix.ci] apply automated fixes
autofix-ci[bot] Apr 27, 2026
afa5d7c
serve(h3): count each QUIC connection as a virtual poll
Jarred-Sumner Apr 27, 2026
08f9a4a
remove stray h3blast load-tester and bench script accidentally swept in
Jarred-Sumner Apr 27, 2026
60279c5
restore h3blast load tester source + http3-hello bench; gitignore bui…
Jarred-Sumner Apr 27, 2026
64c96b2
[autofix.ci] apply automated fixes
autofix-ci[bot] Apr 27, 2026
bbc106d
test(h3): waitForStderr rejects on child EOF; rename misnamed concurr…
Jarred-Sumner Apr 27, 2026
f751000
[autofix.ci] apply automated fixes
autofix-ci[bot] Apr 27, 2026
82314e2
serve(h3): batch process_conns at loop_pre/loop_post; encoder-side perf
Jarred-Sumner Apr 27, 2026
d75e84e
[autofix.ci] apply automated fixes
autofix-ci[bot] Apr 27, 2026
8336f33
serve(h3): skip lsquic priority walk; fix UDP EPOLLERR+EPOLLOUT spin
Jarred-Sumner Apr 27, 2026
145711b
Http3ResponseData: WTF::Vector<_, N> for header storage
Jarred-Sumner Apr 27, 2026
fd09e8e
serve(h3): drop the QUIC timerfd; fold earliest_adv_tick into getTimeout
Jarred-Sumner Apr 27, 2026
3f3cf81
serve(h3): review-feedback batch
Jarred-Sumner Apr 27, 2026
09987e7
serve(h3): drainQuicIfNecessary after the deferred-task queue
Jarred-Sumner Apr 27, 2026
b1305ec
serve(h3): drop inline threshold flush; parse sock_extended_err in MS…
Jarred-Sumner Apr 27, 2026
7510ebb
serve(h3): include <netinet/in.h> for Android; review nits
Jarred-Sumner Apr 27, 2026
4322337
NodeHTTP: explicit case 0 / ASSERT_NOT_REACHED in toUWSResponse kind …
Jarred-Sumner Apr 27, 2026
3a48620
serve: type the resp_kind selector as a real enum on both sides
Jarred-Sumner Apr 27, 2026
bf70914
serve(h3): fill uncovered methods when "/*" route is method-specific
Jarred-Sumner Apr 27, 2026
f52eed3
serve(h3): enable on Windows
Jarred-Sumner Apr 27, 2026
b887d7b
serve(h3): drop the remaining Windows guards missed in f52eed3
Jarred-Sumner Apr 27, 2026
9712ae4
serve(h3): cap CL-less bodies at maxRequestBodySize; treat h3_listene…
Jarred-Sumner Apr 27, 2026
0704dc8
[autofix.ci] apply automated fixes
autofix-ci[bot] Apr 27, 2026
77fe95f
serve(h3): drop literal Host when :authority is present; review fixups
Jarred-Sumner Apr 27, 2026
bc7fb4a
Http3Request: case-insensitive host skip in forEachHeader
Jarred-Sumner Apr 27, 2026
562b4f1
serve(h3): coderabbit review pass
Jarred-Sumner Apr 27, 2026
136c156
[autofix.ci] apply automated fixes
autofix-ci[bot] Apr 27, 2026
deace3b
HTTPHeaderNames: add Proxy-Connection; fix h3/libuv timer re-arm
Jarred-Sumner Apr 27, 2026
63b0ab3
Http3Request: getHeader("host") returns the resolved authority directly
Jarred-Sumner Apr 27, 2026
ad7cddc
serve(h3): emit Alt-Svc on static/file routes; close quic_timer on lo…
Jarred-Sumner Apr 27, 2026
f4ee4df
ServerConfig: reject h1:false with a unix socket
Jarred-Sumner Apr 27, 2026
9bebc25
test(h3): make graceful-stop test diagnostic; widen post-stop sleep
Jarred-Sumner Apr 27, 2026
3addffd
test(serve-protocols): use getReader/releaseLock so the stderr drain …
Jarred-Sumner Apr 27, 2026
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
15 changes: 15 additions & 0 deletions packages/bun-types/serve.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -757,6 +757,21 @@ declare module "bun" {
*/
ipv6Only?: boolean;

/**
* Also listen for HTTP/3 (QUIC) on the same port. Requires {@link tls}.
*
* Not supported on Windows.
* @default false
*/
h3?: boolean;

/**
* Listen for HTTP/1.1 (and HTTP/2) over TCP. Set to `false` together
* with `h3: true` to serve HTTP/3 only.
* @default true
*/
h1?: boolean;

/**
* Sets the number of seconds to wait before timing out a connection
* due to inactivity.
Expand Down
8 changes: 5 additions & 3 deletions packages/bun-usockets/src/loop.c
Original file line number Diff line number Diff line change
Expand Up @@ -665,13 +665,15 @@ void us_internal_dispatch_ready_poll(struct us_poll_t *p, int error, int eof, in
}

if (events & LIBUS_SOCKET_WRITABLE && !error && !u->closed) {
/* Clear WRITABLE before on_drain so a callback that re-arms it
* (e.g. QUIC packets_out hitting EAGAIN) keeps the re-arm. We
* still default to one-shot drain semantics for callers that
* don't touch the poll mask. */
us_poll_change(&u->p, u->loop, us_poll_events(&u->p) & LIBUS_SOCKET_READABLE);
u->on_drain(u);
if (u->closed) {
break;
}
// We only poll for writable after a read has failed, and only send one drain notification.
// Otherwise we would receive a writable event on every tick of the event loop.
us_poll_change(&u->p, u->loop, us_poll_events(&u->p) & LIBUS_SOCKET_READABLE);
}

#if defined(__linux__)
Expand Down
Loading
Loading