Changelog
🚀 Enhancements
- static: ⚠️ Security hardenings and general improvements (#252)
- static: Add
Last-ModifiedandETagconditional caching (#269) - static: Add opt-in
Cache-ControlviamaxAge/immutable(#273) - static: Add byte-range request support (#275)
🔥 Performance
- middleware: Precompose the middleware chain at construction time (#264)
- log: Batch stdout writes and cache the timestamp (#266, #274)
💅 Refactors
- ⚠️ Rename subpath exports to
*Middleware/*Plugin(#278)
🩹 Fixes
- service-worker: Call
respondWithsynchronously and drop extension bypass (#226) - node/web: Correct body handling in
toFetchHandlercompat layer (#232) - Handle
file://entry in loader and node-level TLS in mtls (#231) - node: Prevent body-read crashes and wire corruption in the Node adapter (#228)
- Prevent
waitUntilleak and rejectNaNports (#225) - cli: Stabilization batch and add CLI test suite (#234)
- url: Repair
FastURLorigin-form string and HTTP/2 char normalization (#227) - Resolve
x-forwarded-*hop-aware, right-to-left (#229) - node: Node adapter correctness fixes (
statusText, empty body, HEAD streaming, send errors, sync bridge) (#243) - node: Make
patchGlobalRequestidempotent (#255) - node/web: Remove "data" listener from the socket it was added to (#261)
- node: Guard already-destroyed streamBody cancel against unhandled rejection (#257)
- node: Enable
SO_REUSEPORTforreusePortoption (#258) - node: Don't permanently cache a missed kNeedDrain symbol lookup (#256)
- node: Reject body reads after the body is consumed (#254)
- node/web: Supply
nextto connect-style middleware on the synthetic bridge path (#259) - node: Answer 500 for unhandled handler errors (#251)
- node: Copy
FastResponseinit headers instead of adopting them (#263) - node: Keep req.headers live and consistent across _request materialization (#265)
- node/web: Strip explicit Transfer-Encoding to avoid corrupting the bridged body (#268)
- node/web: Strip hop-by-hop headers from toWebResponse() (#270)
- node/web: Stream bridged responses instead of buffering until end() (#248, #271)
- url: Keep
searchParamsidentity and reflect mutations across deopt (#276) - Improve edge adapters and tests (#242)
📖 Documentation
✅ Tests
- node-adapters: Run fetch(nodeHandler) suite on Deno and Bun in CI (#272)
🤖 CI
- Run the full test suite (#224)
🚀 Enhancements
📝 Docs
- Add missing aws stream docs, tests and example (https://github.com/h3js/srvx/pull/222) (docs)
❤️ Contributors
- Pooya Parsa (@pi0)
- Sandro Circi (@sandros94)
- Oskar Lebuda (@OskarLebuda)
🔥 Performance
🚀 Enhancements
🩹 Fixes
- node: Case-insensitive content-length/content-type dedup in FastResponse (#214)
- url: Deopt FastURL for query percent-encode-set chars (" ' < >) (#215)
- node: Read duplicate single-value headers from rawHeaders in get/has (#217)
Types
- tracing: Satisfy tracingChannel StoreType object constraint (57001b6)
🩹 Fixes
- node/web: Forward socket drain and handle aborted signals (#209)
- node: Keep body methods working when globalThis.Request is patched (8d91ebe)
- node: Deopt
FastURLto native parser for fragments and path encode-set chars (d384e41)
📖 Documentation
- cli: Document static file serving (#210)
❤️ Contributors
- Pooya Parsa (@pi0)
- Sébastien Chopin (@atinux)
🩹 Fixes
- node: Flatten writeHead headers on Deno (#203)
- aws-lambda-streaming: Handle empty body (#205)
- node: Do not crash on asterisk-form request targets (#206)
💅 Refactors
- node/web: Add new
TypeOfServiceutils to socker impl (945fc17)
❤️ Contributors
- Taylor Steele (@taylorfsteele)
- Pooya Parsa (@pi0)
- KT (@ktKongTong)