UNPKG

vite-plugin-react-server

Version:
99 lines (96 loc) 12.7 kB
/** * vite-plugin-react-server * Copyright (c) Nico Brinkkemper * MIT License */ import { createServerActionStream, handleServerActionError } from '../helpers/handleServerAction.client.js'; import { cleanupServerAction } from './cleanupServerAction.client.js'; import { parseServerActionRequestBody, setupServerActionHeaders } from '../helpers/handleServerActionHelper.js'; const handleServerAction = async function _handleWorkerServerAction(req, res, worker, logger) { 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 headerActionId = req.headers["x-rsc-action"]; const parsed = parseServerActionRequestBody(body, req.url); const id = headerActionId || parsed.id; const args = parsed.args; setupServerActionHeaders(res); worker.postMessage({ type: "SERVER_ACTION", id, args }); messageHandler = (message) => { try { if (message.type === "RSC_CHUNK") { passThrough.write(message.chunk); } else if (message.type === "RSC_END") { if (messageHandler) { cleanupServerAction(passThrough, worker, messageHandler, res); } } else if (message.type === "SERVER_ACTION_RESPONSE") { if (message.error?.message) { logger.error(`[handleServerAction] Server action error: ${message.error?.message}`); passThrough.write(`0:${JSON.stringify({ error: message.error.message })} `); } else if (typeof message.error === "string") { logger.error(`[handleServerAction] Server action error: ${message.error}`); passThrough.write(`0:${JSON.stringify({ error: message.error })} `); } else { passThrough.write(`0:${JSON.stringify(message.result)} `); } if (messageHandler) { cleanupServerAction(passThrough, worker, messageHandler, res); } } else if (message.type === "ERROR") { if (messageHandler) { cleanupServerAction( passThrough, worker, messageHandler, res, message.error, logger ); } } } catch (error) { logger.error(`[handleServerAction] Message handler error: ${error}`); if (messageHandler) { cleanupServerAction( passThrough, worker, messageHandler, res, error, logger ); } } }; worker.on("message", messageHandler); passThrough.on("error", (error) => { if (messageHandler) { cleanupServerAction( passThrough, worker, messageHandler, res, error, logger ); } }); } catch (error) { handleServerActionError(error, res, logger); } }; export { handleServerAction }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlU2VydmVyQWN0aW9uLmNsaWVudC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL2Rldi1zZXJ2ZXIvaGFuZGxlU2VydmVyQWN0aW9uLmNsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIFJzY0NodW5rT3V0cHV0TWVzc2FnZSxcbiAgUnNjV29ya2VySW5wdXRNZXNzYWdlLFxuICBSc2NXb3JrZXJPdXRwdXRNZXNzYWdlLFxufSBmcm9tIFwiLi4vd29ya2VyL3JzYy90eXBlcy5qc1wiO1xuaW1wb3J0IHtcbiAgcGFyc2VTZXJ2ZXJBY3Rpb25SZXF1ZXN0Qm9keSxcbiAgc2V0dXBTZXJ2ZXJBY3Rpb25IZWFkZXJzLFxuICBjcmVhdGVTZXJ2ZXJBY3Rpb25TdHJlYW0sXG4gIGhhbmRsZVNlcnZlckFjdGlvbkVycm9yLFxufSBmcm9tIFwiLi4vaGVscGVycy9oYW5kbGVTZXJ2ZXJBY3Rpb24uY2xpZW50LmpzXCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBjbGVhbnVwU2VydmVyQWN0aW9uIH0gZnJvbSBcIi4vY2xlYW51cFNlcnZlckFjdGlvbi5jbGllbnQuanNcIjtcbmltcG9ydCB0eXBlIHsgSGFuZGxlV29ya2VyU2VydmVyQWN0aW9uRm4gfSBmcm9tIFwiLi4vcmVhY3QtY2xpZW50L3R5cGVzLmpzXCI7XG5cbi8qKlxuICogSGFuZGxlcyBzZXJ2ZXIgYWN0aW9uIHJlcXVlc3RzIGluIHRoZSB3b3JrZXIgc2NlbmFyaW8uXG4gKlxuICogQHBhcmFtIHJlcSAtIFRoZSBpbmNvbWluZyByZXF1ZXN0XG4gKiBAcGFyYW0gcmVzIC0gVGhlIHJlc3BvbnNlIG9iamVjdFxuICogQHBhcmFtIHdvcmtlciAtIFRoZSB3b3JrZXIgdGhyZWFkXG4gKiBAcGFyYW0gbG9nZ2VyIC0gVGhlIFZpdGUgbG9nZ2VyXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVTZXJ2ZXJBY3Rpb246IEhhbmRsZVdvcmtlclNlcnZlckFjdGlvbkZuID1cbiAgYXN5bmMgZnVuY3Rpb24gX2hhbmRsZVdvcmtlclNlcnZlckFjdGlvbihyZXEsIHJlcywgd29ya2VyLCBsb2dnZXIpIHtcbiAgICBsZXQgbWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyPFJzY0NodW5rT3V0cHV0TWVzc2FnZT4gfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0IHBhc3NUaHJvdWdoID0gY3JlYXRlU2VydmVyQWN0aW9uU3RyZWFtKHJlcyk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlYWQgcmVxdWVzdCBib2R5XG4gICAgICBjb25zdCBjaHVua3M6IEJ1ZmZlcltdID0gW107XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHJlcSkge1xuICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICB9XG4gICAgICBjb25zdCBib2R5ID0gQnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKCk7XG5cbiAgICAgIC8vIFBhcnNlIHRoZSBzZXJ2ZXIgYWN0aW9uIHJlcXVlc3RcbiAgICAgIC8vIEdldCBhY3Rpb24gSUQgZnJvbSB4LXJzYy1hY3Rpb24gaGVhZGVyIChSZWFjdCdzIHN0YW5kYXJkKSBvciBmYWxsIGJhY2sgdG8gYm9keS9VUkxcbiAgICAgIGNvbnN0IGhlYWRlckFjdGlvbklkID0gcmVxLmhlYWRlcnNbXCJ4LXJzYy1hY3Rpb25cIl0gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VTZXJ2ZXJBY3Rpb25SZXF1ZXN0Qm9keShib2R5LCByZXEudXJsKTtcbiAgICAgIGNvbnN0IGlkID0gaGVhZGVyQWN0aW9uSWQgfHwgcGFyc2VkLmlkO1xuICAgICAgY29uc3QgYXJncyA9IHBhcnNlZC5hcmdzO1xuXG4gICAgICAvLyBTZXQgdXAgcmVzcG9uc2UgaGVhZGVyc1xuICAgICAgc2V0dXBTZXJ2ZXJBY3Rpb25IZWFkZXJzKHJlcyk7XG5cbiAgICAgIC8vIFNlbmQgc2VydmVyIGFjdGlvbiByZXF1ZXN0IHRvIHdvcmtlclxuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogXCJTRVJWRVJfQUNUSU9OXCIsXG4gICAgICAgIGlkLFxuICAgICAgICBhcmdzLFxuICAgICAgfSBzYXRpc2ZpZXMgUnNjV29ya2VySW5wdXRNZXNzYWdlKTtcblxuICAgICAgLy8gQ3JlYXRlIGEgcGFzcy10aHJvdWdoIHN0cmVhbSBmb3IgdGhlIHJlc3BvbnNlXG5cbiAgICAgIC8vIEhhbmRsZSB3b3JrZXIgbWVzc2FnZXMgd2l0aCBwcm9wZXIgZXJyb3IgaGFuZGxpbmdcbiAgICAgIG1lc3NhZ2VIYW5kbGVyID0gKG1lc3NhZ2U6IFJzY1dvcmtlck91dHB1dE1lc3NhZ2UgJiB7IGVycm9yPzogeyBtZXNzYWdlOiBzdHJpbmcgfSB9KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJSU0NfQ0hVTktcIikge1xuICAgICAgICAgICAgcGFzc1Rocm91Z2gud3JpdGUobWVzc2FnZS5jaHVuayk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiUlNDX0VORFwiKSB7XG4gICAgICAgICAgICBpZiAobWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgY2xlYW51cFNlcnZlckFjdGlvbihwYXNzVGhyb3VnaCwgd29ya2VyLCBtZXNzYWdlSGFuZGxlciwgcmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJTRVJWRVJfQUNUSU9OX1JFU1BPTlNFXCIpIHtcbiAgICAgICAgICAgIC8vIFNlcnZlciBhY3Rpb24gY29tcGxldGVkIC0gd3JpdGUgcmVzdWx0IGluIFJTQyBmb3JtYXQgYW5kIGVuZCBzdHJlYW1cbiAgICAgICAgICAgIC8vIFJTQyBmb3JtYXQ6IDA6PGpzb24tdmFsdWU+XFxuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5lcnJvcj8ubWVzc2FnZSkge1xuICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFtoYW5kbGVTZXJ2ZXJBY3Rpb25dIFNlcnZlciBhY3Rpb24gZXJyb3I6ICR7bWVzc2FnZS5lcnJvcj8ubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgcGFzc1Rocm91Z2gud3JpdGUoYDA6JHtKU09OLnN0cmluZ2lmeSh7IGVycm9yOiBtZXNzYWdlLmVycm9yLm1lc3NhZ2UgfSl9XFxuYCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYodHlwZW9mIG1lc3NhZ2UuZXJyb3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBbaGFuZGxlU2VydmVyQWN0aW9uXSBTZXJ2ZXIgYWN0aW9uIGVycm9yOiAke21lc3NhZ2UuZXJyb3J9YCk7XG4gICAgICAgICAgICAgIHBhc3NUaHJvdWdoLndyaXRlKGAwOiR7SlNPTi5zdHJpbmdpZnkoeyBlcnJvcjogbWVzc2FnZS5lcnJvciB9KX1cXG5gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFdyaXRlIHRoZSByZXN1bHQgZGlyZWN0bHkgLSBSZWFjdCB3aWxsIHVud3JhcCBpdFxuICAgICAgICAgICAgICBwYXNzVGhyb3VnaC53cml0ZShgMDoke0pTT04uc3RyaW5naWZ5KG1lc3NhZ2UucmVzdWx0KX1cXG5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgICAgICBjbGVhbnVwU2VydmVyQWN0aW9uKHBhc3NUaHJvdWdoLCB3b3JrZXIsIG1lc3NhZ2VIYW5kbGVyLCByZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcIkVSUk9SXCIpIHtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgICAgICBjbGVhbnVwU2VydmVyQWN0aW9uKFxuICAgICAgICAgICAgICAgIHBhc3NUaHJvdWdoLFxuICAgICAgICAgICAgICAgIHdvcmtlcixcbiAgICAgICAgICAgICAgICBtZXNzYWdlSGFuZGxlcixcbiAgICAgICAgICAgICAgICByZXMsXG4gICAgICAgICAgICAgICAgbWVzc2FnZS5lcnJvcixcbiAgICAgICAgICAgICAgICBsb2dnZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBbaGFuZGxlU2VydmVyQWN0aW9uXSBNZXNzYWdlIGhhbmRsZXIgZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgaWYgKG1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgICBjbGVhbnVwU2VydmVyQWN0aW9uKFxuICAgICAgICAgICAgICBwYXNzVGhyb3VnaCxcbiAgICAgICAgICAgICAgd29ya2VyLFxuICAgICAgICAgICAgICBtZXNzYWdlSGFuZGxlcixcbiAgICAgICAgICAgICAgcmVzLFxuICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgbG9nZ2VyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgd29ya2VyLm9uKFwibWVzc2FnZVwiLCBtZXNzYWdlSGFuZGxlcik7XG5cbiAgICAgIC8vIEhhbmRsZSBlcnJvcnNcbiAgICAgIHBhc3NUaHJvdWdoLm9uKFwiZXJyb3JcIiwgKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIGNsZWFudXBTZXJ2ZXJBY3Rpb24oXG4gICAgICAgICAgICBwYXNzVGhyb3VnaCxcbiAgICAgICAgICAgIHdvcmtlcixcbiAgICAgICAgICAgIG1lc3NhZ2VIYW5kbGVyLFxuICAgICAgICAgICAgcmVzLFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICBsb2dnZXJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaGFuZGxlU2VydmVyQWN0aW9uRXJyb3IoZXJyb3IsIHJlcywgbG9nZ2VyKTtcbiAgICB9XG4gIH07XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBdUJPLE1BQU0scUJBQ1gsZUFBZSx5QkFBQSxDQUEwQixHQUFLLEVBQUEsR0FBQSxFQUFLLFFBQVEsTUFBUSxFQUFBO0FBQ2pFLEVBQUEsSUFBSSxjQUErRCxHQUFBLElBQUE7QUFFbkUsRUFBTSxNQUFBLFdBQUEsR0FBYyx5QkFBeUIsR0FBRyxDQUFBO0FBQ2hELEVBQUksSUFBQTtBQUVGLElBQUEsTUFBTSxTQUFtQixFQUFDO0FBQzFCLElBQUEsV0FBQSxNQUFpQixTQUFTLEdBQUssRUFBQTtBQUM3QixNQUFBLE1BQUEsQ0FBTyxLQUFLLEtBQUssQ0FBQTtBQUFBO0FBRW5CLElBQUEsTUFBTSxJQUFPLEdBQUEsTUFBQSxDQUFPLE1BQU8sQ0FBQSxNQUFNLEVBQUUsUUFBUyxFQUFBO0FBSTVDLElBQU0sTUFBQSxjQUFBLEdBQWlCLEdBQUksQ0FBQSxPQUFBLENBQVEsY0FBYyxDQUFBO0FBQ2pELElBQUEsTUFBTSxNQUFTLEdBQUEsNEJBQUEsQ0FBNkIsSUFBTSxFQUFBLEdBQUEsQ0FBSSxHQUFHLENBQUE7QUFDekQsSUFBTSxNQUFBLEVBQUEsR0FBSyxrQkFBa0IsTUFBTyxDQUFBLEVBQUE7QUFDcEMsSUFBQSxNQUFNLE9BQU8sTUFBTyxDQUFBLElBQUE7QUFHcEIsSUFBQSx3QkFBQSxDQUF5QixHQUFHLENBQUE7QUFHNUIsSUFBQSxNQUFBLENBQU8sV0FBWSxDQUFBO0FBQUEsTUFDakIsSUFBTSxFQUFBLGVBQUE7QUFBQSxNQUNOLEVBQUE7QUFBQSxNQUNBO0FBQUEsS0FDK0IsQ0FBQTtBQUtqQyxJQUFBLGNBQUEsR0FBaUIsQ0FBQyxPQUFzRSxLQUFBO0FBQ3RGLE1BQUksSUFBQTtBQUNGLFFB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