Fastify v5.9.0 ergänzt `request.mediaType` und `onMaxParamLength`, härtet das Vertrauen in `forwarded`-Header, chunkiert große HTTP/2-Antworten und migriert die Typ-Tests zu TSTyche

Fastify v5.9.0 ergänzt `request.mediaType` und `onMaxParamLength`, härtet das Vertrauen in `forwarded`-Header, chunkiert große HTTP/2-Antworten und migriert die Typ-Tests zu TSTyche

lschvn

Fastify v5.9.0, veröffentlicht am 2026-06-28, ist die erste Minor-Version der Fastify-v5-Linie im Jahr 2026 und ein substanzieller 65-PR-Zyklus. Die beiden neuen öffentlichen APIs der Version sind request.mediaType, ein typisierter Accessor für den ausgehandelten Medientyp, und die Routen-Option onMaxParamLength, die es einem Routen-Hook ermöglicht, URLs zu behandeln, deren einzelner Parameter das konfigurierte maxParamLength überschreitet, anstatt synchron eine FST_ERR_VALIDATION zu werfen. Der Zyklus liefert auch einen Sicherheitsfix, der X-Forwarded-Host und X-Forwarded-Proto nicht mehr vertraut, wenn der eingehende Socket fehlt (#6684 von mcollina), chunkiert große HTTP/2-Buffer-Antworten (#6746), migriert die Typ-Test-Suite von handgeschriebenen expect-type-Assertions zu TSTyche (#6532), und fügt Node.js 26 zur Test-Matrix hinzu, während Node.js 20 aus der yarn-Matrix entfernt wird.

Die Version ist die dritte Minor der v5-Linie in diesem Jahr. Fastify v5.8.0 wurde am 5. März 2026 veröffentlicht, und v5.8.5 war der letzte 5.8.x am 14. April 2026. v5.9.0 ist die erste seit diesem 5.8.5-Patch, die eine neue öffentliche API ausliefert.

Die beiden neuen öffentlichen APIs

request.mediaType (climba03003) ist die Hauptfunktion. Vor v5.9.0 hat Anwendungscode, der wissen wollte, welchen Medientyp der Client angefordert hat, request.headers['accept'] von Hand geparst, die Q-Value-Liste durchlaufen, die beste Übereinstimmung ausgewählt und dann mit einem Content-Type verglichen, den die Route hoffentlich auslieferte. Der neue Accessor erledigt das Parsen und den Abgleich an einer Stelle. Für eine req, die application/json angefordert hat, gibt der Accessor 'application/json' zurück; für eine req ohne Accept-Header gibt er undefined zurück. Der Accessor ist additiv, und die öffentliche Oberfläche ist unverändert. Die Implementierung lebt in lib/request.js, und die TypeScript-Oberfläche ist in fastify.d.ts exportiert.

onMaxParamLength (climba03003) ist die zweite. Ohne die Option wirft Fastify synchron eine FST_ERR_VALIDATION, wenn ein einzelner URL-Parameter das konfigurierte maxParamLength überschreitet (standardmäßig 100 Zeichen). Mit der Option kann die Route etwas mit der fehlerhaften Anfrage tun: eine Warnung protokollieren, eine Metrik inkrementieren, umleiten oder einen benutzerdefinierten Fehler zurückgeben. Der Hook ist eine normale Routen-Option ({ onMaxParamLength: (req, reply, maxParamLength) => void }), neben preHandler, onRequest und dem Rest der Lifecycle-Hooks. Die Änderung ist additiv: Routen, die die Option nicht gesetzt haben, behalten das alte Verhalten, und die Option ist standardmäßig aus.

Der Sicherheitsfix und die zugehörigen Arbeiten

PR #6684 (mcollina) schließt eine Request-Spoofing-Lücke im Vertrauenspfad der Forwarded-Header. Vor dem Fix hat Fastify den X-Forwarded-Host- und X-Forwarded-Proto-Headern vertraut, auch wenn der eingehende request.socket fehlte oder undefiniert war (eine Situation, die hinter einem Transport auftreten kann, der die Quellverbindung entfernt, oder wenn die Anfrage aus einem geparsten Body in einem Test rekonstruiert wird). Der neue Code weigert sich, die Forwarded-Header in diesem Fall zu lesen, fällt auf das rohe request.host zurück und kennzeichnet die Situation als untrusted input in der TypeScript-Deklarationsdatei via PR #6572 (mcollina), das die Anfrage-Metadaten-Accessoren request.ip, request.host, request.protocol, request.ips mit expliziten JSDoc-Warnungen versieht, dass sie nicht für Sicherheitsentscheidungen vertrauenswürdig sind. Der Fix ist für korrekt konfigurierte Proxies unsichtbar (die immer einen echten Socket an der eingehenden Anfrage haben), und die Änderung liegt auf der sicheren Seite: fehlender Socket bedeutet keinen Forwarded-Header, selbst wenn der Header in der Anfrage vorhanden ist.

Die Version fügt auch useContentType-als-Schema-Schlüssel-Unterstützung hinzu, sodass die Antwort-Schema-Suche den ausgehandelten Content-Type berücksichtigt (#6685 von UlisesGascon), drei kleine Härtungs-Commits rund um Routing-Fehler-Codes (#6678) und checkDependencies (#6774), und markiert die request-Metadaten-Accessoren als untrusted input in der TypeScript-Deklarationsdatei (#6572 von mcollina).

Die Performance-Arbeit clustert sich auf dem Content-Type-Hot-Path

Drei der vier Perf-Einträge des Zyklus leben auf demselben Hot Path. PR #6692 (aquie00t) verzögert das ContentType-Parsen innerhalb von getSchemaSerializer, bis das Schema tatsächlich gelesen wird, #6694 (aquie00t) cachet geparste ContentType-Objekte innerhalb des ContentTypeParser, und #6693 (aquie00t) fügt eine typeof-Wache vor toString.call in send und onSendEnd hinzu. Der vierte ist der HTTP/2-Buffer-Chunking-Fix (mcollina) für große Antworten: Der alte Code hat die gesamte Payload im Speicher gepuffert, bevor sie über die HTTP/2-Verbindung gesendet wurde (ein 1-GB-Export bedeutete 1 GB residenten Speicher auf dem Server); der neue Code chunkiert den Buffer in kleinere Stücke und streamt sie, sobald die HTTP/2-Verbindung sie aufnehmen kann, sodass die Speicherkosten durch die Chunk-Größe begrenzt sind, nicht durch die Payload-Größe.

Der Vite-8.1-Artikel vom 24. Juni behandelte eine ähnliche Form von Performance-Arbeit im Dev-Server-Build-Pfad: eine kleine Änderung auf einem Hot Path, wiederholt über den Anfrage-Lebenszyklus, die sich zu einer bemerkenswerten Verbesserung summiert. Die Fastify-v5.9.0-Arbeit ist dieselbe Idee, auf einem anderen Runtime.

Trailer, Validierung und andere Fixes

Der Zyklus liefert ein Bündel von Fixes rund um die Trailer- und Validierungspfade. #6676 (climba03003) verhindert ein dupliziertes res.end in sendTrailer, wenn ein synchroner Callback den Trailer auslöst, und #6714 (mcollina) ignoriert duplizierte Trailer-Completion-Ereignisse. #6678 (mcollina) stellt den error.code auf Routing-Fehlern wieder her, die ihn stillschweigend fallen ließen, und #6665 (trivikr) erlaubt request.getValidationFunction(), in der TypeScript-Deklaration undefined zurückzugeben, was dem tatsächlichen Runtime-Verhalten entspricht. #6753 (LeSingh1) sorgt dafür, dass hasRequestDecorator und hasReplyDecorator konstruktor-zugewiesene Built-in-Eigenschaften erkennen, die zuvor übersehen wurden, was eine langjährige Lücke schließt, in der die Dekoratoren fälschlich als nicht vorhanden gemeldet wurden, wenn eine Anfrage oder Reply von einem Built-in umhüllt war.

Die Version liefert auch einen Node.js-Test-Matrix-Bump. #6728 (Fdawgs) fügt Node.js 26 zur Test-Matrix hinzu, was sich mit der Node.js-26.4.0-Veröffentlichung am 25. Juni deckt, und #6662 (Tony133) entfernt Node.js 20 aus der yarn-CI-Matrix, was mit dem End-of-Life-Zeitplan für Node.js 20 des Node.js-Projekts konsistent ist und mit dem Deno-2.9-Artikel vom 26. Juni, der die Runtime-Landschaft abdeckt.

TSTyche für Typ-Tests, fastify-plugin v6.0.0

Die Migration von Fastifys Typ-Test-Suite von handgeschriebenen expect-type-Assertions zu TSTyche ist die interessanteste Infrastrukturänderung des Zyklus. PR #6532 (mrazauskas) führt TSTyche ein, und #6726 und #6727 beenden die Migration in zwei Chargen. TSTyche ist ein zweckgebauter Typ-Test-Runner, der beim TypeScript-Compile-Schritt läuft statt zur Runtime, und der bessere Diagnosen liefert, wenn eine Assertion fehlschlägt (der Fehler verweist auf die Zeile und den erwarteten vs. tatsächlichen Typ, statt ein Runtime-false von expect-type). Die Änderung ist für Fastify-Nutzer unsichtbar; sie beschleunigt die CI der Maintainer und gibt ihnen bessere Fehlermeldungen, wenn ein Typ-Test fehlschlägt.

Die Version pinnt auch einen fastify-plugin-Bump von 5.1.0 auf 6.0.0 (#6801). fastify-plugin ist ein rein-typisierter Peer von Fastify; v6.0.0 ist ein Major-Versions-Bump, der einige der älteren CommonJS-Style-Codepfade entfernt und die API-Oberfläche auf die v5-Fastify-Linie ausrichtet. Der Bump liegt auf einer dependencies-Zeile, die Plugin-Autoren über peerDependencies konsumieren; Anwendungscode, der Fastify direkt verwendet, ist nicht betroffen.

Warum das wichtig ist

Fastify v5.9.0 ist die Version, in der das Framework auf halbem Weg eines einjährigen Härtungszyklus ist. Die v5.0-Linie wurde Ende 2024 veröffentlicht, und das Projekt fügt stetig typisierte Accessoren hinzu, härtet den Vertrauenspfad der Forwarded-Header und migriert die Test-Infrastruktur zu Tools, die besser zur Codebasis passen. v5.9.0 ist die erste Version in diesem Zyklus, die sowohl eine neue öffentliche API als auch einen sicherheitsrelevanten Fix liefert, was das Muster ist, das eine Minor-Versionsnotiz wert macht.

Für Anwendungsentwickler ist die praktische Änderung klein und konkret. Die beiden neuen öffentlichen APIs sind additiv, und der Sicherheitsfix liegt auf der sicheren Seite. Die TypeScript-Oberfläche bekommt einen neuen Accessor, und die request-Metadaten-Accessoren sind explizit als untrusted input markiert, was die richtige Sache ist und der richtige Zeitpunkt, es zu tun. Der HTTP/2-Buffer-Chunking-Fix ist für kleine Payloads unsichtbar und signifikant für sehr große, was die Form eines Fixes ist, die für eine Route zählt, die einen generierten Binär-Blob ausliefert.

Für den breiteren Node.js-Web-Framework-Bereich reiht sich Fastify v5.9.0 neben die Bun-Runtime-Updates und die Deno-2.9-Versionshinweise ein und zeigt, dass die drei großen JavaScript-Runtimes alle ihre HTTP- und Anfrage-Behandlungspfade parallel härten. Fastify ist das Gegenstück auf Framework-Ebene zu diesen Änderungen auf Runtime-Ebene.

Häufig gestellte Fragen

npm 11.18 befördert die `linked`-Installationsstrategie zu stabil, führt den `npm install-scripts`-Namensraum ein und warnt, wenn `min-release-age` einen Audit-Fix blockiert

npm 11.18.0 (29. Juni 2026) liefert drei Features und einen langen Bugfix-Backlog, die zusammen die Arbeit am `install-strategy=linked`-(isolated)-Installationsmodus abschließen, die das npm-CLI seit RFC #0042 aus dem Jahr 2022 verfolgt. Die Schlagzeile ist [PR #9677](https://github.com/npm/cli/pull/9677) (Backport von #9674), die `--install-strategy=linked` von experimentell auf stabil hebt. Der Modus installiert jedes Paket in `node_modules/.store/<name>@<version>/node_modules/<dep>` und verlinkt dessen deklarierte Abhängigkeiten in den eigenen `node_modules/<dep>`-Baum, sodass ein Paket nur Abhängigkeiten `require`n kann, die tatsächlich in seinem eigenen `package.json` stehen. Die neue Doku-Empfehlung ([PR #9690](https://github.com/npm/cli/pull/9690)) lautet, `--install-strategy=linked` in CI auszuführen, um Phantom-Abhängigkeiten vor dem Veröffentlichen abzufangen. Um die Beförderung herum liefert die Release den neuen `npm install-scripts`-Namensraum ([#9635](https://github.com/npm/cli/pull/9635), Backport von #9629) mit `approve`, `deny` und `ls`, wobei `npm approve-scripts` / `npm deny-scripts` als Alias erhalten bleiben; einen `install-scripts: prune unused allowScripts entries`-Aufräumdurchlauf ([#9662](https://github.com/npm/cli/pull/9662)); und eine neue Warnung, wenn `min-release-age` einen `npm audit fix` blockiert ([#9564](https://github.com/npm/cli/pull/9564)). Die 43-Commit-Release fixt zudem 19 Bugs der `linked`-Strategie (Audit-Determinismus #9638, verwaiste `.bin`-Shims #9643, Aufräumen veralteter `.store`-Verzeichnisse #9649, ungültiger `filterNode`-Crash #9645, peerOptional-Validierung #9641), drei `npm sbom`-Fixes und einen Prozent-Encoding-Fix für den `vcs_url`-Qualifier in generierten Purls ([#9693](https://github.com/npm/cli/pull/9693)).

Claude Sonnet 5 wird Standardmodell in Claude Code 2.1.197 mit nativem 1M-Token-Kontextfenster, Einführungspreis von 2 $/10 $ pro MTok und standardmäßig aktivierten Cyber-Safeguards

Anthropic hat Claude Sonnet 5 am 2026-06-30 angekündigt ([Introducing Claude Sonnet 5](https://www.anthropic.com/news/claude-sonnet-5)), und Claude Code [v2.1.197](https://github.com/anthropics/claude-code/releases/tag/v2.1.197) (am selben Tag veröffentlicht) hat es zum Standardmodell gemacht. Der Launch ist das erste Modell der Sonnet-Linie, das die agentische Lücke zu Opus 4.8 schließt, ein natives 1M-Token-Kontextfenster mitbringt und zum Einführungspreis von 2 $ pro Million Input-Tokens und 10 $ pro Million Output-Tokens bis zum 31. August 2026 erscheint (danach 3 $/15 $ pro MTok). Sonnet 5 ist das neue Standardmodell für die Free- und Pro-Tarife von Claude und das Standardmodell in Claude Code, sofort beim Update verfügbar. Das Release wird mit standardmäßig aktivierten Cyber-Safeguards ausgeliefert (derselbe Satz wie bei Opus 4.7 und 4.8, weniger streng als der von Fable 5), einem aktualisierten Tokenizer, der die Token-Zahl um das 1,0- bis 1,35-fache erhöht, und höheren Rate-Limits in Chat, Cowork, Claude Code und auf der Claude-Plattform, um den höheren Token-Verbrauch der neuen Effort-Level aufzufangen. Die Sonnet-5-System-Card und die Claude-Code-Release-Notes erscheinen am selben Tag, sodass die Claude-Code-Zielgruppe das neue Modell am Tag der Ankündigung erhält.

Verwandte Artikel

Weitere Berichterstattung zu ähnlichen Themen und Tags.

Deno 2.9 bringt 1,98x schnelleren Cold Start, 2,2–3,1x weniger RSS unter Last, npm Minimum Release Age als Default, No-Downgrade Trust Policy und eingebaute Snapshot-Tests
runtimes

Deno 2.9 bringt 1,98x schnelleren Cold Start, 2,2–3,1x weniger RSS unter Last, npm Minimum Release Age als Default, No-Downgrade Trust Policy und eingebaute Snapshot-Tests

Deno 2.9 (Bartek Iwańczuk, veröffentlicht am 2026-06-25 auf deno.com/blog/v2.9) ist das größte Deno-Release des Zyklus. Der Cold Start sinkt von 34,2 ms auf 17,3 ms (1,98x), der Spitzen-RSS auf der Deno.serve-Realworld-Last fällt um den Faktor 2,2 (142 MB → 64 MB) und um 3,1x bei 1-MiB-Bodies (197 MB → 63 MB), und der Deno.serve-Durchsatz steigt um 1,27x in Realworld (56,8k → 72,4k req/s), 1,11x in Plaintext und 1,18x bei 1-MiB-Bodies. Supply-Chain-Härtung: Das npm Minimum Release Age wird standardmäßig mit einem 24-Stunden-Fenster aktiviert (PR #35458), und eine neue opt-in No-Downgrade Trust Policy (PR #34927) weigert sich, jede Version aufzulösen, deren Vertrauensbeweis (Staged Publishing, Trusted Publishing, Provenance-Attestation) schwächer ist als der stärkste Beweis einer zuvor veröffentlichten Version desselben Pakets. Test-Runner-Parität: eingebautes t.assertSnapshot() (#35139), Deno.test.each (#34938), --shard für CI-Fan-out (#35057), Retry und Repeats (#35053), Change-Aware --changed und --related (#35199) und Coverage-Thresholds (#35056). Lockfile-Interop: deno install seedet deno.lock aus package-lock.json, pnpm-lock.yaml, yarn.lock oder bun.lock (#34296, #35330, #35346, #35350, #35394), pnpm-workspace.yaml migriert automatisch in deno.json / package.json (#34993), und Git-Merge-Konflikt-Marker in deno.lock lösen sich automatisch auf (#34726). Dazu: deno desktop verlässt den experimentellen Status (PR #33441 vom 16. Juni), Subcommands deno link / deno unlink / deno list / deno watch, stabiles --unsafe-proto (#34738), Web Locks API (#31166), Happy Eyeballs v2 (RFC 8305) (#31726), navigator.userAgentData (#34743), der WebCrypto Modern Algorithms-Vorschlag (ML-KEM, ML-DSA, SLH-DSA, ChaCha20-Poly1305, SHA-3-Familie, KMAC, Argon2) (#34447, #34448, #34914, #35223), Node-26.3.0-Kompatibilität (#34746, #34747), Node-API v10 (#35270) und CSS-Modul-Importe unter --unstable-raw-imports (#35093). Über 165 PRs landen in diesem Zyklus.
Node.js 26.4.0 'Current' bringt das node:vfs-Subsystem (Matteo Collina), ESM-Loader-Package-Maps (Maël Nison), TLS-Zertifikatkompression, TCP_KEEPINTVL/TCP_KEEPCNT und argon2 als stabil
runtimes

Node.js 26.4.0 'Current' bringt das node:vfs-Subsystem (Matteo Collina), ESM-Loader-Package-Maps (Maël Nison), TLS-Zertifikatkompression, TCP_KEEPINTVL/TCP_KEEPCNT und argon2 als stabil

Node.js 26.4.0 (Current), veröffentlicht am 2026-06-24 von @aduh95, liefert acht SEMVER-MINOR-Änderungen: ein minimales node:vfs-Subsystem, das vom Anwendungscode bereitgestellte virtuelle Dateisysteme einhängt (PR #63115, Matteo Collina) sowie ein Folgepatch, das node:fs/promises an eingehängte VFS-Instanzen weiterleitet (PR #63537), Package-Maps für ESM-Loader-Hooks, die Bare-Spezifier durch die Loader-Hooks routen (PR #62239, Maël Nison), TLS certificateCompression, das die zlib- und zstd-Kompression aus RFC 8879 durch die OpenSSL-Build-Konfiguration verkabelt (PR #62217, Tim Perry), TCP_KEEPINTVL- und TCP_KEEPCNT-Unterstützung in net.Socket.setKeepAlive (PR #63825, Guy Bedford), vom Aufrufer bereitgestellte Buffer in fs.readFile / fs.readFileSync (PR #63634, Matteo Collina), closeIdleConnections, das nun auch Pre-Request-Sockets schließt (PR #63470, semimikoh), net.BlockList auf Release-Candidate-Stabilität vorgerückt (PR #63050), und crypto.argon2 + KEM encap/decap als stabil markiert (PR #63924, Filip Skokan). Die Release ergänzt außerdem WebCrypto-cSHAKE (PR #63988), QUIC listEndpoints (PR #63536) und X509Certificate-Handles (PR #63191), dgram connectSync / bindSync (PRs #63838 + #63932, Guy Bedford), net.BoundSocket für frühes TCP-Binding (PR #63951), einen experimentellen schnellen FFI-Aufrufpfad für AArch64 und x86_64 (PRs #63068 + #63941, Paolo Insogna), npm 11.17.0 (PR #63857), sqlite 3.53.2 und libffi 3.6.0.
Node.js 24.18.0 'Krypton' LTS bringt Buffer.poolSize auf 64 KiB, TurboSHAKE und KangarooTwelve in Web Crypto sowie http.writeInformation für beliebige 1xx-Codes
runtimes

Node.js 24.18.0 'Krypton' LTS bringt Buffer.poolSize auf 64 KiB, TurboSHAKE und KangarooTwelve in Web Crypto sowie http.writeInformation für beliebige 1xx-Codes

Node.js 24.18.0 'Krypton' (LTS), veröffentlicht am 2026-06-23, liefert den aus Node.js 26.3.0 bekannten Buffer.poolSize-Default von 64 KiB auf der LTS-Linie, ergänzt Web Cryptography um die RFC-9861-Algorithmen TurboSHAKE und KangarooTwelve (PR #62183, 1.521 Ergänzungen, 13 Dateien), führt http.writeInformation für beliebige 1xx-Statuscodes ein (PR #63155, 306 Ergänzungen, 7 Dateien), legt den Start der V8-Precise-Coverage in das JS-Laufzeitsystem (Commit 8c989ec4a3), ergänzt JWK-Import/Export für die Post-Quanten-Schlüsseltypen ML-KEM und SLH-DSA (PR #62706, 842 Ergänzungen, 39 Dateien), bindet im BoringSSL-Pfad ML-DSA, ML-KEM, ChaCha20-Poly1305 und AES-KW in Web Crypto ein (PR #63255), härtet WebCrypto gegen Prototype-Pollution (PR #63363), vereinheitlicht die Schlüsselargumentnamen von crypto.diffieHellman und akzeptiert Schlüsseldaten als Eingabe (PR #62527), nimmt das in 24.16.0 eingeführte Verhalten 'stream: noop pause/resume on destroyed streams' zurück (PR #63834) und veröffentlicht am selben Tag den Minimal-Hotfix 22.23.1, der eine in der Sicherheitsrelease v22.23.0 vom 18.06. eingeführte Änderung am HTTP-Agent zurücknimmt, die an inaktiven Agent-Sockets Stream-Listener angehängt hatte.

Kommentare

Anmelden Melden Sie sich an, um an der Diskussion teilzunehmen.

Noch keine Kommentare. Seien Sie der Erste, der seine Gedanken teilt.