'use strict'; require('@babel/register')({ presets: [['@babel/preset-react', {runtime: 'automatic'}]], plugins: ['@babel/plugin-transform-modules-commonjs'], only: [/\/src\//], }); const http = require('http'); const {Readable} = require('stream'); const webpack = require('webpack'); const {clientManifest, ssrManifest} = require('./webpack-mock'); const { renderFizzNode, renderFizzEdge, renderFlightFizzNode, renderFlightFizzEdge, } = require('./render-helpers'); const {printGrid} = require('./print-helpers'); const fs = require('fs'); const JSON_OUT = (function () { const arg = process.argv.find(function (a) { return a.startsWith('--json-out='); }); return arg ? arg.slice('--json-out='.length) : null; })(); const jsonResults = []; // --------------------------------------------------------------------------- // Build // --------------------------------------------------------------------------- function build() { const config = require('./webpack.config'); return new Promise(function (resolve, reject) { webpack(config, function (err, stats) { if (err) { reject(err); return; } if (stats.hasErrors()) { reject(new Error(stats.toString({errors: true}))); return; } console.log( stats.toString({colors: true, modules: false, entrypoints: false}) ); resolve(); }); }); } // --------------------------------------------------------------------------- // Server // --------------------------------------------------------------------------- const ITEM_COUNT = 200; const PORT = 3001; async function main() { console.log('Building RSC bundle...\n'); await build(); const { renderRSCNode, renderRSCEdge, App: RSCApp, AppAsync: RSCAppAsync, } = require('./build/rsc-bundle.js'); const App = require('./src/App.js').default; const AppAsync = require('./src/AppAsync.js').default; function pipeStreamToRes(stream, res) { if (typeof stream.pipe === 'function') { // Node Readable stream stream.pipe(res); } else { // Web ReadableStream — convert to Node stream for HTTP response Readable.fromWeb(stream).pipe(res); } } function pipeToRes(streamOrPromise, res) { if (typeof streamOrPromise.then === 'function') { streamOrPromise.then( function (stream) { pipeStreamToRes(stream, res); }, function (err) { console.error(err); if (!res.headersSent) res.writeHead(500); res.end(); } ); } else { pipeStreamToRes(streamOrPromise, res); } } const routes = { '/fizz-node-sync': function (res) { pipeToRes(renderFizzNode(App, ITEM_COUNT), res); }, '/fizz-node-async': function (res) { pipeToRes(renderFizzNode(AppAsync, ITEM_COUNT), res); }, '/fizz-edge-sync': function (res) { pipeToRes(renderFizzEdge(App, ITEM_COUNT), res); }, '/fizz-edge-async': function (res) { pipeToRes(renderFizzEdge(AppAsync, ITEM_COUNT), res); }, '/flight-node-sync': function (res) { pipeToRes( renderFlightFizzNode( renderRSCNode, RSCApp, ITEM_COUNT, clientManifest, ssrManifest ), res ); }, '/flight-node-sync.rsc': function (res) { pipeStreamToRes(renderRSCNode(clientManifest, RSCApp, ITEM_COUNT), res); }, '/flight-node-async': function (res) { pipeToRes( renderFlightFizzNode( renderRSCNode, RSCAppAsync, ITEM_COUNT, clientManifest, ssrManifest ), res ); }, '/flight-node-async.rsc': function (res) { pipeStreamToRes( renderRSCNode(clientManifest, RSCAppAsync, ITEM_COUNT), res ); }, '/flight-edge-sync': function (res) { pipeToRes( renderFlightFizzEdge( renderRSCEdge, RSCApp, ITEM_COUNT, clientManifest, ssrManifest ), res ); }, '/flight-edge-sync.rsc': function (res) { pipeStreamToRes(renderRSCEdge(clientManifest, RSCApp, ITEM_COUNT), res); }, '/flight-edge-async': function (res) { pipeToRes( renderFlightFizzEdge( renderRSCEdge, RSCAppAsync, ITEM_COUNT, clientManifest, ssrManifest ), res ); }, '/flight-edge-async.rsc': function (res) { pipeStreamToRes( renderRSCEdge(clientManifest, RSCAppAsync, ITEM_COUNT), res ); }, }; const server = http.createServer(function (req, res) { const handler = routes[req.url]; if (!handler) { if (req.url === '/' || req.url === '') { res.writeHead(200, {'Content-Type': 'text/html'}); res.end( '