Hono
Use rest-rpc with Hono
Install
pnpm add @rest-rpc/hono
Usage
import { registerRoutes, router } from "@rest-rpc/hono";
import { Hono } from "hono";
import { api } from "./contract";
const app = new Hono();
const routes = router(api, {
todos: {
list() {
return listTodos();
},
get({ id, context }) {
const authorization = context.c.req.header("authorization");
return getTodo(id, { authorization });
},
create({ title }) {
return createTodo({ title });
},
},
});
registerRoutes(app, routes);
export default app;
Framework Context
type HttpRouteHandlerContext<E extends Env = Env> = {
c: Context<E>;
signal: AbortSignal;
};
type WebSocketRouteHandlerContext<E extends Env = Env> = {
c: Context<E>;
};
Options
type RegisterRoutesOptions<TEnv extends Env = Env> = {
errorHandlers?: ServerErrorHandlers<{
c: Context<TEnv>;
signal: AbortSignal;
}>;
parseBody?: HonoParseBody<TEnv>;
webSocket?: HonoWebSocketOptions<TEnv>;
};
Error Handlers
registerRoutes(app, routes, {
errorHandlers: {
onRequestValidationError: ({ issues }) => ({
status: 422,
body: { code: "VALIDATION_ERROR", issues },
}),
onUnhandledError: () => ({
status: 500,
body: { code: "INTERNAL_SERVER_ERROR" },
}),
},
});
Body Parsing
registerRoutes(app, routes, {
parseBody: ({ c }) => c.req.json(),
});
WebSocket
import { upgradeWebSocket } from "hono/cloudflare-workers";
registerRoutes(app, routes, {
webSocket: {
upgradeWebSocket,
beforeUpgrade: ({ context }) => {
const authorization = context.c.req.header("authorization");
return authorization ? undefined : { status: 401 };
},
},
});