import config from 'config'; import { renderPage } from 'vike/server'; // eslint-disable-line import/extensions import { fetchUserStashes } from '../stashes.js'; import { fetchUserTemplates } from '../users.js'; import { fetchUnseenNotificationsCount } from '../alerts.js'; export default async function mainHandler(req, res, next) { const [stashes, templates, unseenNotifications] = req.user ? await Promise.all([ fetchUserStashes(req.user.id, req.user), fetchUserTemplates(req.user), fetchUnseenNotificationsCount(req.user), ]) : []; const pageContextInit = { urlOriginal: req.originalUrl, urlQuery: req.query, // vike's own query does not apply boolean parser headers: req.headers, cookies: req.cookies, tagFilter: req.tagFilter, user: req.user && { id: req.user.id, username: req.user.username, email: req.user.email, avatar: req.user.avatar, }, assets: req.user ? { stashes, primaryStash: stashes.find((stash) => stash.isPrimary), templates, unseenNotifications, } : null, env: { theme: req.cookies.theme || req.headers['sec-ch-prefers-color-scheme'] || 'light', selectedTemplate: Number(req.cookies.selectedTemplate) || 0, allowLogin: config.auth.login, allowSignup: config.auth.signup, maxMatches: config.database.manticore.maxMatches, maxAggregateSize: config.database.manticore.maxAggregateSize, media: config.media, psa: config.psa, links: config.links, }, meta: { now: new Date().toISOString(), }, }; const pageContext = await renderPage(pageContextInit); const { httpResponse } = pageContext; if (pageContext.errorWhileRendering) { console.error(pageContext.errorWhileRendering); } if (!httpResponse) { next(); return; } /* if (res.writeEarlyHints) { res.writeEarlyHints({ link: httpResponse.earlyHints.map((e) => e.earlyHintLink) }); } */ httpResponse.headers.forEach(([name, value]) => res.setHeader(name, value)); res.status(httpResponse.statusCode); // For HTTP streams use httpResponse.pipe() instead, see https://vike.dev/stream res.send(httpResponse.body); }