Getting Started
Build HTTP servers with web standard APIs like fetch, Request, and Response.
#Quick Start (CLI)
Create a server entry:
export default {
fetch(req: Request) {
return Response.json({ hello: "world!" });
},
};Then, run the server using your favorite runtime:
npx srvxTip
You can also try examples in the online playground
#Quick Start (API)
Instead of using the srvx CLI, you can directly import the serve method to define a self-listening server entry.
Create a server entry:
import { serve } from "srvx";
const server = serve({
fetch(request) {
return Response.json({ hello: "world!" });
},
});Install srvx as a dependency:
npm i srvxThen, run the server using your favorite runtime:
node server.mjs#TypeScript
srvx ships self-contained types: they reference no runtime type packages, so tsc passes with only @types/node (or none at all) and without skipLibCheck, whichever runtime you target.
Runtime objects such as server.bun?.server, server.deno?.server, request.runtime?.cloudflare?.context or request.runtime?.awsLambda?.event are described by minimal interfaces covering what srvx itself uses. They accept the official types, so passing a real Bun.Server or Lambda event still type checks. To reach the full surface of a runtime object, install that runtime's type package and cast:
import type { Server } from "bun";
const bunServer = server.bun?.server as Server | undefined;
bunServer?.publish("channel", "hello");To type Cloudflare Workers bindings, augment CloudflareEnv:
The declare module block only augments CloudflareEnv in a file that is a module. In a standalone .d.ts with no imports or exports it would declare a whole new srvx module instead, so add export {} there.
import { serve } from "srvx";
declare module "srvx" {
interface CloudflareEnv {
MY_KV: KVNamespace;
}
}
serve({
fetch: (request) => {
const kv = request.runtime?.cloudflare?.env.MY_KV;
// ...
},
});#Starter Examples
| Example | Source | Try |
|---|---|---|
aws-lambda | examples/aws-lambda | npx giget gh:h3js/srvx/examples/aws-lambda srvx-aws-lambda |
elysia | examples/elysia | npx giget gh:h3js/srvx/examples/elysia srvx-elysia |
express | examples/express | npx giget gh:h3js/srvx/examples/express srvx-express |
fastify | examples/fastify | npx giget gh:h3js/srvx/examples/fastify srvx-fastify |
h3 | examples/h3 | npx giget gh:h3js/srvx/examples/h3 srvx-h3 |
hello-world | examples/hello-world | npx giget gh:h3js/srvx/examples/hello-world srvx-hello-world |
hono | examples/hono | npx giget gh:h3js/srvx/examples/hono srvx-hono |
jsx | examples/jsx | npx giget gh:h3js/srvx/examples/jsx srvx-jsx |
node-handler | examples/node-handler | npx giget gh:h3js/srvx/examples/node-handler srvx-node-handler |
service-worker | examples/service-worker | npx giget gh:h3js/srvx/examples/service-worker srvx-service-worker |
streaming | examples/streaming | npx giget gh:h3js/srvx/examples/streaming srvx-streaming |
tracing | examples/tracing | npx giget gh:h3js/srvx/examples/tracing srvx-tracing |
websocket | examples/websocket | npx giget gh:h3js/srvx/examples/websocket srvx-websocket |