| 
1 |  | -import { renderRequest } from '@vitejs/plugin-rsc/extra/rsc'  | 
2 |  | -import { StateNavigator } from 'navigation'  | 
3 |  | -import stateNavigator from './stateNavigator.ts'  | 
 | 1 | +import * as ReactServer from '@vitejs/plugin-rsc/rsc';  | 
 | 2 | +import { StateNavigator } from 'navigation';  | 
 | 3 | +import stateNavigator from './stateNavigator.ts';  | 
4 | 4 | 
 
  | 
5 | 5 | export default async function handler(request: Request): Promise<Response> {  | 
6 |  | -  let url: string;  | 
 | 6 | +  let url: string = '';  | 
7 | 7 |   let view: any;  | 
8 | 8 |   const serverNavigator = new StateNavigator(stateNavigator);  | 
9 | 9 |   if (request.method === 'GET') {  | 
10 | 10 |     let reqUrl = new URL(request.url);  | 
11 | 11 |     url = `${reqUrl.pathname}${reqUrl.search}`;  | 
12 | 12 |     const App = (await import('./App.tsx')).default;  | 
13 | 13 |     view = <App url={url} />;  | 
14 |  | -  } else {      | 
 | 14 | +  }  | 
 | 15 | +  if (request.method === 'POST') {  | 
15 | 16 |     const sceneViews: any = {  | 
16 | 17 |       people: await import('./People.tsx'),  | 
17 | 18 |       person: await import('./Person.tsx'),  | 
18 | 19 |       friends: await import('./Friends.tsx')  | 
19 | 20 |     };  | 
20 |  | -    const {url: reqUrl, sceneViewKey, state, data, crumbs} = await request.json();  | 
21 |  | -    if (reqUrl) {  | 
22 |  | -      url = reqUrl;  | 
23 |  | -      const SceneView = sceneViews[sceneViewKey].default;  | 
24 |  | -      view = <SceneView />;  | 
25 |  | -    } else {  | 
26 |  | -      let fluentNavigator = serverNavigator.fluent();  | 
27 |  | -      for (let i = 0; i < crumbs.length; i++) {  | 
28 |  | -        fluentNavigator = fluentNavigator.navigate(crumbs[i].state, crumbs[i].data);  | 
29 |  | -      }  | 
30 |  | -      fluentNavigator = fluentNavigator.navigate(state, data);  | 
31 |  | -      url = fluentNavigator.url;  | 
32 |  | -      const App = (await import('./App.tsx')).default;  | 
33 |  | -      view = <App url={url} />;  | 
 | 21 | +    const {url: reqUrl, sceneViewKey} = await request.json();  | 
 | 22 | +    url = reqUrl;  | 
 | 23 | +    const SceneView = sceneViews[sceneViewKey].default;  | 
 | 24 | +    view = <SceneView />;  | 
 | 25 | +  }  | 
 | 26 | +  if (request.method === 'PUT') {  | 
 | 27 | +    const {state, data, crumbs} = await request.json();  | 
 | 28 | +    let fluentNavigator = serverNavigator.fluent();  | 
 | 29 | +    for (let i = 0; i < crumbs.length; i++) {  | 
 | 30 | +      fluentNavigator = fluentNavigator.navigate(crumbs[i].state, crumbs[i].data);  | 
34 | 31 |     }  | 
 | 32 | +    fluentNavigator = fluentNavigator.navigate(state, data);  | 
 | 33 | +    url = fluentNavigator.url;  | 
 | 34 | +    const App = (await import('./App.tsx')).default;  | 
 | 35 | +    view = <App url={url} />;  | 
35 | 36 |   }  | 
36 | 37 |   try {  | 
37 |  | -    serverNavigator.navigateLink(url)  | 
 | 38 | +    serverNavigator.navigateLink(url);  | 
38 | 39 |   } catch(e) {  | 
39 | 40 |     return new Response('Not Found', { status: 404 });  | 
40 | 41 |   }  | 
41 |  | -  const { NavigationHandler } = await import('navigation-react');  | 
 | 42 | +  const {NavigationHandler} = await import('navigation-react');  | 
42 | 43 |   const root = (  | 
43 | 44 |     <>  | 
44 | 45 |       <NavigationHandler stateNavigator={serverNavigator}>  | 
45 | 46 |         {view}  | 
46 | 47 |       </NavigationHandler>  | 
47 | 48 |     </>  | 
48 | 49 |   );  | 
49 |  | -  return renderRequest(request, root);  | 
 | 50 | +  const rscStream = ReactServer.renderToReadableStream({root});  | 
 | 51 | +  if (request.method !== 'GET') {  | 
 | 52 | +    return new Response(rscStream, {headers: {'Content-type': 'text/x-component'}});  | 
 | 53 | +  }  | 
 | 54 | +  const ssrEntryModule = await import.meta.viteRsc.loadModule<typeof import('./server.ssr.tsx')>('ssr', 'index');  | 
 | 55 | +  const htmlStream = await ssrEntryModule.renderHTML(rscStream);  | 
 | 56 | +  return new Response(htmlStream, {headers: {'Content-type': 'text/html'}});  | 
50 | 57 | }  | 
51 | 58 | 
 
  | 
52 | 59 | if (import.meta.hot) {  | 
 | 
0 commit comments