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