Monorepo for Tangled
tangled.org
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}