diff --git a/.changeset/sharp-worms-cross.md b/.changeset/sharp-worms-cross.md new file mode 100644 index 000000000..adf36bb16 --- /dev/null +++ b/.changeset/sharp-worms-cross.md @@ -0,0 +1,5 @@ +--- +"@opennextjs/aws": patch +--- + +fix: partially reverts 644 diff --git a/packages/open-next/src/adapters/middleware.ts b/packages/open-next/src/adapters/middleware.ts index 952d58fa7..bb9b7c2da 100644 --- a/packages/open-next/src/adapters/middleware.ts +++ b/packages/open-next/src/adapters/middleware.ts @@ -1,4 +1,8 @@ -import type { InternalEvent, Origin } from "types/open-next"; +import type { + InternalEvent, + InternalResult, + MiddlewareResult, +} from "types/open-next"; import { runWithOpenNextRequestContext } from "utils/promise"; import { debug, error } from "../adapters/logger"; @@ -15,7 +19,9 @@ import routingHandler from "../core/routingHandler"; globalThis.internalFetch = fetch; globalThis.__openNextAls = new AsyncLocalStorage(); -const defaultHandler = async (internalEvent: InternalEvent) => { +const defaultHandler = async ( + internalEvent: InternalEvent, +): Promise => { const originResolver = await resolveOriginResolver( globalThis.openNextConfig.middleware?.originResolver, ); diff --git a/packages/open-next/src/core/requestHandler.ts b/packages/open-next/src/core/requestHandler.ts index acc7c1a32..d938ba152 100644 --- a/packages/open-next/src/core/requestHandler.ts +++ b/packages/open-next/src/core/requestHandler.ts @@ -2,14 +2,16 @@ import { AsyncLocalStorage } from "node:async_hooks"; import type { OpenNextNodeResponse, StreamCreator } from "http/index.js"; import { IncomingMessage } from "http/index.js"; -import type { InternalEvent, InternalResult } from "types/open-next"; +import type { + InternalEvent, + InternalResult, + RoutingResult, +} from "types/open-next"; import { runWithOpenNextRequestContext } from "utils/promise"; import { debug, error, warn } from "../adapters/logger"; import { patchAsyncStorage } from "./patchAsyncStorage"; -import { resolveProxyRequest } from "./resolve"; import { convertRes, createServerResponse } from "./routing/util"; -import type { MiddlewareOutputEvent } from "./routingHandler"; import routingHandler, { MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_HEADER_PREFIX_LEN, @@ -34,8 +36,7 @@ export async function openNextHandler( } debug("internalEvent", internalEvent); - let routingResult: InternalResult | MiddlewareOutputEvent = { - type: "middleware", + let routingResult: InternalResult | RoutingResult = { internalEvent, isExternalRewrite: false, origin: false, @@ -51,9 +52,9 @@ export async function openNextHandler( //#endOverride const headers = - routingResult.type === "middleware" - ? routingResult.internalEvent.headers - : routingResult.headers; + "type" in routingResult + ? routingResult.headers + : routingResult.internalEvent.headers; const overwrittenResponseHeaders: Record = {}; @@ -68,7 +69,7 @@ export async function openNextHandler( } if ( - routingResult.type === "middleware" && + "isExternalRewrite" in routingResult && routingResult.isExternalRewrite === true ) { try { @@ -78,7 +79,6 @@ export async function openNextHandler( } catch (e) { error("External request failed.", e); routingResult = { - type: "middleware", internalEvent: { type: "core", rawPath: "/500", @@ -97,7 +97,7 @@ export async function openNextHandler( } } - if (routingResult.type === "core") { + if ("type" in routingResult) { // response is used only in the streaming case if (responseStreaming) { const response = createServerResponse( diff --git a/packages/open-next/src/core/routing/middleware.ts b/packages/open-next/src/core/routing/middleware.ts index 708beda4d..4562eb60d 100644 --- a/packages/open-next/src/core/routing/middleware.ts +++ b/packages/open-next/src/core/routing/middleware.ts @@ -23,7 +23,7 @@ const middlewareManifest = MiddlewareManifest; const middleMatch = getMiddlewareMatch(middlewareManifest); -type InternalMiddlewareEvent = InternalEvent & { +type MiddlewareEvent = InternalEvent & { responseHeaders?: Record; isExternalRewrite?: boolean; }; @@ -45,7 +45,7 @@ function defaultMiddlewareLoader() { export async function handleMiddleware( internalEvent: InternalEvent, middlewareLoader: MiddlewareLoader = defaultMiddlewareLoader, -): Promise { +): Promise { const headers = internalEvent.headers; // We bypass the middleware if the request is internal @@ -207,5 +207,5 @@ export async function handleMiddleware( cookies: internalEvent.cookies, remoteAddress: internalEvent.remoteAddress, isExternalRewrite, - } satisfies InternalMiddlewareEvent; + } satisfies MiddlewareEvent; } diff --git a/packages/open-next/src/core/routingHandler.ts b/packages/open-next/src/core/routingHandler.ts index 55c2a82cd..e7aec3f2e 100644 --- a/packages/open-next/src/core/routingHandler.ts +++ b/packages/open-next/src/core/routingHandler.ts @@ -4,7 +4,11 @@ import { PrerenderManifest, RoutesManifest, } from "config/index"; -import type { InternalEvent, InternalResult, Origin } from "types/open-next"; +import type { + InternalEvent, + InternalResult, + RoutingResult, +} from "types/open-next"; import { debug } from "../adapters/logger"; import { cacheInterceptor } from "./routing/cacheInterceptor"; @@ -20,14 +24,6 @@ import { handleMiddleware } from "./routing/middleware"; export const MIDDLEWARE_HEADER_PREFIX = "x-middleware-response-"; export const MIDDLEWARE_HEADER_PREFIX_LEN = MIDDLEWARE_HEADER_PREFIX.length; -export interface MiddlewareOutputEvent { - type: "middleware"; - internalEvent: InternalEvent; - isExternalRewrite: boolean; - origin: Origin | false; - isISR: boolean; -} - // Add the locale prefix to the regex so we correctly match the rawPath const optionalLocalePrefixRegex = RoutesManifest.locales.length ? `^/(?:${RoutesManifest.locales.map((locale) => `${locale}/?`).join("|")})?` @@ -88,7 +84,7 @@ function applyMiddlewareHeaders( export default async function routingHandler( event: InternalEvent, -): Promise { +): Promise { // Add Next geo headers for (const [openNextGeoName, nextGeoName] of Object.entries( geoHeaderToNextHeader, @@ -112,15 +108,15 @@ export default async function routingHandler( return redirect; } - const middlewareEventOrResult = await handleMiddleware(internalEvent); - const isInternalResult = "statusCode" in middlewareEventOrResult; - if (isInternalResult) { - return middlewareEventOrResult; + const eventOrResult = await handleMiddleware(internalEvent); + const isResult = "statusCode" in eventOrResult; + if (isResult) { + return eventOrResult; } - const middlewareResponseHeaders = middlewareEventOrResult.responseHeaders; - let isExternalRewrite = middlewareEventOrResult.isExternalRewrite ?? false; - // internalEvent is `InternalEvent | InternalMiddlewareEvent` - internalEvent = middlewareEventOrResult; + const middlewareResponseHeaders = eventOrResult.responseHeaders; + let isExternalRewrite = eventOrResult.isExternalRewrite ?? false; + // internalEvent is `InternalEvent | MiddlewareEvent` + internalEvent = eventOrResult; if (!isExternalRewrite) { // First rewrite to be applied @@ -234,7 +230,6 @@ export default async function routingHandler( }); return { - type: "middleware", internalEvent, isExternalRewrite, origin: false, diff --git a/packages/open-next/src/overrides/converters/aws-cloudfront.ts b/packages/open-next/src/overrides/converters/aws-cloudfront.ts index 384ca9c53..bf44749d3 100644 --- a/packages/open-next/src/overrides/converters/aws-cloudfront.ts +++ b/packages/open-next/src/overrides/converters/aws-cloudfront.ts @@ -8,18 +8,16 @@ import type { CloudFrontRequestResult, } from "aws-lambda"; import { parseCookies } from "http/util"; -import type { InternalEvent, InternalResult } from "types/open-next"; +import type { + InternalEvent, + InternalResult, + MiddlewareResult, +} from "types/open-next"; import type { Converter } from "types/overrides"; import { fromReadableStream } from "utils/stream"; import { debug } from "../../adapters/logger"; -import { - convertRes, - convertToQuery, - convertToQueryString, - createServerResponse, -} from "../../core/routing/util"; -import type { MiddlewareOutputEvent } from "../../core/routingHandler"; +import { convertToQuery, convertToQueryString } from "../../core/routing/util"; const cloudfrontBlacklistedHeaders = [ // Disallowed headers, see: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/edge-function-restrictions-all.html#function-restrictions-disallowed-headers @@ -146,7 +144,7 @@ function convertToCloudfrontHeaders( } async function convertToCloudFrontRequestResult( - result: InternalResult | MiddlewareOutputEvent, + result: InternalResult | MiddlewareResult, originalRequest: CloudFrontRequestEvent, ): Promise { if (result.type === "middleware") { diff --git a/packages/open-next/src/overrides/converters/edge.ts b/packages/open-next/src/overrides/converters/edge.ts index 530777841..6cfcf9b99 100644 --- a/packages/open-next/src/overrides/converters/edge.ts +++ b/packages/open-next/src/overrides/converters/edge.ts @@ -1,20 +1,19 @@ import { Buffer } from "node:buffer"; import { parseCookies } from "http/util"; -import type { InternalEvent, InternalResult } from "types/open-next"; +import type { + InternalEvent, + InternalResult, + MiddlewareResult, +} from "types/open-next"; import type { Converter } from "types/overrides"; -import type { MiddlewareOutputEvent } from "../../core/routingHandler"; - declare global { // Makes convertTo returns the request instead of fetching it. var __dangerous_ON_edge_converter_returns_request: boolean | undefined; } -const converter: Converter< - InternalEvent, - InternalResult | MiddlewareOutputEvent -> = { +const converter: Converter = { convertFrom: async (event: Request) => { const url = new URL(event.url); diff --git a/packages/open-next/src/overrides/wrappers/cloudflare-edge.ts b/packages/open-next/src/overrides/wrappers/cloudflare-edge.ts index b8f4ba514..02a7318eb 100644 --- a/packages/open-next/src/overrides/wrappers/cloudflare-edge.ts +++ b/packages/open-next/src/overrides/wrappers/cloudflare-edge.ts @@ -1,8 +1,10 @@ -import type { InternalEvent, InternalResult } from "types/open-next"; +import type { + InternalEvent, + InternalResult, + MiddlewareResult, +} from "types/open-next"; import type { Wrapper, WrapperHandler } from "types/overrides"; -import type { MiddlewareOutputEvent } from "../../core/routingHandler"; - const cfPropNameToHeaderName = { city: "x-open-next-city", country: "x-open-next-country", @@ -17,7 +19,7 @@ interface WorkerContext { const handler: WrapperHandler< InternalEvent, - InternalResult | MiddlewareOutputEvent + InternalResult | MiddlewareResult > = async (handler, converter) => async ( @@ -65,4 +67,4 @@ export default { name: "cloudflare-edge", supportStreaming: true, edgeRuntime: true, -} satisfies Wrapper; +} satisfies Wrapper; diff --git a/packages/open-next/src/types/open-next.ts b/packages/open-next/src/types/open-next.ts index 9d045958e..af0338deb 100644 --- a/packages/open-next/src/types/open-next.ts +++ b/packages/open-next/src/types/open-next.ts @@ -95,6 +95,17 @@ export type IncludedConverter = | "sqs-revalidate" | "dummy"; +export interface RoutingResult { + internalEvent: InternalEvent; + isExternalRewrite: boolean; + origin: Origin | false; + isISR: boolean; +} + +export interface MiddlewareResult + extends RoutingResult, + BaseEventOrResult<"middleware"> {} + export type IncludedQueue = "sqs" | "sqs-lite" | "dummy"; export type IncludedIncrementalCache = "s3" | "s3-lite" | "dummy";