import * as Ref from "@confect/core/Ref"; import { type GenericActionCtx } from "convex/server"; import * as Effect from "effect/Effect"; import * as Context from "effect/Context"; import * as Layer from "effect/Layer"; import type * as Schema from "effect/Schema"; const run = Effect.fn("ActionRunner.runAction")( (effect: Effect.Effect): Effect.Effect => effect, ); const make = (runAction: GenericActionCtx["runAction"]) => ({ runAction: ( action: Action, ...args: Ref.OptionalArgs ): Effect.Effect< Ref.Returns, Ref.Error | Schema.SchemaError > => run( Ref.runWithCodec( action, (args[0] ?? {}) as Ref.Args, (functionReference, encodedArgs) => runAction(functionReference, encodedArgs), ), ), }); export const ActionRunner = Context.Service>( "@confect/server/ActionRunner", ); export type ActionRunner = typeof ActionRunner.Identifier; export const layer = (runAction: GenericActionCtx["runAction"]) => Layer.succeed(ActionRunner, make(runAction));