1
- import { createRequire } from 'module '
2
- import { IncomingMessage , ServerResponse } from 'node:http '
1
+ import http from 'node:http '
2
+ import { createRequire } from 'node:module '
3
3
import { fileURLToPath } from 'node:url'
4
4
5
- import type { Context } from '@netlify/functions'
5
+ import type { Handler , HandlerContext , HandlerEvent } from '@netlify/functions'
6
+ import '@vercel/node-bridge/bridge.js'
6
7
7
8
const require = createRequire ( import . meta. url )
9
+
10
+ const { Bridge } = require ( '@vercel/node-bridge/bridge.js' )
8
11
const { getRequestHandlers } = require ( 'next/dist/server/lib/start-server.js' )
9
12
10
- // eslint-disable-next-line import/no-unresolved
11
13
const requiredServerFiles = require ( './.next/required-server-files.json' )
12
14
13
15
process . env . __NEXT_PRIVATE_STANDALONE_CONFIG = JSON . stringify ( requiredServerFiles . config )
@@ -16,29 +18,45 @@ const __dirname = fileURLToPath(new URL('.', import.meta.url))
16
18
17
19
process . chdir ( __dirname )
18
20
19
- // eslint-disable-next-line import/no-anonymous-default-export, @typescript-eslint/no-unused-vars
20
- export default async ( request : Request , context : Context ) => {
21
- // let Next.js initialize and create the request handler
22
- const [ nextHandler ] = await getRequestHandlers ( {
23
- port : 3000 ,
24
- hostname : 'localhost' ,
25
- dir : __dirname ,
26
- isDev : false ,
27
- } )
28
-
29
- const response = new ServerResponse ( request )
30
-
31
- try {
32
- console . log ( 'Next server request:' , request . url )
33
- await nextHandler ( request , response )
34
- } catch ( error ) {
35
- console . error ( error )
36
- response . statusCode = 500
37
- response . end ( 'Internal Server Error' )
21
+ let bridge : typeof Bridge
22
+
23
+ export const handler : Handler = async function ( event : HandlerEvent , context : HandlerContext ) {
24
+ if ( ! bridge ) {
25
+ // initialize Next.js and create the request handler
26
+ const [ nextHandler ] = await getRequestHandlers ( {
27
+ port : 3000 ,
28
+ hostname : 'localhost' ,
29
+ dir : __dirname ,
30
+ isDev : false ,
31
+ } )
32
+
33
+ // create a standard HTTP server that will receive
34
+ // requests from the bridge and send them to Next.js
35
+ const server = http . createServer ( async ( req , res ) => {
36
+ try {
37
+ console . log ( 'Next server request:' , req . url )
38
+ await nextHandler ( req , res )
39
+ } catch ( error ) {
40
+ console . error ( error )
41
+ res . statusCode = 500
42
+ res . end ( 'Internal Server Error' )
43
+ }
44
+ } )
45
+
46
+ bridge = new Bridge ( server )
47
+ bridge . listen ( )
38
48
}
39
49
50
+ // pass the AWS lambda event and context to the bridge
51
+ const { headers, ...result } = await bridge . launcher ( event , context )
52
+
40
53
// log the response from Next.js
54
+ const response = { headers, statusCode : result . statusCode }
41
55
console . log ( 'Next server response:' , JSON . stringify ( response , null , 2 ) )
42
56
43
- return response
57
+ return {
58
+ ...result ,
59
+ headers,
60
+ isBase64Encoded : result . encoding === 'base64' ,
61
+ }
44
62
}
0 commit comments