UNPKG

@cf-wasm/og

Version:

Generate Open Graph Images dynamically from HTML/CSS without a browser.

55 lines (54 loc) 1.74 kB
// src/core/asset.ts import { getIconCode, loadEmoji } from "./emoji.js"; import { loadGoogleFont } from "./font.js"; import { FontDetector, LANGUAGE_FONT_MAP } from "./language.js"; var DETECTOR = new FontDetector(); var ASSET_CACHE_MAP = /* @__PURE__ */ new Map(); var loadSatoriAsset = async (languageCode, segment, emoji) => { if (languageCode === "emoji") { return `data:image/svg+xml;base64,${btoa(await loadEmoji(getIconCode(segment), emoji))}`; } const codes = languageCode.split("|"); const names = codes.map((code) => LANGUAGE_FONT_MAP[code]).filter(Boolean).flat(); if (names.length !== 0) { try { const textByFont = await DETECTOR.detect(segment, names); const fonts = Object.keys(textByFont); const fontData = await Promise.all( fonts.map( (font) => loadGoogleFont(font, { text: textByFont[font], weight: 400 }) ) ); return fontData.map((data, index) => ({ name: `satori_${codes[index]}_fallback_${segment}`, data, weight: 400, style: "normal", lang: codes[index] === "unknown" ? void 0 : codes[index] })); } catch (e) { console.warn(`(@cf-wasm/og) [ WARN ] Failed to load dynamic font for segment \`${segment}\`. `, e); } } return []; }; var loadDynamicAsset = async (languageCode, segment, emoji) => { const key = `${languageCode}:${segment}`; if (ASSET_CACHE_MAP.has(key)) { const cache = ASSET_CACHE_MAP.get(key); return cache ?? []; } const asset = await loadSatoriAsset(languageCode, segment, emoji); ASSET_CACHE_MAP.set(key, asset); return asset; }; export { ASSET_CACHE_MAP, DETECTOR, loadDynamicAsset, loadSatoriAsset };