UNPKG

fully-react

Version:
121 lines (120 loc) 3.33 kB
// src/rsc-worker.ts import { build, createServer } from "vite"; import { existsSync, readFileSync } from "node:fs"; import { fileURLToPath } from "node:url"; import { join } from "node:path"; import { parentPort } from "node:worker_threads"; var server; parentPort?.addListener("message", handleMessage); parentPort?.postMessage("ready"); async function handleMessage(msg) { const event = JSON.parse(msg); if (event.type === "render") { let streamToMessageChannel2 = function(stream, onMessage) { const forwardReader = stream.getReader(); const textDecoder = new TextDecoder(); function read() { forwardReader.read().then(({ done, value }) => { if (done) { onMessage("end"); } else { onMessage(textDecoder.decode(value)); read(); } }); } read(); }; var streamToMessageChannel = streamToMessageChannel2; if (!server) { server = await createServer({ optimizeDeps: { // It's recommended to disable deps optimization disabled: true }, plugins: [ { name: "fully-react-hmr", handleHotUpdate(ctx) { console.log(ctx); parentPort?.postMessage(JSON.stringify({ type: "reload" })); } } ] }); await server.pluginContainer.buildStart({}); } const { default: entry } = await server.ssrLoadModule( fileURLToPath(new URL("./entry-rsc.development.js", import.meta.url)) ); try { const stream = await entry(event.src, event.props); streamToMessageChannel2(stream, (msg2) => { parentPort?.postMessage(JSON.stringify({ chunk: msg2, id: event.id })); }); } catch (e) { console.error(e); } } else if (event.type === "build") { await build({ build: { ssr: true, target: "node18", manifest: true, ssrManifest: true, minify: process.env.MINIFY === "true", rollupOptions: { treeshake: true, external: [ "node:path", "node:fs", "node:async_hooks", "node:url", "@prisma/client", "@auth/core", "fs", "path", "url" ] } }, resolve: { conditions: ["node", "import", "react-server", "production"] }, ssr: { noExternal: true } }); const root = process.cwd(); let clientModules = []; let serverModules = []; if (existsSync(join(root, "dist", "react-server", "client-manifest.json"))) { clientModules = JSON.parse( readFileSync( join(root, "dist", "react-server", "client-manifest.json"), { encoding: "utf8" } ) ); } if (existsSync(join(root, "dist", "react-server", "server-manifest.json"))) { serverModules = JSON.parse( readFileSync( join(root, "dist", "react-server", "server-manifest.json"), { encoding: "utf8" } ) ); } parentPort?.postMessage( JSON.stringify({ id: event.id, status: "built", clientModules, serverModules }) ); } }