const FS = require('fs'); const OS = require('os'); const Express = require('express'); const CrossFetch = require('cross-fetch'); const DNSCache = require('dnscache'); const Crypto = require('crypto'); const SpiderDetector = require('spider-detector') const ReactDOMServer = require('react-dom/server'); const ClientApp = require('./client/app'); // enable DNS caching let dnsCache = DNSCache({ enable: true, ttl: 300, cachesize: 100 }); const basePath = `/`; const perPage = 10; const serverPort = 80; const wordpressHost = process.env.WORDPRESS_HOST; const nginxHost = process.env.NGINX_HOST; const nginxCache = process.env.NGINX_CACHE; let wordpressIP; dnsCache.lookup(wordpressHost, (err, result) => { if (!err) { wordpressIP = `::ffff:${result}`; } }); let app = Express(); app.set('json spaces', 2); app.use(SpiderDetector.middleware()); app.use(`/`, Express.static(`${__dirname}/www`)); app.get('/.mtime', handleTimestampRequest); app.get(`/*`, handlePageRequest); app.purge(`/*`, handlePurgeRequest); app.use(handleError); app.listen(serverPort); async function handlePageRequest(req, res, next) { try { let host = `http://${nginxHost}`; let path = req.url; let noScript = (req.query.js === '0') let target = (req.isSpider() || noScript) ? 'seo' : 'hydrate'; let sourceURLs = []; // create a fetch() that remembers the URLs used let fetch = (url, options) => { console.log(`Fetching: ${url}`); if (url.startsWith(host)) { var relURL = url.substr(host.length); sourceURLs.push(relURL); } return CrossFetch(url, options); }; let options = { host, path, target, fetch }; let rootNode = await ClientApp.render(options); let appHTML = ReactDOMServer.renderToString(rootNode); let indexHTMLPath = `${__dirname}/client/index.html`; let html = await replaceHTMLComment(indexHTMLPath, 'APP', appHTML); if (target === 'hydrate') { // add