From a7173ff7c5c6bde7380acc626c282ac9ff66a73e Mon Sep 17 00:00:00 2001 From: James M Snell Date: Sat, 11 Oct 2025 07:56:22 -0700 Subject: [PATCH 1/6] Avoid unnecessary buffer copy in internalWrite See the code comments for details. --- packages/open-next/src/http/openNextResponse.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/open-next/src/http/openNextResponse.ts b/packages/open-next/src/http/openNextResponse.ts index 4a521e760..bc780d170 100644 --- a/packages/open-next/src/http/openNextResponse.ts +++ b/packages/open-next/src/http/openNextResponse.ts @@ -285,13 +285,20 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse { } private _internalWrite(chunk: any, encoding: BufferEncoding) { - const buffer = Buffer.from(chunk, encoding); + // When encoding === 'buffer', chunk is already a Buffer + // and does not need to be converted again. + // @ts-expect-error TS2367 'encoding' can be 'buffer', but it's not in the + // official type definition + const buffer = encoding === "buffer" ? chunk : Buffer.from(chunk, encoding); this.bodyLength += buffer.length; if (this.streamCreator?.retainChunks !== false) { // Avoid keeping chunks around when the `StreamCreator` supports it to save memory this._chunks.push(buffer); } - this.push(chunk, encoding); + // We already have the data as a buffer, let's push it as is to avoid + // unnecessary additional conversion down the stream pipeline. + // @ts-expect-error TS2345 'buffer' is not in the official type definition + this.push(buffer, "buffer"); this.streamCreator?.onWrite?.(); } From 3e9efea10a4d22377763f8cf6031bb918673c482 Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Wed, 15 Oct 2025 06:18:54 +0200 Subject: [PATCH 2/6] Apply suggestion from @vicb --- packages/open-next/src/http/openNextResponse.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/open-next/src/http/openNextResponse.ts b/packages/open-next/src/http/openNextResponse.ts index bc780d170..4bef12e9e 100644 --- a/packages/open-next/src/http/openNextResponse.ts +++ b/packages/open-next/src/http/openNextResponse.ts @@ -298,7 +298,7 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse { // We already have the data as a buffer, let's push it as is to avoid // unnecessary additional conversion down the stream pipeline. // @ts-expect-error TS2345 'buffer' is not in the official type definition - this.push(buffer, "buffer"); + this.push(buffer); this.streamCreator?.onWrite?.(); } From c29285b7b2f1a0a67a86e365dc789320bafa18e5 Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Wed, 15 Oct 2025 06:19:02 +0200 Subject: [PATCH 3/6] Apply suggestion from @vicb --- packages/open-next/src/http/openNextResponse.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/open-next/src/http/openNextResponse.ts b/packages/open-next/src/http/openNextResponse.ts index 4bef12e9e..9aa5a2a7b 100644 --- a/packages/open-next/src/http/openNextResponse.ts +++ b/packages/open-next/src/http/openNextResponse.ts @@ -295,7 +295,7 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse { // Avoid keeping chunks around when the `StreamCreator` supports it to save memory this._chunks.push(buffer); } - // We already have the data as a buffer, let's push it as is to avoid + // No need to pass the encoding for buffers // unnecessary additional conversion down the stream pipeline. // @ts-expect-error TS2345 'buffer' is not in the official type definition this.push(buffer); From bd389c984281b0ec1d8fffcaf18781faf922a67f Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Wed, 15 Oct 2025 06:19:46 +0200 Subject: [PATCH 4/6] Apply suggestion from @vicb --- packages/open-next/src/http/openNextResponse.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/open-next/src/http/openNextResponse.ts b/packages/open-next/src/http/openNextResponse.ts index 9aa5a2a7b..5039afd10 100644 --- a/packages/open-next/src/http/openNextResponse.ts +++ b/packages/open-next/src/http/openNextResponse.ts @@ -296,7 +296,6 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse { this._chunks.push(buffer); } // No need to pass the encoding for buffers - // unnecessary additional conversion down the stream pipeline. // @ts-expect-error TS2345 'buffer' is not in the official type definition this.push(buffer); this.streamCreator?.onWrite?.(); From 4666a19b8032819f573ba4123e576112a48a9cdc Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Wed, 15 Oct 2025 06:20:05 +0200 Subject: [PATCH 5/6] Apply suggestion from @vicb --- packages/open-next/src/http/openNextResponse.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/open-next/src/http/openNextResponse.ts b/packages/open-next/src/http/openNextResponse.ts index 5039afd10..3a8187950 100644 --- a/packages/open-next/src/http/openNextResponse.ts +++ b/packages/open-next/src/http/openNextResponse.ts @@ -296,7 +296,6 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse { this._chunks.push(buffer); } // No need to pass the encoding for buffers - // @ts-expect-error TS2345 'buffer' is not in the official type definition this.push(buffer); this.streamCreator?.onWrite?.(); } From e03b871031e867d022f75c2fa3811569c7d0349a Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Wed, 15 Oct 2025 06:27:01 +0200 Subject: [PATCH 6/6] perf: avoid unnecessary buffer copy in internalWrite --- .changeset/olive-cars-count.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/olive-cars-count.md diff --git a/.changeset/olive-cars-count.md b/.changeset/olive-cars-count.md new file mode 100644 index 000000000..6d2933d94 --- /dev/null +++ b/.changeset/olive-cars-count.md @@ -0,0 +1,5 @@ +--- +"@opennextjs/aws": patch +--- + +perf: avoid unnecessary buffer copy in internalWrite