Skip to content

Commit f685dde

Browse files
authored
fix(cloudflare): cloudflare-streaming do not use the edge runtime (#644)
1 parent f50520e commit f685dde

File tree

11 files changed

+63
-63
lines changed

11 files changed

+63
-63
lines changed

.changeset/dirty-plums-cheat.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@opennextjs/aws": patch
3+
---
4+
5+
fix(cloudflare): cloudflare-streaming do not use the edge runtime

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

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,25 +34,26 @@ export async function openNextHandler(
3434
}
3535
debug("internalEvent", internalEvent);
3636

37-
let preprocessResult: InternalResult | MiddlewareOutputEvent = {
38-
internalEvent: internalEvent,
37+
let routingResult: InternalResult | MiddlewareOutputEvent = {
38+
type: "middleware",
39+
internalEvent,
3940
isExternalRewrite: false,
4041
origin: false,
4142
isISR: false,
4243
};
4344

4445
//#override withRouting
4546
try {
46-
preprocessResult = await routingHandler(internalEvent);
47+
routingResult = await routingHandler(internalEvent);
4748
} catch (e) {
4849
warn("Routing failed.", e);
4950
}
5051
//#endOverride
5152

5253
const headers =
53-
"type" in preprocessResult
54-
? preprocessResult.headers
55-
: preprocessResult.internalEvent.headers;
54+
routingResult.type === "middleware"
55+
? routingResult.internalEvent.headers
56+
: routingResult.headers;
5657

5758
const overwrittenResponseHeaders: Record<string, string | string[]> = {};
5859

@@ -67,16 +68,17 @@ export async function openNextHandler(
6768
}
6869

6970
if (
70-
"isExternalRewrite" in preprocessResult &&
71-
preprocessResult.isExternalRewrite === true
71+
routingResult.type === "middleware" &&
72+
routingResult.isExternalRewrite === true
7273
) {
7374
try {
74-
preprocessResult = await globalThis.proxyExternalRequest.proxy(
75-
preprocessResult.internalEvent,
75+
routingResult = await globalThis.proxyExternalRequest.proxy(
76+
routingResult.internalEvent,
7677
);
7778
} catch (e) {
7879
error("External request failed.", e);
79-
preprocessResult = {
80+
routingResult = {
81+
type: "middleware",
8082
internalEvent: {
8183
type: "core",
8284
rawPath: "/500",
@@ -95,26 +97,27 @@ export async function openNextHandler(
9597
}
9698
}
9799

98-
if ("type" in preprocessResult) {
100+
if (routingResult.type === "core") {
99101
// response is used only in the streaming case
100102
if (responseStreaming) {
101103
const response = createServerResponse(
102104
internalEvent,
103105
headers,
104106
responseStreaming,
105107
);
106-
response.statusCode = preprocessResult.statusCode;
108+
response.statusCode = routingResult.statusCode;
107109
response.flushHeaders();
108-
const [bodyToConsume, bodyToReturn] = preprocessResult.body.tee();
110+
const [bodyToConsume, bodyToReturn] = routingResult.body.tee();
109111
for await (const chunk of bodyToConsume) {
110112
response.write(chunk);
111113
}
112114
response.end();
113-
preprocessResult.body = bodyToReturn;
115+
routingResult.body = bodyToReturn;
114116
}
115-
return preprocessResult;
117+
return routingResult;
116118
}
117-
const preprocessedEvent = preprocessResult.internalEvent;
119+
120+
const preprocessedEvent = routingResult.internalEvent;
118121
debug("preprocessedEvent", preprocessedEvent);
119122
const reqProps = {
120123
method: preprocessedEvent.method,

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ const middlewareManifest = MiddlewareManifest;
2323

2424
const middleMatch = getMiddlewareMatch(middlewareManifest);
2525

26-
type MiddlewareOutputEvent = InternalEvent & {
26+
type InternalMiddlewareEvent = InternalEvent & {
2727
responseHeaders?: Record<string, string | string[]>;
28-
externalRewrite?: boolean;
28+
isExternalRewrite?: boolean;
2929
};
3030

3131
type Middleware = (request: Request) => Response | Promise<Response>;
@@ -45,7 +45,7 @@ function defaultMiddlewareLoader() {
4545
export async function handleMiddleware(
4646
internalEvent: InternalEvent,
4747
middlewareLoader: MiddlewareLoader = defaultMiddlewareLoader,
48-
): Promise<MiddlewareOutputEvent | InternalResult> {
48+
): Promise<InternalMiddlewareEvent | InternalResult> {
4949
const headers = internalEvent.headers;
5050

5151
// We bypass the middleware if the request is internal
@@ -142,22 +142,22 @@ export async function handleMiddleware(
142142
statusCode: statusCode,
143143
headers: resHeaders,
144144
isBase64Encoded: false,
145-
};
145+
} satisfies InternalResult;
146146
}
147147

148148
// If the middleware returned a Rewrite, set the `url` to the pathname of the rewrite
149149
// NOTE: the header was added to `req` from above
150150
const rewriteUrl = responseHeaders.get("x-middleware-rewrite");
151151
let rewritten = false;
152-
let externalRewrite = false;
152+
let isExternalRewrite = false;
153153
let middlewareQueryString = internalEvent.query;
154154
let newUrl = internalEvent.url;
155155
if (rewriteUrl) {
156156
// If not a string, it should probably throw
157157
if (isExternal(rewriteUrl, internalEvent.headers.host as string)) {
158158
newUrl = rewriteUrl;
159159
rewritten = true;
160-
externalRewrite = true;
160+
isExternalRewrite = true;
161161
} else {
162162
const rewriteUrlObject = new URL(rewriteUrl);
163163
newUrl = rewriteUrlObject.pathname;
@@ -184,14 +184,13 @@ export async function handleMiddleware(
184184
// transfer response body to res
185185
const body = result.body as ReadableStream<Uint8Array>;
186186

187-
// await pipeReadable(result.response.body, res);
188187
return {
189188
type: internalEvent.type,
190189
statusCode: statusCode,
191190
headers: resHeaders,
192191
body,
193192
isBase64Encoded: false,
194-
};
193+
} satisfies InternalResult;
195194
}
196195

197196
return {
@@ -207,6 +206,6 @@ export async function handleMiddleware(
207206
query: middlewareQueryString,
208207
cookies: internalEvent.cookies,
209208
remoteAddress: internalEvent.remoteAddress,
210-
externalRewrite,
211-
};
209+
isExternalRewrite,
210+
} satisfies InternalMiddlewareEvent;
212211
}

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ import { handleMiddleware } from "./routing/middleware";
1919

2020
export const MIDDLEWARE_HEADER_PREFIX = "x-middleware-response-";
2121
export const MIDDLEWARE_HEADER_PREFIX_LEN = MIDDLEWARE_HEADER_PREFIX.length;
22+
2223
export interface MiddlewareOutputEvent {
24+
type: "middleware";
2325
internalEvent: InternalEvent;
2426
isExternalRewrite: boolean;
2527
origin: Origin | false;
@@ -110,17 +112,16 @@ export default async function routingHandler(
110112
return redirect;
111113
}
112114

113-
const middleware = await handleMiddleware(internalEvent);
114-
let middlewareResponseHeaders: Record<string, string | string[]> = {};
115-
if ("statusCode" in middleware) {
116-
return middleware;
115+
const middlewareEventOrResult = await handleMiddleware(internalEvent);
116+
const isInternalResult = "statusCode" in middlewareEventOrResult;
117+
if (isInternalResult) {
118+
return middlewareEventOrResult;
117119
}
118-
middlewareResponseHeaders = middleware.responseHeaders || {};
119-
internalEvent = middleware;
120-
121-
// At this point internalEvent is an InternalEvent or a MiddlewareOutputEvent
120+
const middlewareResponseHeaders = middlewareEventOrResult.responseHeaders;
121+
let isExternalRewrite = middlewareEventOrResult.isExternalRewrite ?? false;
122+
// internalEvent is `InternalEvent | InternalMiddlewareEvent`
123+
internalEvent = middlewareEventOrResult;
122124

123-
let isExternalRewrite = middleware.externalRewrite ?? false;
124125
if (!isExternalRewrite) {
125126
// First rewrite to be applied
126127
const beforeRewrites = handleRewrites(
@@ -233,6 +234,7 @@ export default async function routingHandler(
233234
});
234235

235236
return {
237+
type: "middleware",
236238
internalEvent,
237239
isExternalRewrite,
238240
origin: false,

packages/open-next/src/overrides/converters/aws-cloudfront.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,6 @@ async function convertFromCloudFrontRequestEvent(
111111
};
112112
}
113113

114-
type MiddlewareEvent = {
115-
type: "middleware";
116-
} & MiddlewareOutputEvent;
117-
118114
function convertToCloudfrontHeaders(
119115
headers: Record<string, OutgoingHttpHeader>,
120116
directResponse?: boolean,
@@ -150,7 +146,7 @@ function convertToCloudfrontHeaders(
150146
}
151147

152148
async function convertToCloudFrontRequestResult(
153-
result: InternalResult | MiddlewareEvent,
149+
result: InternalResult | MiddlewareOutputEvent,
154150
originalRequest: CloudFrontRequestEvent,
155151
): Promise<CloudFrontRequestResult> {
156152
if (result.type === "middleware") {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import zlib from "node:zlib";
33

44
import type { APIGatewayProxyEventV2 } from "aws-lambda";
55
import type { StreamCreator } from "http/index";
6-
import type { WrapperHandler } from "types/overrides";
6+
import type { Wrapper, WrapperHandler } from "types/overrides";
77

88
import { debug, error } from "../../adapters/logger";
99
import type {
@@ -119,4 +119,4 @@ export default {
119119
wrapper: handler,
120120
name: "aws-lambda-streaming",
121121
supportStreaming: true,
122-
};
122+
} satisfies Wrapper;

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

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

44
import { Writable } from "node:stream";
55
import type { StreamCreator } from "http/index";
6-
import type { MiddlewareOutputEvent } from "../../core/routingHandler";
76

8-
const handler: WrapperHandler<
9-
InternalEvent,
10-
InternalResult | ({ type: "middleware" } & MiddlewareOutputEvent)
11-
> =
7+
const handler: WrapperHandler<InternalEvent, InternalResult> =
128
async (handler, converter) =>
139
async (
1410
request: Request,
@@ -73,5 +69,4 @@ export default {
7369
wrapper: handler,
7470
name: "cloudflare-streaming",
7571
supportStreaming: true,
76-
edgeRuntime: true,
77-
};
72+
} satisfies Wrapper;

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

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

44
import type { MiddlewareOutputEvent } from "../../core/routingHandler";
55

@@ -17,7 +17,7 @@ interface WorkerContext {
1717

1818
const handler: WrapperHandler<
1919
InternalEvent,
20-
InternalResult | ({ type: "middleware" } & MiddlewareOutputEvent)
20+
InternalResult | MiddlewareOutputEvent
2121
> =
2222
async (handler, converter) =>
2323
async (
@@ -65,4 +65,4 @@ export default {
6565
name: "cloudflare",
6666
supportStreaming: true,
6767
edgeRuntime: true,
68-
};
68+
} satisfies Wrapper<InternalEvent, InternalResult | MiddlewareOutputEvent>;
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import type { WrapperHandler } from "types/overrides";
1+
import type { Wrapper, WrapperHandler } from "types/overrides";
22

33
const dummyWrapper: WrapperHandler = async () => async () => undefined;
44

55
export default {
66
name: "dummy",
7-
handler: dummyWrapper,
7+
wrapper: dummyWrapper,
88
supportStreaming: false,
9-
};
9+
} satisfies Wrapper;

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

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

33
import type { StreamCreator } from "http/index";
4-
import type { WrapperHandler } from "types/overrides";
4+
import type { Wrapper, WrapperHandler } from "types/overrides";
55

66
import { debug, error } from "../../adapters/logger";
77

@@ -66,4 +66,4 @@ export default {
6666
wrapper,
6767
name: "node",
6868
supportStreaming: true,
69-
};
69+
} satisfies Wrapper;

packages/tests-unit/tests/core/routing/middleware.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ describe("handleMiddleware", () => {
146146
responseHeaders: {
147147
"x-middleware-rewrite": "http://localhost/rewrite",
148148
},
149-
externalRewrite: false,
149+
isExternalRewrite: false,
150150
});
151151
});
152152

@@ -176,7 +176,7 @@ describe("handleMiddleware", () => {
176176
__nextDataReq: "1",
177177
newKey: "value",
178178
},
179-
externalRewrite: false,
179+
isExternalRewrite: false,
180180
});
181181
});
182182

@@ -201,7 +201,7 @@ describe("handleMiddleware", () => {
201201
responseHeaders: {
202202
"x-middleware-rewrite": "http://external/rewrite",
203203
},
204-
externalRewrite: true,
204+
isExternalRewrite: true,
205205
});
206206
});
207207

@@ -221,7 +221,7 @@ describe("handleMiddleware", () => {
221221
"custom-header": "value",
222222
},
223223
responseHeaders: {},
224-
externalRewrite: false,
224+
isExternalRewrite: false,
225225
});
226226
});
227227

0 commit comments

Comments
 (0)