Skip to content
rest-rpc
Esc
navigateopen⌘Jpreview
On this page

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 };
		},
	},
});

Was this page helpful?