Getting Started
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 srvx
pnpx srvx
yarn dlx srvx
deno -A npm:srvx
bunx --bun srvx
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 srvx
yarn add srvx
pnpm i srvx
bun i srvx
deno i npm:srvx
Then, run the server using your favorite runtime:
node server.mjs
deno run --allow-env --allow-net server.mjs
bun run 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 |