@@ -3,7 +3,7 @@ export { onRenderHtml }
33
44import React from 'react'
55import { renderToString , renderToStaticMarkup } from 'react-dom/server'
6- import { renderToStream } from 'react-streaming/server'
6+ import { renderToStream , type RenderToStreamOptions } from 'react-streaming/server'
77import { dangerouslySkipEscape , escapeInject } from 'vike/server'
88import type { PageContextServer } from 'vike/types'
99import { VikeReactProviderPageContext } from '../hooks/usePageContext.js'
@@ -80,29 +80,10 @@ async function renderPageToHtml(pageContext: PageContextServer) {
8080 const pageHtmlString = renderToString ( pageContext . page , renderToStringOptions )
8181 pageContext . pageHtmlString = pageHtmlString
8282 } else {
83- const pageHtmlStream = await renderToStream ( pageContext . page , {
84- webStream : ! streamSetting . type
85- ? /* Let react-streaming decide which stream type to use.
86- false
87- */
88- undefined
89- : streamSetting . type === 'web' ,
90- userAgent :
91- pageContext . headers ?. [ 'user-agent' ] ||
92- // TO-DO/eventually: remove old way of acccessing the User Agent header.
93- // @ts -ignore
94- pageContext . userAgent ,
95- disable :
96- // +stream.require is true => default +stream.enable is true
97- // +stream.require is false => default +stream.enable is false
98- streamSetting . enable === false
99- ? true
100- : /* Don't override disabling when bot is detected.
101- false,
102- */
103- undefined ,
104- ...renderToStreamOptions ,
105- } )
83+ const pageHtmlStream = await renderToStream (
84+ pageContext . page ,
85+ getRenderToStreamOptions ( pageContext , streamSetting , renderToStreamOptions ) ,
86+ )
10687 pageContext . pageHtmlStream = pageHtmlStream
10788 }
10889 }
@@ -230,6 +211,37 @@ async function getHtmlInjections(pageContext: PageContextServer) {
230211 return { bodyHtmlBegin, bodyHtmlEnd, headHtmlBegin, headHtmlEnd }
231212}
232213
214+ function getRenderToStreamOptions (
215+ pageContext : PageContextServer ,
216+ streamSetting : StreamSetting ,
217+ renderToStreamOptions : RenderToStreamOptions | undefined ,
218+ ) : RenderToStreamOptions {
219+ const options : RenderToStreamOptions = { }
220+
221+ if ( streamSetting . type ) {
222+ options . webStream = streamSetting . type === 'web'
223+ } else {
224+ // Let react-streaming decide the stream type
225+ }
226+
227+ const userAgent =
228+ pageContext . headers ?. [ 'user-agent' ] ||
229+ // TO-DO/eventually: remove old way of acccessing the User Agent header.
230+ // @ts -ignore
231+ pageContext . userAgent
232+ if ( userAgent ) options . userAgent = userAgent
233+
234+ // +stream.require is true => default +stream.enable is true
235+ // +stream.require is false => default +stream.enable is false
236+ if ( streamSetting . enable === false ) {
237+ options . disable = true
238+ } else {
239+ // Let react-streaming disable streaming when it detects a bot
240+ }
241+
242+ return { ...options , ...renderToStreamOptions }
243+ }
244+
233245type StreamSetting = {
234246 type : 'node' | 'web' | null
235247 enable : boolean | null
0 commit comments