Skip to content

Commit 732dd74

Browse files
committed
improve performance of responses
1 parent e0e7057 commit 732dd74

File tree

2 files changed

+24
-17
lines changed

2 files changed

+24
-17
lines changed

packages/open-next/src/core/routing/util.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,11 @@ export function convertRes(res: OpenNextNodeResponse): InternalResult {
105105
const isBase64Encoded =
106106
isBinaryContentType(headers["content-type"]) ||
107107
!!headers["content-encoding"];
108-
// We cannot convert the OpenNextNodeResponse to a ReadableStream directly
109-
// You can look in the `aws-lambda.ts` file for some context
110-
const body = Readable.toWeb(Readable.from(res.getBody()));
111108
return {
112109
type: "core",
113110
statusCode,
114111
headers,
115-
body,
112+
body: Readable.from(res._chunks),
116113
isBase64Encoded,
117114
};
118115
}

packages/open-next/src/http/openNextResponse.ts

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse {
3939
}
4040
writeEarlyHints(
4141
_hints: Record<string, string | string[]>,
42-
_callback?: (() => void) | undefined,
42+
_callback?: (() => void) | undefined
4343
): void {
4444
throw new Error(CANNOT_BE_USED);
4545
}
@@ -61,7 +61,7 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse {
6161
throw new Error(CANNOT_BE_USED);
6262
}
6363
addTrailers(
64-
_headers: OutgoingHttpHeaders | readonly [string, string][],
64+
_headers: OutgoingHttpHeaders | readonly [string, string][]
6565
): void {
6666
throw new Error(CANNOT_BE_USED);
6767
}
@@ -71,7 +71,7 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse {
7171
private onEnd: (headers: OutgoingHttpHeaders) => Promise<void>,
7272
private streamCreator?: StreamCreator,
7373
private initialHeaders?: OutgoingHttpHeaders,
74-
statusCode?: number,
74+
statusCode?: number
7575
) {
7676
super();
7777
// We only set the status code if it is not a NaN and it is a number
@@ -171,7 +171,7 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse {
171171
...this.headers,
172172
};
173173
const initialCookies = parseSetCookieHeader(
174-
this.initialHeaders[SET_COOKIE_HEADER]?.toString(),
174+
this.initialHeaders[SET_COOKIE_HEADER]?.toString()
175175
);
176176
this._cookies =
177177
mergeHeadersPriority === "middleware"
@@ -217,16 +217,16 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse {
217217
writeHead(
218218
statusCode: number,
219219
statusMessage?: string | undefined,
220-
headers?: OutgoingHttpHeaders | OutgoingHttpHeader[] | undefined,
220+
headers?: OutgoingHttpHeaders | OutgoingHttpHeader[] | undefined
221221
): this;
222222
writeHead(
223223
statusCode: number,
224-
headers?: OutgoingHttpHeaders | OutgoingHttpHeader[] | undefined,
224+
headers?: OutgoingHttpHeaders | OutgoingHttpHeader[] | undefined
225225
): this;
226226
writeHead(
227227
statusCode: unknown,
228228
statusMessage?: unknown,
229-
headers?: unknown,
229+
headers?: unknown
230230
): this {
231231
let _headers = headers as
232232
| OutgoingHttpHeaders
@@ -282,6 +282,14 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse {
282282
return Buffer.concat(this._chunks);
283283
}
284284

285+
getBodyLength(): number {
286+
let size = 0;
287+
for (const chunk of this._chunks) {
288+
size += chunk.length;
289+
}
290+
return size;
291+
}
292+
285293
private _internalWrite(chunk: any, encoding: BufferEncoding) {
286294
this._chunks.push(Buffer.from(chunk, encoding));
287295
this.push(chunk, encoding);
@@ -291,7 +299,7 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse {
291299
_transform(
292300
chunk: any,
293301
encoding: BufferEncoding,
294-
callback: TransformCallback,
302+
callback: TransformCallback
295303
): void {
296304
if (!this.headersSent) {
297305
this.flushHeaders();
@@ -310,7 +318,7 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse {
310318
globalThis.__openNextAls
311319
?.getStore()
312320
?.pendingPromiseRunner.add(this.onEnd(this.headers));
313-
const bodyLength = this.getBody().length;
321+
const bodyLength = this.getBodyLength();
314322
this.streamCreator?.onFinish?.(bodyLength);
315323

316324
//This is only here because of aws broken streaming implementation.
@@ -338,7 +346,7 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse {
338346
*/
339347

340348
setHeaders(
341-
headers: Headers | Map<string, number | string | readonly string[]>,
349+
headers: Headers | Map<string, number | string | readonly string[]>
342350
): this {
343351
headers.forEach((value, key) => {
344352
this.setHeader(key, Array.isArray(value) ? value : value.toString());
@@ -361,13 +369,15 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse {
361369
if (values === undefined) return undefined;
362370

363371
return (Array.isArray(values) ? values : [values]).map((value) =>
364-
value.toString(),
372+
value.toString()
365373
);
366374
}
367375

368376
send() {
369-
const body = this.getBody();
370-
this.end(body);
377+
for (const chunk of this._chunks) {
378+
this.write(chunk);
379+
}
380+
this.end();
371381
}
372382

373383
body(value: string) {

0 commit comments

Comments
 (0)