@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.
- package/dist/ConvexFunctionDefinitions.d.ts.map +1 -1
- package/dist/ConvexFunctionDefinitions.js +2 -2
- package/dist/ConvexFunctionDefinitions.js.map +1 -1
- package/dist/GroupRegistry.d.ts +1 -0
- package/dist/GroupRegistry.d.ts.map +1 -1
- package/dist/GroupRegistry.js +10 -3
- package/dist/GroupRegistry.js.map +1 -1
- package/dist/QueryStreamReadBudget.js +1 -1
- package/dist/RegisteredConvexFunction.d.ts +7 -4
- package/dist/RegisteredConvexFunction.d.ts.map +1 -1
- package/dist/RegisteredConvexFunction.js +27 -14
- package/dist/RegisteredConvexFunction.js.map +1 -1
- package/dist/RegisteredFunction.d.ts +9 -2
- package/dist/RegisteredFunction.d.ts.map +1 -1
- package/dist/RegisteredFunction.js +37 -13
- package/dist/RegisteredFunction.js.map +1 -1
- package/dist/RegisteredNodeFunction.d.ts +1 -1
- package/dist/RegisteredNodeFunction.d.ts.map +1 -1
- package/dist/RegisteredNodeFunction.js +7 -5
- package/dist/RegisteredNodeFunction.js.map +1 -1
- package/dist/index.js +9 -9
- package/dist/internal/observability.d.ts +5 -0
- package/dist/internal/observability.d.ts.map +1 -0
- package/dist/internal/observability.js +21 -0
- package/dist/internal/observability.js.map +1 -0
- package/package.json +2 -2
- package/src/ConvexFunctionDefinitions.ts +2 -1
- package/src/GroupRegistry.ts +7 -3
- package/src/RegisteredConvexFunction.ts +16 -0
- package/src/RegisteredFunction.ts +70 -7
- package/src/RegisteredNodeFunction.ts +7 -1
- package/src/internal/observability.ts +27 -0
|
@@ -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 "./
|
|
10
|
-
import { layer as layer$7 } from "./
|
|
11
|
-
import { layer as layer$8 } from "./
|
|
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
|
|
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$
|
|
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$
|
|
138
|
-
const actionLayer = (databaseSchema, ctx) => Layer.mergeAll(layer$4(ctx.scheduler, databaseSchema.target.scope), layerForTarget(databaseSchema.target, ctx.auth), layer$
|
|
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":"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"}
|
|
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":"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"}
|
|
@@ -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,
|
|
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,
|
|
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 @@
|
|
|
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.
|
|
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.
|
|
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,
|
package/src/GroupRegistry.ts
CHANGED
|
@@ -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
|
|
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),
|