import { assets, type Asset } from './assets.generated.ts' const decoded = new Map>() function body(path: string, asset: Asset): BodyInit { if (asset.text != null) return asset.text let bytes = decoded.get(path) if (!bytes) { const bin = atob(asset.base64 ?? '') bytes = new Uint8Array(bin.length) for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i) decoded.set(path, bytes) } return bytes } function respond(path: string, method: string) { const asset = assets[path] if (!asset) return null return new Response(method === 'HEAD' ? null : body(path, asset), { headers: { 'content-type': asset.type, 'cache-control': path.endsWith('.html') ? 'no-cache' : 'public, max-age=3600', 'x-content-type-options': 'nosniff', }, }) } /** * Kody strips the package mount before forwarding. `/` is the landing page, * `/demo` the phone demo (step in the #hash), `/graph` the benchmark chart. * Pages only use relative URLs, so they work under any prefix. */ export default { async fetch(request: Request): Promise { if (request.method !== 'GET' && request.method !== 'HEAD') { return new Response('Method not allowed', { status: 405 }) } const { pathname } = new URL(request.url) const clipAt = pathname.indexOf('/c/') if (clipAt !== -1) { const path = 'c/' + decodeURIComponent(pathname.slice(clipAt + 3)) return ( respond(path, request.method) ?? new Response('Not found', { status: 404 }) ) } // The browser's preload scanner can fetch before a page's runtime // exists, resolving it beside the page instead; serve those too. const bare = pathname.match(/\/((?:assets|fonts|icons)\/.+)$/) if (bare) { const hit = respond('c/' + decodeURIComponent(bare[1]), request.method) if (hit) return hit } if (pathname.endsWith('/favicon.ico')) { return respond('c/icons/favicon.ico', request.method) as Response } if (pathname.endsWith('/health')) { return Response.json({ ok: true }) } const page = pathname.replace(/\/+$/, '') if (page === '' ) return respond('home.html', request.method) as Response if (page === '/demo') return respond('index.html', request.method) as Response if (page === '/graph') return respond('graph.html', request.method) as Response return new Response('Not found', { status: 404 }) }, }