vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
87 lines (85 loc) • 10.4 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { parentPort, workerData } from 'node:worker_threads';
import { messageHandler } from './messageHandler.server.js';
import { register } from 'tsx/esm/api';
import { createLogger } from 'vite';
import { handleError } from '../../error/handleError.js';
import { sendMessage } from '../sendMessage.js';
import { setMaxListenersOnPort, unrefPort } from '../../stream/setMaxListeners.js';
import { ModuleRunner, ESModulesEvaluator } from 'vite/module-runner';
import { createRunnerTransport } from './createRunnerTransport.js';
import { setRunner, setRpc } from './runnerInstance.js';
if (!parentPort) {
throw new Error("This module must be run as a worker");
}
const logger = createLogger(workerData.resolvedConfig?.logLevel ?? "info", {
prefix: "rsc-worker"
});
if (parentPort) {
setMaxListenersOnPort(parentPort, 500);
}
parentPort?.on("message", messageHandler);
try {
const isBuildMode = workerData.configEnv?.command === "build" || workerData.resolvedConfig?.mode === "production";
if (workerData.verbose) {
logger.info(
isBuildMode ? "Build mode detected - files are already built, skipping tsx hook" : "Development/dev server mode detected"
);
}
register();
parentPort.on("messageerror", (error) => {
logger.error("Parent port message serialization failed.", { error });
});
if (!isBuildMode && workerData.runnerPort) {
try {
setMaxListenersOnPort(workerData.runnerPort, 500);
unrefPort(workerData.runnerPort);
workerData.runnerPort.start();
const { transport, rpc } = createRunnerTransport(workerData.runnerPort);
const runner = new ModuleRunner(
{
transport,
hmr: false,
sourcemapInterceptor: false
},
new ESModulesEvaluator()
);
setRunner(runner);
setRpc(rpc);
if (workerData.verbose) {
logger.info("ModuleRunner initialized");
}
} catch (err) {
logger.error(`Failed to initialize ModuleRunner: ${String(err)}`);
}
}
parentPort.postMessage({
type: "READY",
env: process.env["NODE_ENV"],
pid: process.pid,
id: "worker/rsc"
});
if (process.env["NODE_ENV"] === "production") {
throw new Error("This module should not run in production mode.");
}
} catch (error) {
const handledError = handleError({
error,
logger,
panicThreshold: workerData.userOptions.panicThreshold});
if (parentPort && handledError != null) {
sendMessage(
{
type: "ERROR",
id: "worker/rsc",
error: handledError
},
parentPort
);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnNjLXdvcmtlci5kZXZlbG9wbWVudC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGx1Z2luL3dvcmtlci9yc2MvcnNjLXdvcmtlci5kZXZlbG9wbWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwYXJlbnRQb3J0LCB3b3JrZXJEYXRhIH0gZnJvbSBcIm5vZGU6d29ya2VyX3RocmVhZHNcIjtcbmltcG9ydCB7IG1lc3NhZ2VIYW5kbGVyIH0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXIuc2VydmVyLmpzXCI7XG5pbXBvcnQgeyByZWdpc3RlciBhcyByZWdpc3RlclRzeCB9IGZyb20gXCJ0c3gvZXNtL2FwaVwiO1xuaW1wb3J0IHR5cGUgeyBSZWFkeU1lc3NhZ2UgfSBmcm9tIFwiLi4vdHlwZXMuanNcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgeyBoYW5kbGVFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9oYW5kbGVFcnJvci5qc1wiO1xuaW1wb3J0IHsgc2VuZE1lc3NhZ2UgfSBmcm9tIFwiLi4vc2VuZE1lc3NhZ2UuanNcIjtcbmltcG9ydCB7IHNldE1heExpc3RlbmVyc09uUG9ydCwgdW5yZWZQb3J0IH0gZnJvbSBcIi4uLy4uL3N0cmVhbS9zZXRNYXhMaXN0ZW5lcnMuanNcIjtcbmltcG9ydCB7IE1vZHVsZVJ1bm5lciwgRVNNb2R1bGVzRXZhbHVhdG9yIH0gZnJvbSBcInZpdGUvbW9kdWxlLXJ1bm5lclwiO1xuaW1wb3J0IHsgY3JlYXRlUnVubmVyVHJhbnNwb3J0IH0gZnJvbSBcIi4vY3JlYXRlUnVubmVyVHJhbnNwb3J0LmpzXCI7XG5pbXBvcnQgeyBzZXRSdW5uZXIsIHNldFJwYyB9IGZyb20gXCIuL3J1bm5lckluc3RhbmNlLmpzXCI7XG5cbi8vIEluaXRpYWxpemUgd29ya2VyXG5pZiAoIXBhcmVudFBvcnQpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBtb2R1bGUgbXVzdCBiZSBydW4gYXMgYSB3b3JrZXJcIik7XG59XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcih3b3JrZXJEYXRhLnJlc29sdmVkQ29uZmlnPy5sb2dMZXZlbCA/PyBcImluZm9cIiwge1xuICBwcmVmaXg6IFwicnNjLXdvcmtlclwiLFxufSk7XG5cbi8vIHBhcmVudFBvcnQgaGFuZGxlcyBhbGwgbWVzc2FnZXMsIHNvIG5lZWRzIGEgaGlnaGVyIGxpbWl0XG5pZiAocGFyZW50UG9ydCkge1xuICBzZXRNYXhMaXN0ZW5lcnNPblBvcnQocGFyZW50UG9ydCwgNTAwKTtcbn1cblxucGFyZW50UG9ydD8ub24oXCJtZXNzYWdlXCIsIG1lc3NhZ2VIYW5kbGVyKTtcblxudHJ5IHtcbiAgY29uc3QgaXNCdWlsZE1vZGUgPVxuICAgIHdvcmtlckRhdGEuY29uZmlnRW52Py5jb21tYW5kID09PSBcImJ1aWxkXCIgfHxcbiAgICB3b3JrZXJEYXRhLnJlc29sdmVkQ29uZmlnPy5tb2RlID09PSBcInByb2R1Y3Rpb25cIjtcblxuICBpZiAod29ya2VyRGF0YS52ZXJib3NlKSB7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBpc0J1aWxkTW9kZVxuICAgICAgICA/IFwiQnVpbGQgbW9kZSBkZXRlY3RlZCAtIGZpbGVzIGFyZSBhbHJlYWR5IGJ1aWx0LCBza2lwcGluZyB0c3ggaG9va1wiXG4gICAgICAgIDogXCJEZXZlbG9wbWVudC9kZXYgc2VydmVyIG1vZGUgZGV0ZWN0ZWRcIlxuICAgICk7XG4gIH1cblxuICAvLyBLZWVwIHRoZSB0c3ggaG9vayBhcm91bmQgZm9yIHRoZSByYXJlIG5vbi1ydW5uZXIgaW1wb3J0IHBhdGggd2hlcmUgYVxuICAvLyBtb2R1bGUgdGhhdCBpc24ndCB0cmFuc2Zvcm1lZCBieSBWaXRlIChlLmcuIGEgdmVuZG9yZWQgZGVwZW5kZW5jeSB0aGF0XG4gIC8vIHNoaXBzIC50cyBzb3VyY2VzKSBzdGlsbCBuZWVkcyBUeXBlU2NyaXB0IHN0cmlwcGluZy4gUnVubmVyLWxvYWRlZFxuICAvLyBtb2R1bGVzIHJlY2VpdmUgY29kZSB0aGF0J3MgYWxyZWFkeSBiZWVuIHRocm91Z2ggVml0ZSdzIHRyYW5zZm9ybS5cbiAgcmVnaXN0ZXJUc3goKTtcblxuICBwYXJlbnRQb3J0IS5vbihcIm1lc3NhZ2VlcnJvclwiLCAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgbG9nZ2VyLmVycm9yKFwiUGFyZW50IHBvcnQgbWVzc2FnZSBzZXJpYWxpemF0aW9uIGZhaWxlZC5cIiwgeyBlcnJvciB9KTtcbiAgICAvLyBDYW4ndCBzZW5kIHZpYSBwYXJlbnRQb3J0IHNpbmNlIHRoYXQncyB3aGF0IGZhaWxlZCwgc28ganVzdCBsb2dcbiAgfSk7XG5cbiAgLy8gTW9kdWxlUnVubmVyLWJhc2VkIGZldGNoIHRyYW5zcG9ydCBmb3IgcHJvamVjdCBzb3VyY2UuIFJlcGxhY2VzIE5vZGUnc1xuICAvLyBuYXRpdmUgaW1wb3J0KCkgc28gZGV2OnNzciBpbnZhbGlkYXRlcyBwZXItbW9kdWxlIGluc3RlYWQgb2YgcmVzdGFydGluZ1xuICAvLyB0aGUgd29ya2VyIG9uIGV2ZXJ5IHNhdmUuXG4gIGlmICghaXNCdWlsZE1vZGUgJiYgd29ya2VyRGF0YS5ydW5uZXJQb3J0KSB7XG4gICAgdHJ5IHtcbiAgICAgIHNldE1heExpc3RlbmVyc09uUG9ydCh3b3JrZXJEYXRhLnJ1bm5lclBvcnQsIDUwMCk7XG4gICAgICB1bnJlZlBvcnQod29ya2VyRGF0YS5ydW5uZXJQb3J0KTtcbiAgICAgIHdvcmtlckRhdGEucnVubmVyUG9ydC5zdGFydCgpO1xuICAgICAgY29uc3QgeyB0cmFuc3BvcnQsIHJwYyB9ID0gY3JlYXRlUnVubmVyVHJhbnNwb3J0KHdvcmtlckRhdGEucnVubmVyUG9ydCk7XG4gICAgICBjb25zdCBydW5uZXIgPSBuZXcgTW9kdWxlUnVubmVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHJhbnNwb3J0LFxuICAgICAgICAgIGhtcjogZmFsc2UsXG4gICAgICAgICAgc291cmNlbWFwSW50ZXJjZXB0b3I6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBuZXcgRVNNb2R1bGVzRXZhbHVhdG9yKClcbiAgICAgICk7XG4gICAgICBzZXRSdW5uZXIocnVubmVyKTtcbiAgICAgIHNldFJwYyhycGMpO1xuICAgICAgaWYgKHdvcmtlckRhdGEudmVyYm9zZSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcIk1vZHVsZVJ1bm5lciBpbml0aWFsaXplZFwiKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgTW9kdWxlUnVubmVyOiAke1N0cmluZyhlcnIpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vdGlmeSBwYXJlbnQgdGhhdCB3ZSdyZSByZWFkeVxuICBwYXJlbnRQb3J0IS5wb3N0TWVzc2FnZSh7XG4gICAgdHlwZTogXCJSRUFEWVwiLFxuICAgIGVudjogcHJvY2Vzcy5lbnZbXCJOT0RFX0VOVlwiXSxcbiAgICBwaWQ6IHByb2Nlc3MucGlkLFxuICAgIGlkOiBcIndvcmtlci9yc2NcIixcbiAgfSBzYXRpc2ZpZXMgUmVhZHlNZXNzYWdlKTtcblxuICBpZiAocHJvY2Vzcy5lbnZbXCJOT0RFX0VOVlwiXSA9PT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG1vZHVsZSBzaG91bGQgbm90IHJ1biBpbiBwcm9kdWN0aW9uIG1vZGUuXCIpO1xuICB9XG59IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICBjb25zdCBoYW5kbGVkRXJyb3IgPSBoYW5kbGVFcnJvcih7XG4gICAgZXJyb3IsXG4gICAgbG9nZ2VyLFxuICAgIHBhbmljVGhyZXNob2xkOiB3b3JrZXJEYXRhLnVzZXJPcHRpb25zLnBhbmljVGhyZXNob2xkLFxuICAgIGNvbnRleHQ6IFwicnNjLXdvcmtlclwiLFxuICB9KTtcbiAgLy8gSW4gZGV2IG1vZGUsIHRyeSB0byBzZW5kIGVycm9yIG1lc3NhZ2UgYmVmb3JlIGV4aXRpbmdcbiAgaWYgKHBhcmVudFBvcnQgJiYgaGFuZGxlZEVycm9yICE9IG51bGwpIHtcbiAgICBzZW5kTWVzc2FnZShcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJFUlJPUlwiLFxuICAgICAgICBpZDogXCJ3b3JrZXIvcnNjXCIsXG4gICAgICAgIGVycm9yOiBoYW5kbGVkRXJyb3IsXG4gICAgICB9LFxuICAgICAgcGFyZW50UG9ydFxuICAgICk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJyZWdpc3RlclRzeCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQWFBLElBQUksQ0FBQyxVQUFZLEVBQUE7QUFDZixFQUFNLE1BQUEsSUFBSSxNQUFNLHFDQUFxQyxDQUFBO0FBQ3ZEO0FBRUEsTUFBTSxNQUFTLEdBQUEsWUFBQSxDQUFhLFVBQVcsQ0FBQSxjQUFBLEVBQWdCLFlBQVksTUFBUSxFQUFBO0FBQUEsRUFDekUsTUFBUSxFQUFBO0FBQ1YsQ0FBQyxDQUFBO0FBR0QsSUFBSSxVQUFZLEVBQUE7QUFDZCxFQUFBLHFCQUFBLENBQXNCLFlBQVksR0FBRyxDQUFBO0FBQ3ZDO0FBRUEsVUFBWSxFQUFBLEVBQUEsQ0FBRyxXQUFXLGNBQWMsQ0FBQTtBQUV4QyxJQUFJO0FBQ0YsRUFBQSxNQUFNLGNBQ0osVUFBVyxDQUFBLFNBQUEsRUFBVyxZQUFZLE9BQ2xDLElBQUEsVUFBQSxDQUFXLGdCQUFnQixJQUFTLEtBQUEsWUFBQTtBQUV0QyxFQUFBLElBQUksV0FBVyxPQUFTLEVBQUE7QUFDdEIsSUFBTyxNQUFBLENBQUEsSUFBQTtBQUFBLE1BQ0wsY0FDSSxrRUFDQSxHQUFBO0FBQUEsS0FDTjtBQUFBO0FBT0YsRUFBWUEsUUFBQSxFQUFBO0FBRVosRUFBWSxVQUFBLENBQUEsRUFBQSxDQUFHLGNBQWdCLEVBQUEsQ0FBQyxLQUFpQixLQUFBO0FBQy9DLElBQUEsTUFBQSxDQUFPLEtBQU0sQ0FBQSwyQ0FBQSxFQUE2QyxFQUFFLEtBQUEsRUFBTyxDQUFBO0FBQUEsR0FFcEUsQ0FBQTtBQUtELEVBQUksSUFBQSxDQUFDLFdBQWUsSUFBQSxVQUFBLENBQVcsVUFBWSxFQUFBO0FBQ3pDLElBQUksSUFBQTtBQUNGLE1BQXNCLHFCQUFBLENBQUEsVUFBQSxDQUFXLFlBQVksR0FBRyxDQUFBO0FBQ2hELE1BQUEsU0FBQSxDQUFVLFdBQVcsVUFBVSxDQUFBO0FBQy9CLE1BQUEsVUFBQSxDQUFXLFdBQVcsS0FBTSxFQUFBO0FBQzVCLE1BQUEsTUFBTSxFQUFFLFNBQVcsRUFBQSxHQUFBLEVBQVEsR0FBQSxxQkFBQSxDQUFzQixXQUFXLFVBQVUsQ0FBQTtBQUN0RSxNQUFBLE1BQU0sU0FBUyxJQUFJLFlBQUE7QUFBQSxRQUNqQjtBQUFBLFVBQ0UsU0FBQTtBQUFBLFVBQ0EsR0FBSyxFQUFBLEtBQUE7QUFBQSxVQUNMLG9CQUFzQixFQUFBO0FBQUEsU0FDeEI7QUFBQSxRQUNBLElBQUksa0JBQW1CO0FBQUEsT0FDekI7QUFDQSxNQUFBLFNBQUEsQ0FBVSxNQUFNLENBQUE7QUFDaEIsTUFBQSxNQUFBLENBQU8sR0FBRyxDQUFBO0FBQ1YsTUFBQSxJQUFJLFdBQVcsT0FBUyxFQUFBO0FBQ3RCLFFBQUEsTUFBQSxDQUFPLEtBQUssMEJBQTBCLENBQUE7QUFBQTtBQUN4QyxhQUNPLEdBQUssRUFBQTtBQUNaLE1BQUEsTUFBQSxDQUFPLEtBQU0sQ0FBQSxDQUFBLG1DQUFBLEVBQXNDLE1BQU8sQ0FBQSxHQUFHLENBQUMsQ0FBRSxDQUFBLENBQUE7QUFBQTtBQUNsRTtBQUlGLEVBQUEsVUFBQSxDQUFZLFdBQVksQ0FBQTtBQUFBLElBQ3RCLElBQU0sRUFBQSxPQUFBO0FBQUEsSUFDTixHQUFBLEVBQUssT0FBUSxDQUFBLEdBQUEsQ0FBSSxVQUFVLENBQUE7QUFBQSxJQUMzQixLQUFLLE9BQVEsQ0FBQSxHQUFBO0FBQUEsSUFDYixFQUFJLEVBQUE7QUFBQSxHQUNrQixDQUFBO0FBRXhCLEVBQUEsSUFBSSxPQUFRLENBQUEsR0FBQSxDQUFJLFVBQVUsQ0FBQSxLQUFNLFlBQWMsRUFBQTtBQUM1QyxJQUFNLE1BQUEsSUFBSSxNQUFNLGdEQUFnRCxDQUFBO0FBQUE7QUFFcEUsQ0FBQSxDQUFBLE9BQVMsS0FBZ0IsRUFBQTtBQUN2QixFQUFBLE1BQU0sZUFBZSxXQUFZLENBQUE7QUFBQSxJQUMvQixLQUFBO0FBQUEsSUFDQSxNQUFBO0FBQUEsSUFDQSxjQUFBLEVBQWdCLFdBQVcsV0FBWSxDQUFBLGNBRXpDLENBQUMsQ0FBQTtBQUVELEVBQUksSUFBQSxVQUFBLElBQWMsZ0JBQWdCLElBQU0sRUFBQTtBQUN0QyxJQUFBLFdBQUE7QUFBQSxNQUNFO0FBQUEsUUFDRSxJQUFNLEVBQUEsT0FBQTtBQUFBLFFBQ04sRUFBSSxFQUFBLFlBQUE7QUFBQSxRQUNKLEtBQU8sRUFBQTtBQUFBLE9BQ1Q7QUFBQSxNQUNBO0FBQUEsS0FDRjtBQUFBO0FBRUoifQ==