From 89acb772cb7c66af4e659f18a6ee2dcae6ebd626 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Sun, 8 Feb 2026 15:51:55 +0100 Subject: [PATCH 1/2] perf(start): use FastResponse from srvx --- packages/react-router/package.json | 1 + packages/react-router/src/ssr/renderRouterToStream.tsx | 3 +++ packages/vue-router/package.json | 1 + packages/vue-router/src/ssr/renderRouterToStream.tsx | 3 +++ pnpm-lock.yaml | 6 ++++++ 5 files changed, 14 insertions(+) diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 4ee52b1a75..2a067922ab 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -100,6 +100,7 @@ "@tanstack/react-store": "^0.8.0", "@tanstack/router-core": "workspace:*", "isbot": "^5.1.22", + "srvx": "^0.11.2", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, diff --git a/packages/react-router/src/ssr/renderRouterToStream.tsx b/packages/react-router/src/ssr/renderRouterToStream.tsx index 147a13a9a9..8c75b665ee 100644 --- a/packages/react-router/src/ssr/renderRouterToStream.tsx +++ b/packages/react-router/src/ssr/renderRouterToStream.tsx @@ -5,10 +5,13 @@ import { transformPipeableStreamWithRouter, transformReadableStreamWithRouter, } from '@tanstack/router-core/ssr/server' +import { FastResponse } from 'srvx' import type { AnyRouter } from '@tanstack/router-core' import type { ReadableStream } from 'node:stream/web' import type { ReactNode } from 'react' +globalThis.Response = FastResponse + export const renderRouterToStream = async ({ request, router, diff --git a/packages/vue-router/package.json b/packages/vue-router/package.json index 5b3a6ca27b..763e601710 100644 --- a/packages/vue-router/package.json +++ b/packages/vue-router/package.json @@ -76,6 +76,7 @@ "@vue/runtime-dom": "^3.5.25", "isbot": "^5.1.22", "jsesc": "^3.0.2", + "srvx": "^0.11.2", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, diff --git a/packages/vue-router/src/ssr/renderRouterToStream.tsx b/packages/vue-router/src/ssr/renderRouterToStream.tsx index d8649ff1bd..2e0583f532 100644 --- a/packages/vue-router/src/ssr/renderRouterToStream.tsx +++ b/packages/vue-router/src/ssr/renderRouterToStream.tsx @@ -3,10 +3,13 @@ import * as Vue from 'vue' import { pipeToWebWritable, renderToString } from 'vue/server-renderer' import { isbot } from 'isbot' import { transformReadableStreamWithRouter } from '@tanstack/router-core/ssr/server' +import { FastResponse } from 'srvx' import type { AnyRouter } from '@tanstack/router-core' import type { Component } from 'vue' import type { ReadableStream } from 'node:stream/web' +globalThis.Response = FastResponse + function prependDoctype( readable: globalThis.ReadableStream, ): NodeReadableStream { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 676c703f2a..ab2b18e44e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11560,6 +11560,9 @@ importers: isbot: specifier: ^5.1.22 version: 5.1.28 + srvx: + specifier: ^0.11.2 + version: 0.11.2 tiny-invariant: specifier: ^1.3.3 version: 1.3.3 @@ -12385,6 +12388,9 @@ importers: jsesc: specifier: ^3.0.2 version: 3.1.0 + srvx: + specifier: ^0.11.2 + version: 0.11.2 tiny-invariant: specifier: ^1.3.3 version: 1.3.3 From 255d3c09301e59cffe6f5f6dda8f3d66a50af630 Mon Sep 17 00:00:00 2001 From: Birk Skyum Date: Sun, 8 Feb 2026 16:16:59 +0100 Subject: [PATCH 2/2] direct use of FastResponse --- packages/react-router/src/ssr/renderRouterToStream.tsx | 6 ++---- packages/solid-router/src/ssr/renderRouterToStream.tsx | 4 +--- packages/vue-router/src/ssr/renderRouterToStream.tsx | 6 ++---- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/packages/react-router/src/ssr/renderRouterToStream.tsx b/packages/react-router/src/ssr/renderRouterToStream.tsx index 8c75b665ee..2524806434 100644 --- a/packages/react-router/src/ssr/renderRouterToStream.tsx +++ b/packages/react-router/src/ssr/renderRouterToStream.tsx @@ -10,8 +10,6 @@ import type { AnyRouter } from '@tanstack/router-core' import type { ReadableStream } from 'node:stream/web' import type { ReactNode } from 'react' -globalThis.Response = FastResponse - export const renderRouterToStream = async ({ request, router, @@ -38,7 +36,7 @@ export const renderRouterToStream = async ({ router, stream as unknown as ReadableStream, ) - return new Response(responseStream as any, { + return new FastResponse(responseStream as any, { status: router.state.statusCode, headers: responseHeaders, }) @@ -81,7 +79,7 @@ export const renderRouterToStream = async ({ router, reactAppPassthrough, ) - return new Response(responseStream as any, { + return new FastResponse(responseStream as any, { status: router.state.statusCode, headers: responseHeaders, }) diff --git a/packages/solid-router/src/ssr/renderRouterToStream.tsx b/packages/solid-router/src/ssr/renderRouterToStream.tsx index 5c0a8c1c32..1d56debbcb 100644 --- a/packages/solid-router/src/ssr/renderRouterToStream.tsx +++ b/packages/solid-router/src/ssr/renderRouterToStream.tsx @@ -7,8 +7,6 @@ import type { JSXElement } from 'solid-js' import type { ReadableStream } from 'node:stream/web' import type { AnyRouter } from '@tanstack/router-core' -globalThis.Response = FastResponse - export const renderRouterToStream = async ({ request, router, @@ -54,7 +52,7 @@ export const renderRouterToStream = async ({ router, readable as unknown as ReadableStream, ) - return new Response(responseStream as any, { + return new FastResponse(responseStream as any, { status: router.state.statusCode, headers: responseHeaders, }) diff --git a/packages/vue-router/src/ssr/renderRouterToStream.tsx b/packages/vue-router/src/ssr/renderRouterToStream.tsx index 2e0583f532..0cd285ed27 100644 --- a/packages/vue-router/src/ssr/renderRouterToStream.tsx +++ b/packages/vue-router/src/ssr/renderRouterToStream.tsx @@ -8,8 +8,6 @@ import type { AnyRouter } from '@tanstack/router-core' import type { Component } from 'vue' import type { ReadableStream } from 'node:stream/web' -globalThis.Response = FastResponse - function prependDoctype( readable: globalThis.ReadableStream, ): NodeReadableStream { @@ -65,7 +63,7 @@ export const renderRouterToStream = async ({ fullHtml = fullHtml.slice(htmlOpenIndex) } - return new Response(`${fullHtml}`, { + return new FastResponse(`${fullHtml}`, { status: router.state.statusCode, headers: responseHeaders, }) @@ -81,7 +79,7 @@ export const renderRouterToStream = async ({ doctypedStream as unknown as ReadableStream, ) - return new Response(responseStream as any, { + return new FastResponse(responseStream as any, { status: router.state.statusCode, headers: responseHeaders, })