vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
101 lines (98 loc) • 12.6 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { Transform } from 'node:stream';
import { createStreamMetrics } from '../metrics/createStreamMetrics.js';
const collectRscContent = async function _collectRscContent(rsc, handlerOptions) {
const metrics = createStreamMetrics();
const startTime = performance.now();
const rscBuffer = [];
const metricsTransform = new Transform({
transform(chunk, _encoding, callback) {
metrics.chunks++;
metrics.bytes += chunk.length;
rscBuffer.push(Buffer.from(chunk));
callback(null, chunk);
},
flush(callback) {
metrics.duration = performance.now() - startTime;
if (handlerOptions.verbose) {
handlerOptions.logger.info(
`[collectRscContent] Transform flush: ${metrics.chunks} chunks, ${metrics.duration}ms`
);
}
callback();
}
});
try {
const { PassThrough } = await import('node:stream');
const consumer = new PassThrough();
rsc.pipe(metricsTransform).pipe(consumer);
await new Promise((resolve, reject) => {
const timeout = setTimeout(() => {
if (handlerOptions.verbose) {
handlerOptions.logger.info(
`[collectRscContent] Stream timeout reached, forcing completion`
);
}
resolve();
}, handlerOptions.rscTimeout || 5e3);
consumer.on("end", () => {
if (handlerOptions.verbose) {
handlerOptions.logger.info(
`[collectRscContent] Stream ended with ${metrics.bytes} bytes`
);
}
clearTimeout(timeout);
resolve();
});
consumer.on("error", (error) => {
if (handlerOptions.verbose) {
handlerOptions.logger.info(
`[collectRscContent] Stream error: ${error}`
);
}
clearTimeout(timeout);
reject(error);
});
});
if (handlerOptions.verbose) {
handlerOptions.logger.info(
`[collectRscContent] Collection completed with ${metrics.bytes} bytes`
);
}
const { Readable } = await import('node:stream');
const readableStream = new Readable({
read() {
for (const chunk of rscBuffer) {
this.push(chunk);
}
this.push(null);
}
});
return {
pipe: readableStream.pipe.bind(readableStream),
abort: (reason) => {
rsc.abort(reason);
readableStream.destroy(reason);
},
metrics,
// Include buffered content for reuse
bufferedContent: rscBuffer
};
} catch (error) {
if (handlerOptions.verbose) {
handlerOptions.logger.info(`[collectRscContent] Error: ${error}`);
}
metricsTransform.destroy();
rsc.abort(new Error("RSC Stream aborted"));
if (error != null) {
throw error;
}
throw new Error("Failed to collect RSC content");
}
};
export { collectRscContent };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdFJzY0NvbnRlbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BsdWdpbi9yZWFjdC1zdGF0aWMvY29sbGVjdFJzY0NvbnRlbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjb2xsZWN0UnNjQ29udGVudC50c1xuICpcbiAqIFBVUlBPU0U6IENvbGxlY3RzIFJTQyBjb250ZW50IGZyb20gYSBzdHJlYW0gd2l0aCBtZXRyaWNzXG4gKlxuICogVGhpcyBtb2R1bGU6XG4gKiAxLiBDb2xsZWN0cyBSU0MgY29udGVudCBmcm9tIHRoZSBwcm92aWRlZCBzdHJlYW1cbiAqIDIuIFRyYWNrcyBtZXRyaWNzIChjaHVua3MsIGJ5dGVzLCBkdXJhdGlvbilcbiAqIDMuIFJldHVybnMgYnVmZmVyZWQgY29udGVudCBhbmQgbWV0cmljc1xuICogNC4gRG9lcyBOT1Qgd3JpdGUgZmlsZXMgLSB0aGF0J3MgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5XG4gKi9cblxuaW1wb3J0IHsgVHJhbnNmb3JtIH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgeyBjcmVhdGVTdHJlYW1NZXRyaWNzIH0gZnJvbSBcIi4uL21ldHJpY3MvY3JlYXRlU3RyZWFtTWV0cmljcy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0UnNjQ29udGVudEZuIH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcblxuLyoqXG4gKiBDb2xsZWN0cyBSU0MgY29udGVudCBmcm9tIGEgc3RyZWFtIHdpdGggbWV0cmljc1xuICpcbiAqIEBwYXJhbSByc2MgVGhlIHN0cmVhbSBjb250YWluaW5nIHRoZSBSU0MgY29udGVudFxuICogQHBhcmFtIGhhbmRsZXJPcHRpb25zIFRoZSBvcHRpb25zIGZvciB0aGUgaGFuZGxlclxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBidWZmZXJlZCBjb250ZW50IGFuZCBtZXRyaWNzXG4gKi9cbmV4cG9ydCBjb25zdCBjb2xsZWN0UnNjQ29udGVudDogQ29sbGVjdFJzY0NvbnRlbnRGbiA9XG4gIGFzeW5jIGZ1bmN0aW9uIF9jb2xsZWN0UnNjQ29udGVudChyc2MsIGhhbmRsZXJPcHRpb25zKSB7XG4gICAgY29uc3QgbWV0cmljcyA9IGNyZWF0ZVN0cmVhbU1ldHJpY3MoKTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIC8vIEJ1ZmZlciB0byBzdG9yZSBSU0MgY29udGVudCBmb3IgcmV1c2VcbiAgICBjb25zdCByc2NCdWZmZXI6IEJ1ZmZlcltdID0gW107XG5cbiAgICAvLyBDcmVhdGUgdHJhbnNmb3JtIHRvIHRyYWNrIG1ldHJpY3MgYW5kIGJ1ZmZlciBjb250ZW50XG4gICAgY29uc3QgbWV0cmljc1RyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oe1xuICAgICAgdHJhbnNmb3JtKGNodW5rLCBfZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgICAgIG1ldHJpY3MuY2h1bmtzKys7XG4gICAgICAgIG1ldHJpY3MuYnl0ZXMgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICAvLyBCdWZmZXIgdGhlIGNodW5rIGZvciByZXVzZVxuICAgICAgICByc2NCdWZmZXIucHVzaChCdWZmZXIuZnJvbShjaHVuaykpO1xuICAgICAgICBjYWxsYmFjayhudWxsLCBjaHVuayk7XG4gICAgICB9LFxuICAgICAgZmx1c2goY2FsbGJhY2spIHtcbiAgICAgICAgbWV0cmljcy5kdXJhdGlvbiA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICBpZiAoaGFuZGxlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGhhbmRsZXJPcHRpb25zLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFtjb2xsZWN0UnNjQ29udGVudF0gVHJhbnNmb3JtIGZsdXNoOiAke21ldHJpY3MuY2h1bmtzfSBjaHVua3MsICR7bWV0cmljcy5kdXJhdGlvbn1tc2BcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBhIFBhc3NUaHJvdWdoIHN0cmVhbSB0byBjb25zdW1lIHRoZSB0cmFuc2Zvcm1cbiAgICAgIGNvbnN0IHsgUGFzc1Rocm91Z2ggfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6c3RyZWFtXCIpO1xuICAgICAgY29uc3QgY29uc3VtZXIgPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICAgIFxuICAgICAgLy8gUGlwZSBSU0Mgc3RyZWFtIHRocm91Z2ggbWV0cmljcyB0cmFja2luZyB0byBjb25zdW1lclxuICAgICAgcnNjLnBpcGUobWV0cmljc1RyYW5zZm9ybSkucGlwZShjb25zdW1lcik7XG5cbiAgICAgIC8vIFdhaXQgZm9yIHN0cmVhbSB0byBjb21wbGV0ZSB3aXRoIHRpbWVvdXRcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmIChoYW5kbGVyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgYFtjb2xsZWN0UnNjQ29udGVudF0gU3RyZWFtIHRpbWVvdXQgcmVhY2hlZCwgZm9yY2luZyBjb21wbGV0aW9uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LCBoYW5kbGVyT3B0aW9ucy5yc2NUaW1lb3V0IHx8IDUwMDApOyAvLyA1IHNlY29uZCB0aW1lb3V0XG5cbiAgICAgICAgY29uc3VtZXIub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgIGlmIChoYW5kbGVyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgYFtjb2xsZWN0UnNjQ29udGVudF0gU3RyZWFtIGVuZGVkIHdpdGggJHttZXRyaWNzLmJ5dGVzfSBieXRlc2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN1bWVyLm9uKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGhhbmRsZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGhhbmRsZXJPcHRpb25zLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICBgW2NvbGxlY3RSc2NDb250ZW50XSBTdHJlYW0gZXJyb3I6ICR7ZXJyb3J9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChoYW5kbGVyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgIGhhbmRsZXJPcHRpb25zLmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBbY29sbGVjdFJzY0NvbnRlbnRdIENvbGxlY3Rpb24gY29tcGxldGVkIHdpdGggJHttZXRyaWNzLmJ5dGVzfSBieXRlc2BcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgcmVhZGFibGUgc3RyZWFtIGZyb20gdGhlIGJ1ZmZlcmVkIGNvbnRlbnQgdGhhdCBjYW4gYmUgcGlwZWQgbXVsdGlwbGUgdGltZXNcbiAgICAgIGNvbnN0IHsgUmVhZGFibGUgfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6c3RyZWFtXCIpO1xuICAgICAgY29uc3QgcmVhZGFibGVTdHJlYW0gPSBuZXcgUmVhZGFibGUoe1xuICAgICAgICByZWFkKCkge1xuICAgICAgICAgIC8vIFB1c2ggYWxsIGJ1ZmZlcmVkIGNvbnRlbnRcbiAgICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIHJzY0J1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5wdXNoKGNodW5rKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wdXNoKG51bGwpOyAvLyBFbmQgdGhlIHN0cmVhbVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gUmV0dXJuIGJ1ZmZlcmVkIGNvbnRlbnQgYW5kIG1ldHJpY3MgLSBmaWxlIHdyaXRpbmcgaXMgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBpcGU6IHJlYWRhYmxlU3RyZWFtLnBpcGUuYmluZChyZWFkYWJsZVN0cmVhbSksXG4gICAgICAgIGFib3J0OiAocmVhc29uPzogdW5rbm93bikgPT4ge1xuICAgICAgICAgIHJzYy5hYm9ydChyZWFzb24pO1xuICAgICAgICAgIHJlYWRhYmxlU3RyZWFtLmRlc3Ryb3kocmVhc29uIGFzIEVycm9yKTtcbiAgICAgICAgfSxcbiAgICAgICAgbWV0cmljcyxcbiAgICAgICAgLy8gSW5jbHVkZSBidWZmZXJlZCBjb250ZW50IGZvciByZXVzZVxuICAgICAgICBidWZmZXJlZENvbnRlbnQ6IHJzY0J1ZmZlcixcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChoYW5kbGVyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgIGhhbmRsZXJPcHRpb25zLmxvZ2dlci5pbmZvKGBbY29sbGVjdFJzY0NvbnRlbnRdIEVycm9yOiAke2Vycm9yfWApO1xuICAgICAgfVxuICAgICAgbWV0cmljc1RyYW5zZm9ybS5kZXN0cm95KCk7XG4gICAgICByc2MuYWJvcnQobmV3IEVycm9yKFwiUlNDIFN0cmVhbSBhYm9ydGVkXCIpKTtcbiAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFp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