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)}