@gaganref/confect-server 10.3.1-fork.38 → 10.3.1-fork.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,14 +6,16 @@ import { layer as layer$3 } from "./QueryRunner.js";
6
6
  import { layer as layer$4 } from "./Scheduler.js";
7
7
  import { ActionCallAlreadyUsed, ActionCallNotUsed, NestedActionNotAllowed, SchedulingNotAllowed } from "./ActionCall.js";
8
8
  import { layer as layer$5, layerForTarget } from "./Auth.js";
9
- import { layer as layer$6 } from "./ExecutionMetadata.js";
10
- import { layer as layer$7 } from "./RequestMetadata.js";
11
- import { layer as layer$8 } from "./ConvexLogger.js";
9
+ import { layer as layer$6 } from "./ConvexLogger.js";
10
+ import { layer as layer$7 } from "./ExecutionMetadata.js";
11
+ import { layer as layer$8 } from "./RequestMetadata.js";
12
12
  import { StorageActionWriter } from "./StorageActionWriter.js";
13
13
  import { StorageWriter } from "./StorageWriter.js";
14
14
  import { layer as layer$9 } from "./Storage.js";
15
+ import { memoized } from "./internal/observability.js";
15
16
  import { layer as layer$10 } from "./VectorSearch.js";
16
17
  import * as ActionCallSpec from "@confect/core/ActionCall";
18
+ import * as Context from "effect/Context";
17
19
  import * as Effect from "effect/Effect";
18
20
  import * as Layer from "effect/Layer";
19
21
  import * as MiddlewareSpec from "@confect/core/MiddlewareSpec";
@@ -23,11 +25,14 @@ import { compileArgsSchema, compileReturnsSchema } from "@confect/core/SchemaToV
23
25
  import { ConvexError } from "convex/values";
24
26
  import * as Result from "effect/Result";
25
27
  import * as IdScope from "@confect/core/IdScope";
28
+ import * as Clock from "effect/Clock";
26
29
  import * as Cause from "effect/Cause";
27
30
  import * as Console from "effect/Console";
28
31
  import * as Exit from "effect/Exit";
32
+ import * as Tracer from "effect/Tracer";
29
33
  //#region src/RegisteredFunction.ts
