From 49fbdfd105c055811093af3bda817a60f9d97b51 Mon Sep 17 00:00:00 2001 From: Dorseuil Nicolas Date: Mon, 20 May 2024 12:15:22 +0200 Subject: [PATCH 1/3] fix crypto polyfill for the middleware --- .../open-next/src/converters/aws-apigw-v2.ts | 32 ++++++++++++++++++- packages/open-next/src/plugins/edge.ts | 24 +++++++++++--- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/packages/open-next/src/converters/aws-apigw-v2.ts b/packages/open-next/src/converters/aws-apigw-v2.ts index 02787ed9b..7490e2c9f 100644 --- a/packages/open-next/src/converters/aws-apigw-v2.ts +++ b/packages/open-next/src/converters/aws-apigw-v2.ts @@ -6,6 +6,31 @@ import { debug } from "../adapters/logger"; import { convertToQuery } from "../core/routing/util"; import { removeUndefinedFromQuery } from "./utils"; +// Not sure which one is reallly needed as this is not documented anywhere but server actions redirect are not working without this, it causes a 500 error from cloudfront itself with a 'x-amzErrortype: InternalFailure' header +const CloudFrontBlacklistedHeaders = [ + "connection", + "expect", + "keep-alive", + "proxy-authenticate", + "proxy-authorization", + "proxy-connection", + "trailer", + "upgrade", + "x-accel-buffering", + "x-accel-charset", + "x-accel-limit-rate", + "x-accel-redirect", + /x-amz-cf-(.*)/, + /x-amzn-(.*)/, + /x-edge-(.*)/, + "x-cache", + "x-forwarded-proto", + "x-real-ip", + "set-cookie", + "age", + "via", +]; + function normalizeAPIGatewayProxyEventV2Body( event: APIGatewayProxyEventV2, ): Buffer { @@ -65,7 +90,12 @@ function convertToApiGatewayProxyResultV2( ): APIGatewayProxyResultV2 { const headers: Record = {}; Object.entries(result.headers) - .filter(([key]) => key.toLowerCase() !== "set-cookie") + .filter( + ([key]) => + !CloudFrontBlacklistedHeaders.some((header) => + typeof header === "string" ? header === key : header.test(key), + ), + ) .forEach(([key, value]) => { if (value === null) { headers[key] = ""; diff --git a/packages/open-next/src/plugins/edge.ts b/packages/open-next/src/plugins/edge.ts index e22e8d1d4..9c8f0b32d 100644 --- a/packages/open-next/src/plugins/edge.ts +++ b/packages/open-next/src/plugins/edge.ts @@ -99,10 +99,6 @@ globalThis._ROUTES = ${JSON.stringify(routes)}; import {Buffer} from "node:buffer"; globalThis.Buffer = Buffer; -import crypto from "node:crypto"; -if(!globalThis.crypto){ - globalThis.crypto = crypto; -} import {AsyncLocalStorage} from "node:async_hooks"; globalThis.AsyncLocalStorage = AsyncLocalStorage; @@ -125,6 +121,26 @@ class OverrideRequest extends Request { } } globalThis.Request = OverrideRequest; + +// If we're not in cloudflare, we polyfill crypto +// https://github.com/vercel/edge-runtime/blob/main/packages/primitives/src/primitives/crypto.js +import { webcrypto } from 'node:crypto' +if(!globalThis.crypto){ + globalThis.crypto = new webcrypto.Crypto() +} +if(!globalThis.CryptoKey){ + globalThis.CryptoKey = webcrypto.CryptoKey +} +function SubtleCrypto() { + if (!(this instanceof SubtleCrypto)) return new SubtleCrypto() + throw TypeError('Illegal constructor') +} +if(!globalThis.SubtleCrypto) { + globalThis.SubtleCrypto = SubtleCrypto +} +if(!globalThis.Crypto) { + globalThis.Crypto = webcrypto.Crypto +} ` } ${wasmFiles From edf7b34cb1e26aed7e88a51d3e7a1756886378cf Mon Sep 17 00:00:00 2001 From: Dorseuil Nicolas Date: Mon, 20 May 2024 12:22:15 +0200 Subject: [PATCH 2/3] update version --- packages/open-next/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/open-next/package.json b/packages/open-next/package.json index 4ba59f14e..5a3c44b19 100644 --- a/packages/open-next/package.json +++ b/packages/open-next/package.json @@ -3,7 +3,7 @@ "access": "public" }, "name": "open-next", - "version": "3.0.1", + "version": "3.0.1-middleware-fix", "bin": { "open-next": "./dist/index.js" }, From e6f5d81313b3ed6ed7764048cf7f7daa6bc96796 Mon Sep 17 00:00:00 2001 From: conico974 Date: Fri, 24 May 2024 12:38:12 +0200 Subject: [PATCH 3/3] Create brave-games-argue.md --- .changeset/brave-games-argue.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/brave-games-argue.md diff --git a/.changeset/brave-games-argue.md b/.changeset/brave-games-argue.md new file mode 100644 index 000000000..45f65ea15 --- /dev/null +++ b/.changeset/brave-games-argue.md @@ -0,0 +1,5 @@ +--- +"open-next": patch +--- + +Fix polyfill for crypto in the middleware