Use .provide(layer) to make Effect services available to downstream procedures.
import { Context, Effect, Layer } from "effect";
export class UsersRepo extends Context.Service<
UsersRepo,
{
readonly findById: (
id: string,
) => Effect.Effect<{ id: string; name: string }>;
}
>()("UsersRepo") {}
export const UsersRepoLive = Layer.succeed(UsersRepo, {
findById: (id) => Effect.succeed({ id, name: "Ada Lovelace" }),
});
import { eos } from "effect-orpc";
const effectProcedure = eos.provide(UsersRepoLive);
const getUser = effectProcedure.effect(function* () {
const usersRepo = yield* UsersRepo;
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.Service<
MissingRepo,
{ readonly find: () => Effect.Effect<string> }
>()("MissingRepo") {}
const procedure = eos.provide(UsersRepoLive).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(UsersRepoLive, Logger.pretty, CacheLive);
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