diff --git a/docs/guides/http/stream-iterator.md b/docs/guides/http/stream-iterator.md new file mode 100644 index 00000000000000..6f972b80f670e2 --- /dev/null +++ b/docs/guides/http/stream-iterator.md @@ -0,0 +1,47 @@ +--- +name: Streaming HTTP Server with Async Iterators +--- + +In Bun, [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) objects can accept an async generator function as their body. This allows you to stream data to the client as it becomes available, rather than waiting for the entire response to be ready. + +```ts +Bun.serve({ + port: 3000, + fetch(req) { + return new Response( + // An async generator function + async function* () { + yield "Hello, "; + await Bun.sleep(100); + yield "world!"; + + // you can also yield a TypedArray or Buffer + yield new Uint8Array(["\n".charCodeAt(0)]); + }, + { headers: { "Content-Type": "text/plain" } }, + ); + }, +}); +``` + +--- + +You can pass any async iterable directly to `Response`: + +```ts +Bun.serve({ + port: 3000, + fetch(req) { + return new Response( + { + [Symbol.asyncIterator]: async function* () { + yield "Hello, "; + await Bun.sleep(100); + yield "world!"; + }, + } + { headers: { "Content-Type": "text/plain" } }, + ); + }, +}); +```