const fs = require("fs"); const resvg = require("@resvg/resvg-js").Resvg; const moment = require("moment-timezone"); const tests = require("../controller/speedtests"); const axios = require("axios"); async function generateOpenGraphImage(req) { const test = await tests.listStatistics(1); if (!test.download.avg || !test.upload.avg || !test.ping.avg) { throw new Error("Error fetching OpenGraph data"); } const fontPath = "/assets/fonts/inter-v12-latin-regular.ttf"; const font = process.env.NODE_ENV === "production" ? (await axios.get(`${req.protocol}://${req.hostname}${fontPath}`)).data : await fs.promises.readFile(`client/public${fontPath}`); const html = (await import("satori-html")).html; const satori = (await import("satori")).default; const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; const date = moment().tz(timeZone).format("MM/DD/YYYY"); const time = moment().tz(timeZone).format("h:mm A z"); const markup = html`

MySpeed

${date}

${time}

DOWNLOAD

Mbps

${String(test.download.avg)}

UPLOAD

Mbps

${String(test.upload.avg)}

Ping

ms

${String(test.ping.avg)}

`; const image = await satori(markup, { width: 1200, height: 600, fonts: [ { name: "Inter", data: font, weight: 400, style: "normal", }, ], }); const svg = new resvg(image); return svg.render().asPng(); } module.exports = generateOpenGraphImage;