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

Web

Use rest-rpc with Fetch runtimes

Install

pnpm add @rest-rpc/web

Usage

import { initWeb } from "@rest-rpc/web";
import { api } from "./contract";

type Context = {
	env: Env;
	ctx: ExecutionContext;
};

const web = initWeb<Context>();

const routes = web.router(api, {
	todos: {
		list({ context }) {
			return listTodos(context.env.DB);
		},
		get({ id, context }) {
			return getTodo(context.env.DB, id);
		},
		create({ title, context }) {
			return createTodo(context.env.DB, { title });
		},
	},
});

const handleRequest = web.createHandler(routes);

export default {
	fetch(request, env, ctx) {
		return handleRequest(request, { env, ctx });
	},
};

Framework Context

type WebRouteRuntimeContext<TContext extends WebRouteHandlerContext> =
	TContext & {
		signal: AbortSignal;
	};

Options

type CreateWebHandlerOptions<
	TContext extends WebRouteHandlerContext = WebRouteHandlerContext,
> = {
	errorHandlers?: ServerErrorHandlers<WebRouteRuntimeContext<TContext>>;
	parseBody?: WebRouteParseBody;
};

Error Handlers

const handleRequest = web.createHandler(routes, {
	errorHandlers: {
		onRequestValidationError: ({ issues }) => ({
			status: 422,
			body: { code: "VALIDATION_ERROR", issues },
		}),
		onUnhandledError: () => ({
			status: 500,
			body: { code: "INTERNAL_SERVER_ERROR" },
		}),
	},
});

Body Parsing

const handleUpload = web.createHandler(routes, {
	parseBody: ({ request }) => request.formData(),
});

Was this page helpful?