Skip to content

preset: bun preset uses incorrect ReadableStream parameters #4259

@valiukasd

Description

@valiukasd

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'
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions