nitrojs / nitrojs/nitro

preset: bun preset uses incorrect ReadableStream parameters

Open
#4,259 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug needs investigation tanstack v3
Dominant language
TypeScript
Stars
11.2k
Forks
899
Avg merge
2d 24m
Merged PRs (30d)
40

Description

Environment

Bun v1.3.13
Node v24.15.0

Nitro:
Working version: v3.0.1-alpha.2
Broken version: v3.0.260311-beta (and later versions)

Reproduction

Since I am working on a private project, I cannot share the environement, but this should work in any Tanstack Start + Nitro project. You just need to enable prerendering and try to build the project.

tanstackStart({
    prerender: {
        enabled: true,
        crawlLinks: true
    },
}),
Describe the bug

This bug is related to the "bun" preset.

It generates this code (in the require_react_dom_server_bun_production function):

var stream = new ReadableStream({
    type: "direct",
    pull: function(controller) {
        if (13 === request.status) request.status = 14, closeWithError(controller, request.fatalError);
        else if (14 !== request.status && null === request.destination) {
            request.destination = controller;
            try {
                flushCompletedQueues(request, controller);
            } catch (error) {
                logRecoverableError(request, error, {}), fatalError(request, error);
            }
        }
    },
    cancel: function(reason) {
        request.destination = null;
        abort(request, reason);
    }
}, {
    highWaterMark: 2048
});

This code then throws this error:

[unhandledRejection] TypeError [ERR_INVALID_ARG_VALUE]: The property 'source.type' is invalid. Received 'direct'
    at new ReadableStream (node:internal/webstreams/readablestream:278:15)
    at file:////apps/web/.output/server/_libs/@tanstack/react-router+%5B...%5D.mjs:9049:18
    at completeShell (file:///apps/web/.output/server/_libs/@tanstack/react-router+%5B...%5D.mjs:8549:3)
    at finishedTask (file:///apps/web/.output/server/_libs/@tanstack/react-router+%5B...%5D.mjs:8581:38)
    at performWork (file:///apps/web/.output/server/_libs/@tanstack/react-router+%5B...%5D.mjs:8650:286)
    at file:///apps/web/.output/server/_libs/@tanstack/react-router+%5B...%5D.mjs:8994:11
    at node:internal/process/task_queues:150:7
    at AsyncResource.runInAsyncScope (node:async_hooks:227:14)
    at AsyncResource.runMicrotask (node:internal/process/task_queues:147:8) {
  code: 'ERR_INVALID_ARG_VALUE'
}

This is an LLM explanation, since I am not familiar with runtime differences.

What is happening:

During prerendering, the bundler (Vite/Nitro) resolves the "edge" build of React DOM Server (react-dom/server.edge.js).
React 19 uses an undocumented Cloudflare Workers extension for web streams called "Direct Readable Streams". It explicitly tries to create a stream using new ReadableStream({ type: 'direct' }) to optimize stream pushing.
Node.js and Bun's standard ReadableStream implementations strictly follow the web spec. According to the standard, type can only be "bytes" (or undefined). When the Bun environment sees "direct", it throws the ERR_INVALID_ARG_VALUE error.

When i change the preset to "node" and try to build this, I do not get this error.

Additional context

No response

Logs
╭───────── [Build Info] ───────────╮
 │                                  │
 │  - Build Directory: .output      │
 │  - Date: 5/11/2026, 11:10:53 AM  │
 │  - Nitro Version: 3.0.1-alpha.2  │
 │  - Nitro Preset: bun             │
 │                                  │
 ╰──────────────────────────────────╯

ℹ Spawning preview server...                                                                                                                                                                 11:10:53 AM
ℹ bun run ./server/index.mjs                                                                                                                                                                 11:10:53 AM

➜ Listening on: http://localhost:44407/ (all interfaces)
Port 3000 is in use, trying another one...
Port 3001 is in use, trying another one...
Port 3002 is in use, trying another one...
[prerender] Prerendering pages...
[prerender] Concurrency: 8
[prerender] Crawling: /
[prerender] Crawling: /contact
[prerender] Crawling: /privacy-policy
[prerender] Crawling: /projects
[prerender] Crawling: /schedule
[prerender] Crawling: /diagnostic/completed
[prerender] Crawling: /cases/
[prerender] Crawling: /diagnostic/

Above is the working version (last alpha release)

This is the later versions:


 ╭────────── [Build Info] ────────────╮
 │                                    │
 │  - Build Directory: .output        │
 │  - Date: 5/11/2026, 11:16:15 AM    │
 │  - Nitro Version: 3.0.260429-beta  │
 │  - Nitro Preset: bun               │
 │                                    │
 ╰────────────────────────────────────╯

Port 3000 is in use, trying another one...
Port 3001 is in use, trying another one...
Port 3002 is in use, trying another one...
[prerender] Prerendering pages...
[prerender] Concurrency: 8
[prerender] Crawling: /
[prerender] Crawling: /contact
[prerender] Crawling: /privacy-policy
[prerender] Crawling: /projects
[prerender] Crawling: /schedule
[prerender] Crawling: /diagnostic/completed
[prerender] Crawling: /cases/
[prerender] Crawling: /diagnostic/
TypeError [ERR_INVALID_ARG_VALUE]: The property 'source.type' is invalid. Received 'direct'
    at new ReadableStream (node:internal/webstreams/readablestream:278:15)
    at file:///workspaces/codus/apps/web/.output/server/_libs/@tanstack/react-router+%5B...%5D.mjs:9049:18
    at completeShell (file:///workspaces/codus/apps/web/.output/server/_libs/@tanstack/react-router+%5B...%5D.mjs:8549:3)
    at finishedTask (file:///workspaces/codus/apps/web/.output/server/_libs/@tanstack/react-router+%5B...%5D.mjs:8581:38)
    at performWork (file:///workspaces/codus/apps/web/.output/server/_libs/@tanstack/react-router+%5B...%5D.mjs:8650:286)
    at file:///workspaces/codus/apps/web/.output/server/_libs/@tanstack/react-router+%5B...%5D.mjs:8994:11
    at node:internal/process/task_queues:150:7
    at AsyncResource.runInAsyncScope (node:async_hooks:227:14)
    at AsyncResource.runMicrotask (node:internal/process/task_queues:147:8) {
  code: 'ERR_INVALID_ARG_VALUE'
}

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by locating the Nitro bun preset and the generated React DOM Server integration that creates the ReadableStream with type "direct". Reproduce the failure with TanStack Start prerendering enabled, then verify that the bun preset produces valid stream parameters and that the prerender build completes without ERR_INVALID_ARG_VALUE.

Written by the indexing model from the issue text.

Assessment

Tech stack
bun, node.js, react, typescript
Domain
backend, build-system
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.