@cf-wasm/og
Version:
Generate Open Graph Images dynamically from HTML/CSS without a browser.
53 lines (52 loc) • 2.06 kB
JavaScript
const require_maps = require("./maps.cjs");
const require_font = require("./font.cjs");
const require_emoji = require("./emoji.cjs");
const require_language = require("./language.cjs");
//#region src/core/asset.ts
/** Font detector */
const DETECTOR = new require_language.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 require_emoji.loadEmoji(require_emoji.getIconCode(segment), emoji))}`;
const codes = languageCode.split("|");
const names = codes.map((code) => require_language.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) => require_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 (require_maps.ASSET_CACHE_MAP.has(key)) return require_maps.ASSET_CACHE_MAP.get(key) ?? [];
const asset = await loadSatoriAsset(languageCode, segment, emoji);
require_maps.ASSET_CACHE_MAP.set(key, asset);
return asset;
}
//#endregion
exports.DETECTOR = DETECTOR;
exports.loadDynamicAsset = loadDynamicAsset;
exports.loadSatoriAsset = loadSatoriAsset;
//# sourceMappingURL=asset.cjs.map