@chttp/router
v0.4.0
Published
Minimal async-first HTTP router authored inside the scriptc compilable subset
Maintainers
Readme
chttp
Minimal async-first HTTP router for node:http, zero dependencies, authored inside the scriptc compilable subset. The same source lowers to a native ELF directly, no plugin required.
import { CtxCore, createRouter } from "@chttp/router";
const app = createRouter();
app.get("/", (c: CtxCore) => c.text("hi"));
app.get("/user/:id", (c: CtxCore) => c.json({ id: c.req.param("id") }));
app.post("/echo", (c: CtxCore) => c.text(c.req.body()));
app.get("/slow", async (c: CtxCore) => {
const user = await fetchUser(c.req.param("id"));
return c.json(user);
});
app.notFound((c: CtxCore) => c.status(404).text("not found"));
app.serve({ port: 3000 });Install
npm i @chttp/routerCompile to native
The package has zero runtime dependencies and compiles fully statically under scriptc v0.3.0 automatic package compilation, no plugin required:
scriptc build src/main.ts -o app
./appThat is the whole native story: chttp lowers directly like any subset library. On top of it, @chttp/unplugin is an elective build-time dispatch specialization: it recovers the route table from imperative registrations and emits a CompiledRoutes dispatch that skips the runtime trie (works with plain vite/rollup; composes with unplugin-scriptc for the ELF pipeline, where chttp must be program code). See the unplugin docs.
Typed client
@chttp/router/client ships a typed HTTP client that compiles into the same ELF (HTTP/1.1 over node:net/node:tls, no fetch):
import { createClient } from "@chttp/router/client";
const client = createClient("http://localhost:3000");
const user = await client.get<{ id: string }>("/users/:id", { params: { id: "42" } });Path params are checked by ParamKey inference on Node.js; inside compiled apps bind a ClientCore receiver. See the client docs.
Docs
- Full documentation: https://chttpjs.pages.dev/
- Benchmarks:
bench/RESULTS-v2.mdin the repo - Examples:
examples/in the repo
License
Apache-2.0
