Skip to content

Commit 00662dc

Browse files
authoredFeb 7, 2024
fix: shim require("node:buffer") (#233)
* chore: repro aws middleware build failure repro for https://linear.app/netlify/issue/FRA-248/edge-function-middleware-error-on-next-runtime-v5-beta * fix: shim require("node:buffer") * chore: comment * chore: add more shims
1 parent c076448 commit 00662dc

File tree

5 files changed

+2475
-111
lines changed

5 files changed

+2475
-111
lines changed
 

‎edge-runtime/shim/index.js

+27
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,36 @@
33
// application.
44
import { AsyncLocalStorage } from 'node:async_hooks'
55
import process from 'node:process'
6+
import * as BufferCompat from 'node:buffer'
7+
import * as EventsCompat from 'node:events'
8+
import * as AsyncHooksCompat from 'node:async_hooks'
9+
import * as AssertCompat from 'node:assert'
10+
import * as UtilCompat from 'node:util'
611

712
globalThis.process = process
813

914
globalThis.AsyncLocalStorage = AsyncLocalStorage
1015

16+
// next.js generates require("node:buffer") statemenents:
17+
// https://github.com/vercel/next.js/blob/89e68377baf3ea6d2bf09e0ae694f57ec5c8ea93/packages/next/src/build/webpack-config.ts#L1677-L1684
18+
// we need to shim them, because require doesn't work on Deno
19+
// we've also added a few more shims that Next.js also shims in their own sandbox:
20+
// https://github.com/vercel/next.js/blob/55b472b5fc8da9a97ffca0070befa80ae431217f/packages/next/src/server/web/sandbox/context.ts#L177
21+
globalThis.require = function nextRuntimeMinimalRequireShim(name) {
22+
switch (name.replace(/^node:/, '')) {
23+
case 'buffer':
24+
return BufferCompat
25+
case 'events':
26+
return EventsCompat
27+
case 'async_hooks':
28+
return AsyncHooksCompat
29+
case 'assert':
30+
return AssertCompat
31+
case 'util':
32+
return UtilCompat
33+
default:
34+
throw new ReferenceError(`require is not defined`)
35+
}
36+
}
37+
1138
var _ENTRIES = {}

‎tests/e2e/edge-middleware.test.ts

+6
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,9 @@ test('Does not run edge middleware at the origin', async ({ page }) => {
3131
const h1 = page.locator('h1')
3232
await expect(h1).toHaveText('Message from middleware: hello')
3333
})
34+
35+
test('Supports CJS dependencies in Edge Middleware', async ({ page }) => {
36+
const res = await page.goto(`${ctx.url}/test/next`)
37+
38+
expect(await res?.headerValue('x-cjs-module-works')).toEqual("true")
39+
})

‎tests/fixtures/middleware/middleware.ts

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,24 @@
11
import type { NextRequest } from 'next/server'
22
import { NextResponse } from 'next/server'
3+
import { createServerRunner } from '@aws-amplify/adapter-nextjs'
34

4-
export function middleware(request: NextRequest) {
5+
export const { runWithAmplifyServerContext } = createServerRunner({
6+
config: {},
7+
})
8+
9+
export async function middleware(request: NextRequest) {
510
const response = getResponse(request)
611

712
response.headers.append('Deno' in globalThis ? 'x-deno' : 'x-node', Date.now().toString())
813
response.headers.set('x-hello-from-middleware-res', 'hello')
914

15+
await runWithAmplifyServerContext({
16+
nextServerContext: { request, response },
17+
operation: async () => {
18+
response.headers.set('x-cjs-module-works', 'true')
19+
},
20+
})
21+
1022
return response
1123
}
1224

‎tests/fixtures/middleware/package-lock.json

+2,428-110
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎tests/fixtures/middleware/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"build": "next build"
99
},
1010
"dependencies": {
11+
"@aws-amplify/adapter-nextjs": "^1.0.13",
1112
"next": "^14.0.4",
1213
"react": "18.2.0",
1314
"react-dom": "18.2.0"

0 commit comments

Comments
 (0)
Please sign in to comment.