// import cookieParser = require('cookie-parser'); import serialize from 'serialize-javascript'; import express from 'express'; import { StaticRouter } from 'inferno-router'; import { renderToString } from 'inferno-server'; import { matchPath } from 'inferno-router'; import path from 'path'; import { App } from '../shared/components/app'; import { IsoData } from '../shared/interfaces'; import { routes } from '../shared/routes'; import IsomorphicCookie from 'isomorphic-cookie'; import { lemmyHttp, setAuth } from '../shared/utils'; import { GetSiteForm } from 'lemmy-js-client'; import process from 'process'; import { Helmet } from 'inferno-helmet'; import { initializeSite } from '../shared/initialize'; const server = express(); const port = 1234; server.use(express.json()); server.use(express.urlencoded({ extended: false })); server.use('/static', express.static(path.resolve('./dist'))); // server.use(cookieParser()); server.get('/*', async (req, res) => { const activeRoute = routes.find(route => matchPath(req.path, route)) || {}; const context = {} as any; let auth: string = IsomorphicCookie.load('jwt', req); let getSiteForm: GetSiteForm = {}; setAuth(getSiteForm, auth); let promises: Promise[] = []; // Get site data first let site = await lemmyHttp.getSite(getSiteForm); initializeSite(site); if (activeRoute.fetchInitialData) { promises.push(...activeRoute.fetchInitialData(auth, req.path)); } let routeData = await Promise.all(promises); // Redirect to the 404 if there's an API error if (routeData[0] && routeData[0].error) { let errCode = routeData[0].error; return res.redirect(`/404?err=${errCode}`); } let acceptLang = req.headers['accept-language'] ? req.headers['accept-language'].split(',')[0] : 'en'; let lang = !!site.my_user ? site.my_user.lang == 'browser' ? acceptLang : 'en' : acceptLang; let isoData: IsoData = { path: req.path, site, routeData, lang, }; const wrapper = ( ); if (context.url) { return res.redirect(context.url); } const root = renderToString(wrapper); const helmet = Helmet.renderStatic(); res.send(` ${helmet.title.toString()} ${helmet.meta.toString()} ${helmet.link.toString()}
${root}
`); }); let Server = server.listen(port, () => { console.log(`http://localhost:${port}`); }); /** * Used to restart server by fuseBox */ export async function shutdown() { Server.close(); Server = undefined; } process.on('SIGINT', () => { console.info('Interrupted'); process.exit(0); });