import express, { type Express } from "express"; import fs from "fs"; import path from "path"; import { storage } from "./storage"; function escapeHtml(str: string): string { return str.replace(/&/g, "&").replace(/"/g, """).replace(//g, ">"); } function ogImageUrl(coverImage: string, baseUrl: string): string { if (!coverImage) return ""; let imgPath = coverImage; if (imgPath.endsWith(".webp")) { imgPath = imgPath.replace(/\.webp$/, ".jpg"); } return imgPath.startsWith("http") ? imgPath : `${baseUrl}${imgPath}`; } export function serveStatic(app: Express) { const distPath = path.resolve(__dirname, "public"); if (!fs.existsSync(distPath)) { throw new Error( `Could not find the build directory: ${distPath}, make sure to build the client first`, ); } app.use(express.static(distPath, { setHeaders(res, filePath) { if (filePath.endsWith("og-image.jpg") || filePath.includes("/uploads/")) { res.setHeader("Cache-Control", "public, max-age=86400"); } }, })); app.use("/{*path}", async (req, res) => { const url = req.originalUrl; const indexPath = path.resolve(distPath, "index.html"); const articleMatch = url.match(/^\/article\/([^?#]+)/); if (articleMatch) { try { const slug = decodeURIComponent(articleMatch[1]); const article = await storage.getArticleBySlug(slug); if (article) { const host = req.get("host") || "folx.tv"; const protocol = req.get("x-forwarded-proto") || "https"; const baseUrl = `${protocol}://${host}`; const articleUrl = `${baseUrl}/article/${article.slug}`; const imageUrl = ogImageUrl(article.coverImage || "", baseUrl); let template = await fs.promises.readFile(indexPath, "utf-8"); const finalImage = imageUrl || `${baseUrl}/og-image.jpg`; const ogTags = [ ``, ``, ``, ``, ``, ``, ``, ``, ``, ``, ``, ``, ``, `${escapeHtml(article.title)} - Folx Music Television`, ].join("\n "); template = template.replace(/]*>\s*/g, ""); template = template.replace(/[^<]*<\/title>/, ogTags); res.status(200).set({ "Content-Type": "text/html" }).end(template); return; } } catch (e) { } } const host = req.get("host") || "folx.tv"; const protocol = req.get("x-forwarded-proto") || "https"; const baseUrl = `${protocol}://${host}`; let template = await fs.promises.readFile(indexPath, "utf-8"); template = template.replace(/https:\/\/www\.folx\.tv\//g, `${baseUrl}/`); template = template.replace(/https:\/\/www\.folx\.tv\/og-image\.jpg/g, `${baseUrl}/og-image.jpg`); res.status(200).set({ "Content-Type": "text/html" }).end(template); }); }