import type { MiddlewareHandler } from "hono"; import type { WebAppEnv } from "../lib/theme-resolution.js"; import { resolveTheme, FALLBACK_THEME } from "../lib/theme-resolution.js"; import { ThemeCache } from "../lib/theme-cache.js"; import { logger } from "../lib/logger.js"; const DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes export function createThemeMiddleware( appviewUrl: string, cacheTtlMs: number = DEFAULT_CACHE_TTL_MS ): MiddlewareHandler { // Intentionally outside the request handler: one shared instance per server // startup. Moving this inside the handler would create a new cache per // request, silently defeating the feature. const cache = new ThemeCache(cacheTtlMs); return async (c, next) => { const cookieHeader = c.req.header("Cookie"); const colorSchemeHint = c.req.header("Sec-CH-Prefers-Color-Scheme"); let theme; try { theme = await resolveTheme(appviewUrl, cookieHeader, colorSchemeHint, cache); } catch (error) { logger.error("createThemeMiddleware: resolveTheme threw unexpectedly — using fallback", { operation: "createThemeMiddleware", error: error instanceof Error ? error.message : String(error), }); theme = FALLBACK_THEME; } c.set("theme", theme); await next(); }; }