1. import * as React from 'react';
    
  2. import {use, Suspense, useState, startTransition} from 'react';
    
  3. import ReactDOM from 'react-dom/client';
    
  4. import {createFromFetch, encodeReply} from 'react-server-dom-esm/client';
    
  5. 
    
  6. const moduleBaseURL = '/src/';
    
  7. let updateRoot;
    
  8. async function callServer(id, args) {
    
  9.   const response = fetch('/', {
    
  10.     method: 'POST',
    
  11.     headers: {
    
  12.       Accept: 'text/x-component',
    
  13.       'rsc-action': id,
    
  14.     },
    
  15.     body: await encodeReply(args),
    
  16.   });
    
  17.   const {returnValue, root} = await createFromFetch(response, {
    
  18.     callServer,
    
  19.     moduleBaseURL,
    
  20.   });
    
  21.   // Refresh the tree with the new RSC payload.
    
  22.   startTransition(() => {
    
  23.     updateRoot(root);
    
  24.   });
    
  25.   return returnValue;
    
  26. }
    
  27. 
    
  28. let data = createFromFetch(
    
  29.   fetch('/', {
    
  30.     headers: {
    
  31.       Accept: 'text/x-component',
    
  32.     },
    
  33.   }),
    
  34.   {
    
  35.     callServer,
    
  36.     moduleBaseURL,
    
  37.   }
    
  38. );
    
  39. 
    
  40. function Shell({data}) {
    
  41.   const [root, setRoot] = useState(use(data));
    
  42.   updateRoot = setRoot;
    
  43.   return root;
    
  44. }
    
  45. 
    
  46. ReactDOM.hydrateRoot(document, React.createElement(Shell, {data}));