UNPKG

vite-plugin-react-server

Version:
86 lines (83 loc) 11.6 kB
/** * 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==