vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
86 lines (83 loc) • 11.6 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { cleanupServerAction } from '../dev-server/cleanupServerAction.client.js';
import { toError } from '../error/toError.js';
import { logError } from '../error/logError.js';
import { PassThrough } from 'node:stream';
import { parseServerActionRequestBody, setupServerActionHeaders, createServerActionResponse } from './handleServerActionHelper.js';
export { parseServerActionRequest } from './handleServerActionHelper.js';
function createServerActionStream(res) {
const passThrough = new PassThrough();
passThrough.pipe(res, { end: true });
passThrough.on("end", () => {
res.end();
});
return passThrough;
}
function handleServerActionError(error, res, logger) {
const err = toError(error);
logError(err, logger);
res.statusCode = 500;
res.end(JSON.stringify(createServerActionResponse(void 0, err.message)));
}
async function handleServerAction(req, res, options) {
if (!options.worker) {
throw new Error("Worker is required for client-side server actions");
}
let messageHandler = null;
const passThrough = createServerActionStream(res);
try {
const chunks = [];
for await (const chunk of req) {
chunks.push(chunk);
}
const body = Buffer.concat(chunks).toString();
const { id, args } = parseServerActionRequestBody(body, req.url);
setupServerActionHeaders(res);
options.worker.postMessage({
type: "SERVER_ACTION",
id,
args
});
messageHandler = (message) => {
if (message.type === "RSC_CHUNK") {
passThrough.write(message.chunk);
} else if (message.type === "RSC_END") {
if (messageHandler) {
cleanupServerAction(passThrough, options.worker, messageHandler, res);
}
} else if (message.type === "ERROR") {
if (messageHandler) {
cleanupServerAction(
passThrough,
options.worker,
messageHandler,
res,
message.error,
options.logger
);
}
}
};
options.worker.on("message", messageHandler);
passThrough.on("error", (error) => {
if (messageHandler) {
cleanupServerAction(
passThrough,
options.worker,
messageHandler,
res,
error,
options.logger
);
}
});
} catch (error) {
handleServerActionError(error, res, options.logger);
}
}
export { createServerActionResponse, createServerActionStream, handleServerAction, handleServerActionError, parseServerActionRequestBody, setupServerActionHeaders };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlU2VydmVyQWN0aW9uLmNsaWVudC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL2hlbHBlcnMvaGFuZGxlU2VydmVyQWN0aW9uLmNsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgdHlwZSB7IEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2UgfSBmcm9tIFwibm9kZTpodHRwXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlciB9IGZyb20gXCJub2RlOndvcmtlcl90aHJlYWRzXCI7XG5pbXBvcnQgdHlwZSB7IFJzY1dvcmtlcklucHV0TWVzc2FnZSB9IGZyb20gXCIuLi93b3JrZXIvcnNjL3R5cGVzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBjbGVhbnVwU2VydmVyQWN0aW9uIH0gZnJvbSBcIi4uL2Rldi1zZXJ2ZXIvY2xlYW51cFNlcnZlckFjdGlvbi5jbGllbnQuanNcIjtcbmltcG9ydCB7IGxvZ0Vycm9yLCB0b0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9yL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBQYXNzVGhyb3VnaCB9IGZyb20gXCJub2RlOnN0cmVhbVwiO1xuaW1wb3J0IHR5cGUge1xuICBTZXJ2ZXJBY3Rpb25IYW5kbGVyT3B0aW9ucyxcbn0gZnJvbSBcIi4vaGFuZGxlU2VydmVyQWN0aW9uSGVscGVyLmpzXCI7XG5pbXBvcnQgeyBwYXJzZVNlcnZlckFjdGlvblJlcXVlc3RCb2R5LCBjcmVhdGVTZXJ2ZXJBY3Rpb25SZXNwb25zZSwgc2V0dXBTZXJ2ZXJBY3Rpb25IZWFkZXJzIH0gZnJvbSBcIi4vaGFuZGxlU2VydmVyQWN0aW9uSGVscGVyLmpzXCI7XG5cbi8vIFVzZSBzaGFyZWQgaGVscGVyIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgbG9naWNcblxuLy8gVXNlIHNoYXJlZCBoZWxwZXIgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBsb2dpY1xuXG4vKipcbiAqIENyZWF0ZXMgYSBwYXNzLXRocm91Z2ggc3RyZWFtIGZvciBzZXJ2ZXIgYWN0aW9uIHJlc3BvbnNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlcnZlckFjdGlvblN0cmVhbShyZXM6IFNlcnZlclJlc3BvbnNlKTogUGFzc1Rocm91Z2gge1xuICBjb25zdCBwYXNzVGhyb3VnaCA9IG5ldyBQYXNzVGhyb3VnaCgpO1xuICBwYXNzVGhyb3VnaC5waXBlKHJlcywgeyBlbmQ6IHRydWUgfSk7XG4gIHBhc3NUaHJvdWdoLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgcmVzLmVuZCgpO1xuICB9KTtcbiAgcmV0dXJuIHBhc3NUaHJvdWdoO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgZXJyb3JzIGluIHNlcnZlciBhY3Rpb24gcHJvY2Vzc2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVNlcnZlckFjdGlvbkVycm9yKGVycm9yOiB1bmtub3duLCByZXM6IFNlcnZlclJlc3BvbnNlLCBsb2dnZXI/OiBMb2dnZXIpIHtcbiAgY29uc3QgZXJyID0gdG9FcnJvcihlcnJvcik7XG4gIGxvZ0Vycm9yKGVyciwgbG9nZ2VyKTtcbiAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XG4gIHJlcy5lbmQoSlNPTi5zdHJpbmdpZnkoY3JlYXRlU2VydmVyQWN0aW9uUmVzcG9uc2UodW5kZWZpbmVkLCBlcnIubWVzc2FnZSkpKTtcbn1cblxuLyoqXG4gKiBDbGllbnQtc2lkZSBzZXJ2ZXIgYWN0aW9uIGhhbmRsZXIgdGhhdCBkZWxlZ2F0ZXMgdG8gd29ya2VyXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVTZXJ2ZXJBY3Rpb24oXG4gIHJlcTogSW5jb21pbmdNZXNzYWdlLFxuICByZXM6IFNlcnZlclJlc3BvbnNlLFxuICBvcHRpb25zOiBTZXJ2ZXJBY3Rpb25IYW5kbGVyT3B0aW9ucyAmIHsgd29ya2VyPzogV29ya2VyIH1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW9wdGlvbnMud29ya2VyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiV29ya2VyIGlzIHJlcXVpcmVkIGZvciBjbGllbnQtc2lkZSBzZXJ2ZXIgYWN0aW9uc1wiKTtcbiAgfVxuXG4gIGxldCBtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXI8YW55PiB8IG51bGwgPSBudWxsO1xuICBjb25zdCBwYXNzVGhyb3VnaCA9IGNyZWF0ZVNlcnZlckFjdGlvblN0cmVhbShyZXMpO1xuXG4gIHRyeSB7XG4gICAgLy8gUmVhZCByZXF1ZXN0IGJvZHlcbiAgICBjb25zdCBjaHVua3M6IEJ1ZmZlcltdID0gW107XG4gICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiByZXEpIHtcbiAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IEJ1ZmZlci5jb25jYXQoY2h1bmtzKS50b1N0cmluZygpO1xuXG4gICAgLy8gUGFyc2UgdGhlIHNlcnZlciBhY3Rpb24gcmVxdWVzdFxuICAgIGNvbnN0IHsgaWQsIGFyZ3MgfSA9IHBhcnNlU2VydmVyQWN0aW9uUmVxdWVzdEJvZHkoYm9keSwgcmVxLnVybCk7XG5cbiAgICAvLyBTZXQgdXAgcmVzcG9uc2UgaGVhZGVyc1xuICAgIHNldHVwU2VydmVyQWN0aW9uSGVhZGVycyhyZXMpO1xuXG4gICAgLy8gU2VuZCBzZXJ2ZXIgYWN0aW9uIHJlcXVlc3QgdG8gd29ya2VyXG4gICAgb3B0aW9ucy53b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJTRVJWRVJfQUNUSU9OXCIsXG4gICAgICBpZCxcbiAgICAgIGFyZ3MsXG4gICAgfSBzYXRpc2ZpZXMgUnNjV29ya2VySW5wdXRNZXNzYWdlKTtcblxuICAgIC8vIEhhbmRsZSB3b3JrZXIgbWVzc2FnZXNcbiAgICBtZXNzYWdlSGFuZGxlciA9IChtZXNzYWdlOiBhbnkpID0+IHtcbiAgICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiUlNDX0NIVU5LXCIpIHtcbiAgICAgICAgcGFzc1Rocm91Z2gud3JpdGUobWVzc2FnZS5jaHVuayk7XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJSU0NfRU5EXCIpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgY2xlYW51cFNlcnZlckFjdGlvbihwYXNzVGhyb3VnaCwgb3B0aW9ucy53b3JrZXIhLCBtZXNzYWdlSGFuZGxlciwgcmVzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiRVJST1JcIikge1xuICAgICAgICBpZiAobWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICBjbGVhbnVwU2VydmVyQWN0aW9uKFxuICAgICAgICAgICAgcGFzc1Rocm91Z2gsXG4gICAgICAgICAgICBvcHRpb25zLndvcmtlciEsXG4gICAgICAgICAgICBtZXNzYWdlSGFuZGxlcixcbiAgICAgICAgICAgIHJlcyxcbiAgICAgICAgICAgIG1lc3NhZ2UuZXJyb3IsXG4gICAgICAgICAgICBvcHRpb25zLmxvZ2dlclxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgb3B0aW9ucy53b3JrZXIub24oXCJtZXNzYWdlXCIsIG1lc3NhZ2VIYW5kbGVyKTtcblxuICAgIC8vIEhhbmRsZSBlcnJvcnNcbiAgICBwYXNzVGhyb3VnaC5vbihcImVycm9yXCIsIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgaWYgKG1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgIGNsZWFudXBTZXJ2ZXJBY3Rpb24oXG4gICAgICAgICAgcGFzc1Rocm91Z2gsXG4gICAgICAgICAgb3B0aW9ucy53b3JrZXIhLFxuICAgICAgICAgIG1lc3NhZ2VIYW5kbGVyLFxuICAgICAgICAgIHJlcyxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICBvcHRpb25zLmxvZ2dlclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGhhbmRsZVNlcnZlckFjdGlvbkVycm9yKGVycm9yLCByZXMsIG9wdGlvbnMubG9nZ2VyKTtcbiAgfVxufVxuXG4vKipcbiAqIENsaWVudC1zaWRlIFZpdGVEZXZTZXJ2ZXItc3BlY2lmaWMgaGFuZGxlciB0aGF0IGRlbGVnYXRlcyB0byB3b3JrZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVNlcnZlckFjdGlvbldpdGhWaXRlU2VydmVyKFxuICByZXE6IEluY29taW5nTWVzc2FnZSxcbiAgcmVzOiBTZXJ2ZXJSZXNwb25zZSxcbiAgc2VydmVyOiBhbnksXG4gIGhhbmRsZXJPcHRpb25zOiB7XG4gICAgdmVyYm9zZT86IGJvb2xlYW47XG4gICAgcHJvamVjdFJvb3Q6IHN0cmluZztcbiAgICB3b3JrZXI/OiBXb3JrZXI7XG4gIH1cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gaGFuZGxlU2VydmVyQWN0aW9uKHJlcSwgcmVzLCB7XG4gICAgcHJvamVjdFJvb3Q6IGhhbmRsZXJPcHRpb25zLnByb2plY3RSb290LFxuICAgIHZlcmJvc2U6IGhhbmRsZXJPcHRpb25zLnZlcmJvc2UsXG4gICAgbG9nZ2VyOiBzZXJ2ZXIuY29uZmlnLmN1c3RvbUxvZ2dlciB8fCBzZXJ2ZXIuY29uZmlnLmxvZ2dlcixcbiAgICB3b3JrZXI6IGhhbmRsZXJPcHRpb25zLndvcmtlcixcbiAgfSk7XG59XG5cbi8vIFJlLWV4cG9ydCBoZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgZW50cnkgcG9pbnRcbmV4cG9ydCB7IFxuICBwYXJzZVNlcnZlckFjdGlvblJlcXVlc3QsXG4gIHBhcnNlU2VydmVyQWN0aW9uUmVxdWVzdEJvZHksXG4gIGNyZWF0ZVNlcnZlckFjdGlvblJlc3BvbnNlLCBcbiAgc2V0dXBTZXJ2ZXJBY3Rpb25IZWFkZXJzIFxufSBmcm9tIFwiLi9oYW5kbGVTZXJ2ZXJBY3Rpb25IZWxwZXIuanNcIjsgXG5leHBvcnQgdHlwZSB7IFNlcnZlckFjdGlvblJlcXVlc3QsIFNlcnZlckFjdGlvbkhhbmRsZXJPcHRpb25zIH0gZnJvbSBcIi4vaGFuZGxlU2VydmVyQWN0aW9uSGVscGVyLmpzXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBb0JPLFNBQVMseUJBQXlCLEdBQWtDLEVBQUE7QUFDekUsRUFBTSxNQUFBLFdBQUEsR0FBYyxJQUFJLFdBQVksRUFBQTtBQUNwQyxFQUFBLFdBQUEsQ0FBWSxJQUFLLENBQUEsR0FBQSxFQUFLLEVBQUUsR0FBQSxFQUFLLE1BQU0sQ0FBQTtBQUNuQyxFQUFZLFdBQUEsQ0FBQSxFQUFBLENBQUcsT0FBTyxNQUFNO0FBQzFCLElBQUEsR0FBQSxDQUFJLEdBQUksRUFBQTtBQUFBLEdBQ1QsQ0FBQTtBQUNELEVBQU8sT0FBQSxXQUFBO0FBQ1Q7QUFLTyxTQUFTLHVCQUFBLENBQXdCLEtBQWdCLEVBQUEsR0FBQSxFQUFxQixNQUFpQixFQUFBO0FBQzVGLEVBQU0sTUFBQSxHQUFBLEdBQU0sUUFBUSxLQUFLLENBQUE7QUFDekIsRUFBQSxRQUFBLENBQVMsS0FBSyxNQUFNLENBQUE7QUFDcEIsRUFBQSxHQUFBLENBQUksVUFBYSxHQUFBLEdBQUE7QUFDakIsRUFBSSxHQUFBLENBQUEsR0FBQSxDQUFJLEtBQUssU0FBVSxDQUFBLDBCQUFBLENBQTJCLFFBQVcsR0FBSSxDQUFBLE9BQU8sQ0FBQyxDQUFDLENBQUE7QUFDNUU7QUFLQSxlQUFzQixrQkFBQSxDQUNwQixHQUNBLEVBQUEsR0FBQSxFQUNBLE9BQ2UsRUFBQTtBQUNmLEVBQUksSUFBQSxDQUFDLFFBQVEsTUFBUSxFQUFBO0FBQ25CLElBQU0sTUFBQSxJQUFJLE1BQU0sbURBQW1ELENBQUE7QUFBQTtBQUdyRSxFQUFBLElBQUksY0FBNkMsR0FBQSxJQUFBO0FBQ2pELEVBQU0sTUFBQSxXQUFBLEdBQWMseUJBQXlCLEdBQUcsQ0FBQTtBQUVoRCxFQUFJLElBQUE7QUFFRixJQUFBLE1BQU0sU0FBbUIsRUFBQztBQUMxQixJQUFBLFdBQUEsTUFBaUIsU0FBUyxHQUFLLEVBQUE7QUFDN0IsTUFBQSxNQUFBLENBQU8sS0FBSyxLQUFLLENBQUE7QUFBQTtBQUVuQixJQUFBLE1BQU0sSUFBTyxHQUFBLE1BQUEsQ0FBTyxNQUFPLENBQUEsTUFBTSxFQUFFLFFBQVMsRUFBQTtBQUc1QyxJQUFBLE1BQU0sRUFBRSxFQUFJLEVBQUEsSUFBQSxLQUFTLDRCQUE2QixDQUFBLElBQUEsRUFBTSxJQUFJLEdBQUcsQ0FBQTtBQUcvRCxJQUFBLHdCQUFBLENBQXlCLEdBQUcsQ0FBQTtBQUc1QixJQUFBLE9BQUEsQ0FBUSxPQUFPLFdBQVksQ0FBQTtBQUFBLE1BQ3pCLElBQU0sRUFBQSxlQUFBO0FBQUEsTUFDTixFQUFBO0FBQUEsTUFDQTtBQUFBLEtBQytCLENBQUE7QUFHakMsSUFBQSxjQUFBLEdBQWlCLENBQUMsT0FBaUIsS0FBQTtBQUNqQyxNQUFJLElBQUEsT0FBQSxDQUFRLFNBQVMsV0FBYSxFQUFBO0FBQ2hDLFFBQVksV0FBQSxDQUFBLEtBQUEsQ0FBTSxRQUFRLEtBQUssQ0FBQTtBQUFBLE9BQ2pDLE1BQUEsSUFBVyxPQUFRLENBQUEsSUFBQSxLQUFTLFNBQVcsRUFBQTtBQUNyQyxRQUFBLElBQUksY0FBZ0IsRUFBQTtBQUNsQixVQUFBLG1CQUFBLENBQW9CLFdBQWEsRUFBQSxPQUFBLENBQVEsTUFBUyxFQUFBLGNBQUEsRUFBZ0IsR0FBRyxDQUFBO0FBQUE7QUFDdkUsT0FDRixNQUFBLElBQVcsT0FBUSxDQUFBLElBQUEsS0FBUyxPQUFTLEVBQUE7QUFDbkMsUUFBQSxJQUFJLGNBQWdCLEVBQUE7QUFDbEIsVUFBQSxtQkFBQTtBQUFBLFlBQ0UsV0FBQTtBQUFBLFlBQ0EsT0FBUSxDQUFBLE1BQUE7QUFBQSxZQUNSLGNBQUE7QUFBQSxZQUNBLEdBQUE7QUFBQSxZQUNBLE9BQVEsQ0FBQSxLQUFBO0FBQUEsWUFDUixPQUFRLENBQUE7QUFBQSxXQUNWO0FBQUE7QUFDRjtBQUNGLEtBQ0Y7QUFFQSxJQUFRLE9BQUEsQ0FBQSxNQUFBLENBQU8sRUFBRyxDQUFBLFNBQUEsRUFBVyxjQUFjLENBQUE7QUFHM0MsSUFBWSxXQUFBLENBQUEsRUFBQSxDQUFHLE9BQVMsRUFBQSxDQUFDLEtBQW1CLEtBQUE7QUFDMUMsTUFBQSxJQUFJLGNBQWdCLEVBQUE7QUFDbEIsUUFBQSxtQkFBQTtBQUFBLFVBQ0UsV0FBQTtBQUFBLFVBQ0EsT0FBUSxDQUFBLE1BQUE7QUFBQSxVQUNSLGNBQUE7QUFBQSxVQUNBLEdBQUE7QUFBQSxVQUNBLEtBQUE7QUFBQSxVQUNBLE9BQVEsQ0FBQTtBQUFBLFNBQ1Y7QUFBQTtBQUNGLEtBQ0QsQ0FBQTtBQUFBLFdBQ00sS0FBTyxFQUFBO0FBQ2QsSUFBd0IsdUJBQUEsQ0FBQSxLQUFBLEVBQU8sR0FBSyxFQUFBLE9BQUEsQ0FBUSxNQUFNLENBQUE7QUFBQTtBQUV0RDs7OzsifQ==