{"slug":"server","title":"Server & streaming","headings":["SSR","Hydration","Streaming","Out-of-order slots","Server functions (rpc)"],"contentHtml":"<h1 id=\"server-streaming\">Server &amp; streaming</h1><h2 id=\"ssr\">SSR</h2><pre class=\"shiki github-dark\" style=\"background-color:#17171d;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#F97583\">import</span><span style=\"color:#E1E4E8\"> { createApp, renderToString } </span><span style=\"color:#F97583\">from</span><span style=\"color:#9ECBFF\"> \"ruri/server\"</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">import</span><span style=\"color:#E1E4E8\"> { App } </span><span style=\"color:#F97583\">from</span><span style=\"color:#9ECBFF\"> \"./app.js\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#B392F0\">createApp</span><span style=\"color:#E1E4E8\">()</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    .</span><span style=\"color:#B392F0\">get</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"/\"</span><span style=\"color:#E1E4E8\">, (</span><span style=\"color:#FFAB70\">context</span><span style=\"color:#E1E4E8\">) </span><span style=\"color:#F97583\">=></span><span style=\"color:#E1E4E8\"> context.</span><span style=\"color:#B392F0\">html</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#B392F0\">renderToString</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#B392F0\">App</span><span style=\"color:#E1E4E8\">())))</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    .</span><span style=\"color:#B392F0\">static</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#F97583\">new</span><span style=\"color:#B392F0\"> URL</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"./public\"</span><span style=\"color:#E1E4E8\">, </span><span style=\"color:#F97583\">import</span><span style=\"color:#E1E4E8\">.</span><span style=\"color:#79B8FF\">meta</span><span style=\"color:#E1E4E8\">.url))</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    .</span><span style=\"color:#B392F0\">listen</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#79B8FF\">3000</span><span style=\"color:#E1E4E8\">)</span></span></code></pre><h2 id=\"hydration\">Hydration</h2><pre class=\"shiki github-dark\" style=\"background-color:#17171d;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#F97583\">import</span><span style=\"color:#E1E4E8\"> { hydrate } </span><span style=\"color:#F97583\">from</span><span style=\"color:#9ECBFF\"> \"ruri\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#B392F0\">hydrate</span><span style=\"color:#E1E4E8\">(document.</span><span style=\"color:#B392F0\">getElementById</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"app\"</span><span style=\"color:#E1E4E8\">), App)</span></span></code></pre><p>Hydration replays the component against the server-rendered DOM: matching nodes are adopted in place, handlers attached and signals bound to the existing text nodes. Mismatches fall back to a full client render.</p><h2 id=\"streaming\">Streaming</h2><pre class=\"shiki github-dark\" style=\"background-color:#17171d;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#F97583\">import</span><span style=\"color:#E1E4E8\"> { renderToStream } </span><span style=\"color:#F97583\">from</span><span style=\"color:#9ECBFF\"> \"ruri/server\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#F97583\">new</span><span style=\"color:#B392F0\"> Response</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#B392F0\">renderToStream</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#B392F0\">App</span><span style=\"color:#E1E4E8\">()))</span></span></code></pre><h2 id=\"out-of-order-slots\">Out-of-order slots</h2><pre class=\"shiki github-dark\" style=\"background-color:#17171d;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#F97583\">import</span><span style=\"color:#E1E4E8\"> { createSlot, slotPlaceholder, streamSlots } </span><span style=\"color:#F97583\">from</span><span style=\"color:#9ECBFF\"> \"ruri/server\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#F97583\">const</span><span style=\"color:#79B8FF\"> panel</span><span style=\"color:#F97583\"> =</span><span style=\"color:#B392F0\"> createSlot</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#B392F0\">renderUserPanelLater</span><span style=\"color:#E1E4E8\">())</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">return</span><span style=\"color:#B392F0\"> streamSlots</span><span style=\"color:#E1E4E8\">({</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  shell: </span><span style=\"color:#9ECBFF\">`&#x3C;body>${</span><span style=\"color:#B392F0\">slotPlaceholder</span><span style=\"color:#9ECBFF\">(</span><span style=\"color:#E1E4E8\">panel</span><span style=\"color:#9ECBFF\">)</span><span style=\"color:#9ECBFF\">}&#x3C;/body>`</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  slots: [panel],</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">})</span></span></code></pre><h2 id=\"server-functions-rpc\">Server functions (rpc)</h2><pre class=\"shiki github-dark\" style=\"background-color:#17171d;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#E1E4E8\">app.</span><span style=\"color:#B392F0\">rpc</span><span style=\"color:#E1E4E8\">({ </span><span style=\"color:#F97583\">async</span><span style=\"color:#B392F0\"> addTodo</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#FFAB70\">text</span><span style=\"color:#E1E4E8\">) { </span><span style=\"color:#6A737D\">/* ... */</span><span style=\"color:#E1E4E8\"> } })</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#6A737D\">// client</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">import</span><span style=\"color:#E1E4E8\"> { rpc } </span><span style=\"color:#F97583\">from</span><span style=\"color:#9ECBFF\"> \"ruri\"</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">const</span><span style=\"color:#79B8FF\"> todo</span><span style=\"color:#F97583\"> =</span><span style=\"color:#F97583\"> await</span><span style=\"color:#B392F0\"> rpc</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"addTodo\"</span><span style=\"color:#E1E4E8\">, </span><span style=\"color:#9ECBFF\">\"write docs\"</span><span style=\"color:#E1E4E8\">)</span></span></code></pre>"}