Skip to content

Commit d691697

Browse files
committed
refactor: move StreamCreator to types/open-next
And make onFinish optional
1 parent b5e77b0 commit d691697

File tree

11 files changed

+42
-38
lines changed

11 files changed

+42
-38
lines changed

.changeset/big-terms-boil.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@opennextjs/aws": minor
3+
---
4+
5+
refactor: move StreamCreator to types/open-next

packages/open-next/src/adapters/image-optimization-adapter.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import path from "node:path";
99
import type { Writable } from "node:stream";
1010

1111
import { loadBuildId, loadConfig } from "config/util.js";
12-
import type { StreamCreator } from "http/openNextResponse.js";
1312
import { OpenNextNodeResponse } from "http/openNextResponse.js";
1413
// @ts-ignore
1514
import { defaultConfig } from "next/dist/server/config-shared";
@@ -19,7 +18,11 @@ import {
1918
} from "next/dist/server/image-optimizer";
2019
// @ts-ignore
2120
import type { NextUrlWithParsedQuery } from "next/dist/server/request-meta";
22-
import type { InternalEvent, InternalResult } from "types/open-next.js";
21+
import type {
22+
InternalEvent,
23+
InternalResult,
24+
StreamCreator,
25+
} from "types/open-next.js";
2326
import { emptyReadableStream, toReadableStream } from "utils/stream.js";
2427

2528
import { createGenericHandler } from "../core/createGenericHandler.js";

packages/open-next/src/core/requestHandler.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { AsyncLocalStorage } from "node:async_hooks";
22

3-
import type { OpenNextNodeResponse, StreamCreator } from "http/index.js";
3+
import type { OpenNextNodeResponse } from "http/index.js";
44
import { IncomingMessage } from "http/index.js";
55
import type {
66
InternalEvent,
77
InternalResult,
88
RoutingResult,
9+
StreamCreator,
910
} from "types/open-next";
1011
import { runWithOpenNextRequestContext } from "utils/promise";
1112

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@ import type { OutgoingHttpHeaders } from "node:http";
33
import { Readable } from "node:stream";
44

55
import { BuildId, HtmlPages, NextConfig } from "config/index.js";
6-
import type { IncomingMessage, StreamCreator } from "http/index.js";
6+
import type { IncomingMessage } from "http/index.js";
77
import { OpenNextNodeResponse } from "http/openNextResponse.js";
88
import { parseHeaders } from "http/util.js";
99
import type { MiddlewareManifest } from "types/next-types";
10-
import type { InternalEvent, InternalResult } from "types/open-next.js";
10+
import type {
11+
InternalEvent,
12+
InternalResult,
13+
StreamCreator,
14+
} from "types/open-next.js";
1115

1216
import { debug, error } from "../../adapters/logger.js";
1317
import { isBinaryContentType } from "../../utils/binary.js";

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

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,13 @@ import type { Socket } from "node:net";
88
import type { TransformCallback, Writable } from "node:stream";
99
import { Transform } from "node:stream";
1010

11+
import type { StreamCreator } from "types/open-next";
1112
import { debug } from "../adapters/logger";
1213
import { parseCookies, parseHeaders } from "./util";
1314

1415
const SET_COOKIE_HEADER = "set-cookie";
1516
const CANNOT_BE_USED = "This cannot be used in OpenNext";
1617

