UNPKG

@cf-wasm/og

Version:

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

54 lines (53 loc) 1.97 kB
import { ASSET_CACHE_MAP } from "./maps.js"; import { loadGoogleFont } from "./font.js"; import { getIconCode, loadEmoji } from "./emoji.js"; import { FontDetector, LANGUAGE_FONT_MAP } from "./language.js"; //#region src/core/asset.ts /** Font detector */ const DETECTOR = new FontDetector(); /** Loads dynamic asset requested by satori without caching */ async function loadSatoriAsset(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); return (await Promise.all(fonts.map((font) => loadGoogleFont(font, { text: textByFont[font], weight: 400 })))).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}\`.\n`, e); } return []; } /** * Loads dynamic assets requested by satori * * @param languageCode The language code * @param segment The text * @param emoji The {@link EmojiType} * * @returns On success, the asset as either string or {@link Font} */ async function loadDynamicAsset(languageCode, segment, emoji) { /** Get a key from input */ const key = JSON.stringify([languageCode, segment]); if (ASSET_CACHE_MAP.has(key)) { const cache = ASSET_CACHE_MAP.get(key); return cache !== null && cache !== void 0 ? cache : []; } const asset = await loadSatoriAsset(languageCode, segment, emoji); ASSET_CACHE_MAP.set(key, asset); return asset; } //#endregion export { DETECTOR, loadDynamicAsset, loadSatoriAsset }; //# sourceMappingURL=asset.js.map