Skip to content

Streaming Large Payloads with ctx.bodyStream

For scenarios involving large payloads—such as streaming videos, log forwarding, or proxying requests—reading the entire payload into RAM is impractical.

Volten exposes ctx.bodyStream, which returns a Web Standard ReadableStream<Uint8Array>:

typescript
import { App } from "volten";
import { Writable } from "node:stream";
import { createWriteStream } from "node:fs";

const app = new App();

app.post("/upload-raw", async (ctx) => {
  const destination = createWriteStream("./uploads/large-file.bin");

  // Pipe Web Standard ReadableStream to Node.js WritableStream
  await ctx.bodyStream.pipeTo(Writable.toWeb(destination));

  return ctx.send("File saved successfully");
});

You can also consume chunks iteratively using for await:

typescript
app.post("/process-chunks", async (ctx) => {
  let totalBytes = 0;

  for await (const chunk of ctx.bodyStream) {
    totalBytes += chunk.length;
  }

  return ctx.json({ processedBytes: totalBytes });
});

Memory Protection

If an incoming payload exceeds Node.js's internal string limit (constants.MAX_STRING_LENGTH), ctx.body() rejects the operation to prevent V8 memory crashes and prompts you to use ctx.bodyStream.


Released under the MIT License.