17-
export interface StreamCreator {
18-
writeHeaders(prelude: {
19-
statusCode: number;
20-
cookies: string[];
21-
headers: Record<string, string>;
22-
}): Writable;
23-
// Just to fix an issue with aws lambda streaming with empty body
24-
onWrite?: () => void;
25-
onFinish: (length: number) => void;
26-
}
27-
2818
// We only need to implement the methods that are used by next.js
2919
export class OpenNextNodeResponse extends Transform implements ServerResponse {
3020
statusCode!: number;
@@ -92,9 +82,7 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse {
9282
}
9383

9484
get finished() {
95-
return Boolean(
96-
this.writableFinished && this.responseStream?.writableFinished,
97-
);
85+
return this.writableFinished && (this.responseStream?.writableFinished ?? true);
9886
}
9987

10088
setHeader(name: string, value: string | string[]): this {
@@ -303,7 +291,7 @@ export class OpenNextNodeResponse extends Transform implements ServerResponse {
303291
?.getStore()
304292
?.pendingPromiseRunner.add(this.onEnd(this.headers));
305293
const bodyLength = this.getBody().length;
306-
this.streamCreator?.onFinish(bodyLength);
294+
this.streamCreator?.onFinish?.(bodyLength);
307295

308296
//This is only here because of aws broken streaming implementation.
309297
//Hopefully one day they will be able to give us a working streaming implementation in lambda for everyone

packages/open-next/src/overrides/wrappers/aws-lambda-streaming.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import { Readable, type Writable } from "node:stream";
22
import zlib from "node:zlib";
33

44
import type { APIGatewayProxyEventV2 } from "aws-lambda";
5-
import type { StreamCreator } from "http/index";
65
import type { Wrapper, WrapperHandler } from "types/overrides";
76

7+
import type { StreamCreator } from "types/open-next";
88
import { debug, error } from "../../adapters/logger";
99
import type {
1010
WarmerEvent,
@@ -92,10 +92,6 @@ const handler: WrapperHandler = async (handler, converter) =>
9292

9393
return compressedStream ?? responseStream;
9494
},
95-
onWrite: () => {
96-
// _hasWriten = true;
97-
},
98-
onFinish: () => {},
9995
};
10096

10197
const response = await handler(internalEvent, streamCreator);

packages/open-next/src/overrides/wrappers/aws-lambda.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import type {
88
CloudFrontRequestEvent,
99
CloudFrontRequestResult,
1010
} from "aws-lambda";
11-
import type { StreamCreator } from "http/openNextResponse";
1211
import type { WrapperHandler } from "types/overrides";
1312

13+
import type { StreamCreator } from "types/open-next";
1414
import type {
1515
WarmerEvent,
1616
WarmerResponse,
@@ -59,9 +59,6 @@ const handler: WrapperHandler =
5959
},
6060
});
6161
},
62-
onFinish: () => {
63-
// Do nothing
64-
},
6562
};
6663

6764
const response = await handler(internalEvent, fakeStream);

packages/open-next/src/overrides/wrappers/cloudflare-node.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
import type { InternalEvent, InternalResult } from "types/open-next";
1+
import type {
2+
InternalEvent,
3+
InternalResult,
4+
StreamCreator,
5+
} from "types/open-next";
26
import type { Wrapper, WrapperHandler } from "types/overrides";
37

48
import { Writable } from "node:stream";
5-
import type { StreamCreator } from "http/index";
69

710
const handler: WrapperHandler<InternalEvent, InternalResult> =
811
async (handler, converter) =>
@@ -56,8 +59,6 @@ const handler: WrapperHandler<InternalEvent, InternalResult> =
5659

5760
return Writable.fromWeb(writable);
5861
},
59-
onWrite: () => {},
60-
onFinish: (_length: number) => {},
6162
};
6263

6364
ctx.waitUntil(handler(internalEvent, streamCreator));

packages/open-next/src/overrides/wrappers/node.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { createServer } from "node:http";
22

3-
import type { StreamCreator } from "http/index";
43
import type { Wrapper, WrapperHandler } from "types/overrides";
54

5+
import type { StreamCreator } from "types/open-next";
66
import { debug, error } from "../../adapters/logger";
77

88
const wrapper: WrapperHandler = async (handler, converter) => {
@@ -16,9 +16,6 @@ const wrapper: WrapperHandler = async (handler, converter) => {
1616
res.uncork();
1717
return res;
1818
},
19-
onFinish: () => {
20-
// Is it necessary to do something here?
21-
},
2219
};
2320
if (internalEvent.rawPath === "/__health") {
2421
res.writeHead(200, {

packages/open-next/src/types/open-next.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { ReadableStream } from "node:stream/web";
22

3+
import type { Writable } from "node:stream";
34
import type { WarmerEvent, WarmerResponse } from "../adapters/warmer-function";
45
import type {
56
Converter,
@@ -35,6 +36,17 @@ export type InternalResult = {
3536
isBase64Encoded: boolean;
3637
} & BaseEventOrResult<"core">;
3738

39+
export interface StreamCreator {
40+
writeHeaders(prelude: {
41+
statusCode: number;
42+
cookies: string[];
43+
headers: Record<string, string>;
44+
}): Writable;
45+
// Just to fix an issue with aws lambda streaming with empty body
46+
onWrite?: () => void;
47+
onFinish?: (length: number) => void;
48+
}
49+
3850
export interface DangerousOptions {
3951
/**
4052
* The tag cache is used for revalidateTags and revalidatePath.

packages/open-next/src/types/overrides.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type { Readable } from "node:stream";
22

3-
import type { StreamCreator } from "http/index";
43
import type { Meta } from "types/cache";
54

65
import type {
@@ -9,6 +8,7 @@ import type {
98
InternalEvent,
109
InternalResult,
1110
Origin,
11+
StreamCreator,
1212
} from "./open-next";
1313

1414
// Queue

0 commit comments

Comments
 (0)