## Demo: cache-events ### CacheEvents.svelte ```svelte
Cached value {time}
Status {status}

Refresh under 3s for a fresh hit. Refresh between 3–10s for stale + a background revalidate. After 10s the next refresh blocks on a fresh fetch (expired). Each event logs to your server console.

``` ### log.ts ```ts import { MochiCache, mochiEvents, logger } from 'mochi-framework'; import { delay } from '../../components/utils'; export const slowClock = new MochiCache({ minTimeToStale: 3_000, maxTimeToLive: 10_000, }); // Custom integration: every cache event is printed via mochi-framework's `logger` // with an in-message tag so it's easy to grep alongside the framework's own // lines. setHandler (rather than .on) means dev re-imports don't pile up // duplicate subscribers. mochiEvents.setHandler('demo:cache-events:read', 'cache:read', ({ key, status }) => { logger.info(`[demo:cache-events] read ${key} → ${status}`); }); mochiEvents.setHandler('demo:cache-events:revalidate', 'cache:revalidate', ({ key }) => { logger.info(`[demo:cache-events] revalidate ${key}`); }); export async function getSlowTime() { return slowClock.fetchWithStatus('slow-clock', async () => { await delay(150); return new Date().toISOString(); }); } ``` ### routes.ts ```ts import { Mochi } from 'mochi-framework'; import type { MochiRouteValue } from 'mochi-framework'; export const routes: Record = { '/demos/cache-events': Mochi.page('./src/demos/cache-events/CacheEvents.svelte'), }; ``` ### index.ts ```ts import { Mochi, logger } from 'mochi-framework'; await Mochi.serve({ port: 3333, development: process.env.MODE === 'development', routes: { '/': Mochi.page('./src/Home.svelte'), }, }); logger.info('Server running at http://localhost:3333'); ```