Use .provide(layer) to make Effect services available to downstream procedures.
import { Effect } from "effect";
export class UsersRepo extends Effect.Service<UsersRepo>()("UsersRepo", {
accessors: true,
sync: () => ({
findById: (id: string) => ({ id, name: "Ada Lovelace" }),
}),
}) {}
import { eos } from "effect-orpc";
const effectProcedure = eos.provide(UsersRepo.Default);
const getUser = effectProcedure.effect(function* () {
return yield* UsersRepo.findById("1");
});
Missing services are type errors
If a handler yields a service that was not provided, the procedure should fail to type-check.
class MissingRepo extends Context.Tag("MissingRepo")<
MissingRepo,
{ find: () => Effect.Effect<string> }
>() {}
const procedure = eos.provide(UsersRepo.Default).effect(
// @ts-expect-error MissingRepo was not provided.
function* () {
return yield* MissingRepo;
},
);
Provide multiple services
Merge services into one application layer, then provide that layer once.
const AppLive = Layer.mergeAll(UsersRepo.Default, Logger.pretty, Cache.Default);
const effectProcedure = eos.provide(AppLive);
Next step
Use request data to provide per-request services in Request-scoped services. Last modified on June 15, 2026