Skip to main content
This example turns oRPC context into an Effect service.
auth.ts
import { Context, Effect } from "effect";
import { eos } from "effect-orpc";

class CurrentUser extends Context.Tag("CurrentUser")<
  CurrentUser,
  { id: string; role: "admin" | "member" }
>() {}

const authedProcedure = eos
  .$context<{ user: { id: string; role: "admin" | "member" } }>()
  .provide(CurrentUser, ({ context }) => Effect.succeed(context.user));

export const router = {
  me: authedProcedure.effect(function* () {
    return yield* CurrentUser;
  }),
};

Use in middleware

require-admin.ts
const adminProcedure = authedProcedure.use(function* () {
  const user = yield* CurrentUser;

  if (user.role !== "admin") {
    return yield* Effect.fail(new ForbiddenError());
  }
});

Next step

Add structured errors with Tagged errors example.
Last modified on June 15, 2026