vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
78 lines (75 loc) • 9.24 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { configureRequestHandler } from './configureRequestHandler.client.js';
import { MessageChannel } from 'node:worker_threads';
import { setMaxListenersOnPort, unrefPort } from '../stream/setMaxListeners.js';
const configureReactServer = function _createReactWorkerServer({
server,
autoDiscoveredFiles,
userOptions,
configEnv,
hmrChannel,
onWorkerCreated,
serverManifest,
resolvedConfig
}) {
const logger = server.config.customLogger || server.config.logger;
const verbose = userOptions.verbose || false;
if (verbose) {
logger?.info(
`[createReactWorkerServer] Configuring worker-based rendering`
);
}
server.ws.on("restart", async () => {
logger?.info(
"[createReactWorkerServer] Server restarting, shutting down worker..."
);
});
let currentWorker = null;
const effectiveHmrChannel = (() => {
const channel = hmrChannel || new MessageChannel();
const initialMaxListeners = 500;
setMaxListenersOnPort(channel.port1, initialMaxListeners);
setMaxListenersOnPort(channel.port2, initialMaxListeners);
unrefPort(channel.port1);
unrefPort(channel.port2);
return channel;
})();
configureRequestHandler({
server,
autoDiscoveredFiles,
userOptions,
configEnv,
hmrChannel: effectiveHmrChannel,
serverManifest,
resolvedConfig,
onWorkerCreated: (worker, restart) => {
currentWorker = worker;
if (onWorkerCreated) {
onWorkerCreated(worker, restart);
}
}
});
return {
sendHmrUpdate: (file, routes) => {
if (currentWorker) {
const normalizedPath = file.replace(userOptions.projectRoot || server.config.root, "").replace(/^\/+/, "");
currentWorker.postMessage({
type: "HMR_UPDATE",
id: normalizedPath,
path: file,
routes: routes || [],
timestamp: Date.now()
});
if (verbose) {
logger?.info(`[createReactWorkerServer] Sent HMR_UPDATE for ${file} to worker`);
}
}
}
};
};
export { configureReactServer };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJlUmVhY3RTZXJ2ZXIuY2xpZW50LmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW4vZGV2LXNlcnZlci9jb25maWd1cmVSZWFjdFNlcnZlci5jbGllbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29uZmlndXJlUmVxdWVzdEhhbmRsZXIgfSBmcm9tIFwiLi9jb25maWd1cmVSZXF1ZXN0SGFuZGxlci5jbGllbnQuanNcIjtcbmltcG9ydCB7IE1lc3NhZ2VDaGFubmVsIH0gZnJvbSBcIm5vZGU6d29ya2VyX3RocmVhZHNcIjtcbmltcG9ydCB0eXBlIHsgQ3JlYXRlUmVhY3RXb3JrZXJTZXJ2ZXJGbiB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBzZXRNYXhMaXN0ZW5lcnNPblBvcnQsIHVucmVmUG9ydCB9IGZyb20gXCIuLi9zdHJlYW0vc2V0TWF4TGlzdGVuZXJzLmpzXCI7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgUmVhY3QgV29ya2VyIFNlcnZlciB0aGF0IGNvbmZpZ3VyZXMgd29ya2VyLWJhc2VkIHJlbmRlcmluZ1xuICogU2V0cyB1cCBtaWRkbGV3YXJlLCBITVIsIGFuZCB3b3JrZXIgbWFuYWdlbWVudCBsaWtlIHJlYWN0LWNsaWVudC9wbHVnaW4uY2xpZW50LnRzXG4gKi9cbmV4cG9ydCBjb25zdCBjb25maWd1cmVSZWFjdFNlcnZlcjogQ3JlYXRlUmVhY3RXb3JrZXJTZXJ2ZXJGbiA9XG4gIGZ1bmN0aW9uIF9jcmVhdGVSZWFjdFdvcmtlclNlcnZlcih7XG4gICAgc2VydmVyLFxuICAgIGF1dG9EaXNjb3ZlcmVkRmlsZXMsXG4gICAgdXNlck9wdGlvbnMsXG4gICAgY29uZmlnRW52LFxuICAgIGhtckNoYW5uZWwsXG4gICAgb25Xb3JrZXJDcmVhdGVkLFxuICAgIHNlcnZlck1hbmlmZXN0LFxuICAgIHJlc29sdmVkQ29uZmlnLFxuICB9KSB7XG4gICAgY29uc3QgbG9nZ2VyID0gc2VydmVyLmNvbmZpZy5jdXN0b21Mb2dnZXIgfHwgc2VydmVyLmNvbmZpZy5sb2dnZXI7XG4gICAgY29uc3QgdmVyYm9zZSA9IHVzZXJPcHRpb25zLnZlcmJvc2UgfHwgZmFsc2U7XG5cbiAgICBpZiAodmVyYm9zZSkge1xuICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICBgW2NyZWF0ZVJlYWN0V29ya2VyU2VydmVyXSBDb25maWd1cmluZyB3b3JrZXItYmFzZWQgcmVuZGVyaW5nYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgcmVzdGFydCBsaXN0ZW5lciBmb3Igd29ya2VyIGNsZWFudXBcbiAgICBzZXJ2ZXIud3Mub24oXCJyZXN0YXJ0XCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgXCJbY3JlYXRlUmVhY3RXb3JrZXJTZXJ2ZXJdIFNlcnZlciByZXN0YXJ0aW5nLCBzaHV0dGluZyBkb3duIHdvcmtlci4uLlwiXG4gICAgICApO1xuICAgICAgLy8gV29ya2VyIGNsZWFudXAgd291bGQgYmUgaGFuZGxlZCBieSB0aGUgd29ya2VyIG1hbmFnZW1lbnRcbiAgICB9KTtcblxuICAgIGxldCBjdXJyZW50V29ya2VyOiBhbnkgPSBudWxsO1xuXG4gICAgLy8gQ29uZmlndXJlIHRoZSB3b3JrZXIgcmVxdWVzdCBoYW5kbGVyIChzZXRzIHVwIG1pZGRsZXdhcmUpXG4gICAgY29uc3QgZWZmZWN0aXZlSG1yQ2hhbm5lbCA9ICgoKSA9PiB7XG4gICAgICBjb25zdCBjaGFubmVsID0gaG1yQ2hhbm5lbCB8fCBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgIC8vIEluY3JlYXNlIG1heCBsaXN0ZW5lcnMgdG8gcHJldmVudCB3YXJuaW5ncyBkdXJpbmcgZGV2ZWxvcG1lbnRcbiAgICAgIC8vIFRoaXMgaXMgYSB0YXJnZXRlZCBmaXggZm9yIHRoZSBtZW1vcnkgbGVhayB3YXJuaW5nc1xuICAgICAgLy8gV2UgbmVlZCB0byBzZXQgdGhpcyBvbiBCT1RIIHBvcnRzIGJlY2F1c2UgbGlzdGVuZXJzIGNhbiBiZSBhZGRlZCB0byBlaXRoZXIgc2lkZVxuICAgICAgLy8gVXNlIGEgaGlnaCBkZWZhdWx0ICg1MDApIHRvIGFjY29tbW9kYXRlIGxhcmdlIHByb2plY3RzIHdpdGggbWFueSByb3V0ZXNcbiAgICAgIC8vIHJlc3RhcnRXb3JrZXIgd2lsbCBhZGp1c3QgdGhpcyBiYXNlZCBvbiBhY3R1YWwgcm91dGUgY291bnRcbiAgICAgIGNvbnN0IGluaXRpYWxNYXhMaXN0ZW5lcnMgPSA1MDA7XG4gICAgICBzZXRNYXhMaXN0ZW5lcnNPblBvcnQoY2hhbm5lbC5wb3J0MSwgaW5pdGlhbE1heExpc3RlbmVycyk7XG4gICAgICBzZXRNYXhMaXN0ZW5lcnNPblBvcnQoY2hhbm5lbC5wb3J0MiwgaW5pdGlhbE1heExpc3RlbmVycyk7XG4gICAgICB1bnJlZlBvcnQoY2hhbm5lbC5wb3J0MSk7XG4gICAgICB1bnJlZlBvcnQoY2hhbm5lbC5wb3J0Mik7XG4gICAgICByZXR1cm4gY2hhbm5lbDtcbiAgICB9KSgpO1xuXG4gICAgY29uZmlndXJlUmVxdWVzdEhhbmRsZXIoe1xuICAgICAgc2VydmVyLFxuICAgICAgYXV0b0Rpc2NvdmVyZWRGaWxlcyxcbiAgICAgIHVzZXJPcHRpb25zLFxuICAgICAgY29uZmlnRW52LFxuICAgICAgaG1yQ2hhbm5lbDogZWZmZWN0aXZlSG1yQ2hhbm5lbCxcbiAgICAgIHNlcnZlck1hbmlmZXN0LFxuICAgICAgcmVzb2x2ZWRDb25maWcsXG4gICAgICBvbldvcmtlckNyZWF0ZWQ6ICh3b3JrZXI6IGFueSwgcmVzdGFydD86ICgpID0+IFByb21pc2U8dm9pZD4pID0+IHtcbiAgICAgICAgY3VycmVudFdvcmtlciA9IHdvcmtlcjtcbiAgICAgICAgaWYgKG9uV29ya2VyQ3JlYXRlZCkge1xuICAgICAgICAgIG9uV29ya2VyQ3JlYXRlZCh3b3JrZXIsIHJlc3RhcnQpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbmRIbXJVcGRhdGU6IChmaWxlOiBzdHJpbmcsIHJvdXRlcz86IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgIGlmIChjdXJyZW50V29ya2VyKSB7XG4gICAgICAgICAgLy8gTm90aWZ5IHRoZSB3b3JrZXIgdGhhdCBhIGZpbGUgY2hhbmdlZC4gVGhlIHdvcmtlcidzIEhNUl9VUERBVEVcbiAgICAgICAgICAvLyBoYW5kbGVyIGludmFsaWRhdGVzIHRoZSBNb2R1bGVSdW5uZXIgY2FjaGUgc28gdGhlIG5leHQgaW1wb3J0XG4gICAgICAgICAgLy8gcmUtZmV0Y2hlcyB0cmFuc2Zvcm1lZCBjb2RlIHRocm91Z2ggVml0ZSdzIHBpcGVsaW5lLlxuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gZmlsZS5yZXBsYWNlKHVzZXJPcHRpb25zLnByb2plY3RSb290IHx8IHNlcnZlci5jb25maWcucm9vdCwgJycpLnJlcGxhY2UoL15cXC8rLywgJycpO1xuICAgICAgICAgIGN1cnJlbnRXb3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdHlwZTogXCJITVJfVVBEQVRFXCIsXG4gICAgICAgICAgICBpZDogbm9ybWFsaXplZFBhdGgsXG4gICAgICAgICAgICBwYXRoOiBmaWxlLFxuICAgICAgICAgICAgcm91dGVzOiByb3V0ZXMgfHwgW10sXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgfSBzYXRpc2ZpZXMgYW55KTtcblxuICAgICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICBsb2dnZXI/LmluZm8oYFtjcmVhdGVSZWFjdFdvcmtlclNlcnZlcl0gU2VudCBITVJfVVBEQVRFIGZvciAke2ZpbGV9IHRvIHdvcmtlcmApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVVhLE1BQUEsb0JBQUEsR0FDWCxTQUFTLHdCQUF5QixDQUFB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