Skip to content

Commit

Permalink
fix: partially reverts 644 (#660)
Browse files Browse the repository at this point in the history
  • Loading branch information
vicb authored Dec 3, 2024
1 parent be8b2c7 commit 4dea7ea
Show file tree
Hide file tree
Showing 9 changed files with 72 additions and 56 deletions.
5 changes: 5 additions & 0 deletions .changeset/sharp-worms-cross.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@opennextjs/aws": patch
---

fix: partially reverts 644
10 changes: 8 additions & 2 deletions packages/open-next/src/adapters/middleware.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand All @@ -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<InternalResult | MiddlewareResult> => {
const originResolver = await resolveOriginResolver(
globalThis.openNextConfig.middleware?.originResolver,
);
Expand Down
22 changes: 11 additions & 11 deletions packages/open-next/src/core/requestHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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<string, string | string[]> = {};

Expand All @@ -68,7 +69,7 @@ export async function openNextHandler(
}

if (
routingResult.type === "middleware" &&
"isExternalRewrite" in routingResult &&
routingResult.isExternalRewrite === true
) {
try {
Expand All @@ -78,7 +79,6 @@ export async function openNextHandler(
} catch (e) {
error("External request failed.", e);
routingResult = {
type: "middleware",
internalEvent: {
type: "core",
rawPath: "/500",
Expand All @@ -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(
Expand Down
6 changes: 3 additions & 3 deletions packages/open-next/src/core/routing/middleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ const middlewareManifest = MiddlewareManifest;

const middleMatch = getMiddlewareMatch(middlewareManifest);

type InternalMiddlewareEvent = InternalEvent & {
type MiddlewareEvent = InternalEvent & {
responseHeaders?: Record<string, string | string[]>;
isExternalRewrite?: boolean;
};
Expand All @@ -45,7 +45,7 @@ function defaultMiddlewareLoader() {
export async function handleMiddleware(
internalEvent: InternalEvent,
middlewareLoader: MiddlewareLoader = defaultMiddlewareLoader,
): Promise<InternalMiddlewareEvent | InternalResult> {
): Promise<MiddlewareEvent | InternalResult> {
const headers = internalEvent.headers;

// We bypass the middleware if the request is internal
Expand Down Expand Up @@ -207,5 +207,5 @@ export async function handleMiddleware(
cookies: internalEvent.cookies,
remoteAddress: internalEvent.remoteAddress,
isExternalRewrite,
} satisfies InternalMiddlewareEvent;
} satisfies MiddlewareEvent;
}
33 changes: 14 additions & 19 deletions packages/open-next/src/core/routingHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -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("|")})?`
Expand Down Expand Up @@ -88,7 +84,7 @@ function applyMiddlewareHeaders(

export default async function routingHandler(
event: InternalEvent,
): Promise<InternalResult | MiddlewareOutputEvent> {
): Promise<InternalResult | RoutingResult> {
// Add Next geo headers
for (const [openNextGeoName, nextGeoName] of Object.entries(
geoHeaderToNextHeader,
Expand All @@ -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
Expand Down Expand Up @@ -234,7 +230,6 @@ export default async function routingHandler(
});

return {
type: "middleware",
internalEvent,
isExternalRewrite,
origin: false,
Expand Down
16 changes: 7 additions & 9 deletions packages/open-next/src/overrides/converters/aws-cloudfront.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -146,7 +144,7 @@ function convertToCloudfrontHeaders(
}

async function convertToCloudFrontRequestResult(
result: InternalResult | MiddlewareOutputEvent,
result: InternalResult | MiddlewareResult,
originalRequest: CloudFrontRequestEvent,
): Promise<CloudFrontRequestResult> {
if (result.type === "middleware") {
Expand Down
13 changes: 6 additions & 7 deletions packages/open-next/src/overrides/converters/edge.ts
Original file line number Diff line number Diff line change
@@ -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<InternalEvent, InternalResult | MiddlewareResult> = {
convertFrom: async (event: Request) => {
const url = new URL(event.url);

Expand Down
12 changes: 7 additions & 5 deletions packages/open-next/src/overrides/wrappers/cloudflare-edge.ts
Original file line number Diff line number Diff line change
@@ -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",
Expand All @@ -17,7 +19,7 @@ interface WorkerContext {

const handler: WrapperHandler<
InternalEvent,
InternalResult | MiddlewareOutputEvent
InternalResult | MiddlewareResult
> =
async (handler, converter) =>
async (
Expand Down Expand Up @@ -65,4 +67,4 @@ export default {
name: "cloudflare-edge",
supportStreaming: true,
edgeRuntime: true,
} satisfies Wrapper<InternalEvent, InternalResult | MiddlewareOutputEvent>;
} satisfies Wrapper<InternalEvent, InternalResult | MiddlewareResult>;
11 changes: 11 additions & 0 deletions packages/open-next/src/types/open-next.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down

0 comments on commit 4dea7ea

Please sign in to comment.