Fastify v5.9.0 ajoute `request.mediaType` et `onMaxParamLength`, durcit la confiance dans les en-têtes `forwarded`, découpe les grandes réponses HTTP/2 et migre les tests de types vers TSTyche

Fastify v5.9.0 ajoute `request.mediaType` et `onMaxParamLength`, durcit la confiance dans les en-têtes `forwarded`, découpe les grandes réponses HTTP/2 et migre les tests de types vers TSTyche

lschvn

Fastify v5.9.0, publié le 2026-06-28, est la première version mineure de la ligne v5 de Fastify en 2026 et un cycle substantiel de 65 PR. Les deux nouvelles API publiques de la version sont request.mediaType, un accesseur typé pour le type de média négocié, et l'option de route onMaxParamLength, qui permet à un hook de route de gérer les URLs dont un seul paramètre dépasse le maxParamLength configuré, au lieu de jeter une FST_ERR_VALIDATION synchrone. Le cycle livre aussi un correctif de sécurité qui ne fait plus confiance à X-Forwarded-Host et X-Forwarded-Proto quand le socket entrant est absent (#6684 par mcollina), découpe en morceaux les grandes réponses buffer HTTP/2 (#6746), migre la suite de tests de types d'assertions expect-type artisanales vers TSTyche (#6532), et ajoute Node.js 26 à la matrice de tests tout en retirant Node.js 20 de la matrice yarn.

La version est la troisième mineure de la ligne v5 cette année. Fastify v5.8.0 est sorti le 5 mars 2026, et v5.8.5 était le dernier 5.8.x le 14 avril 2026. v5.9.0 est la première depuis ce patch 5.8.5 qui livre une nouvelle API publique.

Les deux nouvelles API publiques

request.mediaType (climba03003) est la fonctionnalité phare. Avant la v5.9.0, le code d'application qui voulait savoir quel type de média le client demandait parsait request.headers['accept'] à la main, parcourait la liste des q-values, choisissait la meilleure correspondance, puis comparait avec un Content-Type qu'il espérait servi par la route. Le nouvel accesseur fait le parsing et la correspondance en un seul endroit. Pour une req qui demande application/json, l'accesseur retourne 'application/json' ; pour une req sans en-tête Accept, il retourne undefined. L'accesseur est additif, et la surface publique est inchangée. L'implémentation vit dans lib/request.js et la surface TypeScript est exportée dans fastify.d.ts.

onMaxParamLength (climba03003) est la deuxième. Sans l'option, Fastify jette une FST_ERR_VALIDATION synchrone quand un seul paramètre d'URL dépasse le maxParamLength configuré (100 caractères par défaut). Avec l'option, la route peut faire quelque chose avec la requête fautive : journaliser un avertissement, incrémenter une métrique, rediriger, ou retourner une erreur personnalisée. Le hook est une option de route normale ({ onMaxParamLength: (req, reply, maxParamLength) => void }), à côté de preHandler, onRequest et du reste des hooks de cycle de vie. Le changement est additif : les routes qui n'ont pas défini l'option conservent l'ancien comportement, et l'option est désactivée par défaut.

Le correctif de sécurité et les travaux liés

PR #6684 (mcollina) ferme une faille de spoofing de requête dans le chemin de confiance des en-têtes forwarded. Avant le correctif, Fastify faisait confiance aux en-têtes X-Forwarded-Host et X-Forwarded-Proto même quand le request.socket entrant était absent ou non défini (une situation qui peut se produire derrière un transport qui supprime la connexion source, ou quand la requête est reconstruite depuis un corps analysé dans un test). Le nouveau code refuse de lire les en-têtes forwarded dans ce cas, retombe sur le request.host brut, et signale la situation comme untrusted input dans le fichier de déclaration TypeScript via PR #6572 (mcollina), qui marque les accesseurs de métadonnées de la requête request.ip, request.host, request.protocol, request.ips avec des avertissements JSDoc explicites indiquant qu'ils ne doivent pas être utilisés pour des décisions de sécurité. Le correctif est invisible pour les proxies correctement configurés (qui ont toujours un vrai socket sur la requête entrante) et le changement est du côté sûr : socket absent signifie pas d'en-tête forwarded, même si l'en-tête est présent dans la requête.

La version ajoute aussi le support de useContentType comme clé de schéma, pour que la recherche de schéma de réponse respecte le type de contenu négocié (#6685 par UlisesGascon), trois petits commits de durcissement autour des codes d'erreur de routage (#6678) et de checkDependencies (#6774), et marque les accesseurs de métadonnées de la request comme entrées non fiables dans le fichier de déclaration TypeScript (#6572 par mcollina).

Le travail de performance se regroupe sur le chemin chaud du type de contenu

Trois des quatre entrées de perf du cycle vivent sur le même chemin chaud. PR #6692 (aquie00t) diffère le parsing ContentType à l'intérieur de getSchemaSerializer jusqu'à ce que le schéma soit réellement lu, #6694 (aquie00t) met en cache les objets ContentType analysés à l'intérieur du ContentTypeParser, et #6693 (aquie00t) ajoute une garde typeof devant toString.call dans send et onSendEnd. Le quatrième est le correctif de découpage en morceaux du buffer HTTP/2 (mcollina) pour les grandes réponses : l'ancien code mettait en buffer la totalité de la charge utile en mémoire avant de l'envoyer sur la connexion HTTP/2 (un export de 1 Go voulait dire 1 Go de mémoire résidente sur le serveur) ; le nouveau code découpe le buffer en morceaux plus petits et les streame au fur et à mesure que la connexion HTTP/2 peut les absorber, donc le coût mémoire est borné par la taille du chunk plutôt que par la taille de la charge utile.

L'article Vite 8.1 du 24 juin couvrait une forme similaire de travail de perf dans le chemin de build du dev server : un petit changement sur un chemin chaud, répété tout au long du cycle de vie de la requête, qui s'additionne en une amélioration notable. Le travail de Fastify v5.9.0 est la même idée, sur un runtime différent.

Trailer, validation, et autres correctifs

Le cycle livre un groupe de correctifs autour des chemins de trailer et de validation. #6676 (climba03003) empêche un res.end dupliqué dans sendTrailer quand un callback synchrone déclenche le trailer, et #6714 (mcollina) ignore les complétions de trailer dupliquées. #6678 (mcollina) restaure le error.code sur les erreurs de routage qui le supprimaient silencieusement, et #6665 (trivikr) autorise request.getValidationFunction() à retourner undefined dans la déclaration TypeScript, ce qui correspond au comportement runtime réel. #6753 (LeSingh1) fait que hasRequestDecorator et hasReplyDecorator détectent les propriétés natives assignées par constructeur qui étaient précédemment manquées, ce qui ferme un écart de longue date où les décorateurs étaient faussement signalés comme absents sur une requête ou un reply qui avait été encapsulé par un natif.

La version livre aussi un bump de la matrice de tests Node.js. #6728 (Fdawgs) ajoute Node.js 26 à la matrice de tests, ce qui s'aligne sur la version Node.js 26.4.0 du 25 juin, et #6662 (Tony133) retire Node.js 20 de la matrice yarn CI, ce qui est cohérent avec le calendrier de fin de vie de Node.js 20 du projet Node.js et avec l'article Deno 2.9 du 26 juin qui couvre le paysage des runtimes.

TSTyche pour les tests de types, fastify-plugin v6.0.0

La migration de la suite de tests de types de Fastify d'assertions expect-type artisanales vers TSTyche est le changement d'infrastructure le plus intéressant du cycle. PR #6532 (mrazauskas) introduit TSTyche, et #6726 et #6727 terminent la migration en deux lots. TSTyche est un lanceur de tests de types dédié qui s'exécute à l'étape de compilation TypeScript plutôt qu'au runtime, et qui donne de meilleurs diagnostics quand une assertion échoue (l'échec pointe sur la ligne et le type attendu vs. réel, plutôt qu'un false runtime de expect-type). Le changement est invisible pour les utilisateurs de Fastify ; il accélère la CI des mainteneurs et leur donne de meilleurs messages d'erreur quand un test de type échoue.

La version épingle aussi un bump de fastify-plugin de 5.1.0 à 6.0.0 (#6801). fastify-plugin est un peer purement TypeScript de Fastify ; v6.0.0 est un bump de version majeure qui supprime certains des anciens chemins de code style CommonJS et aligne la surface API sur la ligne Fastify v5. Le bump est sur une ligne de dependencies que les auteurs de plugins consomment via peerDependencies ; le code d'application qui utilise Fastify directement n'est pas affecté.

Pourquoi c'est important

Fastify v5.9.0 est la version où le framework est à mi-chemin d'un cycle de durcissement d'un an. La ligne v5.0 est sortie fin 2024 et le projet ajoute régulièrement des accesseurs type-safe, durcit le chemin de confiance des en-têtes forwarded, et migre l'infrastructure de test vers des outils qui sont un meilleur choix pour la base de code. v5.9.0 est la première version de ce cycle qui livre à la fois une nouvelle API publique et un correctif pertinent pour la sécurité, ce qui est le schéma qui fait qu'une mineure vaut la peine d'être écrite.

Pour les développeurs d'application, le changement pratique est petit et concret. Les deux nouvelles API publiques sont additives et le correctif de sécurité est du côté sûr. La surface TypeScript obtient un nouvel accesseur et les accesseurs de métadonnées de la request sont explicitement marqués comme entrées non fiables, ce qui est la bonne chose à faire et le bon moment pour le faire. Le correctif de découpage en morceaux du buffer HTTP/2 est invisible pour les petites charges utiles et significatif pour les très grandes, ce qui est la forme de correctif qui compte pour une route qui sert un blob binaire généré.

Pour l'espace plus large des frameworks web Node.js, Fastify v5.9.0 s'aligne sur les mises à jour du runtime Bun et les notes de version Deno 2.9 pour montrer que les trois grands runtimes JavaScript durcissent tous leurs chemins HTTP et de gestion de requête en parallèle. Fastify est la contrepartie au niveau framework de ces changements au niveau runtime.

Questions fréquentes

npm 11.18 promeut la stratégie d'installation `linked` en stable, ajoute l'espace de noms `npm install-scripts` et avertit quand `min-release-age` bloque un correctif d'audit

npm 11.18.0 (29 juin 2026) livre trois fonctionnalités et un long backlog de corrections de bugs qui, ensemble, achèvent le travail que le CLI npm mène sur le mode d'installation `install-strategy=linked` (isolated) depuis la RFC #0042 en 2022. L'événement phare est la [PR #9677](https://github.com/npm/cli/pull/9677) (backport de #9674), qui fait passer `--install-strategy=linked` d'expérimental à stable. Le mode installe chaque paquet dans `node_modules/.store/<name>@<version>/node_modules/<dep>` et lie symboliquement ses dépendances déclarées dans son propre `node_modules/<dep>`, de sorte qu'un paquet ne peut `require` que les dépendances réellement déclarées dans son propre `package.json`. La nouvelle recommandation des docs ([PR #9690](https://github.com/npm/cli/pull/9690)) consiste à exécuter `--install-strategy=linked` en CI pour intercepter les dépendances fantômes avant publication. Autour de cette promotion, la release livre un nouveau namespace `npm install-scripts` ([#9635](https://github.com/npm/cli/pull/9635), backport de #9629) qui possède `approve`, `deny` et `ls`, avec `npm approve-scripts` / `npm deny-scripts` conservés comme alias ; une passe de ménage `install-scripts: prune unused allowScripts entries` ([#9662](https://github.com/npm/cli/pull/9662)) ; et un nouvel avertissement quand `min-release-age` bloque un `npm audit fix` ([#9564](https://github.com/npm/cli/pull/9564)). La release de 43 commits corrige aussi 19 bugs de la stratégie `linked` (déterminisme de l'audit #9638, stubs `.bin` orphelins #9643, nettoyage des `.store` périmés #9649, crash `filterNode` invalide #9645, validation peerOptional #9641), trois fixes `npm sbom` et un fix d'encodage en pourcentage du qualificateur `vcs_url` dans les purls générées ([#9693](https://github.com/npm/cli/pull/9693)).

Claude Sonnet 5 devient le modèle par défaut de Claude Code 2.1.197 avec une fenêtre de contexte native de 1M tokens, un tarif de lancement de 2 $/10 $ par MTok et des garde-fous cyber activés par défaut

Anthropic a annoncé Claude Sonnet 5 le 2026-06-30 ([Introducing Claude Sonnet 5](https://www.anthropic.com/news/claude-sonnet-5)), et Claude Code [v2.1.197](https://github.com/anthropics/claude-code/releases/tag/v2.1.197) (publié le même jour) en a fait le modèle par défaut. Le lancement est le premier modèle de la lignée Sonnet qui comble l'écart agentique avec Opus 4.8, embarque une fenêtre de contexte native de 1M tokens et arrive à un tarif de lancement de 2 $ par million de tokens d'entrée et 10 $ par million de tokens de sortie jusqu'au 31 août 2026 (puis 3 $/15 $ par MTok). Sonnet 5 devient le modèle par défaut des plans Free et Pro de Claude et le modèle par défaut de Claude Code, disponible immédiatement à la mise à jour. La release est livrée avec les garde-fous cyber activés par défaut (les mêmes que pour Opus 4.7 et 4.8, moins stricts que ceux de Fable 5), un tokenizer rafraîchi qui gonfle le nombre de tokens de 1,0 à 1,35x, et des hausses de limites de débit sur Chat, Cowork, Claude Code et la plateforme Claude pour absorber la consommation accrue des nouveaux niveaux d'effort. La system card Sonnet 5 et les notes de release Claude Code sortent le même jour, donc l'audience Claude Code reçoit le nouveau modèle le jour même de l'annonce.

Articles connexes

Plus de couverture avec des sujets et tags en commun.

Deno 2.9 livre un démarrage à froid 1,98x plus rapide, 2,2 à 3,1x moins de RSS en charge, le minimum-release-age npm activé par défaut, la politique de confiance no-downgrade et les tests par snapshot natifs
runtimes

Deno 2.9 livre un démarrage à froid 1,98x plus rapide, 2,2 à 3,1x moins de RSS en charge, le minimum-release-age npm activé par défaut, la politique de confiance no-downgrade et les tests par snapshot natifs

Deno 2.9 (Bartek Iwańczuk, publié le 2026-06-25 sur deno.com/blog/v2.9) est la plus grande release Deno du cycle. Le démarrage à froid passe de 34,2 ms à 17,3 ms (1,98x), le pic RSS sur la charge realworld de Deno.serve baisse d'un facteur 2,2 (142 Mo → 64 Mo) et de 3,1x sur les corps de 1 Mio (197 Mo → 63 Mo), et le débit Deno.serve grimpe de 1,27x en realworld (56,8k → 72,4k req/s), 1,11x en plaintext, et 1,18x sur les corps de 1 Mio. Durcissement supply chain : le npm minimum-release-age est activé par défaut avec une fenêtre de 24h (PR #35458), et une nouvelle politique de confiance opt-in no-downgrade (PR #34927) refuse de résoudre toute version dont la preuve de confiance (publication échelonnée, trusted publishing, attestation de provenance) est plus faible que la meilleure preuve sur toute version précédemment publiée du même paquet. Parité du runner de tests : t.assertSnapshot() natif (#35139), Deno.test.each (#34938), --shard pour fan-out CI (#35057), retry et repeats (#35053), sélection change-aware --changed et --related (#35199), et seuils de coverage (#35056). Interop lockfile : deno install seed deno.lock depuis package-lock.json, pnpm-lock.yaml, yarn.lock ou bun.lock (#34296, #35330, #35346, #35350, #35394), pnpm-workspace.yaml auto-migre vers deno.json / package.json (#34993), et les marqueurs de conflit de fusion git dans deno.lock se résolvent automatiquement (#34726). Plus : deno desktop sort de l'expérimental (PR #33441 du 16 juin), sous-commandes deno link / deno unlink / deno list / deno watch, --unsafe-proto stable (#34738), Web Locks API (#31166), Happy Eyeballs v2 (RFC 8305) (#31726), navigator.userAgentData (#34743), la proposition WebCrypto Modern Algorithms (ML-KEM, ML-DSA, SLH-DSA, ChaCha20-Poly1305, famille SHA-3, KMAC, Argon2) (#34447, #34448, #34914, #35223), compat Node 26.3.0 (#34746, #34747), Node-API v10 (#35270), et imports de modules CSS sous --unstable-raw-imports (#35093). Plus de 165 PRs mergent dans ce cycle.
Node.js 26.4.0 'Current' livre le sous-système node:vfs (Matteo Collina), les package maps pour les hooks de loader ESM (Maël Nison), la compression de certificat TLS, TCP_KEEPINTVL/TCP_KEEPCNT, et argon2 stable
runtimes

Node.js 26.4.0 'Current' livre le sous-système node:vfs (Matteo Collina), les package maps pour les hooks de loader ESM (Maël Nison), la compression de certificat TLS, TCP_KEEPINTVL/TCP_KEEPCNT, et argon2 stable

Node.js 26.4.0 (Current), publié le 2026-06-24 par @aduh95, apporte huit changements SEMVER-MINOR : un sous-système node:vfs minimal qui permet de monter des systèmes de fichiers virtuels fournis par l'application (PR #63115, Matteo Collina) ainsi qu'un suivi qui redirige node:fs/promises vers les instances VFS montées (PR #63537), les package maps pour les hooks de loader ESM qui routent les spécificateurs bruts à travers les hooks de loader (PR #62239, Maël Nison), certificateCompression TLS qui câble la compression zlib et zstd de la RFC 8879 à travers la configuration de build OpenSSL (PR #62217, Tim Perry), le support de TCP_KEEPINTVL et TCP_KEEPCNT dans net.Socket.setKeepAlive (PR #63825, Guy Bedford), des buffers fournis par l'appelant dans fs.readFile / fs.readFileSync (PR #63634, Matteo Collina), closeIdleConnections qui ferme désormais aussi les sockets pre-request (PR #63470, semimikoh), net.BlockList promu au statut Release Candidate (PR #63050), et crypto argon2 + KEM encap/decap marqués stable (PR #63924, Filip Skokan). La release ajoute aussi WebCrypto cSHAKE (PR #63988), listEndpoints QUIC (PR #63536) et des handles X509Certificate (PR #63191), dgram connectSync / bindSync (PRs #63838 + #63932, Guy Bedford), net.BoundSocket pour un binding TCP précoce (PR #63951), un chemin expérimental d'appel FFI rapide pour AArch64 et x86_64 (PRs #63068 + #63941, Paolo Insogna), npm 11.17.0 (PR #63857), sqlite 3.53.2 et libffi 3.6.0.
Node.js 24.18.0 'Krypton' LTS : Buffer.poolSize à 64 Kio, TurboSHAKE et KangarooTwelve dans Web Crypto, et http.writeInformation pour les codes 1xx arbitraires
runtimes

Node.js 24.18.0 'Krypton' LTS : Buffer.poolSize à 64 Kio, TurboSHAKE et KangarooTwelve dans Web Crypto, et http.writeInformation pour les codes 1xx arbitraires

Node.js 24.18.0 'Krypton' (LTS), publié le 2026-06-23, embarque la valeur par défaut Buffer.poolSize à 64 Kio déjà livrée sur Current par la 26.3.0, ajoute à Web Cryptography les algorithmes TurboSHAKE et KangarooTwelve de la RFC 9861 (PR #62183, 1 521 ajouts, 13 fichiers), expose http.writeInformation pour envoyer des codes 1xx arbitraires (PR #63155, 306 ajouts, 7 fichiers), rend accessible au runtime JS le démarrage de la couverture précise de V8 (commit 8c989ec4a3), ajoute l'import-export JWK pour les types de clés post-quantiques ML-KEM et SLH-DSA (PR #62706, 842 ajouts, 39 fichiers), câble en BoringSSL ML-DSA, ML-KEM, ChaCha20-Poly1305 et AES-KW pour Web Crypto (PR #63255), durcit WebCrypto contre la pollution de prototype (PR #63363), aligne les noms d'arguments de clé de crypto.diffieHellman et accepte des données de clé en entrée (PR #62527), annule le comportement 'stream: noop pause/resume on destroyed streams' de la 24.16.0 (PR #63834), et publie dans la foulée un correctif minimal 22.23.1 qui revient sur un changement d'agent http introduit dans la release de sécurité 06-18 et qui rattachait des listeners de stream sur les sockets idle.

Commentaires

Connexion Connectez-vous pour participer à la conversation.

Pas encore de commentaires. Soyez le premier à partager vos pensées.