🍡 mochi

SSR framework for Svelte 5 + Bun with islands-based selective hydration

Middleware (hooks)

Middleware uses SvelteKit-style Handle functions. Compose multiple handlers with sequence():

import { sequence } from './mochi-framework/hooks';
import type { Handle } from './mochi-framework/hooks';

const auth: Handle = async ({ event, resolve }) => {
  if (!event.request.headers.get('Authorization')) {
    return new Response('Unauthorized', { status: 401 });
  }
  return resolve(event);
};

const logging: Handle = async ({ event, resolve }) => {
  console.log('→', event.url.pathname);
  const response = await resolve(event);
  console.log('←', response.status);
  return response;
};

await Mochi.serve({
  handle: sequence(auth, logging),
  routes,
});

event.locals is a per-request object for passing data between middleware layers.

resolve() accepts options for post-processing:

  • transformPageChunk({ html }) — transform the HTML response before sending
  • filterResponseHeaders(name, value) — filter which headers are included