Monorepo for Tangled tangled.org
at master 60 lines 1.6 kB view raw
1/** 2 * Cloudflare Workers runtime implementation 3 * Uses ?module suffix for WASM imports as required by Wrangler 4 */ 5import type { FontData, SatoriFn, ResvgClass } from "./types"; 6 7import inter400 from "@fontsource/inter/files/inter-latin-400-normal.woff"; 8import inter500 from "@fontsource/inter/files/inter-latin-500-normal.woff"; 9import inter600 from "@fontsource/inter/files/inter-latin-600-normal.woff"; 10 11let satoriFn: SatoriFn | null = null; 12let resvgInitialized = false; 13let Resvg: ResvgClass | null = null; 14 15export async function initSatori(): Promise<SatoriFn> { 16 if (satoriFn) return satoriFn; 17 18 const { default: satori, init } = await import("satori/standalone"); 19 const wasmModule = (await import("satori/yoga.wasm?module")).default; 20 await init(wasmModule); 21 satoriFn = satori; 22 23 return satoriFn; 24} 25 26export async function initResvg(): Promise<ResvgClass> { 27 if (resvgInitialized) return Resvg!; 28 29 const { Resvg: ResvgClass, initWasm } = await import("@resvg/resvg-wasm"); 30 const wasmModule = (await import("@resvg/resvg-wasm/index_bg.wasm?module")) 31 .default; 32 await initWasm(wasmModule); 33 34 Resvg = ResvgClass; 35 resvgInitialized = true; 36 return Resvg; 37} 38 39export async function loadFonts(): Promise<FontData[]> { 40 return [ 41 { 42 name: "Inter", 43 data: inter400 as ArrayBuffer, 44 weight: 400, 45 style: "normal", 46 }, 47 { 48 name: "Inter", 49 data: inter500 as ArrayBuffer, 50 weight: 500, 51 style: "normal", 52 }, 53 { 54 name: "Inter", 55 data: inter600 as ArrayBuffer, 56 weight: 600, 57 style: "normal", 58 }, 59 ]; 60}