From c682462415302bd590ba6e3f2d7e62523f4ad7ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel?= Date: Mon, 13 Jul 2026 07:49:37 +0000 Subject: [PATCH] fix(producer): skip slow TTC recompression --- .../deterministicFonts-systemCapture.test.ts | 7 ++++++- .../producer/src/services/deterministicFonts.ts | 6 +++++- .../src/services/fontCompression.test.ts | 16 ++++++++++++---- .../producer/src/services/fontCompression.ts | 3 +++ 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/packages/producer/src/services/deterministicFonts-systemCapture.test.ts b/packages/producer/src/services/deterministicFonts-systemCapture.test.ts index e04117d576..87c716b906 100644 --- a/packages/producer/src/services/deterministicFonts-systemCapture.test.ts +++ b/packages/producer/src/services/deterministicFonts-systemCapture.test.ts @@ -12,7 +12,7 @@ import { describe, expect, it } from "bun:test"; import { existsSync } from "node:fs"; -import { injectDeterministicFontFaces } from "./deterministicFonts.js"; +import { fontFormatHint, injectDeterministicFontFaces } from "./deterministicFonts.js"; // A font family that is NOT in FONT_ALIASES but exists on macOS as // /System/Library/Fonts/Supplemental/Impact.ttf. When Google Fonts @@ -36,6 +36,11 @@ function makeHttp400Fetch(): typeof fetch { } describe("system font capture — allowSystemFontCapture option", () => { + it("uses the CSS collection hint for raw TTC data URIs", () => { + expect(fontFormatHint("data:font/collection;base64,AA==")).toBe("collection"); + expect(fontFormatHint("data:font/woff2;base64,AA==")).toBe("woff2"); + }); + it("does not attempt system font capture when allowSystemFontCapture is false", async () => { const html = makeHtml("NotARealFontFamilyForTest"); const result = await injectDeterministicFontFaces(html, { diff --git a/packages/producer/src/services/deterministicFonts.ts b/packages/producer/src/services/deterministicFonts.ts index 2805bae2e9..c8b3eddc07 100644 --- a/packages/producer/src/services/deterministicFonts.ts +++ b/packages/producer/src/services/deterministicFonts.ts @@ -432,6 +432,10 @@ function extractRequestedFontFamilies(html: string): Map { return requested; } +export function fontFormatHint(src: string): "collection" | "woff2" { + return src.startsWith("data:font/collection;") ? "collection" : "woff2"; +} + function buildFontFaceRule( familyName: string, src: string, @@ -442,7 +446,7 @@ function buildFontFaceRule( return [ "@font-face {", ` font-family: "${familyName}";`, - ` src: url("${src}") format("woff2");`, + ` src: url("${src}") format("${fontFormatHint(src)}");`, ` font-style: ${style};`, ` font-weight: ${weight};`, " font-display: block;", diff --git a/packages/producer/src/services/fontCompression.test.ts b/packages/producer/src/services/fontCompression.test.ts index 92969481b1..a1a65d2650 100644 --- a/packages/producer/src/services/fontCompression.test.ts +++ b/packages/producer/src/services/fontCompression.test.ts @@ -72,9 +72,17 @@ describe("fontToDataUri", () => { expect(uri).toMatch(/^data:font\/otf;base64,/); }); - it("falls back with correct MIME type for ttc", async () => { - const garbage = Buffer.from("not a font"); - const uri = await fontToDataUri(garbage, "ttc"); - expect(uri).toMatch(/^data:font\/collection;base64,/); + it("embeds ttc collections raw without attempting slow woff2 compression", async () => { + const warnings: unknown[][] = []; + const originalWarn = console.warn; + console.warn = (...args: unknown[]) => warnings.push(args); + try { + const raw = Buffer.from("ttc-bytes"); + const uri = await fontToDataUri(raw, "ttc"); + expect(uri).toBe(`data:font/collection;base64,${raw.toString("base64")}`); + expect(warnings).toHaveLength(0); + } finally { + console.warn = originalWarn; + } }); }); diff --git a/packages/producer/src/services/fontCompression.ts b/packages/producer/src/services/fontCompression.ts index d6be0df43e..213f058ad9 100644 --- a/packages/producer/src/services/fontCompression.ts +++ b/packages/producer/src/services/fontCompression.ts @@ -22,6 +22,9 @@ export async function fontToDataUri(input: Buffer, originalFormat: string): Prom if (originalFormat === "woff2") { return `data:font/woff2;base64,${input.toString("base64")}`; } + if (originalFormat === "ttc") { + return `data:font/collection;base64,${input.toString("base64")}`; + } try { const compressed = await compressToWoff2(input); return `data:font/woff2;base64,${compressed.toString("base64")}`;