vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
57 lines (54 loc) • 7.25 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { Readable } from 'node:stream';
import { handleError } from '../error/handleError.js';
import { getNodeEnv } from '../config/getNodeEnv.js';
function pipeToResponse(options) {
const { stream, response, contentType, logger, verbose = false, panicThreshold = "none", context = "pipeToResponse" } = options;
if (!response.writable) {
if (verbose) {
logger.warn(`[${context}] Response not writable, skipping pipe`);
}
return;
}
const readable = Readable.fromWeb(stream);
let headersSent = false;
readable.on("data", (chunk) => {
if (!headersSent) {
response.setHeader("Content-Type", contentType);
response.setHeader("Transfer-Encoding", "chunked");
response.setHeader("Connection", "keep-alive");
headersSent = true;
}
response.write(chunk);
});
readable.on("end", () => {
response.end();
});
readable.on("error", (error) => {
const panicError = handleError({
error,
logger,
mode: getNodeEnv(),
panicThreshold,
log: true
});
if (panicError != null) {
throw panicError;
}
if (!headersSent) {
response.statusCode = 500;
response.setHeader("Content-Type", "text/plain; charset=utf-8");
const message = error instanceof Error ? error.message : String(error);
response.end(`RSC render failed: ${message}
`);
} else {
response.end();
}
});
}
export { pipeToResponse };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZVRvUmVzcG9uc2UuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BsdWdpbi9oZWxwZXJzL3BpcGVUb1Jlc3BvbnNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlclJlc3BvbnNlIH0gZnJvbSBcIm5vZGU6aHR0cFwiO1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZVN0cmVhbSB9IGZyb20gXCJub2RlOnN0cmVhbS93ZWJcIjtcbmltcG9ydCB7IGhhbmRsZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL2hhbmRsZUVycm9yLmpzXCI7XG5pbXBvcnQgeyBnZXROb2RlRW52IH0gZnJvbSBcIi4uL2NvbmZpZy9nZXROb2RlRW52LmpzXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgdHlwZSB7IFBhbmljVGhyZXNob2xkIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZVRvUmVzcG9uc2VPcHRpb25zIHtcbiAgc3RyZWFtOiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB8IGFueTsgLy8gQWxsb3cgYW55IGZvciBub3cgdG8gaGFuZGxlIHR5cGUgbWlzbWF0Y2hlc1xuICByZXNwb25zZTogU2VydmVyUmVzcG9uc2U7XG4gIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gIGxvZ2dlcjogTG9nZ2VyO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgcGFuaWNUaHJlc2hvbGQ/OiBQYW5pY1RocmVzaG9sZDtcbiAgY29udGV4dD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQaXBlcyBhIFJlYWRhYmxlU3RyZWFtIHRvIGFuIEhUVFAgcmVzcG9uc2Ugd2l0aCBwcm9wZXIgZXJyb3IgaGFuZGxpbmcgYW5kIGhlYWRlcnMuXG4gKiBUaGlzIGlzIGEgY29tbW9uIHBhdHRlcm4gdXNlZCBhY3Jvc3MgdGhlIHBsdWdpbiBmb3Igc3RyZWFtaW5nIHJlc3BvbnNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpcGVUb1Jlc3BvbnNlKG9wdGlvbnM6IFBpcGVUb1Jlc3BvbnNlT3B0aW9ucyk6IHZvaWQge1xuICBjb25zdCB7IHN0cmVhbSwgcmVzcG9uc2UsIGNvbnRlbnRUeXBlLCBsb2dnZXIsIHZlcmJvc2UgPSBmYWxzZSwgcGFuaWNUaHJlc2hvbGQgPSBcIm5vbmVcIiwgY29udGV4dCA9IFwicGlwZVRvUmVzcG9uc2VcIiB9ID0gb3B0aW9ucztcblxuICBpZiAoIXJlc3BvbnNlLndyaXRhYmxlKSB7XG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBbJHtjb250ZXh0fV0gUmVzcG9uc2Ugbm90IHdyaXRhYmxlLCBza2lwcGluZyBwaXBlYCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJlYWRhYmxlID0gUmVhZGFibGUuZnJvbVdlYihzdHJlYW0gYXMgUmVhZGFibGVTdHJlYW0pO1xuICBsZXQgaGVhZGVyc1NlbnQgPSBmYWxzZTtcblxuICByZWFkYWJsZS5vbignZGF0YScsIChjaHVuaykgPT4ge1xuICAgIGlmICghaGVhZGVyc1NlbnQpIHtcbiAgICAgIC8vIE9ubHkgc2VuZCBoZWFkZXJzIHdoZW4gZmlyc3QgY2h1bmsgYXJyaXZlc1xuICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIGNvbnRlbnRUeXBlKTtcbiAgICAgIHJlc3BvbnNlLnNldEhlYWRlcihcIlRyYW5zZmVyLUVuY29kaW5nXCIsIFwiY2h1bmtlZFwiKTtcbiAgICAgIHJlc3BvbnNlLnNldEhlYWRlcihcIkNvbm5lY3Rpb25cIiwgXCJrZWVwLWFsaXZlXCIpO1xuICAgICAgaGVhZGVyc1NlbnQgPSB0cnVlO1xuICAgIH1cbiAgICByZXNwb25zZS53cml0ZShjaHVuayk7XG4gIH0pO1xuXG4gIHJlYWRhYmxlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgcmVzcG9uc2UuZW5kKCk7XG4gIH0pO1xuXG4gIHJlYWRhYmxlLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgIC8vIEFsd2F5cyBsb2c6IGEgc3RyZWFtIGVycm9yIGhlcmUgbWVhbnMgYW4gUlNDIHJlbmRlciBibGV3IHVwLiBXaXRob3V0XG4gICAgLy8gdGhpcyBsb2cgdGhlIHVzZXIganVzdCBzZWVzIGEgaHVuZyB0YWIgYW5kIGFuIGVtcHR5IDV4eCwgd2hpY2ggaXNcbiAgICAvLyBleGFjdGx5IHRoZSB2ZXJib3NlLW9ubHkgYmVoYXZpb3IgYmQtcXZ6ICMyIGNhbGxzIG91dC5cbiAgICBjb25zdCBwYW5pY0Vycm9yID0gaGFuZGxlRXJyb3Ioe1xuICAgICAgZXJyb3IsXG4gICAgICBsb2dnZXIsXG4gICAgICBtb2RlOiBnZXROb2RlRW52KCksXG4gICAgICBwYW5pY1RocmVzaG9sZCxcbiAgICAgIGNvbnRleHQsXG4gICAgICBsb2c6IHRydWUsXG4gICAgfSk7XG5cbiAgICBpZiAocGFuaWNFcnJvciAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBwYW5pY0Vycm9yO1xuICAgIH1cblxuICAgIGlmICghaGVhZGVyc1NlbnQpIHtcbiAgICAgIHJlc3BvbnNlLnN0YXR1c0NvZGUgPSA1MDA7XG4gICAgICByZXNwb25zZS5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIHJlc3BvbnNlLmVuZChgUlNDIHJlbmRlciBmYWlsZWQ6ICR7bWVzc2FnZX1cXG5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGVhZGVycyBhbHJlYWR5IGZsdXNoZWQgKGFuZCBsaWtlbHkgc29tZSBSU0MgYnl0ZXMgdG9vKS4gVGhlIFJTQ1xuICAgICAgLy8gcHJvdG9jb2wgY2FycmllcyBhbiBlcnJvciBmcmFtZSBpbi1iYW5kOyBqdXN0IGVuZCB0aGUgcmVzcG9uc2UgYW5kXG4gICAgICAvLyByZWx5IG9uIHRoZSBwcmlvciBsb2cgbGluZSBmb3IgZGlhZ25vc2FiaWxpdHkuXG4gICAgICByZXNwb25zZS5lbmQoKTtcbiAgICB9XG4gIH0pO1xufSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFzQk8sU0FBUyxlQUFlLE9BQXNDLEVBQUE7QUFDbkUsRUFBTSxNQUFBLEVBQUUsTUFBUSxFQUFBLFFBQUEsRUFBVSxXQUFhLEVBQUEsTUFBQSxFQUFRLE9BQVUsR0FBQSxLQUFBLEVBQU8sY0FBaUIsR0FBQSxNQUFBLEVBQVEsT0FBVSxHQUFBLGdCQUFBLEVBQXFCLEdBQUEsT0FBQTtBQUV4SCxFQUFJLElBQUEsQ0FBQyxTQUFTLFFBQVUsRUFBQTtBQUN0QixJQUFBLElBQUksT0FBUyxFQUFBO0FBQ1gsTUFBTyxNQUFBLENBQUEsSUFBQSxDQUFLLENBQUksQ0FBQSxFQUFBLE9BQU8sQ0FBd0Msc0NBQUEsQ0FBQSxDQUFBO0FBQUE7QUFFakUsSUFBQTtBQUFBO0FBR0YsRUFBTSxNQUFBLFFBQUEsR0FBVyxRQUFTLENBQUEsT0FBQSxDQUFRLE1BQXdCLENBQUE7QUFDMUQsRUFBQSxJQUFJLFdBQWMsR0FBQSxLQUFBO0FBRWxCLEVBQVMsUUFBQSxDQUFBLEVBQUEsQ0FBRyxNQUFRLEVBQUEsQ0FBQyxLQUFVLEtBQUE7QUFDN0IsSUFBQSxJQUFJLENBQUMsV0FBYSxFQUFBO0FBRWhCLE1BQVMsUUFBQSxDQUFBLFNBQUEsQ0FBVSxnQkFBZ0IsV0FBVyxDQUFBO0FBQzlDLE1BQVMsUUFBQSxDQUFBLFNBQUEsQ0FBVSxxQkFBcUIsU0FBUyxDQUFBO0FBQ2pELE1BQVMsUUFBQSxDQUFBLFNBQUEsQ0FBVSxjQUFjLFlBQVksQ0FBQTtBQUM3QyxNQUFjLFdBQUEsR0FBQSxJQUFBO0FBQUE7QUFFaEIsSUFBQSxRQUFBLENBQVMsTUFBTSxLQUFLLENBQUE7QUFBQSxHQUNyQixDQUFBO0FBRUQsRUFBUyxRQUFBLENBQUEsRUFBQSxDQUFHLE9BQU8sTUFBTTtBQUN2QixJQUFBLFFBQUEsQ0FBUyxHQUFJLEVBQUE7QUFBQSxHQUNkLENBQUE7QUFFRCxFQUFTLFFBQUEsQ0FBQSxFQUFBLENBQUcsT0FBUyxFQUFBLENBQUMsS0FBVSxLQUFBO0FBSTlCLElBQUEsTUFBTSxhQUFhLFdBQVksQ0FBQTtBQUFBLE1BQzdCLEtBQUE7QUFBQSxNQUNBLE1BQUE7QUFBQSxNQUNBLE1BQU0sVUFBVyxFQUFBO0FBQUEsTUFDakIsY0FBQTtBQUFBLE1BRUEsR0FBSyxFQUFBO0FBQUEsS0FDTixDQUFBO0FBRUQsSUFBQSxJQUFJLGNBQWMsSUFBTSxFQUFBO0FBQ3RCLE1BQU0sTUFBQSxVQUFBO0FBQUE7QUFHUixJQUFBLElBQUksQ0FBQyxXQUFhLEVBQUE7QUFDaEIsTUFBQSxRQUFBLENBQVMsVUFBYSxHQUFBLEdBQUE7QUFDdEIsTUFBUyxRQUFBLENBQUEsU0FBQSxDQUFVLGdCQUFnQiwyQkFBMkIsQ0FBQTtBQUM5RCxNQUFBLE1BQU0sVUFBVSxLQUFpQixZQUFBLEtBQUEsR0FBUSxLQUFNLENBQUEsT0FBQSxHQUFVLE9BQU8sS0FBSyxDQUFBO0FBQ3JFLE1BQVMsUUFBQSxDQUFBLEdBQUEsQ0FBSSxzQkFBc0IsT0FBTztBQUFBLENBQUksQ0FBQTtBQUFBLEtBQ3pDLE1BQUE7QUFJTCxNQUFBLFFBQUEsQ0FBUyxHQUFJLEVBQUE7QUFBQTtBQUNmLEdBQ0QsQ0FBQTtBQUNIOzs7OyJ9