109 lines
2.5 KiB
JavaScript
109 lines
2.5 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const babelRegister = require('@babel/register');
|
|
babelRegister({
|
|
ignore: [/[\\\/](build|server\/server|node_modules)[\\\/]/],
|
|
presets: [['react-app', {runtime: 'automatic'}]],
|
|
plugins: ['@babel/transform-modules-commonjs'],
|
|
});
|
|
|
|
const express = require('express');
|
|
const compress = require('compression');
|
|
const {readFileSync} = require('fs');
|
|
const path = require('path');
|
|
const renderToString = require('./render-to-string');
|
|
const renderToStream = require('./render-to-stream');
|
|
const renderToBuffer = require('./render-to-buffer');
|
|
const {JS_BUNDLE_DELAY} = require('./delays');
|
|
|
|
const PORT = process.env.PORT || 4000;
|
|
const app = express();
|
|
|
|
app.use(compress());
|
|
app.get(
|
|
'/',
|
|
handleErrors(async function (req, res) {
|
|
await waitForWebpack();
|
|
renderToStream(req.url, res);
|
|
})
|
|
);
|
|
app.get(
|
|
'/string',
|
|
handleErrors(async function (req, res) {
|
|
await waitForWebpack();
|
|
renderToString(req.url, res);
|
|
})
|
|
);
|
|
app.get(
|
|
'/stream',
|
|
handleErrors(async function (req, res) {
|
|
await waitForWebpack();
|
|
renderToStream(req.url, res);
|
|
})
|
|
);
|
|
app.get(
|
|
'/buffer',
|
|
handleErrors(async function (req, res) {
|
|
await waitForWebpack();
|
|
renderToBuffer(req.url, res);
|
|
})
|
|
);
|
|
app.use(express.static('build'));
|
|
app.use(express.static('public'));
|
|
|
|
app
|
|
.listen(PORT, () => {
|
|
console.log(`Listening at ${PORT}...`);
|
|
})
|
|
.on('error', function (error) {
|
|
if (error.syscall !== 'listen') {
|
|
throw error;
|
|
}
|
|
const isPipe = portOrPipe => Number.isNaN(portOrPipe);
|
|
const bind = isPipe(PORT) ? 'Pipe ' + PORT : 'Port ' + PORT;
|
|
switch (error.code) {
|
|
case 'EACCES':
|
|
console.error(bind + ' requires elevated privileges');
|
|
process.exit(1);
|
|
break;
|
|
case 'EADDRINUSE':
|
|
console.error(bind + ' is already in use');
|
|
process.exit(1);
|
|
break;
|
|
default:
|
|
throw error;
|
|
}
|
|
});
|
|
|
|
function handleErrors(fn) {
|
|
return async function (req, res, next) {
|
|
try {
|
|
return await fn(req, res);
|
|
} catch (x) {
|
|
next(x);
|
|
}
|
|
};
|
|
}
|
|
|
|
async function waitForWebpack() {
|
|
while (true) {
|
|
try {
|
|
readFileSync(path.resolve(__dirname, '../build/main.js'));
|
|
return;
|
|
} catch (err) {
|
|
console.log(
|
|
'Could not find webpack build output. Will retry in a second...'
|
|
);
|
|
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
}
|
|
}
|
|
}
|