UNPKG

@platform/react.ssr

Version:

An SSR (server-side-render) system for react apps bundled with ParcelJS and hosted on S3.

75 lines (74 loc) 2.85 kB
import { parse as parseUrl } from 'url'; import { log } from '../common'; import { Manifest } from '../manifest'; export function init(args) { const { router, manifestUrl, baseUrl } = args; const manifestFromCacheOrS3 = (args = {}) => { const { force } = args; return Manifest.get({ manifestUrl, baseUrl, force, loadBundleManifest: true }); }; router.get('/.manifest/summary', async (req) => { const manifest = await manifestFromCacheOrS3(); const sites = manifest.sites.reduce((acc, next) => { const { name, version, size } = next; return Object.assign({}, acc, { [name]: { version, size } }); }, {}); return { status: 200, headers: { 'Cache-Control': `s-maxage=10, stale-while-revalidate` }, data: { sites }, }; }); router.get('/.manifest', async (req) => { const manifest = await manifestFromCacheOrS3(); return { status: 200, headers: { 'Cache-Control': `s-maxage=10, stale-while-revalidate` }, data: manifest.toObject(), }; }); router.post('/.manifest', async (req) => { const manifest = await manifestFromCacheOrS3({ force: true }); log.info(`Manifest cache reset.`); return { status: 200, data: manifest.toObject(), }; }); router.get('*', async (req) => { const manifest = await manifestFromCacheOrS3(); if (!manifest.ok) { const status = manifest.status; const message = 'Manifest could not be loaded.'; return { status, data: { status, message } }; } const hostname = (req.headers.host || '').split(':')[0]; const site = manifest.site.byHost(hostname); if (!site) { const status = 404; const message = `A site definition for the domain '${hostname}' does not exist in the manifest.`; return { status, data: { status, message } }; } const url = parseUrl(req.url || '', false); const route = site.route(url.pathname); const headers = { 'Cache-Control': `s-maxage=10, stale-while-revalidate` }; if (route) { const entry = await route.entry(); if (entry.ok) { return { headers, data: entry.html }; } else { const { status, url } = entry; const message = `Failed to get entry HTML from CDN.`; return { status, data: { status, message, url } }; } } const location = site.redirectUrl(url.pathname); if (location) { const status = 307; return { status, headers, data: location }; } return undefined; }); return router; }