workerd 1.20260916.1: node:net, node:stream web-interop y retries de JS RPC
El runtime de Cloudflare Workers sigue cerrando la brecha con Node: suite de node:net, suite de web-interop para node:stream, soporte de web streams en stream.pipeline() y validación de bounds de offset/length en lecturas y escrituras de node:fs. Nada de esto es glamoroso, pero es exactamente lo que hace que tu librería de npm deje de explotar en el edge.
Del lado de Durable Objects se preparan los planes de llamada JS RPC para retries, se reporta si un target de fetch soporta retry y se desactivan los retries en namespaces no elegibles. También cae un use-after-free en el canal de facets tras un timeout de alarm.
NestJS 11.2.5: el transporte TCP se blinda contra un peer hostil
Parche de una sola línea en el changelog y de peso real: @nestjs/microservices endurece el transporte TCP frente a un peer hostil. Si exponés microservicios Nest por TCP en una red que no controlás del todo, este es el que subís hoy.
NestJS 12.0.3: memoria acotada por peer TCP y sockets que sí se cierran al apagar
La rama 12 recibe el mismo trabajo de microservicios con más detalle: memoria acotada para cada peer TCP, sockets abiertos destruidos en el shutdown, requests pendientes que fallan cuando el cliente cierra, y el hook de fin de procesamiento de Kafka que ahora corre siempre. Eso último es el clásico que te deja lag fantasma en el consumer group.
En common, la validación de UUID ahora chequea versión y variante aunque no declares versión — si tu DTO aceptaba UUIDs raros, ahora los va a rechazar.
Hono 4.13.8: backpressure en Lambda streaming y negociación de Accept que respeta q=0
Tanda de correcciones finas de conformidad HTTP: el adaptador de aws-lambda ahora respeta el backpressure al streamear el body de la respuesta, y la negociación de Accept saltea las entradas con q=0, trata el nombre del parámetro q como case-insensitive y clampea un q negativo a 0 en vez de a 1. También se conserva el media type de la request al reusar un body cacheado.
Extra de performance: menos trabajo de lookup en updates keyed grandes de jsx/dom. Detallitos de RFC, sí — pero son los que separan un router que casi cumple de uno que cumple.
Kysely 0.29.6: columnas inmutables permitidas en el where de doUpdateSet
Tanda chica de bugfixes en la línea estable: el where de doUpdateSet() ahora acepta columnas inmutables en PostgreSQL y SQLite. Si venías peleando con los tipos para escribir un upsert condicional sobre una columna generada, ya está.
AWS Direct Connect pasa a pricing plano en conexiones dedicadas
Las conexiones dedicadas de Direct Connect pasan a tarifa plana. Para cualquiera que esté modelando costo de red en híbrido, esto cambia la aritmética: el port-hour más data transfer variable deja de ser la única forma de presupuestar el link.
El turnstile de Solaris explica por qué los locks de Go, WebKit y parking_lot son diminutos
La idea es de manual de arquitectura: sacá el estado de espera de adentro del lock y metelo en una hash table global. El lock sin contención queda mínimo — un par de bytes — y la herencia de prioridad sigue funcionando, al precio de contención en los buckets del hash cuando la concurrencia sube.
El mismo patrón vive hoy en Go, WebKit y el crate parking_lot de Rust. Si alguna vez te preguntaste por qué un Mutex moderno ocupa tan poco, acá está la respuesta, y es el tipo de tradeoff espacio-vs-sincronización que conviene tener internalizado antes de diseñar cualquier primitiva concurrente propia.
Vitest 5.0.1: automocking sin prototipos recursivos y vitest list que falla con exit 1
Primer patch de la serie 5: se evita el prototipo recursivo en automocking, vitest list ahora sale con código 1 cuando falla la colección, y se conservan los detalles del error de parseo en la colección estática. Los dos últimos son oro para CI: un list que fallaba silencioso en verde es exactamente el bug que te deja tests sin correr sin que nadie se entere.
La UI suma un modo de vista de trace enfocada y mueve el selector de intentos al header del viewer.
Dropbox: más de 50% de mejora en eficiencia energética midiendo watts por petabyte
Dropbox cuenta cómo hizo lugar para cargas de AI sin construir data centers nuevos: rebalanceo de workloads, densidad de storage con shingled magnetic recording y ciclos de vida de hardware más largos, con una métrica clara — watts por petabyte, más de 50% mejor desde 2020.
La lección transferible no es el hardware: es elegir la métrica correcta. Y el límite real que aparece es la entrega de potencia — duplicaron los PDUs por rack para la séptima generación de servidores.
Http4s Ember HTTP/2 bufferea el payload declarado antes de chequear SETTINGS_MAX_FRAME_SIZE
Un peer declara un frame gigante y Ember reserva la memoria antes de validar contra SETTINGS_MAX_FRAME_SIZE. Es el patrón clásico de agotamiento de memoria: confiar en el largo declarado antes de aplicar el límite negociado. Viene acompañado de acumulación sin límite de frames CONTINUATION, cola de salida sin cota y falta de enforcement de SETTINGS_MAX_CONCURRENT_STREAMS.
DNS rebinding contra el transporte Streamable HTTP local del MCP de GitLab
Segundo crítico del mismo paquete: una página web cualquiera puede alcanzar tu transporte MCP corriendo en localhost vía DNS rebinding. El supuesto de que escucha sólo en 127.0.0.1, entonces está seguro se cae solo en cuanto el navegador de la víctima resuelve un dominio del atacante hacia loopback. Validá Origin y Host en todo transporte MCP local, sin excepción.
libp2p-quic: panic remoto por carrera de expiración de certificado en el handshake (CVSS 8.2)
Un peer malicioso presenta un certificado TLS libp2p válido pero de vida corta y retrasa el último fragmento del handshake TLS 1.3 hasta que expire. Tras el handshake, libp2p-quic vuelve a parsear el mismo certificado asumiendo que no puede fallar — y ahí panickea. Crashea cualquier app con un listener QUIC expuesto; parcheado en 0.13.1.
Moraleja de diseño: si validaste algo una vez, no asumas que sigue siendo válido cuando lo volvés a mirar. El tiempo también es entrada del atacante.
Tendencias Destacadas
El lote de Http4s es un recordatorio incómodo: el request smuggling sigue vivo en 2026 porque la ambigüedad de framing entre proxy y origin nunca se resolvió del todo. Si tenés un intermediario adelante, tu servidor no decide solo cómo se parte el body.
Los servidores MCP se están convirtiendo en la nueva superficie de ataque del backend. SSRF por header, DNS rebinding contra localhost, bypass de allow-lists: son bugs de 2010 apareciendo en infraestructura de 2026 porque el ecosistema se está escribiendo más rápido de lo que se audita.
Tres releases del día (NestJS, workerd, libp2p) atacan el mismo tema: límites de recursos por conexión. Memoria acotada por peer TCP, retries con plan explícito, parseo que puede fallar dos veces. El backend maduro de 2026 asume que cada conexión es hostil hasta que demuestre lo contrario.
workerd 1.20260916.1: node:net, node:stream web interop and JS RPC retries
The Cloudflare Workers runtime keeps closing the Node gap: a node:net suite, a node:stream web-interop suite, web streams support in stream.pipeline(), and offset/length bounds validation for node:fs buffer reads and writes. None of it is glamorous, but it is exactly what stops your npm library from blowing up at the edge.
On the Durable Objects side, JS RPC call plans are prepared for retries, a fetch target now reports whether it supports retries, and retries are disabled for ineligible actor namespaces. A use-after-free in the facet channel after an alarm timeout also gets fixed.
NestJS 11.2.5: the TCP transport hardens against a hostile peer
A one-line changelog with real weight: @nestjs/microservices hardens the TCP transport against a hostile peer. If you expose Nest microservices over TCP on a network you do not fully control, this is the one to bump today.
NestJS 12.0.3: bounded memory per TCP peer and sockets that actually close on shutdown
The 12 branch gets the same microservices work in more detail: bounded memory per TCP peer, open sockets destroyed on shutdown, pending requests failing when the client closes, and the Kafka processing-end hook now always running. That last one is the classic that leaves phantom lag in your consumer group.
In common, UUID validation now checks version and variant even when no version is declared — if your DTO accepted odd UUIDs, it will start rejecting them.
Hono 4.13.8: Lambda streaming backpressure and Accept negotiation that respects q=0
A batch of fine-grained HTTP conformance fixes: the aws-lambda adapter now respects backpressure when streaming the response body, and Accept negotiation skips entries with q=0, treats the q parameter name as case-insensitive, and clamps a negative q to 0 rather than 1. The request media type is also kept when reusing a cached body.
Performance extra: less lookup work on large keyed updates in jsx/dom. RFC minutiae, yes — and exactly what separates a router that almost complies from one that does.
Kysely 0.29.6: immutable columns allowed in doUpdateSet's where
A small bugfix batch on the stable line: doUpdateSet()'s where now accepts immutable columns on PostgreSQL and SQLite. If you were fighting the types to write a conditional upsert over a generated column, that is settled.
AWS Direct Connect moves to flat-rate pricing for dedicated connections
Direct Connect dedicated connections move to flat-rate pricing. For anyone modelling hybrid network cost, the arithmetic changes: port-hour plus variable data transfer is no longer the only way to budget the link.
Solaris' turnstile explains why locks in Go, WebKit and parking_lot are tiny
The idea is straight out of an architecture textbook: pull the waiting state out of the lock and put it in a global hash table. The uncontended lock stays minimal — a couple of bytes — and priority inheritance still works, at the cost of contention on hash buckets as concurrency climbs.
The same pattern lives today in Go, WebKit and Rust's parking_lot crate. If you ever wondered why a modern Mutex is so small, here is the answer — and it is the kind of space-versus-synchronization tradeoff worth internalizing before designing any concurrency primitive of your own.
Vitest 5.0.1: automocking without recursive prototypes and vitest list exiting 1
First patch of the 5 series: recursive prototypes are avoided in automocking, vitest list now exits 1 when collection fails, and parse error details are kept in static collection. The last two are gold for CI — a list that failed silently green is exactly the bug that leaves tests unrun with nobody noticing.
The UI adds a focused trace view layout mode and moves the attempts selector into the viewer header.
Dropbox: over 50% power efficiency improvement measured in watts per petabyte
Dropbox describes how it made room for AI workloads without building new data centers: workload rebalancing, storage density via shingled magnetic recording, and longer hardware lifecycles, all against one clear metric — watts per petabyte, over 50% better since 2020.
The transferable lesson is not the hardware, it is picking the right metric. And the real ceiling that shows up is power delivery: they doubled PDUs per rack for seventh-generation servers.
Http4s Ember HTTP/2 buffers a frame's declared payload before checking SETTINGS_MAX_FRAME_SIZE
A peer declares a huge frame and Ember reserves the memory before validating against SETTINGS_MAX_FRAME_SIZE. It is the classic memory-exhaustion pattern: trusting the declared length before applying the negotiated limit. It ships alongside unbounded CONTINUATION frame accumulation, an unbounded outbound queue, and missing SETTINGS_MAX_CONCURRENT_STREAMS enforcement.
DNS rebinding reaches the GitLab MCP local Streamable HTTP transport
Second critical in the same batch: any web page can reach your MCP transport running on localhost via DNS rebinding. The assumption that it only listens on 127.0.0.1, so it is safe collapses the moment the victim's browser resolves an attacker domain to loopback. Validate Origin and Host on every local MCP transport, no exceptions.
libp2p-quic: remote panic via certificate expiry race during the QUIC handshake (CVSS 8.2)
A malicious peer presents a valid but short-lived libp2p TLS certificate and delays the final TLS 1.3 handshake fragment until it expires. After the handshake, libp2p-quic re-parses the same certificate assuming it cannot fail — and panics. It crashes any app exposing a QUIC listener; patched in 0.13.1.
Design lesson: if you validated something once, do not assume it is still valid when you look again. Time is an attacker input too.
Notable Trends
The Http4s batch is an uncomfortable reminder: request smuggling is alive in 2026 because framing ambiguity between proxy and origin was never fully resolved. With an intermediary in front, your server does not decide alone how the body is split.
MCP servers are becoming the backend's new attack surface. Header-driven SSRF, DNS rebinding against localhost, allow-list bypasses: these are 2010 bugs showing up in 2026 infrastructure because the ecosystem is being written faster than it is audited.
Three of today's releases (NestJS, workerd, libp2p) attack the same theme: per-connection resource limits. Bounded memory per TCP peer, retries with an explicit plan, parsing that can fail twice. Mature 2026 backends assume every connection is hostile until proven otherwise.
workerd 1.20260916.1 : node:net, interop node:stream web et retries JS RPC
Le runtime Cloudflare Workers continue de combler l'écart avec Node : suite node:net, suite d'interop web pour node:stream, support des web streams dans stream.pipeline() et validation des bornes offset/length pour les lectures et écritures node:fs.
Côté Durable Objects, les plans d'appel JS RPC sont préparés pour les retries, une cible de fetch indique si elle les supporte, et les retries sont désactivés pour les namespaces non éligibles. Un use-after-free du canal de facets après un timeout d'alarm est aussi corrigé.
NestJS 11.2.5 : le transport TCP se blinde contre un peer hostile
Un changelog d'une ligne au poids bien réel : @nestjs/microservices durcit le transport TCP face à un peer hostile. Si vous exposez des microservices Nest en TCP sur un réseau que vous ne maîtrisez pas totalement, c'est la version à passer aujourd'hui.
NestJS 12.0.3 : mémoire bornée par peer TCP et sockets réellement fermées à l'arrêt
La branche 12 reçoit le même travail sur les microservices en plus détaillé : mémoire bornée par peer TCP, sockets ouvertes détruites à l'arrêt, requêtes en attente qui échouent à la fermeture du client, et le hook de fin de traitement Kafka qui s'exécute désormais toujours.
Dans common, la validation d'UUID vérifie maintenant version et variante même sans version déclarée — si votre DTO acceptait des UUIDs douteux, il va les rejeter.
Hono 4.13.8 : backpressure en streaming Lambda et négociation Accept respectant q=0
Un lot de corrections fines de conformité HTTP : l'adaptateur aws-lambda respecte désormais le backpressure lors du streaming du body, et la négociation Accept ignore les entrées à q=0, traite le nom du paramètre q comme insensible à la casse, et ramène un q négatif à 0 plutôt qu'à 1.
Bonus performance : moins de travail de lookup sur les gros updates keyed de jsx/dom.
Kysely 0.29.6 : colonnes immuables autorisées dans le where de doUpdateSet
Petit lot de correctifs sur la ligne stable : le where de doUpdateSet() accepte désormais les colonnes immuables sur PostgreSQL et SQLite. Si vous luttiez contre les types pour écrire un upsert conditionnel sur une colonne générée, c'est réglé.
AWS Direct Connect passe à une tarification forfaitaire sur les connexions dédiées
Les connexions dédiées Direct Connect passent à une tarification forfaitaire. Pour qui modélise le coût réseau en hybride, l'arithmétique change : port-heure plus transfert variable n'est plus la seule façon de budgéter le lien.
Le turnstile de Solaris explique pourquoi les locks de Go, WebKit et parking_lot sont minuscules
L'idée sort d'un manuel d'architecture : sortir l'état d'attente du lock et le placer dans une table de hachage globale. Le lock non contendu reste minimal — quelques octets — et l'héritage de priorité fonctionne toujours, au prix d'une contention sur les buckets quand la concurrence grimpe.
Le même pattern vit aujourd'hui dans Go, WebKit et le crate parking_lot de Rust.
Vitest 5.0.1 : automocking sans prototypes récursifs et vitest list sortant en 1
Premier patch de la série 5 : les prototypes récursifs sont évités en automocking, vitest list sort désormais en 1 quand la collecte échoue, et les détails d'erreur de parsing sont conservés en collecte statique. Les deux derniers sont précieux en CI.
L'UI ajoute un mode de vue de trace focalisée et déplace le sélecteur de tentatives dans le header du viewer.
Dropbox : plus de 50 % d'efficacité énergétique gagnée, mesurée en watts par pétaoctet
Dropbox raconte comment libérer de la capacité pour l'AI sans construire de nouveaux data centers : rééquilibrage des workloads, densité de stockage via shingled magnetic recording et cycles de vie matériels allongés, avec une métrique claire — watts par pétaoctet, plus de 50 % de mieux depuis 2020.
La leçon transférable n'est pas le matériel, c'est le choix de la bonne métrique.
Http4s Ember HTTP/2 bufferise le payload déclaré avant de vérifier SETTINGS_MAX_FRAME_SIZE
Un peer déclare un frame énorme et Ember réserve la mémoire avant de valider contre SETTINGS_MAX_FRAME_SIZE. C'est le pattern classique d'épuisement mémoire : faire confiance à la longueur déclarée avant d'appliquer la limite négociée.
DNS rebinding atteint le transport Streamable HTTP local du MCP GitLab
Deuxième critique du même lot : n'importe quelle page web peut atteindre votre transport MCP sur localhost via DNS rebinding. L'hypothèse « il n'écoute que sur 127.0.0.1, donc c'est sûr » s'effondre dès que le navigateur de la victime résout un domaine attaquant vers le loopback.
libp2p-quic : panic distant via une course d'expiration de certificat pendant le handshake (CVSS 8.2)
Un peer malveillant présente un certificat TLS libp2p valide mais à durée de vie courte et retarde le dernier fragment du handshake TLS 1.3 jusqu'à son expiration. Après le handshake, libp2p-quic reparse le même certificat en supposant que cela ne peut pas échouer — et panique. Corrigé en 0.13.1.
Tendances Notables
Le lot Http4s est un rappel inconfortable : le request smuggling vit encore en 2026 parce que l'ambiguïté de framing entre proxy et origin n'a jamais été totalement résolue.
Les serveurs MCP deviennent la nouvelle surface d'attaque du backend. SSRF par header, DNS rebinding contre localhost, contournements d'allow-list : des bugs de 2010 qui resurgissent dans l'infrastructure de 2026.
Trois releases du jour (NestJS, workerd, libp2p) attaquent le même thème : les limites de ressources par connexion. Mémoire bornée par peer TCP, retries planifiés explicitement, parsing qui peut échouer deux fois.