1
+ import type { NextConfig } from '../../../../server/config-shared'
2
+
1
3
import { NextRequest } from '../../../../server/web/spec-extension/request'
2
- import { renderToHTML } from '../../../../server/web/render'
3
- import RenderResult from '../../../../server/render-result'
4
4
import { toNodeHeaders } from '../../../../server/web/utils'
5
5
6
+ import WebServer from '../../../../server/web-server'
7
+ import { WebNextRequest , WebNextResponse } from '../../../../server/base-http'
8
+
6
9
const createHeaders = ( args ?: any ) => ( {
7
10
...args ,
8
11
'x-middleware-ssr' : '1' ,
@@ -18,26 +21,22 @@ function sendError(req: any, error: Error) {
18
21
}
19
22
20
23
export function getRender ( {
21
- App,
22
24
Document,
23
- pageMod,
24
- errorMod,
25
- rscManifest,
26
- buildManifest,
27
- reactLoadableManifest,
28
25
isServerComponent,
29
- restRenderOpts ,
26
+ config ,
30
27
} : {
31
- App : any
32
28
Document : any
33
- pageMod : any
34
- errorMod : any
35
- rscManifest : object
36
- buildManifest : any
37
- reactLoadableManifest : any
38
29
isServerComponent : boolean
39
- restRenderOpts : any
30
+ config : NextConfig
40
31
} ) {
32
+ // Polyfilled for `path-browserify`.
33
+ process . cwd = ( ) => ''
34
+ const server = new WebServer ( {
35
+ conf : config ,
36
+ minimalMode : true ,
37
+ } )
38
+ const requestHandler = server . getRequestHandler ( )
39
+
41
40
return async function render ( request : NextRequest ) {
42
41
const { nextUrl : url , cookies, headers } = request
43
42
const { pathname, searchParams } = url
@@ -56,6 +55,7 @@ export function getRender({
56
55
} )
57
56
}
58
57
58
+ // @TODO : We should move this into server/render.
59
59
if ( Document . getInitialProps ) {
60
60
const err = new Error (
61
61
'`getInitialProps` in Document component is not supported with `concurrentFeatures` enabled.'
@@ -72,92 +72,15 @@ export function getRender({
72
72
? JSON . parse ( query . __props__ )
73
73
: undefined
74
74
75
- delete query . __flight__
76
- delete query . __props__
77
-
78
- const renderOpts = {
79
- ...restRenderOpts ,
80
- // Locales are not supported yet.
81
- // locales: i18n?.locales,
82
- // locale: detectedLocale,
83
- // defaultLocale,
84
- // domainLocales: i18n?.domains,
85
- dev : process . env . NODE_ENV !== 'production' ,
86
- App,
87
- Document,
88
- buildManifest,
89
- Component : pageMod . default ,
90
- pageConfig : pageMod . config || { } ,
91
- getStaticProps : pageMod . getStaticProps ,
92
- getServerSideProps : pageMod . getServerSideProps ,
93
- getStaticPaths : pageMod . getStaticPaths ,
94
- reactLoadableManifest,
95
- env : process . env ,
96
- supportsDynamicHTML : true ,
97
- concurrentFeatures : true ,
98
- // When streaming, opt-out the `defer` behavior for script tags.
99
- disableOptimizedLoading : true ,
75
+ // Extend the context.
76
+ Object . assign ( ( self as any ) . __server_context , {
100
77
renderServerComponentData,
101
78
serverComponentProps,
102
- serverComponentManifest : isServerComponent ? rscManifest : null ,
103
- ComponentMod : null ,
104
- }
105
-
106
- const transformStream = new TransformStream ( )
107
- const writer = transformStream . writable . getWriter ( )
108
- const encoder = new TextEncoder ( )
109
-
110
- let result : RenderResult | null
111
- let renderError : any
112
- try {
113
- result = await renderToHTML (
114
- req as any ,
115
- { } as any ,
116
- pathname ,
117
- query ,
118
- renderOpts
119
- )
120
- } catch ( err : any ) {
121
- console . error (
122
- 'An error occurred while rendering the initial result:' ,
123
- err
124
- )
125
- const errorRes = { statusCode : 500 , err }
126
- renderError = err
127
- try {
128
- req . url = '/_error'
129
- result = await renderToHTML (
130
- req as any ,
131
- errorRes as any ,
132
- '/_error' ,
133
- query ,
134
- {
135
- ...renderOpts ,
136
- err,
137
- Component : errorMod . default ,
138
- getStaticProps : errorMod . getStaticProps ,
139
- getServerSideProps : errorMod . getServerSideProps ,
140
- getStaticPaths : errorMod . getStaticPaths ,
141
- }
142
- )
143
- } catch ( err2 : any ) {
144
- return sendError ( req , err2 )
145
- }
146
- }
147
-
148
- if ( ! result ) {
149
- return sendError ( req , new Error ( 'No result returned from render.' ) )
150
- }
151
-
152
- result . pipe ( {
153
- write : ( str : string ) => writer . write ( encoder . encode ( str ) ) ,
154
- end : ( ) => writer . close ( ) ,
155
- // Not implemented: cork/uncork/on/removeListener
156
- } as any )
157
-
158
- return new Response ( transformStream . readable , {
159
- headers : createHeaders ( ) ,
160
- status : renderError ? 500 : 200 ,
161
79
} )
80
+
81
+ const extendedReq = new WebNextRequest ( request )
82
+ const extendedRes = new WebNextResponse ( )
83
+ requestHandler ( extendedReq , extendedRes )
84
+ return await extendedRes . toResponse ( )
162
85
}
163
86
}
0 commit comments