@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
JavaScript
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;
}