import fs from 'node:fs'; import { Resvg } from '@resvg/resvg-js'; import moment from 'moment-timezone'; import * as tests from './speedtests.js'; import axios from 'axios'; import { html } from 'satori-html'; import satori from 'satori'; async function generateOpenGraphImage(req) { const today = new Date(); const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); const formatDate = (d) => d.toISOString().split('T')[0]; const test = await tests.listStatistics(formatDate(yesterday), formatDate(today)); 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 localFontPath = `client/public${fontPath}`; const font = fs.existsSync(localFontPath) ? await fs.promises.readFile(localFontPath) : (await axios.get(`${req.protocol}://${req.hostname}${fontPath}`)).data; 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(); } export default generateOpenGraphImage;