diff --git a/.changeset/wise-moons-read.md b/.changeset/wise-moons-read.md new file mode 100644 index 000000000000..839ccf11669d --- /dev/null +++ b/.changeset/wise-moons-read.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: stream promised `read` results lazily instead of eagerly buffering them diff --git a/packages/kit/src/runtime/server/index.js b/packages/kit/src/runtime/server/index.js index 0b1522391ef0..98dcc85465ca 100644 --- a/packages/kit/src/runtime/server/index.js +++ b/packages/kit/src/runtime/server/index.js @@ -67,31 +67,17 @@ export class Server { const result = read(file); if (result instanceof ReadableStream) { return result; - } else { - return new ReadableStream({ - async start(controller) { - try { - const stream = await Promise.resolve(result); - if (!stream) { - controller.close(); - return; - } - - const reader = stream.getReader(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - controller.enqueue(value); - } - - controller.close(); - } catch (error) { - controller.error(error); - } - } - }); } + + // TODO remove the cast once TypeScript's lib includes `ReadableStream.from` + return /** @type {ReadableStream} */ ( + /** @type {any} */ (ReadableStream).from( + (async function* () { + const stream = await result; + if (stream) yield* stream; + })() + ) + ); }; set_read_implementation(wrapped_read);