30
34
  var RegisteredFunction_exports = /* @__PURE__ */ __exportAll({
35
+ Observability: () => Observability,
31
36
  actionFunctionBase: () => actionFunctionBase,
32
37
  actionLayer: () => actionLayer,
33
38
  applyMiddleware: () => applyMiddleware,
@@ -36,6 +41,7 @@ var RegisteredFunction_exports = /* @__PURE__ */ __exportAll({
36
41
  runHandlerPromise: () => runHandlerPromise,
37
42
  storageLayer: () => storageLayer
38
43
  });
44
+ const Observability = Context.Reference("@confect/server/Observability", { defaultValue: () => void 0 });
39
45
  /**
40
46
  * Wrap a function's handler effect in its resolved middleware chain, per
41
47
  * invocation, after args decode. Iterated innermost-first so that the
@@ -89,31 +95,46 @@ const combineErrorSchemas = (error, resolvedMiddlewares) => {
89
95
  * Only a root-context scheduler covers them.
90
96
  */
91
97
  const runHandlerPromise = (errorSchema, runOptions) => (effect) => {
98
+ const { observability, invocation, clock } = runOptions ?? {};
99
+ let encodedError;
100
+ const observed = Effect.tapCause(effect, (cause) => Effect.gen(function* () {
101
+ const reason = cause.reasons.find(Cause.isDieReason) ?? cause.reasons.find(Cause.isFailReason);
102
+ if (reason?._tag === "Fail" && errorSchema !== void 0) {
103
+ encodedError = yield* Effect.exit(Schema.encodeEffect(errorSchema)(reason.error));
104
+ if (Exit.isFailure(encodedError)) return yield* Effect.orDie(encodedError);
105
+ }
106
+ }));
92
107
  const withConvexError = Effect.gen(function* () {
93
- const exit = yield* Effect.exit(effect);
108
+ const exit = yield* Effect.exit(observability === void 0 || invocation === void 0 ? effect : Effect.flatMap(invocation, ({ name, type, componentPath }) => Effect.useSpan(name, {
109
+ root: true,
110
+ attributes: {
111
+ kind: type,
112
+ componentPath
113
+ }
114
+ }, (span) => Effect.provideService(observed, Tracer.ParentSpan, span))));
94
115
  if (Exit.isSuccess(exit)) return Result.succeed(exit.value);
95
- const { cause } = exit;
116
+ const cause = encodedError !== void 0 && Exit.isFailure(encodedError) ? encodedError.cause : exit.cause;
96
117
  const reason = cause.reasons.find(Cause.isDieReason) ?? cause.reasons.find(Cause.isFailReason);
97
- if (reason?._tag === "Die" && cause.reasons.length === 1 && reason.defect instanceof ConvexError) return Result.fail(reason.defect);
118
+ if (encodedError === void 0 && reason?._tag === "Die" && cause.reasons.length === 1 && reason.defect instanceof ConvexError) return Result.fail(reason.defect);
98
119
  if (reason?._tag === "Fail") {
99
120
  if (errorSchema === void 0) {
100
121
  if (reason.error instanceof ConvexError) return Result.fail(reason.error);
101
122
  return yield* Effect.die(reason.error);
102
123
  }
103
- const encoded = yield* Effect.exit(Schema.encodeEffect(errorSchema)(reason.error));
124
+ const encoded = encodedError ?? (yield* Effect.exit(Schema.encodeEffect(errorSchema)(reason.error)));
104
125
  if (Exit.isSuccess(encoded)) return Result.fail(new ConvexError(encoded.value));
105
126
  return yield* Effect.die(new Error(Cause.pretty(encoded.cause), { cause: encoded.cause }));
106
127
  }
107
128
  return yield* Effect.die(new Error(Cause.pretty(cause), { cause }));
108
129
  });
109
- return Effect.runPromise(withConvexError.pipe(Effect.provide(layer$8), Effect.provideService(Console.Console, globalThis.console)), runOptions).then(Result.match({
130
+ return Effect.runPromise(withConvexError.pipe(Effect.provide(observability === void 0 ? layer$6 : memoized(observability)), Effect.provideService(Console.Console, globalThis.console), clock === void 0 ? (self) => self : Effect.provideService(Clock.Clock, clock)), runOptions).then(Result.match({
110
131
  onFailure: (error) => {
111
132
  throw error;
112
133
  },
113
134
  onSuccess: (value) => value
114
135
  }));
115
136
  };
116
- const actionFunctionBase = ({ name, functionVisibility, args, returns, error, handler, resolvedMiddlewares = [], createLayer, scope = IdScope.app }) => ({
137
+ const actionFunctionBase = ({ name, functionVisibility, args, returns, error, handler, resolvedMiddlewares = [], createLayer, scope = IdScope.app, observability }) => ({
117
138
  args: compileArgsSchema(args, scope),
118
139
  returns: compileReturnsSchema(returns, scope),
119
140
  handler: (ctx, actualArgs) => Effect.gen(function* () {
@@ -127,15 +148,18 @@ const actionFunctionBase = ({ name, functionVisibility, args, returns, error, ha
127
148
  }).pipe(Effect.provide(createLayer(restricted?.ctx ?? ctx)));
128
149
  if (restricted !== void 0) yield* restricted.check;
129
150
  return yield* pipe(decodedReturns, Schema.encodeEffect(returns), Effect.catchTag("SchemaError", Effect.die));
130
- }).pipe(runHandlerPromise(combineErrorSchemas(error, resolvedMiddlewares)))
151
+ }).pipe(runHandlerPromise(combineErrorSchemas(error, resolvedMiddlewares), {
152
+ invocation: Effect.promise(() => ctx.meta.getFunctionMetadata()),
153
+ observability
154
+ }))
131
155
  });
132
156
  /**
133
157
  * The ctx-backed action services that don't depend on a Confect database
134
158
  * schema. {@link actionLayer} adds the schema-typed `VectorSearch` on top; the
135
159
  * HTTP API handler uses this base directly.
136
160
  */
137
- const baseActionLayer = (ctx) => Layer.mergeAll(layer$4(ctx.scheduler), layer$5(ctx.auth), layer$6(ctx.meta), layer$7(ctx.meta), layer$9(ctx.storage), StorageWriter.layer(ctx.storage), StorageActionWriter.layer(ctx.storage), layer$3(ctx.runQuery.bind(ctx)), layer$2(ctx.runMutation.bind(ctx)), layer$1(ctx.runAction.bind(ctx)), Layer.succeed(ActionCtx(), ctx));
138
- const actionLayer = (databaseSchema, ctx) => Layer.mergeAll(layer$4(ctx.scheduler, databaseSchema.target.scope), layerForTarget(databaseSchema.target, ctx.auth), layer$6(ctx.meta), layer$7(ctx.meta), storageLayer(ctx.storage), StorageWriter.layer(ctx.storage, databaseSchema.target.scope), StorageActionWriter.layer(ctx.storage, databaseSchema.target.scope), layer$3(ctx.runQuery.bind(ctx)), layer$2(ctx.runMutation.bind(ctx)), layer$1(ctx.runAction.bind(ctx)), layer(ctx, databaseSchema.target.scope), layer$10(ctx.vectorSearch.bind(ctx)));
161
+ const baseActionLayer = (ctx) => Layer.mergeAll(layer$4(ctx.scheduler), layer$5(ctx.auth), layer$7(ctx.meta), layer$8(ctx.meta), layer$9(ctx.storage), StorageWriter.layer(ctx.storage), StorageActionWriter.layer(ctx.storage), layer$3(ctx.runQuery.bind(ctx)), layer$2(ctx.runMutation.bind(ctx)), layer$1(ctx.runAction.bind(ctx)), Layer.succeed(ActionCtx(), ctx));
162
+ const actionLayer = (databaseSchema, ctx) => Layer.mergeAll(layer$4(ctx.scheduler, databaseSchema.target.scope), layerForTarget(databaseSchema.target, ctx.auth), layer$7(ctx.meta), layer$8(ctx.meta), storageLayer(ctx.storage), StorageWriter.layer(ctx.storage, databaseSchema.target.scope), StorageActionWriter.layer(ctx.storage, databaseSchema.target.scope), layer$3(ctx.runQuery.bind(ctx)), layer$2(ctx.runMutation.bind(ctx)), layer$1(ctx.runAction.bind(ctx)), layer(ctx, databaseSchema.target.scope), layer$10(ctx.vectorSearch.bind(ctx)));
139
163
  const storageLayer = (reader) => layer$9(reader);
140
164
  /**
141
165
  * Shares one dispatch budget across the entire middleware chain.
@@ -176,6 +200,6 @@ const restrict = (ctx) => {
176
200
  };
177
201
  };
178
202
  //#endregion
179
- export { RegisteredFunction_exports, actionFunctionBase, actionLayer, applyMiddleware, baseActionLayer, combineErrorSchemas, runHandlerPromise, storageLayer };
203
+ export { Observability, RegisteredFunction_exports, actionFunctionBase, actionLayer, applyMiddleware, baseActionLayer, combineErrorSchemas, runHandlerPromise, storageLayer };
180
204
 
181
205
  //# sourceMappingURL=RegisteredFunction.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RegisteredFunction.js","names":["ConvexLogger.layer","Scheduler.layer","Auth.layer","ExecutionMetadata.layer","RequestMetadata.layer","Storage.layer","QueryRunner.layer","MutationRunner.layer","ActionRunner.layer","ActionCtx.ActionCtx","Auth.layerForTarget","ActionCtx.layer","VectorSearch.layer","ActionCall.ActionCallAlreadyUsed","ActionCall.SchedulingNotAllowed","ActionCall.NestedActionNotAllowed","ActionCall.ActionCallNotUsed"],"sources":["../src/RegisteredFunction.ts"],"sourcesContent":["import * as ActionCallSpec from \"@confect/core/ActionCall\";\nimport * as ActionCall from \"./ActionCall.js\";\nimport type { FunctionSpec, RuntimeAndFunctionType } from \"@confect/core\";\nimport * as IdScope from \"@confect/core/IdScope\";\nimport type * as FunctionProvenance from \"@confect/core/FunctionProvenance\";\nimport * as MiddlewareSpec from \"@confect/core/MiddlewareSpec\";\nimport {\n compileArgsSchema,\n compileReturnsSchema,\n} from \"@confect/core/SchemaToValidator\";\nimport {\n type DefaultFunctionArgs,\n type FunctionVisibility,\n type GenericActionCtx,\n type GenericDataModel,\n type StorageReader as ConvexStorageReader,\n type RegisteredAction,\n type RegisteredMutation,\n type RegisteredQuery,\n} from \"convex/server\";\nimport type { Value } from \"convex/values\";\nimport { ConvexError } from \"convex/values\";\nimport { pipe } from \"effect/Function\";\nimport * as Cause from \"effect/Cause\";\nimport * as Console from \"effect/Console\";\nimport * as Effect from \"effect/Effect\";\nimport * as Exit from \"effect/Exit\";\nimport * as Result from \"effect/Result\";\nimport * as Layer from \"effect/Layer\";\nimport * as Schema from \"effect/Schema\";\nimport type * as EffectScheduler from \"effect/Scheduler\";\nimport * as ActionCtx from \"./ActionCtx.js\";\nimport * as ActionRunner from \"./ActionRunner.js\";\nimport * as Auth from \"./Auth.js\";\nimport * as ConvexLogger from \"./ConvexLogger.js\";\nimport type * as DatabaseSchema from \"./DatabaseSchema.js\";\nimport type * as DataModel from \"./DataModel.js\";\nimport * as ExecutionMetadata from \"./ExecutionMetadata.js\";\nimport * as RequestMetadata from \"./RequestMetadata.js\";\nimport * as MutationRunner from \"./MutationRunner.js\";\nimport * as QueryRunner from \"./QueryRunner.js\";\nimport type * as ResolvedMiddleware from \"./ResolvedMiddleware.js\";\nimport * as Scheduler from \"./Scheduler.js\";\nimport * as Storage from \"./Storage.js\";\nimport * as StorageActionWriter from \"./StorageActionWriter.js\";\nimport type * as StorageReader from \"./StorageReader.js\";\nimport * as StorageWriter from \"./StorageWriter.js\";\nimport * as VectorSearch from \"./VectorSearch.js\";\nimport type * as Handler from \"./Handler.js\";\n\nexport type Any =\n | RegisteredQuery<FunctionVisibility, DefaultFunctionArgs, any>\n | RegisteredMutation<FunctionVisibility, DefaultFunctionArgs, any>\n | RegisteredAction<FunctionVisibility, DefaultFunctionArgs, any>;\n\ntype ConfectRegisteredFunction<\n FunctionSpec_ extends FunctionSpec.AnyWithProps,\n> =\n FunctionSpec.EncodedArgs<FunctionSpec_> extends infer Args_ extends\n DefaultFunctionArgs\n ? RuntimeAndFunctionType.GetFunctionType<\n FunctionSpec_[\"runtimeAndFunctionType\"]\n > extends \"query\"\n ? RegisteredQuery<\n FunctionSpec.GetFunctionVisibility<FunctionSpec_>,\n Args_,\n Promise<FunctionSpec.EncodedReturns<FunctionSpec_>>\n >\n : RuntimeAndFunctionType.GetFunctionType<\n FunctionSpec_[\"runtimeAndFunctionType\"]\n > extends \"mutation\"\n ? RegisteredMutation<\n FunctionSpec.GetFunctionVisibility<FunctionSpec_>,\n Args_,\n Promise<FunctionSpec.EncodedReturns<FunctionSpec_>>\n >\n : RuntimeAndFunctionType.GetFunctionType<\n FunctionSpec_[\"runtimeAndFunctionType\"]\n > extends \"action\"\n ? RegisteredAction<\n FunctionSpec.GetFunctionVisibility<FunctionSpec_>,\n Args_,\n Promise<FunctionSpec.EncodedReturns<FunctionSpec_>>\n >\n : never\n : never;\n\nexport type ConvexRegisteredFunction<\n FunctionSpec_ extends FunctionSpec.AnyWithProps,\n> = FunctionSpec_ extends FunctionSpec.AnyWithProps\n ? FunctionSpec.GetFunctionProvenance<FunctionSpec_> extends FunctionProvenance.Convex<\n infer Args_ extends DefaultFunctionArgs,\n infer Returns_\n >\n ? RuntimeAndFunctionType.GetFunctionType<\n FunctionSpec_[\"runtimeAndFunctionType\"]\n > extends \"query\"\n ? RegisteredQuery<\n FunctionSpec.GetFunctionVisibility<FunctionSpec_>,\n Args_,\n Returns_\n >\n : RuntimeAndFunctionType.GetFunctionType<\n FunctionSpec_[\"runtimeAndFunctionType\"]\n > extends \"mutation\"\n ? RegisteredMutation<\n FunctionSpec.GetFunctionVisibility<FunctionSpec_>,\n Args_,\n Returns_\n >\n : RuntimeAndFunctionType.GetFunctionType<\n FunctionSpec_[\"runtimeAndFunctionType\"]\n > extends \"action\"\n ? RegisteredAction<\n FunctionSpec.GetFunctionVisibility<FunctionSpec_>,\n Args_,\n Returns_\n >\n : never\n : never\n : never;\n\nexport type RegisteredFunction<\n FunctionSpec_ extends FunctionSpec.AnyWithProps,\n> =\n FunctionSpec_ extends FunctionSpec.WithFunctionProvenance<\n FunctionSpec_,\n FunctionProvenance.AnyConvex\n >\n ? ConvexRegisteredFunction<FunctionSpec_>\n : FunctionSpec_ extends FunctionSpec.WithFunctionProvenance<\n FunctionSpec_,\n FunctionProvenance.AnyConfect\n >\n ? ConfectRegisteredFunction<FunctionSpec_>\n : never;\n\n/**\n * Wrap a function's handler effect in its resolved middleware chain, per\n * invocation, after args decode. Iterated innermost-first so that the\n * first-attached (group-level, in attachment order) middleware ends up\n * outermost and runs first. Erased types: the public safety story lives at the\n * `MiddlewareSpec.MiddlewareImpl`/`MiddlewareImpl.make` signatures, and the\n * composed effect's error channel is re-accounted by\n * {@link combineErrorSchemas}.\n */\nexport const applyMiddleware = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n resolvedMiddlewares: ReadonlyArray<ResolvedMiddleware.ResolvedMiddleware>,\n invocation: MiddlewareSpec.MiddlewareOptions[\"invocation\"],\n): Effect.Effect<A, any, R> => {\n return resolvedMiddlewares.reduceRight<Effect.Effect<any, any, any>>(\n // oxlint-disable-next-line effecttsgo/any-unknown-in-error-context -- The erased middleware error remains intact so runHandlerPromise can validate it against the combined error schema.\n (wrapped, middleware) => {\n const context =\n \"options\" in middleware.middlewareSpec\n ? { options: middleware.options, invocation }\n : { invocation };\n // oxlint-disable-next-line effecttsgo/any-unknown-in-error-context -- Resolved middleware is type-erased after its public implementation boundary; its error and service channels are restored by the surrounding function contract.\n return middleware.middlewareImpl(wrapped, context);\n },\n effect,\n );\n};\n\n/**\n * The error-schema allowlist for a function with middleware: the function's own\n * declared `error` schema unioned with every covering middleware's error\n * schema. `undefined` (⇒ every failure dies) only when neither declares\n * one—mirroring the ref-side union clients decode against.\n */\nexport const combineErrorSchemas = (\n error: Schema.Codec<any, any> | undefined,\n resolvedMiddlewares: ReadonlyArray<ResolvedMiddleware.ResolvedMiddleware>,\n): Schema.Codec<any, any> | undefined => {\n const schemas = [\n ...(error !== undefined ? [error] : []),\n ...MiddlewareSpec.errorSchemas(\n resolvedMiddlewares.map(({ middlewareSpec }) => middlewareSpec),\n ),\n ];\n return schemas.length === 0\n ? undefined\n : schemas.length === 1\n ? schemas[0]\n : Schema.Union(schemas);\n};\n\n/**\n * Run the `Effect` as a `Promise`. Inspect the complete `Exit` before encoding\n * a declared error so a typed failure cannot hide a defect.\n *\n * Any `Die` reason takes the defect path. Without a `Die`, the first `Fail` in\n * cause order is schema-encoded and thrown as a `ConvexError` outside the\n * Effect runtime so Convex surfaces its data to the client. Other failures and\n * interruptions alongside that `Fail` are ignored. Without an error schema, the\n * selected failure is treated as a defect.\n *\n * A lone `ConvexError` defect or a selected undeclared `ConvexError` failure is\n * rethrown bare so it keeps Convex's meaning. Pagination and Workpool rely on\n * its data for their control signals. Other causes with a `Die`, interrupt-only\n * or empty causes, and error-encoding failures reject with a plain `Error`\n * whose message renders the complete cause and whose `cause` holds it for\n * server diagnostics.\n *\n * A `scheduler` in `runOptions` must be passed here as a run option rather than\n * provided via `Effect.provideService` inside `effect`: the run option lands in\n * the fiber's root context, while a service provided within `effect` pops\n * before the exit/encoding wrappers this function adds. The fiber's op counter\n * survives context pops, so a cooperative yield can fire inside those wrappers.\n * Only a root-context scheduler covers them.\n */\nexport const runHandlerPromise =\n (\n errorSchema: Schema.Codec<any, any> | undefined,\n runOptions?: {\n readonly scheduler?: EffectScheduler.Scheduler | undefined;\n },\n ) =>\n <A, E>(effect: Effect.Effect<A, E>): Promise<A> => {\n const withConvexError: Effect.Effect<Result.Result<A, ConvexError<any>>> =\n Effect.gen(function* () {\n const exit = yield* Effect.exit(effect);\n if (Exit.isSuccess(exit)) {\n return Result.succeed(exit.value);\n }\n\n const { cause } = exit;\n const reason =\n cause.reasons.find(Cause.isDieReason) ??\n cause.reasons.find(Cause.isFailReason);\n if (\n reason?._tag === \"Die\" &&\n cause.reasons.length === 1 &&\n reason.defect instanceof ConvexError\n ) {\n return Result.fail(reason.defect);\n }\n\n if (reason?._tag === \"Fail\") {\n if (errorSchema === undefined) {\n if (reason.error instanceof ConvexError) {\n return Result.fail(reason.error);\n }\n return yield* Effect.die(reason.error);\n }\n const encoded = yield* Effect.exit(\n Schema.encodeEffect(errorSchema)(reason.error),\n );\n if (Exit.isSuccess(encoded)) {\n return Result.fail(new ConvexError(encoded.value));\n }\n return yield* Effect.die(\n new Error(Cause.pretty(encoded.cause), { cause: encoded.cause }),\n );\n }\n return yield* Effect.die(new Error(Cause.pretty(cause), { cause }));\n });\n return Effect.runPromise(\n withConvexError.pipe(\n Effect.provide(ConvexLogger.layer),\n Effect.provideService(Console.Console, globalThis.console),\n ),\n runOptions,\n ).then(\n Result.match({\n onFailure: (error) => {\n throw error;\n },\n onSuccess: (value) => value,\n }),\n );\n };\n\nexport const actionFunctionBase = <\n Schema extends DatabaseSchema.AnyWithProps,\n Args,\n ConvexArgs extends DefaultFunctionArgs,\n Returns,\n ConvexReturns,\n E,\n R,\n>({\n name,\n functionVisibility,\n args,\n returns,\n error,\n handler,\n resolvedMiddlewares = [],\n createLayer,\n scope = IdScope.app,\n}: {\n name: string;\n functionVisibility: FunctionVisibility;\n args: Schema.Codec<Args, ConvexArgs>;\n returns: Schema.Codec<Returns, ConvexReturns>;\n error: Schema.Codec<Error, Value> | undefined;\n handler: (a: Args) => Effect.Effect<Returns, E, R>;\n resolvedMiddlewares?: ReadonlyArray<ResolvedMiddleware.ResolvedMiddleware>;\n createLayer: (\n ctx: GenericActionCtx<DataModel.ToConvex<DataModel.FromSchema<Schema>>>,\n ) => Layer.Layer<R>;\n scope?: IdScope.IdScope;\n}) => ({\n args: compileArgsSchema(args, scope),\n returns: compileReturnsSchema(returns, scope),\n handler: (\n ctx: GenericActionCtx<DataModel.ToConvex<DataModel.FromSchema<Schema>>>,\n actualArgs: ConvexArgs,\n ): Promise<ConvexReturns> =>\n Effect.gen(function* () {\n const decodedArgs = yield* pipe(\n actualArgs,\n Schema.decodeUnknownEffect(args),\n Effect.catchTag(\"SchemaError\", Effect.die),\n );\n const restricted = resolvedMiddlewares.some(\n ({ middlewareSpec }) =>\n middlewareSpec.key === ActionCallSpec.Middleware.key,\n )\n ? restrict(ctx)\n : undefined;\n // oxlint-disable-next-line effecttsgo/any-unknown-in-error-context -- Middleware errors are intentionally erased here and validated by runHandlerPromise against the combined error schema below.\n const decodedReturns = yield* applyMiddleware(\n handler(decodedArgs),\n resolvedMiddlewares,\n {\n name,\n functionType: \"action\",\n functionVisibility,\n args: decodedArgs,\n },\n ).pipe(Effect.provide(createLayer(restricted?.ctx ?? ctx)));\n if (restricted !== undefined) yield* restricted.check;\n return yield* pipe(\n decodedReturns,\n Schema.encodeEffect(returns),\n Effect.catchTag(\"SchemaError\", Effect.die),\n );\n }).pipe(runHandlerPromise(combineErrorSchemas(error, resolvedMiddlewares))),\n});\n\nexport type ActionServices<\n DatabaseSchema_ extends DatabaseSchema.AnyWithProps,\n> = Handler.ActionServices<DatabaseSchema_>;\n\n/**\n * The ctx-backed action services that don't depend on a Confect database\n * schema. {@link actionLayer} adds the schema-typed `VectorSearch` on top; the\n * HTTP API handler uses this base directly.\n */\nexport const baseActionLayer = <ConvexDataModel extends GenericDataModel>(\n ctx: GenericActionCtx<ConvexDataModel>,\n) =>\n Layer.mergeAll(\n Scheduler.layer(ctx.scheduler),\n Auth.layer(ctx.auth),\n ExecutionMetadata.layer(ctx.meta),\n RequestMetadata.layer(ctx.meta),\n Storage.layer(ctx.storage),\n StorageWriter.StorageWriter.layer(ctx.storage),\n StorageActionWriter.StorageActionWriter.layer(ctx.storage),\n QueryRunner.layer(ctx.runQuery.bind(ctx)),\n MutationRunner.layer(ctx.runMutation.bind(ctx)),\n ActionRunner.layer(ctx.runAction.bind(ctx)),\n Layer.succeed(ActionCtx.ActionCtx<ConvexDataModel>(), ctx),\n );\n\nexport const actionLayer = <\n DatabaseSchema_ extends DatabaseSchema.AnyWithProps,\n>(\n databaseSchema: DatabaseSchema_,\n ctx: GenericActionCtx<\n DataModel.ToConvex<DataModel.FromSchema<DatabaseSchema_>>\n >,\n) =>\n Layer.mergeAll(\n Scheduler.layer<DatabaseSchema.Scope<DatabaseSchema_>>(\n ctx.scheduler,\n databaseSchema.target.scope,\n ),\n Auth.layerForTarget<DatabaseSchema_[\"target\"]>(\n databaseSchema.target,\n ctx.auth,\n ),\n ExecutionMetadata.layer(ctx.meta),\n RequestMetadata.layer(ctx.meta),\n storageLayer<DatabaseSchema.Scope<DatabaseSchema_>>(ctx.storage),\n StorageWriter.StorageWriter.layer<DatabaseSchema.Scope<DatabaseSchema_>>(\n ctx.storage,\n databaseSchema.target.scope,\n ),\n StorageActionWriter.StorageActionWriter.layer<\n DatabaseSchema.Scope<DatabaseSchema_>\n >(ctx.storage, databaseSchema.target.scope),\n QueryRunner.layer(ctx.runQuery.bind(ctx)),\n MutationRunner.layer(ctx.runMutation.bind(ctx)),\n ActionRunner.layer(ctx.runAction.bind(ctx)),\n ActionCtx.layer<\n DataModel.ToConvex<DataModel.FromSchema<DatabaseSchema_>>,\n DatabaseSchema.Scope<DatabaseSchema_>\n >(ctx, databaseSchema.target.scope),\n VectorSearch.layer(ctx.vectorSearch.bind(ctx)),\n );\n\n// Scoped readers share the same runtime service and ID strings. Reuse the\n// reader supplied by Storage so both APIs keep the same reader instance.\nexport const storageLayer = <Scope extends IdScope.IdScope>(\n reader: ConvexStorageReader,\n): Layer.Layer<Storage.Storage | StorageReader.ForScope<Scope>> =>\n Storage.layer(reader) as Layer.Layer<\n Storage.Storage | StorageReader.ForScope<Scope>\n >;\n\n/**\n * Shares one dispatch budget across the entire middleware chain.\n */\nconst restrict = <Model extends GenericDataModel>(\n ctx: GenericActionCtx<Model>,\n) => {\n let dispatched = false;\n const claim = () => {\n if (dispatched) throw new ActionCall.ActionCallAlreadyUsed();\n dispatched = true;\n };\n const restricted: GenericActionCtx<Model> = {\n ...ctx,\n scheduler: {\n runAfter: () => {\n throw new ActionCall.SchedulingNotAllowed();\n },\n runAt: () => {\n throw new ActionCall.SchedulingNotAllowed();\n },\n cancel: () => {\n throw new ActionCall.SchedulingNotAllowed();\n },\n },\n runQuery: (...args) => {\n claim();\n return ctx.runQuery(...args);\n },\n runMutation: (...args) => {\n claim();\n return ctx.runMutation(...args);\n },\n runAction: () => {\n throw new ActionCall.NestedActionNotAllowed();\n },\n };\n return {\n ctx: restricted,\n check: Effect.suspend(() =>\n dispatched ? Effect.void : Effect.die(new ActionCall.ActionCallNotUsed()),\n ),\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkJA,MAAa,mBACX,QACA,qBACA,eAC6B;CAC7B,OAAO,oBAAoB,aAExB,SAAS,eAAe;EACvB,MAAM,UACJ,aAAa,WAAW,iBACpB;GAAE,SAAS,WAAW;GAAS;EAAW,IAC1C,EAAE,WAAW;EAEnB,OAAO,WAAW,eAAe,SAAS,OAAO;CACnD,GACA,MACF;AACF;;;;;;;AAQA,MAAa,uBACX,OACA,wBACuC;CACvC,MAAM,UAAU,CACd,GAAI,UAAU,KAAA,IAAY,CAAC,KAAK,IAAI,CAAC,GACrC,GAAG,eAAe,aAChB,oBAAoB,KAAK,EAAE,qBAAqB,cAAc,CAChE,CACF;CACA,OAAO,QAAQ,WAAW,IACtB,KAAA,IACA,QAAQ,WAAW,IACjB,QAAQ,KACR,OAAO,MAAM,OAAO;AAC5B;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,MAAa,qBAET,aACA,gBAIK,WAA4C;CACjD,MAAM,kBACJ,OAAO,IAAI,aAAa;EACtB,MAAM,OAAO,OAAO,OAAO,KAAK,MAAM;EACtC,IAAI,KAAK,UAAU,IAAI,GACrB,OAAO,OAAO,QAAQ,KAAK,KAAK;EAGlC,MAAM,EAAE,UAAU;EAClB,MAAM,SACJ,MAAM,QAAQ,KAAK,MAAM,WAAW,KACpC,MAAM,QAAQ,KAAK,MAAM,YAAY;EACvC,IACE,QAAQ,SAAS,SACjB,MAAM,QAAQ,WAAW,KACzB,OAAO,kBAAkB,aAEzB,OAAO,OAAO,KAAK,OAAO,MAAM;EAGlC,IAAI,QAAQ,SAAS,QAAQ;GAC3B,IAAI,gBAAgB,KAAA,GAAW;IAC7B,IAAI,OAAO,iBAAiB,aAC1B,OAAO,OAAO,KAAK,OAAO,KAAK;IAEjC,OAAO,OAAO,OAAO,IAAI,OAAO,KAAK;GACvC;GACA,MAAM,UAAU,OAAO,OAAO,KAC5B,OAAO,aAAa,WAAW,CAAC,CAAC,OAAO,KAAK,CAC/C;GACA,IAAI,KAAK,UAAU,OAAO,GACxB,OAAO,OAAO,KAAK,IAAI,YAAY,QAAQ,KAAK,CAAC;GAEnD,OAAO,OAAO,OAAO,IACnB,IAAI,MAAM,MAAM,OAAO,QAAQ,KAAK,GAAG,EAAE,OAAO,QAAQ,MAAM,CAAC,CACjE;EACF;EACA,OAAO,OAAO,OAAO,IAAI,IAAI,MAAM,MAAM,OAAO,KAAK,GAAG,EAAE,MAAM,CAAC,CAAC;CACpE,CAAC;CACH,OAAO,OAAO,WACZ,gBAAgB,KACd,OAAO,QAAQA,OAAkB,GACjC,OAAO,eAAe,QAAQ,SAAS,WAAW,OAAO,CAC3D,GACA,UACF,CAAC,CAAC,KACA,OAAO,MAAM;EACX,YAAY,UAAU;GACpB,MAAM;EACR;EACA,YAAY,UAAU;CACxB,CAAC,CACH;AACF;AAEF,MAAa,sBAQX,EACA,MACA,oBACA,MACA,SACA,OACA,SACA,sBAAsB,CAAC,GACvB,aACA,QAAQ,QAAQ,WAaX;CACL,MAAM,kBAAkB,MAAM,KAAK;CACnC,SAAS,qBAAqB,SAAS,KAAK;CAC5C,UACE,KACA,eAEA,OAAO,IAAI,aAAa;EACtB,MAAM,cAAc,OAAO,KACzB,YACA,OAAO,oBAAoB,IAAI,GAC/B,OAAO,SAAS,eAAe,OAAO,GAAG,CAC3C;EACA,MAAM,aAAa,oBAAoB,MACpC,EAAE,qBACD,eAAe,QAAQ,eAAe,WAAW,GACrD,IACI,SAAS,GAAG,IACZ,KAAA;EAEJ,MAAM,iBAAiB,OAAO,gBAC5B,QAAQ,WAAW,GACnB,qBACA;GACE;GACA,cAAc;GACd;GACA,MAAM;EACR,CACF,CAAC,CAAC,KAAK,OAAO,QAAQ,YAAY,YAAY,OAAO,GAAG,CAAC,CAAC;EAC1D,IAAI,eAAe,KAAA,GAAW,OAAO,WAAW;EAChD,OAAO,OAAO,KACZ,gBACA,OAAO,aAAa,OAAO,GAC3B,OAAO,SAAS,eAAe,OAAO,GAAG,CAC3C;CACF,CAAC,CAAC,CAAC,KAAK,kBAAkB,oBAAoB,OAAO,mBAAmB,CAAC,CAAC;AAC9E;;;;;;AAWA,MAAa,mBACX,QAEA,MAAM,SACJC,QAAgB,IAAI,SAAS,GAC7BC,QAAW,IAAI,IAAI,GACnBC,QAAwB,IAAI,IAAI,GAChCC,QAAsB,IAAI,IAAI,GAC9BC,QAAc,IAAI,OAAO,GAAA,cACG,MAAM,IAAI,OAAO,GAAA,oBACL,MAAM,IAAI,OAAO,GACzDC,QAAkB,IAAI,SAAS,KAAK,GAAG,CAAC,GACxCC,QAAqB,IAAI,YAAY,KAAK,GAAG,CAAC,GAC9CC,QAAmB,IAAI,UAAU,KAAK,GAAG,CAAC,GAC1C,MAAM,QAAQC,UAAqC,GAAG,GAAG,CAC3D;AAEF,MAAa,eAGX,gBACA,QAIA,MAAM,SACJR,QACE,IAAI,WACJ,eAAe,OAAO,KACxB,GACAS,eACE,eAAe,QACf,IAAI,IACN,GACAP,QAAwB,IAAI,IAAI,GAChCC,QAAsB,IAAI,IAAI,GAC9B,aAAoD,IAAI,OAAO,GAAA,cACnC,MAC1B,IAAI,SACJ,eAAe,OAAO,KACxB,GAAA,oBACwC,MAEtC,IAAI,SAAS,eAAe,OAAO,KAAK,GAC1CE,QAAkB,IAAI,SAAS,KAAK,GAAG,CAAC,GACxCC,QAAqB,IAAI,YAAY,KAAK,GAAG,CAAC,GAC9CC,QAAmB,IAAI,UAAU,KAAK,GAAG,CAAC,GAC1CG,MAGE,KAAK,eAAe,OAAO,KAAK,GAClCC,SAAmB,IAAI,aAAa,KAAK,GAAG,CAAC,CAC/C;AAIF,MAAa,gBACX,WAEAP,QAAc,MAAM;;;;AAOtB,MAAM,YACJ,QACG;CACH,IAAI,aAAa;CACjB,MAAM,cAAc;EAClB,IAAI,YAAY,MAAM,IAAIQ,sBAAiC;EAC3D,aAAa;CACf;CA0BA,OAAO;EACL,KAAK;GAzBL,GAAG;GACH,WAAW;IACT,gBAAgB;KACd,MAAM,IAAIC,qBAAgC;IAC5C;IACA,aAAa;KACX,MAAM,IAAIA,qBAAgC;IAC5C;IACA,cAAc;KACZ,MAAM,IAAIA,qBAAgC;IAC5C;GACF;GACA,WAAW,GAAG,SAAS;IACrB,MAAM;IACN,OAAO,IAAI,SAAS,GAAG,IAAI;GAC7B;GACA,cAAc,GAAG,SAAS;IACxB,MAAM;IACN,OAAO,IAAI,YAAY,GAAG,IAAI;GAChC;GACA,iBAAiB;IACf,MAAM,IAAIC,uBAAkC;GAC9C;EAGc;EACd,OAAO,OAAO,cACZ,aAAa,OAAO,OAAO,OAAO,IAAI,IAAIC,kBAA6B,CAAC,CAC1E;CACF;AACF"}
1
+ {"version":3,"file":"RegisteredFunction.js","names":["ConvexLogger.layer","ObservabilityRuntime.memoized","Scheduler.layer","Auth.layer","ExecutionMetadata.layer","RequestMetadata.layer","Storage.layer","QueryRunner.layer","MutationRunner.layer","ActionRunner.layer","ActionCtx.ActionCtx","Auth.layerForTarget","ActionCtx.layer","VectorSearch.layer","ActionCall.ActionCallAlreadyUsed","ActionCall.SchedulingNotAllowed","ActionCall.NestedActionNotAllowed","ActionCall.ActionCallNotUsed"],"sources":["../src/RegisteredFunction.ts"],"sourcesContent":["import * as ActionCallSpec from \"@confect/core/ActionCall\";\nimport * as ActionCall from \"./ActionCall.js\";\nimport type { FunctionSpec, RuntimeAndFunctionType } from \"@confect/core\";\nimport * as IdScope from \"@confect/core/IdScope\";\nimport type * as FunctionProvenance from \"@confect/core/FunctionProvenance\";\nimport * as MiddlewareSpec from \"@confect/core/MiddlewareSpec\";\nimport {\n compileArgsSchema,\n compileReturnsSchema,\n} from \"@confect/core/SchemaToValidator\";\nimport {\n type DefaultFunctionArgs,\n type FunctionVisibility,\n type FunctionMetadata,\n type GenericActionCtx,\n type GenericDataModel,\n type StorageReader as ConvexStorageReader,\n type RegisteredAction,\n type RegisteredMutation,\n type RegisteredQuery,\n} from \"convex/server\";\nimport type { Value } from \"convex/values\";\nimport { ConvexError } from \"convex/values\";\nimport { pipe } from \"effect/Function\";\nimport * as Clock from \"effect/Clock\";\nimport * as Cause from \"effect/Cause\";\nimport * as Console from \"effect/Console\";\nimport * as Context from \"effect/Context\";\nimport * as Effect from \"effect/Effect\";\nimport * as Exit from \"effect/Exit\";\nimport * as Result from \"effect/Result\";\nimport * as Layer from \"effect/Layer\";\nimport * as Schema from \"effect/Schema\";\nimport type * as EffectScheduler from \"effect/Scheduler\";\nimport * as ActionCtx from \"./ActionCtx.js\";\nimport * as ActionRunner from \"./ActionRunner.js\";\nimport * as Auth from \"./Auth.js\";\nimport * as ConvexLogger from \"./ConvexLogger.js\";\nimport type * as DatabaseSchema from \"./DatabaseSchema.js\";\nimport type * as DataModel from \"./DataModel.js\";\nimport * as ExecutionMetadata from \"./ExecutionMetadata.js\";\nimport * as RequestMetadata from \"./RequestMetadata.js\";\nimport * as MutationRunner from \"./MutationRunner.js\";\nimport * as QueryRunner from \"./QueryRunner.js\";\nimport type * as ResolvedMiddleware from \"./ResolvedMiddleware.js\";\nimport * as Scheduler from \"./Scheduler.js\";\nimport * as Storage from \"./Storage.js\";\nimport * as StorageActionWriter from \"./StorageActionWriter.js\";\nimport type * as StorageReader from \"./StorageReader.js\";\nimport * as StorageWriter from \"./StorageWriter.js\";\nimport * as Tracer from \"effect/Tracer\";\nimport * as ObservabilityRuntime from \"./internal/observability.js\";\nimport * as VectorSearch from \"./VectorSearch.js\";\nimport type * as Handler from \"./Handler.js\";\n\nexport const Observability = Context.Reference<Layer.Layer<never> | undefined>(\n \"@confect/server/Observability\",\n { defaultValue: () => undefined },\n);\n\nexport type Any =\n | RegisteredQuery<FunctionVisibility, DefaultFunctionArgs, any>\n | RegisteredMutation<FunctionVisibility, DefaultFunctionArgs, any>\n | RegisteredAction<FunctionVisibility, DefaultFunctionArgs, any>;\n\ntype ConfectRegisteredFunction<\n FunctionSpec_ extends FunctionSpec.AnyWithProps,\n> =\n FunctionSpec.EncodedArgs<FunctionSpec_> extends infer Args_ extends\n DefaultFunctionArgs\n ? RuntimeAndFunctionType.GetFunctionType<\n FunctionSpec_[\"runtimeAndFunctionType\"]\n > extends \"query\"\n ? RegisteredQuery<\n FunctionSpec.GetFunctionVisibility<FunctionSpec_>,\n Args_,\n Promise<FunctionSpec.EncodedReturns<FunctionSpec_>>\n >\n : RuntimeAndFunctionType.GetFunctionType<\n FunctionSpec_[\"runtimeAndFunctionType\"]\n > extends \"mutation\"\n ? RegisteredMutation<\n FunctionSpec.GetFunctionVisibility<FunctionSpec_>,\n Args_,\n Promise<FunctionSpec.EncodedReturns<FunctionSpec_>>\n >\n : RuntimeAndFunctionType.GetFunctionType<\n FunctionSpec_[\"runtimeAndFunctionType\"]\n > extends \"action\"\n ? RegisteredAction<\n FunctionSpec.GetFunctionVisibility<FunctionSpec_>,\n Args_,\n Promise<FunctionSpec.EncodedReturns<FunctionSpec_>>\n >\n : never\n : never;\n\nexport type ConvexRegisteredFunction<\n FunctionSpec_ extends FunctionSpec.AnyWithProps,\n> = FunctionSpec_ extends FunctionSpec.AnyWithProps\n ? FunctionSpec.GetFunctionProvenance<FunctionSpec_> extends FunctionProvenance.Convex<\n infer Args_ extends DefaultFunctionArgs,\n infer Returns_\n >\n ? RuntimeAndFunctionType.GetFunctionType<\n FunctionSpec_[\"runtimeAndFunctionType\"]\n > extends \"query\"\n ? RegisteredQuery<\n FunctionSpec.GetFunctionVisibility<FunctionSpec_>,\n Args_,\n Returns_\n >\n : RuntimeAndFunctionType.GetFunctionType<\n FunctionSpec_[\"runtimeAndFunctionType\"]\n > extends \"mutation\"\n ? RegisteredMutation<\n FunctionSpec.GetFunctionVisibility<FunctionSpec_>,\n Args_,\n Returns_\n >\n : RuntimeAndFunctionType.GetFunctionType<\n FunctionSpec_[\"runtimeAndFunctionType\"]\n > extends \"action\"\n ? RegisteredAction<\n FunctionSpec.GetFunctionVisibility<FunctionSpec_>,\n Args_,\n Returns_\n >\n : never\n : never\n : never;\n\nexport type RegisteredFunction<\n FunctionSpec_ extends FunctionSpec.AnyWithProps,\n> =\n FunctionSpec_ extends FunctionSpec.WithFunctionProvenance<\n FunctionSpec_,\n FunctionProvenance.AnyConvex\n >\n ? ConvexRegisteredFunction<FunctionSpec_>\n : FunctionSpec_ extends FunctionSpec.WithFunctionProvenance<\n FunctionSpec_,\n FunctionProvenance.AnyConfect\n >\n ? ConfectRegisteredFunction<FunctionSpec_>\n : never;\n\n/**\n * Wrap a function's handler effect in its resolved middleware chain, per\n * invocation, after args decode. Iterated innermost-first so that the\n * first-attached (group-level, in attachment order) middleware ends up\n * outermost and runs first. Erased types: the public safety story lives at the\n * `MiddlewareSpec.MiddlewareImpl`/`MiddlewareImpl.make` signatures, and the\n * composed effect's error channel is re-accounted by\n * {@link combineErrorSchemas}.\n */\nexport const applyMiddleware = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n resolvedMiddlewares: ReadonlyArray<ResolvedMiddleware.ResolvedMiddleware>,\n invocation: MiddlewareSpec.MiddlewareOptions[\"invocation\"],\n): Effect.Effect<A, any, R> => {\n return resolvedMiddlewares.reduceRight<Effect.Effect<any, any, any>>(\n // oxlint-disable-next-line effecttsgo/any-unknown-in-error-context -- The erased middleware error remains intact so runHandlerPromise can validate it against the combined error schema.\n (wrapped, middleware) => {\n const context =\n \"options\" in middleware.middlewareSpec\n ? { options: middleware.options, invocation }\n : { invocation };\n // oxlint-disable-next-line effecttsgo/any-unknown-in-error-context -- Resolved middleware is type-erased after its public implementation boundary; its error and service channels are restored by the surrounding function contract.\n return middleware.middlewareImpl(wrapped, context);\n },\n effect,\n );\n};\n\n/**\n * The error-schema allowlist for a function with middleware: the function's own\n * declared `error` schema unioned with every covering middleware's error\n * schema. `undefined` (⇒ every failure dies) only when neither declares\n * one—mirroring the ref-side union clients decode against.\n */\nexport const combineErrorSchemas = (\n error: Schema.Codec<any, any> | undefined,\n resolvedMiddlewares: ReadonlyArray<ResolvedMiddleware.ResolvedMiddleware>,\n): Schema.Codec<any, any> | undefined => {\n const schemas = [\n ...(error !== undefined ? [error] : []),\n ...MiddlewareSpec.errorSchemas(\n resolvedMiddlewares.map(({ middlewareSpec }) => middlewareSpec),\n ),\n ];\n return schemas.length === 0\n ? undefined\n : schemas.length === 1\n ? schemas[0]\n : Schema.Union(schemas);\n};\n\n/**\n * Run the `Effect` as a `Promise`. Inspect the complete `Exit` before encoding\n * a declared error so a typed failure cannot hide a defect.\n *\n * Any `Die` reason takes the defect path. Without a `Die`, the first `Fail` in\n * cause order is schema-encoded and thrown as a `ConvexError` outside the\n * Effect runtime so Convex surfaces its data to the client. Other failures and\n * interruptions alongside that `Fail` are ignored. Without an error schema, the\n * selected failure is treated as a defect.\n *\n * A lone `ConvexError` defect or a selected undeclared `ConvexError` failure is\n * rethrown bare so it keeps Convex's meaning. Pagination and Workpool rely on\n * its data for their control signals. Other causes with a `Die`, interrupt-only\n * or empty causes, and error-encoding failures reject with a plain `Error`\n * whose message renders the complete cause and whose `cause` holds it for\n * server diagnostics.\n *\n * A `scheduler` in `runOptions` must be passed here as a run option rather than\n * provided via `Effect.provideService` inside `effect`: the run option lands in\n * the fiber's root context, while a service provided within `effect` pops\n * before the exit/encoding wrappers this function adds. The fiber's op counter\n * survives context pops, so a cooperative yield can fire inside those wrappers.\n * Only a root-context scheduler covers them.\n */\nexport const runHandlerPromise =\n (\n errorSchema: Schema.Codec<any, any> | undefined,\n runOptions?: {\n readonly scheduler?: EffectScheduler.Scheduler | undefined;\n readonly clock?: Clock.Clock | undefined;\n readonly invocation?: Effect.Effect<FunctionMetadata> | undefined;\n readonly observability?: Layer.Layer<never> | undefined;\n },\n ) =>\n <A, E>(effect: Effect.Effect<A, E>): Promise<A> => {\n const { observability, invocation, clock } = runOptions ?? {};\n let encodedError: Exit.Exit<any, any> | undefined;\n const observed = Effect.tapCause(effect, (cause) =>\n Effect.gen(function* () {\n const reason =\n cause.reasons.find(Cause.isDieReason) ??\n cause.reasons.find(Cause.isFailReason);\n if (reason?._tag === \"Fail\" && errorSchema !== undefined) {\n encodedError = yield* Effect.exit(\n Schema.encodeEffect(errorSchema)(reason.error),\n );\n if (Exit.isFailure(encodedError))\n return yield* Effect.orDie(encodedError);\n }\n }),\n );\n const withConvexError: Effect.Effect<Result.Result<A, ConvexError<any>>> =\n Effect.gen(function* () {\n const exit = yield* Effect.exit(\n observability === undefined || invocation === undefined\n ? effect\n : Effect.flatMap(invocation, ({ name, type, componentPath }) =>\n Effect.useSpan(\n name,\n {\n root: true,\n attributes: { kind: type, componentPath },\n },\n (span) =>\n Effect.provideService(observed, Tracer.ParentSpan, span),\n ),\n ),\n );\n if (Exit.isSuccess(exit)) {\n return Result.succeed(exit.value);\n }\n\n const cause =\n encodedError !== undefined && Exit.isFailure(encodedError)\n ? encodedError.cause\n : exit.cause;\n const reason =\n cause.reasons.find(Cause.isDieReason) ??\n cause.reasons.find(Cause.isFailReason);\n if (\n encodedError === undefined &&\n reason?._tag === \"Die\" &&\n cause.reasons.length === 1 &&\n reason.defect instanceof ConvexError\n ) {\n return Result.fail(reason.defect);\n }\n\n if (reason?._tag === \"Fail\") {\n if (errorSchema === undefined) {\n if (reason.error instanceof ConvexError) {\n return Result.fail(reason.error);\n }\n return yield* Effect.die(reason.error);\n }\n const encoded =\n encodedError ??\n (yield* Effect.exit(\n Schema.encodeEffect(errorSchema)(reason.error),\n ));\n if (Exit.isSuccess(encoded)) {\n return Result.fail(new ConvexError(encoded.value));\n }\n return yield* Effect.die(\n new Error(Cause.pretty(encoded.cause), { cause: encoded.cause }),\n );\n }\n return yield* Effect.die(new Error(Cause.pretty(cause), { cause }));\n });\n return Effect.runPromise(\n withConvexError.pipe(\n Effect.provide(\n observability === undefined\n ? ConvexLogger.layer\n : ObservabilityRuntime.memoized(observability),\n ),\n Effect.provideService(Console.Console, globalThis.console),\n clock === undefined\n ? (self) => self\n : Effect.provideService(Clock.Clock, clock),\n ),\n runOptions,\n ).then(\n Result.match({\n onFailure: (error) => {\n throw error;\n },\n onSuccess: (value) => value,\n }),\n );\n };\n\nexport const actionFunctionBase = <\n Schema extends DatabaseSchema.AnyWithProps,\n Args,\n ConvexArgs extends DefaultFunctionArgs,\n Returns,\n ConvexReturns,\n E,\n R,\n>({\n name,\n functionVisibility,\n args,\n returns,\n error,\n handler,\n resolvedMiddlewares = [],\n createLayer,\n scope = IdScope.app,\n observability,\n}: {\n name: string;\n functionVisibility: FunctionVisibility;\n args: Schema.Codec<Args, ConvexArgs>;\n returns: Schema.Codec<Returns, ConvexReturns>;\n error: Schema.Codec<Error, Value> | undefined;\n handler: (a: Args) => Effect.Effect<Returns, E, R>;\n resolvedMiddlewares?: ReadonlyArray<ResolvedMiddleware.ResolvedMiddleware>;\n createLayer: (\n ctx: GenericActionCtx<DataModel.ToConvex<DataModel.FromSchema<Schema>>>,\n ) => Layer.Layer<R>;\n scope?: IdScope.IdScope;\n observability?: Layer.Layer<never> | undefined;\n}) => ({\n args: compileArgsSchema(args, scope),\n returns: compileReturnsSchema(returns, scope),\n handler: (\n ctx: GenericActionCtx<DataModel.ToConvex<DataModel.FromSchema<Schema>>>,\n actualArgs: ConvexArgs,\n ): Promise<ConvexReturns> =>\n Effect.gen(function* () {\n const decodedArgs = yield* pipe(\n actualArgs,\n Schema.decodeUnknownEffect(args),\n Effect.catchTag(\"SchemaError\", Effect.die),\n );\n const restricted = resolvedMiddlewares.some(\n ({ middlewareSpec }) =>\n middlewareSpec.key === ActionCallSpec.Middleware.key,\n )\n ? restrict(ctx)\n : undefined;\n // oxlint-disable-next-line effecttsgo/any-unknown-in-error-context -- Middleware errors are intentionally erased here and validated by runHandlerPromise against the combined error schema below.\n const decodedReturns = yield* applyMiddleware(\n handler(decodedArgs),\n resolvedMiddlewares,\n {\n name,\n functionType: \"action\",\n functionVisibility,\n args: decodedArgs,\n },\n ).pipe(Effect.provide(createLayer(restricted?.ctx ?? ctx)));\n if (restricted !== undefined) yield* restricted.check;\n return yield* pipe(\n decodedReturns,\n Schema.encodeEffect(returns),\n Effect.catchTag(\"SchemaError\", Effect.die),\n );\n }).pipe(\n runHandlerPromise(combineErrorSchemas(error, resolvedMiddlewares), {\n invocation: Effect.promise(() => ctx.meta.getFunctionMetadata()),\n observability,\n }),\n ),\n});\n\nexport type ActionServices<\n DatabaseSchema_ extends DatabaseSchema.AnyWithProps,\n> = Handler.ActionServices<DatabaseSchema_>;\n\n/**\n * The ctx-backed action services that don't depend on a Confect database\n * schema. {@link actionLayer} adds the schema-typed `VectorSearch` on top; the\n * HTTP API handler uses this base directly.\n */\nexport const baseActionLayer = <ConvexDataModel extends GenericDataModel>(\n ctx: GenericActionCtx<ConvexDataModel>,\n) =>\n Layer.mergeAll(\n Scheduler.layer(ctx.scheduler),\n Auth.layer(ctx.auth),\n ExecutionMetadata.layer(ctx.meta),\n RequestMetadata.layer(ctx.meta),\n Storage.layer(ctx.storage),\n StorageWriter.StorageWriter.layer(ctx.storage),\n StorageActionWriter.StorageActionWriter.layer(ctx.storage),\n QueryRunner.layer(ctx.runQuery.bind(ctx)),\n MutationRunner.layer(ctx.runMutation.bind(ctx)),\n ActionRunner.layer(ctx.runAction.bind(ctx)),\n Layer.succeed(ActionCtx.ActionCtx<ConvexDataModel>(), ctx),\n );\n\nexport const actionLayer = <\n DatabaseSchema_ extends DatabaseSchema.AnyWithProps,\n>(\n databaseSchema: DatabaseSchema_,\n ctx: GenericActionCtx<\n DataModel.ToConvex<DataModel.FromSchema<DatabaseSchema_>>\n >,\n) =>\n Layer.mergeAll(\n Scheduler.layer<DatabaseSchema.Scope<DatabaseSchema_>>(\n ctx.scheduler,\n databaseSchema.target.scope,\n ),\n Auth.layerForTarget<DatabaseSchema_[\"target\"]>(\n databaseSchema.target,\n ctx.auth,\n ),\n ExecutionMetadata.layer(ctx.meta),\n RequestMetadata.layer(ctx.meta),\n storageLayer<DatabaseSchema.Scope<DatabaseSchema_>>(ctx.storage),\n StorageWriter.StorageWriter.layer<DatabaseSchema.Scope<DatabaseSchema_>>(\n ctx.storage,\n databaseSchema.target.scope,\n ),\n StorageActionWriter.StorageActionWriter.layer<\n DatabaseSchema.Scope<DatabaseSchema_>\n >(ctx.storage, databaseSchema.target.scope),\n QueryRunner.layer(ctx.runQuery.bind(ctx)),\n MutationRunner.layer(ctx.runMutation.bind(ctx)),\n ActionRunner.layer(ctx.runAction.bind(ctx)),\n ActionCtx.layer<\n DataModel.ToConvex<DataModel.FromSchema<DatabaseSchema_>>,\n DatabaseSchema.Scope<DatabaseSchema_>\n >(ctx, databaseSchema.target.scope),\n VectorSearch.layer(ctx.vectorSearch.bind(ctx)),\n );\n\n// Scoped readers share the same runtime service and ID strings. Reuse the\n// reader supplied by Storage so both APIs keep the same reader instance.\nexport const storageLayer = <Scope extends IdScope.IdScope>(\n reader: ConvexStorageReader,\n): Layer.Layer<Storage.Storage | StorageReader.ForScope<Scope>> =>\n Storage.layer(reader) as Layer.Layer<\n Storage.Storage | StorageReader.ForScope<Scope>\n >;\n\n/**\n * Shares one dispatch budget across the entire middleware chain.\n */\nconst restrict = <Model extends GenericDataModel>(\n ctx: GenericActionCtx<Model>,\n) => {\n let dispatched = false;\n const claim = () => {\n if (dispatched) throw new ActionCall.ActionCallAlreadyUsed();\n dispatched = true;\n };\n const restricted: GenericActionCtx<Model> = {\n ...ctx,\n scheduler: {\n runAfter: () => {\n throw new ActionCall.SchedulingNotAllowed();\n },\n runAt: () => {\n throw new ActionCall.SchedulingNotAllowed();\n },\n cancel: () => {\n throw new ActionCall.SchedulingNotAllowed();\n },\n },\n runQuery: (...args) => {\n claim();\n return ctx.runQuery(...args);\n },\n runMutation: (...args) => {\n claim();\n return ctx.runMutation(...args);\n },\n runAction: () => {\n throw new ActionCall.NestedActionNotAllowed();\n },\n };\n return {\n ctx: restricted,\n check: Effect.suspend(() =>\n dispatched ? Effect.void : Effect.die(new ActionCall.ActionCallNotUsed()),\n ),\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDA,MAAa,gBAAgB,QAAQ,UACnC,iCACA,EAAE,oBAAoB,KAAA,EAAU,CAClC;;;;;;;;;;AAkGA,MAAa,mBACX,QACA,qBACA,eAC6B;CAC7B,OAAO,oBAAoB,aAExB,SAAS,eAAe;EACvB,MAAM,UACJ,aAAa,WAAW,iBACpB;GAAE,SAAS,WAAW;GAAS;EAAW,IAC1C,EAAE,WAAW;EAEnB,OAAO,WAAW,eAAe,SAAS,OAAO;CACnD,GACA,MACF;AACF;;;;;;;AAQA,MAAa,uBACX,OACA,wBACuC;CACvC,MAAM,UAAU,CACd,GAAI,UAAU,KAAA,IAAY,CAAC,KAAK,IAAI,CAAC,GACrC,GAAG,eAAe,aAChB,oBAAoB,KAAK,EAAE,qBAAqB,cAAc,CAChE,CACF;CACA,OAAO,QAAQ,WAAW,IACtB,KAAA,IACA,QAAQ,WAAW,IACjB,QAAQ,KACR,OAAO,MAAM,OAAO;AAC5B;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,MAAa,qBAET,aACA,gBAOK,WAA4C;CACjD,MAAM,EAAE,eAAe,YAAY,UAAU,cAAc,CAAC;CAC5D,IAAI;CACJ,MAAM,WAAW,OAAO,SAAS,SAAS,UACxC,OAAO,IAAI,aAAa;EACtB,MAAM,SACJ,MAAM,QAAQ,KAAK,MAAM,WAAW,KACpC,MAAM,QAAQ,KAAK,MAAM,YAAY;EACvC,IAAI,QAAQ,SAAS,UAAU,gBAAgB,KAAA,GAAW;GACxD,eAAe,OAAO,OAAO,KAC3B,OAAO,aAAa,WAAW,CAAC,CAAC,OAAO,KAAK,CAC/C;GACA,IAAI,KAAK,UAAU,YAAY,GAC7B,OAAO,OAAO,OAAO,MAAM,YAAY;EAC3C;CACF,CAAC,CACH;CACA,MAAM,kBACJ,OAAO,IAAI,aAAa;EACtB,MAAM,OAAO,OAAO,OAAO,KACzB,kBAAkB,KAAA,KAAa,eAAe,KAAA,IAC1C,SACA,OAAO,QAAQ,aAAa,EAAE,MAAM,MAAM,oBACxC,OAAO,QACL,MACA;GACE,MAAM;GACN,YAAY;IAAE,MAAM;IAAM;GAAc;EAC1C,IACC,SACC,OAAO,eAAe,UAAU,OAAO,YAAY,IAAI,CAC3D,CACF,CACN;EACA,IAAI,KAAK,UAAU,IAAI,GACrB,OAAO,OAAO,QAAQ,KAAK,KAAK;EAGlC,MAAM,QACJ,iBAAiB,KAAA,KAAa,KAAK,UAAU,YAAY,IACrD,aAAa,QACb,KAAK;EACX,MAAM,SACJ,MAAM,QAAQ,KAAK,MAAM,WAAW,KACpC,MAAM,QAAQ,KAAK,MAAM,YAAY;EACvC,IACE,iBAAiB,KAAA,KACjB,QAAQ,SAAS,SACjB,MAAM,QAAQ,WAAW,KACzB,OAAO,kBAAkB,aAEzB,OAAO,OAAO,KAAK,OAAO,MAAM;EAGlC,IAAI,QAAQ,SAAS,QAAQ;GAC3B,IAAI,gBAAgB,KAAA,GAAW;IAC7B,IAAI,OAAO,iBAAiB,aAC1B,OAAO,OAAO,KAAK,OAAO,KAAK;IAEjC,OAAO,OAAO,OAAO,IAAI,OAAO,KAAK;GACvC;GACA,MAAM,UACJ,iBACC,OAAO,OAAO,KACb,OAAO,aAAa,WAAW,CAAC,CAAC,OAAO,KAAK,CAC/C;GACF,IAAI,KAAK,UAAU,OAAO,GACxB,OAAO,OAAO,KAAK,IAAI,YAAY,QAAQ,KAAK,CAAC;GAEnD,OAAO,OAAO,OAAO,IACnB,IAAI,MAAM,MAAM,OAAO,QAAQ,KAAK,GAAG,EAAE,OAAO,QAAQ,MAAM,CAAC,CACjE;EACF;EACA,OAAO,OAAO,OAAO,IAAI,IAAI,MAAM,MAAM,OAAO,KAAK,GAAG,EAAE,MAAM,CAAC,CAAC;CACpE,CAAC;CACH,OAAO,OAAO,WACZ,gBAAgB,KACd,OAAO,QACL,kBAAkB,KAAA,IACdA,UACAC,SAA8B,aAAa,CACjD,GACA,OAAO,eAAe,QAAQ,SAAS,WAAW,OAAO,GACzD,UAAU,KAAA,KACL,SAAS,OACV,OAAO,eAAe,MAAM,OAAO,KAAK,CAC9C,GACA,UACF,CAAC,CAAC,KACA,OAAO,MAAM;EACX,YAAY,UAAU;GACpB,MAAM;EACR;EACA,YAAY,UAAU;CACxB,CAAC,CACH;AACF;AAEF,MAAa,sBAQX,EACA,MACA,oBACA,MACA,SACA,OACA,SACA,sBAAsB,CAAC,GACvB,aACA,QAAQ,QAAQ,KAChB,qBAcK;CACL,MAAM,kBAAkB,MAAM,KAAK;CACnC,SAAS,qBAAqB,SAAS,KAAK;CAC5C,UACE,KACA,eAEA,OAAO,IAAI,aAAa;EACtB,MAAM,cAAc,OAAO,KACzB,YACA,OAAO,oBAAoB,IAAI,GAC/B,OAAO,SAAS,eAAe,OAAO,GAAG,CAC3C;EACA,MAAM,aAAa,oBAAoB,MACpC,EAAE,qBACD,eAAe,QAAQ,eAAe,WAAW,GACrD,IACI,SAAS,GAAG,IACZ,KAAA;EAEJ,MAAM,iBAAiB,OAAO,gBAC5B,QAAQ,WAAW,GACnB,qBACA;GACE;GACA,cAAc;GACd;GACA,MAAM;EACR,CACF,CAAC,CAAC,KAAK,OAAO,QAAQ,YAAY,YAAY,OAAO,GAAG,CAAC,CAAC;EAC1D,IAAI,eAAe,KAAA,GAAW,OAAO,WAAW;EAChD,OAAO,OAAO,KACZ,gBACA,OAAO,aAAa,OAAO,GAC3B,OAAO,SAAS,eAAe,OAAO,GAAG,CAC3C;CACF,CAAC,CAAC,CAAC,KACD,kBAAkB,oBAAoB,OAAO,mBAAmB,GAAG;EACjE,YAAY,OAAO,cAAc,IAAI,KAAK,oBAAoB,CAAC;EAC/D;CACF,CAAC,CACH;AACJ;;;;;;AAWA,MAAa,mBACX,QAEA,MAAM,SACJC,QAAgB,IAAI,SAAS,GAC7BC,QAAW,IAAI,IAAI,GACnBC,QAAwB,IAAI,IAAI,GAChCC,QAAsB,IAAI,IAAI,GAC9BC,QAAc,IAAI,OAAO,GAAA,cACG,MAAM,IAAI,OAAO,GAAA,oBACL,MAAM,IAAI,OAAO,GACzDC,QAAkB,IAAI,SAAS,KAAK,GAAG,CAAC,GACxCC,QAAqB,IAAI,YAAY,KAAK,GAAG,CAAC,GAC9CC,QAAmB,IAAI,UAAU,KAAK,GAAG,CAAC,GAC1C,MAAM,QAAQC,UAAqC,GAAG,GAAG,CAC3D;AAEF,MAAa,eAGX,gBACA,QAIA,MAAM,SACJR,QACE,IAAI,WACJ,eAAe,OAAO,KACxB,GACAS,eACE,eAAe,QACf,IAAI,IACN,GACAP,QAAwB,IAAI,IAAI,GAChCC,QAAsB,IAAI,IAAI,GAC9B,aAAoD,IAAI,OAAO,GAAA,cACnC,MAC1B,IAAI,SACJ,eAAe,OAAO,KACxB,GAAA,oBACwC,MAEtC,IAAI,SAAS,eAAe,OAAO,KAAK,GAC1CE,QAAkB,IAAI,SAAS,KAAK,GAAG,CAAC,GACxCC,QAAqB,IAAI,YAAY,KAAK,GAAG,CAAC,GAC9CC,QAAmB,IAAI,UAAU,KAAK,GAAG,CAAC,GAC1CG,MAGE,KAAK,eAAe,OAAO,KAAK,GAClCC,SAAmB,IAAI,aAAa,KAAK,GAAG,CAAC,CAC/C;AAIF,MAAa,gBACX,WAEAP,QAAc,MAAM;;;;AAOtB,MAAM,YACJ,QACG;CACH,IAAI,aAAa;CACjB,MAAM,cAAc;EAClB,IAAI,YAAY,MAAM,IAAIQ,sBAAiC;EAC3D,aAAa;CACf;CA0BA,OAAO;EACL,KAAK;GAzBL,GAAG;GACH,WAAW;IACT,gBAAgB;KACd,MAAM,IAAIC,qBAAgC;IAC5C;IACA,aAAa;KACX,MAAM,IAAIA,qBAAgC;IAC5C;IACA,cAAc;KACZ,MAAM,IAAIA,qBAAgC;IAC5C;GACF;GACA,WAAW,GAAG,SAAS;IACrB,MAAM;IACN,OAAO,IAAI,SAAS,GAAG,IAAI;GAC7B;GACA,cAAc,GAAG,SAAS;IACxB,MAAM;IACN,OAAO,IAAI,YAAY,GAAG,IAAI;GAChC;GACA,iBAAiB;IACf,MAAM,IAAIC,uBAAkC;GAC9C;EAGc;EACd,OAAO,OAAO,cACZ,aAAa,OAAO,OAAO,OAAO,IAAI,IAAIC,kBAA6B,CAAC,CAC1E;CACF;AACF"}
@@ -7,5 +7,5 @@ import type * as GroupSpec from "@confect/core/GroupSpec";
7
7
  import type * as GroupImpl from "./GroupImpl.js";
8
8
  import type * as RegisteredFunctions from "./RegisteredFunctions.js";
9
9
  export declare const buildForGroup: <Group extends GroupSpec.AnyWithProps>(databaseSchema: DatabaseSchema.AnyWithProps, groupLayer: Layer.Layer<GroupImpl.GroupImpl<"Finalized">>) => RegisteredFunctions.RegisteredFunctionsForGroupSpec<Group>;
10
- export declare const make: (databaseSchema: DatabaseSchema.AnyWithProps, item: FunctionRegistryItem.ConfectFunctionRegistryItem, resolvedMiddlewares?: ReadonlyArray<ResolvedMiddleware.ResolvedMiddleware>) => RegisteredFunction.Any;
10
+ export declare const make: (databaseSchema: DatabaseSchema.AnyWithProps, item: FunctionRegistryItem.ConfectFunctionRegistryItem, resolvedMiddlewares?: ReadonlyArray<ResolvedMiddleware.ResolvedMiddleware>, observability?: Layer.Layer<never>) => RegisteredFunction.Any;
11
11
  //# sourceMappingURL=RegisteredNodeFunction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RegisteredNodeFunction.d.ts","sourceRoot":"","sources":["../src/RegisteredNodeFunction.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,KAAK,cAAc,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,kBAAkB,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,oBAAoB,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,kBAAkB,MAAM,yBAAyB,CAAC;AAE9D,OAAO,KAAK,KAAK,SAAS,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,KAAK,SAAS,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,KAAK,mBAAmB,MAAM,0BAA0B,CAAC;AAGrE,eAAO,MAAM,aAAa,GAAI,KAAK,SAAS,SAAS,CAAC,YAAY,kBAChD,cAAc,CAAC,YAAY,cAC/B,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,KACxD,mBAAmB,CAAC,+BAA+B,CAAC,KAAK,CAqB3D,CAAC;AAEF,eAAO,MAAM,IAAI,mBACC,cAAc,CAAC,YAAY,QACrC,oBAAoB,CAAC,2BAA2B,wBACjC,aAAa,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,KACxE,kBAAkB,CAAC,GAkBrB,CAAC"}
1
+ {"version":3,"file":"RegisteredNodeFunction.d.ts","sourceRoot":"","sources":["../src/RegisteredNodeFunction.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,KAAK,cAAc,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,kBAAkB,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,oBAAoB,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,kBAAkB,MAAM,yBAAyB,CAAC;AAE9D,OAAO,KAAK,KAAK,SAAS,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,KAAK,SAAS,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,KAAK,mBAAmB,MAAM,0BAA0B,CAAC;AAGrE,eAAO,MAAM,aAAa,GAAI,KAAK,SAAS,SAAS,CAAC,YAAY,kBAChD,cAAc,CAAC,YAAY,cAC/B,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,KACxD,mBAAmB,CAAC,+BAA+B,CAAC,KAAK,CAsB3D,CAAC;AAEF,eAAO,MAAM,IAAI,mBACC,cAAc,CAAC,YAAY,QACrC,oBAAoB,CAAC,2BAA2B,wBACjC,aAAa,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,kBACzD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KACjC,kBAAkB,CAAC,GAmBrB,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import { __exportAll } from "./_virtual/_rolldown/runtime.js";
2
2
  import { mapLeaves } from "./internal/utils.js";
3
+ import { actionFunctionBase, actionLayer } from "./RegisteredFunction.js";
3
4
  import { make as make$1 } from "./GroupRegistry.js";
4
5
  import { isFunctionRegistryItem } from "./FunctionRegistryItem.js";
5
- import { actionFunctionBase, actionLayer } from "./RegisteredFunction.js";
6
6
  import { resolve } from "./ResolvedMiddleware.js";
7
7
  import * as Layer from "effect/Layer";
8
8
  import { actionGeneric, internalActionGeneric } from "convex/server";
@@ -14,12 +14,13 @@ var RegisteredNodeFunction_exports = /* @__PURE__ */ __exportAll({
14
14
  make: () => make
15
15
  });
16
16
  const buildForGroup = (databaseSchema, groupLayer) => {
17
- const { functionRegistryItems, middlewareRegistryItems } = make$1(groupLayer);
18
- return mapLeaves(functionRegistryItems, isFunctionRegistryItem, (item) => Match.value(item).pipe(Match.tag("Convex", ({ handler }) => handler), Match.tag("Confect", (confect) => make(databaseSchema, confect, resolve(confect, middlewareRegistryItems))), Match.exhaustive));
17
+ const { functionRegistryItems, middlewareRegistryItems, observability } = make$1(groupLayer);
18
+ return mapLeaves(functionRegistryItems, isFunctionRegistryItem, (item) => Match.value(item).pipe(Match.tag("Convex", ({ handler }) => handler), Match.tag("Confect", (confect) => make(databaseSchema, confect, resolve(confect, middlewareRegistryItems), observability)), Match.exhaustive));
19
19
  };
20
- const make = (databaseSchema, item, resolvedMiddlewares = []) => {
20
+ const make = (databaseSchema, item, resolvedMiddlewares = [], observability) => {
21
21
  return Match.value(item.functionVisibility).pipe(Match.when("public", () => actionGeneric), Match.when("internal", () => internalActionGeneric), Match.exhaustive)(nodeActionFunction(databaseSchema, {
22
22
  name: item.name,
23
+ observability,
23
24
  functionVisibility: item.functionVisibility,
24
25
  args: item.args,
25
26
  returns: item.returns,
@@ -28,7 +29,7 @@ const make = (databaseSchema, item, resolvedMiddlewares = []) => {
28
29
  resolvedMiddlewares
29
30
  }));
30
31
  };
31
- const nodeActionFunction = (databaseSchema, { name, functionVisibility, args, returns, error, handler, resolvedMiddlewares }) => actionFunctionBase({
32
+ const nodeActionFunction = (databaseSchema, { name, functionVisibility, args, returns, error, handler, resolvedMiddlewares, observability }) => actionFunctionBase({
32
33
  scope: databaseSchema.target.scope,
33
34
  name,
34
35
  functionVisibility,
@@ -37,6 +38,7 @@ const nodeActionFunction = (databaseSchema, { name, functionVisibility, args, re
37
38
  error,
38
39
  handler,
39
40
  resolvedMiddlewares,
41
+ observability,
40
42
  createLayer: (ctx) => Layer.mergeAll(actionLayer(databaseSchema, ctx), NodeServices.layer)
41
43
  });
42
44
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"RegisteredNodeFunction.js","names":["GroupRegistry.make","FunctionRegistryItem.isFunctionRegistryItem","ResolvedMiddleware.resolve","RegisteredFunction.actionFunctionBase","RegisteredFunction.actionLayer"],"sources":["../src/RegisteredNodeFunction.ts"],"sourcesContent":["import * as NodeServices from \"@effect/platform-node/NodeServices\";\nimport {\n actionGeneric,\n type DefaultFunctionArgs,\n type FunctionVisibility,\n internalActionGeneric,\n} from \"convex/server\";\nimport type { Effect } from \"effect\";\nimport type { Schema } from \"effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as Match from \"effect/Match\";\nimport type * as DatabaseSchema from \"./DatabaseSchema.js\";\nimport * as RegisteredFunction from \"./RegisteredFunction.js\";\nimport * as FunctionRegistryItem from \"./FunctionRegistryItem.js\";\nimport * as ResolvedMiddleware from \"./ResolvedMiddleware.js\";\nimport * as GroupRegistry from \"./GroupRegistry.js\";\nimport type * as GroupSpec from \"@confect/core/GroupSpec\";\nimport type * as GroupImpl from \"./GroupImpl.js\";\nimport type * as RegisteredFunctions from \"./RegisteredFunctions.js\";\nimport { mapLeaves } from \"./internal/utils.js\";\n\nexport const buildForGroup = <Group extends GroupSpec.AnyWithProps>(\n databaseSchema: DatabaseSchema.AnyWithProps,\n groupLayer: Layer.Layer<GroupImpl.GroupImpl<\"Finalized\">>,\n): RegisteredFunctions.RegisteredFunctionsForGroupSpec<Group> => {\n const { functionRegistryItems, middlewareRegistryItems } =\n GroupRegistry.make(groupLayer);\n return mapLeaves<FunctionRegistryItem.AnyWithProps, RegisteredFunction.Any>(\n functionRegistryItems as {\n [key: string]: FunctionRegistryItem.AnyWithProps;\n },\n FunctionRegistryItem.isFunctionRegistryItem,\n (item) =>\n Match.value(item).pipe(\n Match.tag(\"Convex\", ({ handler }) => handler),\n Match.tag(\"Confect\", (confect) =>\n make(\n databaseSchema,\n confect,\n ResolvedMiddleware.resolve(confect, middlewareRegistryItems),\n ),\n ),\n Match.exhaustive,\n ),\n ) as RegisteredFunctions.RegisteredFunctionsForGroupSpec<Group>;\n};\n\nexport const make = (\n databaseSchema: DatabaseSchema.AnyWithProps,\n item: FunctionRegistryItem.ConfectFunctionRegistryItem,\n resolvedMiddlewares: ReadonlyArray<ResolvedMiddleware.ResolvedMiddleware> = [],\n): RegisteredFunction.Any => {\n const genericFunction = Match.value(item.functionVisibility).pipe(\n Match.when(\"public\", () => actionGeneric),\n Match.when(\"internal\", () => internalActionGeneric),\n Match.exhaustive,\n );\n\n return genericFunction(\n nodeActionFunction(databaseSchema, {\n name: item.name,\n functionVisibility: item.functionVisibility,\n args: item.args,\n returns: item.returns,\n error: item.error,\n handler: item.handler,\n resolvedMiddlewares,\n }),\n );\n};\n\nconst nodeActionFunction = <\n DatabaseSchema_ extends DatabaseSchema.AnyWithProps,\n Args,\n ConvexArgs extends DefaultFunctionArgs,\n Returns,\n ConvexReturns,\n E,\n>(\n databaseSchema: DatabaseSchema_,\n {\n name,\n functionVisibility,\n args,\n returns,\n error,\n handler,\n resolvedMiddlewares,\n }: {\n name: string;\n functionVisibility: FunctionVisibility;\n args: Schema.Codec<Args, ConvexArgs>;\n returns: Schema.Codec<Returns, ConvexReturns>;\n error: Schema.Codec<any, any> | undefined;\n handler: (\n a: Args,\n ) => Effect.Effect<\n Returns,\n E,\n | RegisteredFunction.ActionServices<DatabaseSchema_>\n | NodeServices.NodeServices\n >;\n resolvedMiddlewares: ReadonlyArray<ResolvedMiddleware.ResolvedMiddleware>;\n },\n) =>\n RegisteredFunction.actionFunctionBase({\n scope: databaseSchema.target.scope,\n name,\n functionVisibility,\n args,\n returns,\n error,\n handler,\n resolvedMiddlewares,\n createLayer: (ctx) =>\n Layer.mergeAll(\n RegisteredFunction.actionLayer(databaseSchema, ctx),\n NodeServices.layer,\n ),\n });\n"],"mappings":";;;;;;;;;;;;;;;AAqBA,MAAa,iBACX,gBACA,eAC+D;CAC/D,MAAM,EAAE,uBAAuB,4BAC7BA,OAAmB,UAAU;CAC/B,OAAO,UACL,uBAGAC,yBACC,SACC,MAAM,MAAM,IAAI,CAAC,CAAC,KAChB,MAAM,IAAI,WAAW,EAAE,cAAc,OAAO,GAC5C,MAAM,IAAI,YAAY,YACpB,KACE,gBACA,SACAC,QAA2B,SAAS,uBAAuB,CAC7D,CACF,GACA,MAAM,UACR,CACJ;AACF;AAEA,MAAa,QACX,gBACA,MACA,sBAA4E,CAAC,MAClD;CAO3B,OANwB,MAAM,MAAM,KAAK,kBAAkB,CAAC,CAAC,KAC3D,MAAM,KAAK,gBAAgB,aAAa,GACxC,MAAM,KAAK,kBAAkB,qBAAqB,GAClD,MAAM,UAGa,CAAC,CACpB,mBAAmB,gBAAgB;EACjC,MAAM,KAAK;EACX,oBAAoB,KAAK;EACzB,MAAM,KAAK;EACX,SAAS,KAAK;EACd,OAAO,KAAK;EACZ,SAAS,KAAK;EACd;CACF,CAAC,CACH;AACF;AAEA,MAAM,sBAQJ,gBACA,EACE,MACA,oBACA,MACA,SACA,OACA,SACA,0BAkBFC,mBAAsC;CACpC,OAAO,eAAe,OAAO;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA,cAAc,QACZ,MAAM,SACJC,YAA+B,gBAAgB,GAAG,GAClD,aAAa,KACf;AACJ,CAAC"}
1
+ {"version":3,"file":"RegisteredNodeFunction.js","names":["GroupRegistry.make","FunctionRegistryItem.isFunctionRegistryItem","ResolvedMiddleware.resolve","RegisteredFunction.actionFunctionBase","RegisteredFunction.actionLayer"],"sources":["../src/RegisteredNodeFunction.ts"],"sourcesContent":["import * as NodeServices from \"@effect/platform-node/NodeServices\";\nimport {\n actionGeneric,\n type DefaultFunctionArgs,\n type FunctionVisibility,\n internalActionGeneric,\n} from \"convex/server\";\nimport type { Effect } from \"effect\";\nimport type { Schema } from \"effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as Match from \"effect/Match\";\nimport type * as DatabaseSchema from \"./DatabaseSchema.js\";\nimport * as RegisteredFunction from \"./RegisteredFunction.js\";\nimport * as FunctionRegistryItem from \"./FunctionRegistryItem.js\";\nimport * as ResolvedMiddleware from \"./ResolvedMiddleware.js\";\nimport * as GroupRegistry from \"./GroupRegistry.js\";\nimport type * as GroupSpec from \"@confect/core/GroupSpec\";\nimport type * as GroupImpl from \"./GroupImpl.js\";\nimport type * as RegisteredFunctions from \"./RegisteredFunctions.js\";\nimport { mapLeaves } from \"./internal/utils.js\";\n\nexport const buildForGroup = <Group extends GroupSpec.AnyWithProps>(\n databaseSchema: DatabaseSchema.AnyWithProps,\n groupLayer: Layer.Layer<GroupImpl.GroupImpl<\"Finalized\">>,\n): RegisteredFunctions.RegisteredFunctionsForGroupSpec<Group> => {\n const { functionRegistryItems, middlewareRegistryItems, observability } =\n GroupRegistry.make(groupLayer);\n return mapLeaves<FunctionRegistryItem.AnyWithProps, RegisteredFunction.Any>(\n functionRegistryItems as {\n [key: string]: FunctionRegistryItem.AnyWithProps;\n },\n FunctionRegistryItem.isFunctionRegistryItem,\n (item) =>\n Match.value(item).pipe(\n Match.tag(\"Convex\", ({ handler }) => handler),\n Match.tag(\"Confect\", (confect) =>\n make(\n databaseSchema,\n confect,\n ResolvedMiddleware.resolve(confect, middlewareRegistryItems),\n observability,\n ),\n ),\n Match.exhaustive,\n ),\n ) as RegisteredFunctions.RegisteredFunctionsForGroupSpec<Group>;\n};\n\nexport const make = (\n databaseSchema: DatabaseSchema.AnyWithProps,\n item: FunctionRegistryItem.ConfectFunctionRegistryItem,\n resolvedMiddlewares: ReadonlyArray<ResolvedMiddleware.ResolvedMiddleware> = [],\n observability?: Layer.Layer<never>,\n): RegisteredFunction.Any => {\n const genericFunction = Match.value(item.functionVisibility).pipe(\n Match.when(\"public\", () => actionGeneric),\n Match.when(\"internal\", () => internalActionGeneric),\n Match.exhaustive,\n );\n\n return genericFunction(\n nodeActionFunction(databaseSchema, {\n name: item.name,\n observability,\n functionVisibility: item.functionVisibility,\n args: item.args,\n returns: item.returns,\n error: item.error,\n handler: item.handler,\n resolvedMiddlewares,\n }),\n );\n};\n\nconst nodeActionFunction = <\n DatabaseSchema_ extends DatabaseSchema.AnyWithProps,\n Args,\n ConvexArgs extends DefaultFunctionArgs,\n Returns,\n ConvexReturns,\n E,\n>(\n databaseSchema: DatabaseSchema_,\n {\n name,\n functionVisibility,\n args,\n returns,\n error,\n handler,\n resolvedMiddlewares,\n observability,\n }: {\n name: string;\n functionVisibility: FunctionVisibility;\n args: Schema.Codec<Args, ConvexArgs>;\n returns: Schema.Codec<Returns, ConvexReturns>;\n error: Schema.Codec<any, any> | undefined;\n handler: (\n a: Args,\n ) => Effect.Effect<\n Returns,\n E,\n | RegisteredFunction.ActionServices<DatabaseSchema_>\n | NodeServices.NodeServices\n >;\n resolvedMiddlewares: ReadonlyArray<ResolvedMiddleware.ResolvedMiddleware>;\n observability?: Layer.Layer<never> | undefined;\n },\n) =>\n RegisteredFunction.actionFunctionBase({\n scope: databaseSchema.target.scope,\n name,\n functionVisibility,\n args,\n returns,\n error,\n handler,\n resolvedMiddlewares,\n observability,\n createLayer: (ctx) =>\n Layer.mergeAll(\n RegisteredFunction.actionLayer(databaseSchema, ctx),\n NodeServices.layer,\n ),\n });\n"],"mappings":";;;;;;;;;;;;;;;AAqBA,MAAa,iBACX,gBACA,eAC+D;CAC/D,MAAM,EAAE,uBAAuB,yBAAyB,kBACtDA,OAAmB,UAAU;CAC/B,OAAO,UACL,uBAGAC,yBACC,SACC,MAAM,MAAM,IAAI,CAAC,CAAC,KAChB,MAAM,IAAI,WAAW,EAAE,cAAc,OAAO,GAC5C,MAAM,IAAI,YAAY,YACpB,KACE,gBACA,SACAC,QAA2B,SAAS,uBAAuB,GAC3D,aACF,CACF,GACA,MAAM,UACR,CACJ;AACF;AAEA,MAAa,QACX,gBACA,MACA,sBAA4E,CAAC,GAC7E,kBAC2B;CAO3B,OANwB,MAAM,MAAM,KAAK,kBAAkB,CAAC,CAAC,KAC3D,MAAM,KAAK,gBAAgB,aAAa,GACxC,MAAM,KAAK,kBAAkB,qBAAqB,GAClD,MAAM,UAGa,CAAC,CACpB,mBAAmB,gBAAgB;EACjC,MAAM,KAAK;EACX;EACA,oBAAoB,KAAK;EACzB,MAAM,KAAK;EACX,SAAS,KAAK;EACd,OAAO,KAAK;EACZ,SAAS,KAAK;EACd;CACF,CAAC,CACH;AACF;AAEA,MAAM,sBAQJ,gBACA,EACE,MACA,oBACA,MACA,SACA,OACA,SACA,qBACA,oBAmBFC,mBAAsC;CACpC,OAAO,eAAe,OAAO;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,cAAc,QACZ,MAAM,SACJC,YAA+B,gBAAgB,GAAG,GAClD,aAAa,KACf;AACJ,CAAC"}
package/dist/index.js CHANGED
@@ -17,6 +17,15 @@ import { Auth_exports } from "./Auth.js";
17
17
  import { BlobNotFoundError_exports } from "./BlobNotFoundError.js";
18
18
  import { Callback_exports } from "./Callback.js";
19
19
  import { ConvexConfigProvider_exports } from "./ConvexConfigProvider.js";
20
+ import { ConvexLogger_exports } from "./ConvexLogger.js";
21
+ import { ExecutionMetadata_exports } from "./ExecutionMetadata.js";
22
+ import { RequestMetadata_exports } from "./RequestMetadata.js";
23
+ import { StorageActionWriter_exports } from "./StorageActionWriter.js";
24
+ import { StorageReader_exports } from "./StorageReader.js";
25
+ import { StorageWriter_exports } from "./StorageWriter.js";
26
+ import { Storage_exports } from "./Storage.js";
27
+ import { VectorSearch_exports } from "./VectorSearch.js";
28
+ import { RegisteredFunction_exports } from "./RegisteredFunction.js";
20
29
  import { FunctionRegistryItem_exports } from "./FunctionRegistryItem.js";
21
30
  import { DatabaseSchema_exports } from "./DatabaseSchema.js";
22
31
  import { Document_exports } from "./Document.js";
@@ -34,18 +43,9 @@ import { QueryInitializer_exports } from "./QueryInitializer.js";
34
43
  import { Table_exports } from "./Table.js";
35
44
  import { DatabaseReader_exports } from "./DatabaseReader.js";
36
45
  import { DatabaseWriter_exports } from "./DatabaseWriter.js";
37
- import { ExecutionMetadata_exports } from "./ExecutionMetadata.js";
38
- import { RequestMetadata_exports } from "./RequestMetadata.js";
39
46
  import { TransactionMetadata_exports } from "./TransactionMetadata.js";
40
47
  import { MutationCtx_exports } from "./MutationCtx.js";
41
48
  import { QueryCtx_exports } from "./QueryCtx.js";
42
- import { ConvexLogger_exports } from "./ConvexLogger.js";
43
- import { StorageActionWriter_exports } from "./StorageActionWriter.js";
44
- import { StorageReader_exports } from "./StorageReader.js";
45
- import { StorageWriter_exports } from "./StorageWriter.js";
46
- import { Storage_exports } from "./Storage.js";
47
- import { VectorSearch_exports } from "./VectorSearch.js";
48
- import { RegisteredFunction_exports } from "./RegisteredFunction.js";
49
49
  import { RegisteredConvexFunction_exports } from "./RegisteredConvexFunction.js";
50
50
  import { ResolvedMiddleware_exports } from "./ResolvedMiddleware.js";
51
51
  import { ConvexFunctionDefinitions_exports } from "./ConvexFunctionDefinitions.js";
@@ -0,0 +1,5 @@
1
+ import * as Layer from "effect/Layer";
2
+ import * as Scope from "effect/Scope";
3
+ export declare const scope: Scope.Closeable;
4
+ export declare const memoized: (layer: Layer.Layer<never>) => Layer.Layer<never>;
5
+ //# sourceMappingURL=observability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../src/internal/observability.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAItC,eAAO,MAAM,KAAK,iBAAqB,CAAC;AAGxC,eAAO,MAAM,QAAQ,UAAW,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAerE,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { layer } from "../ConvexConfigProvider.js";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Layer from "effect/Layer";
4
+ import * as Duration from "effect/Duration";
5
+ import * as Exit from "effect/Exit";
6
+ import * as Scope from "effect/Scope";
7
+ //#region src/internal/observability.ts
8
+ const memoMap = Layer.makeMemoMapUnsafe();
9
+ const scope = Scope.makeUnsafe();
10
+ const layers = /* @__PURE__ */ new WeakMap();
11
+ const memoized = (layer$1) => {
12
+ const cached = layers.get(layer$1);
13
+ if (cached !== void 0) return cached;
14
+ const built = Layer.buildWithMemoMap(layer$1, memoMap, scope).pipe(Effect.provide(layer), Effect.cachedWithTTL((exit) => Exit.isSuccess(exit) ? Duration.infinity : Duration.zero), Effect.runSync, Effect.uninterruptible, Layer.effectContext);
15
+ layers.set(layer$1, built);
16
+ return built;
17
+ };
18
+ //#endregion
19
+ export { memoized, scope };
20
+
21
+ //# sourceMappingURL=observability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.js","names":["layer","ConvexConfigProvider.layer"],"sources":["../../src/internal/observability.ts"],"sourcesContent":["import * as Duration from \"effect/Duration\";\nimport * as Effect from \"effect/Effect\";\nimport * as Exit from \"effect/Exit\";\nimport * as Layer from \"effect/Layer\";\nimport * as Scope from \"effect/Scope\";\nimport * as ConvexConfigProvider from \"../ConvexConfigProvider.js\";\n\nconst memoMap = Layer.makeMemoMapUnsafe();\nexport const scope = Scope.makeUnsafe();\nconst layers = new WeakMap<Layer.Layer<never>, Layer.Layer<never>>();\n\nexport const memoized = (layer: Layer.Layer<never>): Layer.Layer<never> => {\n const cached = layers.get(layer);\n if (cached !== undefined) return cached;\n const built = Layer.buildWithMemoMap(layer, memoMap, scope).pipe(\n Effect.provide(ConvexConfigProvider.layer),\n // A failed first build is retried on the next invocation instead of failing every later one.\n Effect.cachedWithTTL((exit) =>\n Exit.isSuccess(exit) ? Duration.infinity : Duration.zero,\n ),\n Effect.runSync,\n Effect.uninterruptible,\n Layer.effectContext,\n );\n layers.set(layer, built);\n return built;\n};\n"],"mappings":";;;;;;;AAOA,MAAM,UAAU,MAAM,kBAAkB;AACxC,MAAa,QAAQ,MAAM,WAAW;AACtC,MAAM,yBAAS,IAAI,QAAgD;AAEnE,MAAa,YAAY,YAAkD;CACzE,MAAM,SAAS,OAAO,IAAIA,OAAK;CAC/B,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,MAAM,QAAQ,MAAM,iBAAiBA,SAAO,SAAS,KAAK,CAAC,CAAC,KAC1D,OAAO,QAAQC,KAA0B,GAEzC,OAAO,eAAe,SACpB,KAAK,UAAU,IAAI,IAAI,SAAS,WAAW,SAAS,IACtD,GACA,OAAO,SACP,OAAO,iBACP,MAAM,aACR;CACA,OAAO,IAAID,SAAO,KAAK;CACvB,OAAO;AACT"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@gaganref/confect-server",
3
- "version": "10.3.1-fork.38",
3
+ "version": "10.3.1-fork.39",
4
4
  "dependencies": {
5
5
  "@effect/ai-openai-compat": "4.0.4",
6
6
  "@effect/ai-openrouter": "4.0.4"
7
7
  },
8
8
  "peerDependencies": {
9
- "@confect/core": "npm:@gaganref/confect-core@10.3.1-fork.38",
9
+ "@confect/core": "npm:@gaganref/confect-core@10.3.1-fork.39",
10
10
  "@effect/platform-node": ">=4.0.0 <4.1.0",
11
11
  "convex": "^1.48.0",
12
12
  "effect": ">=4.0.4 <4.1.0"
@@ -63,7 +63,7 @@ export const buildForGroup = <Group extends GroupSpec.AnyWithProps>(
63
63
  databaseSchema: DatabaseSchema.AnyWithProps,
64
64
  groupLayer: Layer.Layer<GroupImpl.GroupImpl<"Finalized">>,
65
65
  ): ForGroup<Group> => {
66
- const { functionRegistryItems, middlewareRegistryItems } =
66
+ const { functionRegistryItems, middlewareRegistryItems, observability } =
67
67
  GroupRegistry.make(groupLayer);
68
68
  return mapLeaves<
69
69
  FunctionRegistryItem.AnyWithProps,
@@ -83,6 +83,7 @@ export const buildForGroup = <Group extends GroupSpec.AnyWithProps>(
83
83
  databaseSchema,
84
84
  confect,
85
85
  ResolvedMiddleware.resolve(confect, middlewareRegistryItems),
86
+ observability,
86
87
  ),
87
88
  ),
88
89
  Match.exhaustive,
@@ -1,3 +1,4 @@
1
+ import * as RegisteredFunction from "./RegisteredFunction.js";
1
2
  import * as Effect from "effect/Effect";
2
3
  import type * as Layer from "effect/Layer";
3
4
  import * as Ref from "effect/Ref";
@@ -9,9 +10,12 @@ import * as MiddlewareRegistryItem from "./MiddlewareRegistryItem.js";
9
10
  export const make = (
10
11
  groupLayer: Layer.Layer<GroupImpl.GroupImpl<"Finalized">>,
11
12
  ) => {
12
- const registryItems = Effect.gen(function* () {
13
+ const { registryItems, observability } = Effect.gen(function* () {
13
14
  const registry = yield* Registry.Registry;
14
- return yield* Ref.get(registry);
15
+ return {
16
+ registryItems: yield* Ref.get(registry),
17
+ observability: yield* RegisteredFunction.Observability,
18
+ };
15
19
  }).pipe(
16
20
  Effect.provide(groupLayer),
17
21
  Effect.provideService(
@@ -21,7 +25,7 @@ export const make = (
21
25
  Effect.runSync,
22
26
  );
23
27
 
24
- return partitionRegistryItems(registryItems);
28
+ return { ...partitionRegistryItems(registryItems), observability };
25
29
  };
26
30
 
27
31
  const partitionRegistryItems = (registryItems: RegistryItems.RegistryItems) => {
@@ -61,12 +61,14 @@ export const prepare = (
61
61
  databaseSchema: DatabaseSchema.AnyWithProps,
62
62
  item: FunctionRegistryItem.ConfectFunctionRegistryItem,
63
63
  resolvedMiddlewares: ReadonlyArray<ResolvedMiddleware.ResolvedMiddleware> = [],
64
+ observability?: Layer.Layer<never>,
64
65
  ) =>
65
66
  Match.value(item.functionType).pipe(
66
67
  Match.when("query", () => {
67
68
  const definition = queryFunction({
68
69
  databaseSchema,
69
70
  name: item.name,
71
+ observability,
70
72
  functionVisibility: item.functionVisibility,
71
73
  args: item.args,
72
74
  returns: item.returns,
@@ -84,6 +86,7 @@ export const prepare = (
84
86
  const definition = mutationFunction({
85
87
  databaseSchema,
86
88
  name: item.name,
89
+ observability,
87
90
  functionVisibility: item.functionVisibility,
88
91
  args: item.args,
89
92
  returns: item.returns,
@@ -100,6 +103,7 @@ export const prepare = (
100
103
  Match.when("action", () => {
101
104
  const definition = convexActionFunction(databaseSchema, {
102
105
  name: item.name,
106
+ observability,
103
107
  functionVisibility: item.functionVisibility,
104
108
  args: item.args,
105
109
  returns: item.returns,
@@ -188,6 +192,7 @@ const queryFunction = <
188
192
  error,
189
193
  handler,
190
194
  resolvedMiddlewares,
195
+ observability,
191
196
  }: {
192
197
  databaseSchema: DatabaseSchema_;
193
198
  name: string;
@@ -199,6 +204,7 @@ const queryFunction = <
199
204
  a: Args,
200
205
  ) => Effect.Effect<Returns, E, Handler.QueryServices<DatabaseSchema_>>;
201
206
  resolvedMiddlewares: ReadonlyArray<ResolvedMiddleware.ResolvedMiddleware>;
207
+ observability?: Layer.Layer<never> | undefined;
202
208
  }) => ({
203
209
  args: compileArgsSchema(args, databaseSchema.target.scope),
204
210
  returns: compileReturnsSchema(returns, databaseSchema.target.scope),
@@ -258,6 +264,9 @@ const queryFunction = <
258
264
  RegisteredFunction.combineErrorSchemas(error, resolvedMiddlewares),
259
265
  {
260
266
  scheduler: new EffectScheduler.MixedScheduler("sync"),
267
+ invocation: Effect.promise(() => ctx.meta.getFunctionMetadata()),
268
+ clock: observability === undefined ? undefined : queryClock,
269
+ observability,
261
270
  },
262
271
  ),
263
272
  ),
@@ -314,6 +323,7 @@ const mutationFunction = <
314
323
  error,
315
324
  handler,
316
325
  resolvedMiddlewares,
326
+ observability,
317
327
  }: {
318
328
  databaseSchema: DatabaseSchema_;
319
329
  name: string;
@@ -325,6 +335,7 @@ const mutationFunction = <
325
335
  a: Args,
326
336
  ) => Effect.Effect<Returns, E, MutationServices<DatabaseSchema_>>;
327
337
  resolvedMiddlewares: ReadonlyArray<ResolvedMiddleware.ResolvedMiddleware>;
338
+ observability?: Layer.Layer<never> | undefined;
328
339
  }) => ({
329
340
  args: compileArgsSchema(args, databaseSchema.target.scope),
330
341
  returns: compileReturnsSchema(returns, databaseSchema.target.scope),
@@ -361,6 +372,8 @@ const mutationFunction = <
361
372
  RegisteredFunction.combineErrorSchemas(error, resolvedMiddlewares),
362
373
  {
363
374
  scheduler: new EffectScheduler.MixedScheduler("sync"),
375
+ invocation: Effect.promise(() => ctx.meta.getFunctionMetadata()),
376
+ observability,
364
377
  },
365
378
  ),
366
379
  ),
@@ -383,6 +396,7 @@ const convexActionFunction = <
383
396
  error,
384
397
  handler,
385
398
  resolvedMiddlewares,
399
+ observability,
386
400
  }: {
387
401
  name: string;
388
402
  functionVisibility: FunctionVisibility;
@@ -397,6 +411,7 @@ const convexActionFunction = <
397
411
  RegisteredFunction.ActionServices<DatabaseSchema_>
398
412
  >;
399
413
  resolvedMiddlewares: ReadonlyArray<ResolvedMiddleware.ResolvedMiddleware>;
414
+ observability?: Layer.Layer<never> | undefined;
400
415
  },
401
416
  ) =>
402
417
  RegisteredFunction.actionFunctionBase({
@@ -408,6 +423,7 @@ const convexActionFunction = <
408
423
  error,
409
424
  handler,
410
425
  resolvedMiddlewares,
426
+ observability,
411
427
  createLayer: (ctx) =>
412
428
  Layer.mergeAll(
413
429
  RegisteredFunction.actionLayer(schema, ctx),