diff --git a/.changeset/sour-socks-rescue.md b/.changeset/sour-socks-rescue.md new file mode 100644 index 000000000..6982f7480 --- /dev/null +++ b/.changeset/sour-socks-rescue.md @@ -0,0 +1,5 @@ +--- +"@opennextjs/aws": patch +--- + +perf(cloudflare): optimize readable/writable piping diff --git a/packages/open-next/src/overrides/wrappers/cloudflare-node.ts b/packages/open-next/src/overrides/wrappers/cloudflare-node.ts index b3d8b374e..bdc156162 100644 --- a/packages/open-next/src/overrides/wrappers/cloudflare-node.ts +++ b/packages/open-next/src/overrides/wrappers/cloudflare-node.ts @@ -52,19 +52,53 @@ const handler: WrapperHandler = responseHeaders.set("Content-Encoding", "identity"); } - const { readable, writable } = new TransformStream({ - transform(chunk, controller) { - controller.enqueue(Uint8Array.from(chunk.chunk ?? chunk)); + // Optimize: skip ReadableStream creation for null body statuses + if (NULL_BODY_STATUSES.has(statusCode)) { + const response = new Response(null, { + status: statusCode, + headers: responseHeaders, + }); + resolveResponse(response); + + // Return a no-op Writable that discards all data + return new Writable({ + write(chunk, encoding, callback) { + callback(); + }, + }); + } + + let controller: ReadableStreamDefaultController; + const readable = new ReadableStream({ + start(c) { + controller = c; }, }); - const body = NULL_BODY_STATUSES.has(statusCode) ? null : readable; - const response = new Response(body, { + + const response = new Response(readable, { status: statusCode, headers: responseHeaders, }); resolveResponse(response); - return Writable.fromWeb(writable); + return new Writable({ + write(chunk, encoding, callback) { + controller.enqueue(chunk); + callback(); + }, + final(callback) { + controller.close(); + callback(); + }, + destroy(error, callback) { + if (error) { + controller.error(error); + } else { + controller.close(); + } + callback(error); + }, + }); }, // This is for passing along the original abort signal from the initial Request you retrieve in your worker // Ensures that the response we pass to NextServer is aborted if the request is aborted