Getting Started

Build fetch-style servers with middleware, invocation context, and runtime adapters.

Install

npm i @hornjs/fest

Quick Start

Create a server entry:

server.ts
import { serve } from "@hornjs/fest";
import { NodeRuntimeAdapter } from "@hornjs/fest/node";

serve({
  adapter: new NodeRuntimeAdapter(),
  fetch() {
    return Response.json({ hello: "world" });
  },
});

Run it with Node.js:

node --experimental-strip-types server.ts

Quick Start with CLI

Create a default entry file:

server.ts
export default {
  fetch() {
    return new Response("Hello from fest");
  },
};

Then run:

npx @hornjs/fest

Or after installation, run the installed binary directly:

fest

The CLI will look for common entry names such as:

  • server.ts
  • server.mjs
  • src/server.ts
  • src/server.mjs

If your entry uses another name or extension, pass it explicitly:

fest --entry ./server.tsx --import jiti/register
Read more in Using the CLI.

Runtime Adapters

fest keeps request handling runtime-agnostic. You provide an adapter for the host environment you want to run on.

  • @hornjs/fest/node
  • @hornjs/fest/bun
  • @hornjs/fest/deno
  • @hornjs/fest/stream

Main Exports

import {
  Server,
  ServerServeEvent,
  ServerCloseEvent,
  ServerErrorEvent,
  serve,
  createContextKey,
} from "@hornjs/fest";
import { log } from "@hornjs/fest/log";
import { serveStatic } from "@hornjs/fest/static";
import { StreamRuntimeAdapter } from "@hornjs/fest/stream";

Examples

The repository includes runnable examples under examples/:

  • examples/basic/node.ts
  • examples/basic/bun.ts
  • examples/basic/deno.ts
  • examples/basic/stream.ts
  • examples/jsx/server.tsx