@gaganref/confect-server 10.3.1-fork.3 → 10.3.1-fork.30

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.
Files changed (273) hide show
  1. package/dist/ActionCall.d.ts +30 -0
  2. package/dist/ActionCall.d.ts.map +1 -0
  3. package/dist/ActionCall.js +41 -0
  4. package/dist/ActionCall.js.map +1 -0
  5. package/dist/ActionCtx.d.ts +1 -1
  6. package/dist/ActionCtx.d.ts.map +1 -1
  7. package/dist/ActionCtx.js.map +1 -1
  8. package/dist/ActionRunner.js +2 -2
  9. package/dist/AiGatewayDecisionClient.d.ts +2 -2
  10. package/dist/AiGatewayDecisionClient.d.ts.map +1 -1
  11. package/dist/AiGatewayDecisionClient.js +1 -1
  12. package/dist/AiGatewayDecisionClient.js.map +1 -1
  13. package/dist/AiGatewayLanguageClient.d.ts +2 -2
  14. package/dist/AiGatewayLanguageClient.d.ts.map +1 -1
  15. package/dist/AiGatewayLanguageClient.js +1 -1
  16. package/dist/AiGatewayLanguageClient.js.map +1 -1
  17. package/dist/Auth.d.ts +1 -1
  18. package/dist/Auth.d.ts.map +1 -1
  19. package/dist/Auth.js +1 -1
  20. package/dist/Auth.js.map +1 -1
  21. package/dist/Callback.js +3 -3
  22. package/dist/ComponentCtx.d.ts +1 -1
  23. package/dist/ComponentCtx.d.ts.map +1 -1
  24. package/dist/ConvexConfigProvider.js +2 -2
  25. package/dist/ConvexFunctionDefinitions.d.ts +4 -4
  26. package/dist/ConvexFunctionDefinitions.d.ts.map +1 -1
  27. package/dist/ConvexFunctionDefinitions.js +2 -2
  28. package/dist/ConvexFunctionDefinitions.js.map +1 -1
  29. package/dist/ConvexLogger.js +1 -1
  30. package/dist/CronJobs.d.ts +1 -1
  31. package/dist/CronJobs.d.ts.map +1 -1
  32. package/dist/CronJobs.js +6 -6
  33. package/dist/CronJobs.js.map +1 -1
  34. package/dist/DataModel.d.ts +3 -3
  35. package/dist/DataModel.d.ts.map +1 -1
  36. package/dist/DataModel.js.map +1 -1
  37. package/dist/DatabaseReader.d.ts +4 -4
  38. package/dist/DatabaseReader.d.ts.map +1 -1
  39. package/dist/DatabaseReader.js.map +1 -1
  40. package/dist/DatabaseSchema.d.ts +1 -1
  41. package/dist/DatabaseSchema.d.ts.map +1 -1
  42. package/dist/DatabaseSchema.js +2 -2
  43. package/dist/DatabaseSchema.js.map +1 -1
  44. package/dist/DatabaseWriter.d.ts +41 -7
  45. package/dist/DatabaseWriter.d.ts.map +1 -1
  46. package/dist/DatabaseWriter.js +55 -8
  47. package/dist/DatabaseWriter.js.map +1 -1
  48. package/dist/Document.d.ts +4 -4
  49. package/dist/Document.d.ts.map +1 -1
  50. package/dist/Document.js.map +1 -1
  51. package/dist/ExecutionMetadata.js +1 -1
  52. package/dist/FunctionImpl.d.ts +2 -2
  53. package/dist/FunctionImpl.d.ts.map +1 -1
  54. package/dist/FunctionImpl.js +2 -2
  55. package/dist/FunctionImpl.js.map +1 -1
  56. package/dist/FunctionRegistryItem.d.ts +1 -1
  57. package/dist/FunctionRegistryItem.d.ts.map +1 -1
  58. package/dist/FunctionRegistryItem.js +1 -1
  59. package/dist/FunctionRegistryItem.js.map +1 -1
  60. package/dist/GroupImpl.d.ts +24 -5
  61. package/dist/GroupImpl.d.ts.map +1 -1
  62. package/dist/GroupImpl.js +21 -22
  63. package/dist/GroupImpl.js.map +1 -1
  64. package/dist/GroupRegistry.d.ts +2 -2
  65. package/dist/GroupRegistry.d.ts.map +1 -1
  66. package/dist/GroupRegistry.js.map +1 -1
  67. package/dist/Handler.d.ts +30 -26
  68. package/dist/Handler.d.ts.map +1 -1
  69. package/dist/Handler.js.map +1 -1
  70. package/dist/HttpRouter.d.ts +13 -13
  71. package/dist/HttpRouter.d.ts.map +1 -1
  72. package/dist/HttpRouter.js +2 -2
  73. package/dist/HttpRouter.js.map +1 -1
  74. package/dist/MiddlewareImpl.d.ts +14 -14
  75. package/dist/MiddlewareImpl.d.ts.map +1 -1
  76. package/dist/MiddlewareImpl.js +1 -1
  77. package/dist/MiddlewareImpl.js.map +1 -1
  78. package/dist/MutationCtx.d.ts +1 -1
  79. package/dist/MutationCtx.d.ts.map +1 -1
  80. package/dist/MutationCtx.js.map +1 -1
  81. package/dist/MutationRunner.d.ts +1 -1
  82. package/dist/MutationRunner.d.ts.map +1 -1
  83. package/dist/MutationRunner.js +2 -2
  84. package/dist/MutationRunner.js.map +1 -1
  85. package/dist/MutationTransactionContext.d.ts +2 -2
  86. package/dist/MutationTransactionContext.d.ts.map +1 -1
  87. package/dist/MutationTransactionContext.js +2 -2
  88. package/dist/MutationTransactionContext.js.map +1 -1
  89. package/dist/OfficialComponent.d.ts +50 -0
  90. package/dist/OfficialComponent.d.ts.map +1 -0
  91. package/dist/OfficialComponent.js +70 -0
  92. package/dist/OfficialComponent.js.map +1 -0
  93. package/dist/OrderedQuery.d.ts +4 -4
  94. package/dist/OrderedQuery.d.ts.map +1 -1
  95. package/dist/OrderedQuery.js.map +1 -1
  96. package/dist/QueryCtx.d.ts +1 -1
  97. package/dist/QueryCtx.d.ts.map +1 -1
  98. package/dist/QueryCtx.js.map +1 -1
  99. package/dist/QueryInitializer.d.ts +10 -10
  100. package/dist/QueryInitializer.d.ts.map +1 -1
  101. package/dist/QueryInitializer.js +2 -2
  102. package/dist/QueryInitializer.js.map +1 -1
  103. package/dist/QueryRunner.d.ts +2 -2
  104. package/dist/QueryRunner.d.ts.map +1 -1
  105. package/dist/QueryRunner.js +2 -2
  106. package/dist/QueryRunner.js.map +1 -1
  107. package/dist/QueryStream.d.ts +86 -13
  108. package/dist/QueryStream.d.ts.map +1 -1
  109. package/dist/QueryStream.js +81 -8
  110. package/dist/QueryStream.js.map +1 -1
  111. package/dist/QueryStreamCursor.d.ts +2 -2
  112. package/dist/QueryStreamCursor.d.ts.map +1 -1
  113. package/dist/QueryStreamCursor.js +1 -1
  114. package/dist/QueryStreamCursor.js.map +1 -1
  115. package/dist/QueryStreamIndexPrefix.d.ts +2 -2
  116. package/dist/QueryStreamIndexPrefix.d.ts.map +1 -1
  117. package/dist/QueryStreamIndexPrefix.js +1 -1
  118. package/dist/QueryStreamIndexPrefix.js.map +1 -1
  119. package/dist/QueryStreamIndexRange.d.ts +4 -4
  120. package/dist/QueryStreamIndexRange.d.ts.map +1 -1
  121. package/dist/QueryStreamIndexRange.js +2 -2
  122. package/dist/QueryStreamIndexRange.js.map +1 -1
  123. package/dist/QueryStreamKey.d.ts +2 -2
  124. package/dist/QueryStreamKey.d.ts.map +1 -1
  125. package/dist/QueryStreamKey.js +1 -1
  126. package/dist/QueryStreamKey.js.map +1 -1
  127. package/dist/QueryStreamKeyBounds.d.ts +3 -3
  128. package/dist/QueryStreamKeyBounds.d.ts.map +1 -1
  129. package/dist/QueryStreamKeyBounds.js +2 -2
  130. package/dist/QueryStreamKeyBounds.js.map +1 -1
  131. package/dist/QueryStreamKeyLayout.d.ts +1 -1
  132. package/dist/QueryStreamKeyLayout.d.ts.map +1 -1
  133. package/dist/QueryStreamKeyLayout.js +2 -2
  134. package/dist/QueryStreamKeyLayout.js.map +1 -1
  135. package/dist/QueryStreamKeyValues.d.ts +1 -1
  136. package/dist/QueryStreamKeyValues.d.ts.map +1 -1
  137. package/dist/QueryStreamKeyValues.js +1 -1
  138. package/dist/QueryStreamKeyValues.js.map +1 -1
  139. package/dist/QueryStreamPagination.d.ts +1 -1
  140. package/dist/QueryStreamPagination.d.ts.map +1 -1
  141. package/dist/QueryStreamPagination.js +1 -1
  142. package/dist/QueryStreamPagination.js.map +1 -1
  143. package/dist/QueryStreamReadBudget.d.ts +3 -2
  144. package/dist/QueryStreamReadBudget.d.ts.map +1 -1
  145. package/dist/QueryStreamReadBudget.js +6 -3
  146. package/dist/QueryStreamReadBudget.js.map +1 -1
  147. package/dist/QueryTransactionContext.js +2 -2
  148. package/dist/RegisteredConvexFunction.d.ts +20 -20
  149. package/dist/RegisteredConvexFunction.d.ts.map +1 -1
  150. package/dist/RegisteredConvexFunction.js +19 -19
  151. package/dist/RegisteredConvexFunction.js.map +1 -1
  152. package/dist/RegisteredFunction.d.ts +26 -26
  153. package/dist/RegisteredFunction.d.ts.map +1 -1
  154. package/dist/RegisteredFunction.js +55 -13
  155. package/dist/RegisteredFunction.js.map +1 -1
  156. package/dist/RegisteredFunctions.d.ts +3 -3
  157. package/dist/RegisteredFunctions.d.ts.map +1 -1
  158. package/dist/RegisteredFunctions.js.map +1 -1
  159. package/dist/RegisteredNodeFunction.d.ts +6 -6
  160. package/dist/RegisteredNodeFunction.d.ts.map +1 -1
  161. package/dist/RegisteredNodeFunction.js +1 -1
  162. package/dist/RegisteredNodeFunction.js.map +1 -1
  163. package/dist/Registry.d.ts +1 -1
  164. package/dist/Registry.d.ts.map +1 -1
  165. package/dist/Registry.js.map +1 -1
  166. package/dist/RegistryItems.d.ts +7 -0
  167. package/dist/RegistryItems.d.ts.map +1 -1
  168. package/dist/RegistryItems.js +8 -3
  169. package/dist/RegistryItems.js.map +1 -1
  170. package/dist/RequestMetadata.js +1 -1
  171. package/dist/ResolvedMiddleware.d.ts +2 -2
  172. package/dist/ResolvedMiddleware.d.ts.map +1 -1
  173. package/dist/ResolvedMiddleware.js.map +1 -1
  174. package/dist/Scheduler.js +2 -2
  175. package/dist/Storage.d.ts +6 -6
  176. package/dist/Storage.d.ts.map +1 -1
  177. package/dist/Storage.js +1 -1
  178. package/dist/Storage.js.map +1 -1
  179. package/dist/StorageActionWriter.d.ts +1 -1
  180. package/dist/StorageActionWriter.d.ts.map +1 -1
  181. package/dist/StorageActionWriter.js +1 -1
  182. package/dist/StorageActionWriter.js.map +1 -1
  183. package/dist/StorageReader.d.ts +1 -1
  184. package/dist/StorageReader.d.ts.map +1 -1
  185. package/dist/StorageReader.js +1 -1
  186. package/dist/StorageReader.js.map +1 -1
  187. package/dist/StorageWriter.d.ts +1 -1
  188. package/dist/StorageWriter.d.ts.map +1 -1
  189. package/dist/StorageWriter.js +1 -1
  190. package/dist/StorageWriter.js.map +1 -1
  191. package/dist/TableInfo.d.ts +2 -2
  192. package/dist/TableInfo.d.ts.map +1 -1
  193. package/dist/TableInfo.js.map +1 -1
  194. package/dist/TransactionMetadata.js +1 -1
  195. package/dist/VectorSearch.d.ts +1 -1
  196. package/dist/VectorSearch.d.ts.map +1 -1
  197. package/dist/VectorSearch.js +1 -1
  198. package/dist/VectorSearch.js.map +1 -1
  199. package/dist/index.d.ts +62 -60
  200. package/dist/index.d.ts.map +1 -1
  201. package/dist/index.js +11 -9
  202. package/dist/internal/AiGatewayDecisionClient.d.ts +1 -1
  203. package/dist/internal/AiGatewayDecisionClient.d.ts.map +1 -1
  204. package/dist/internal/AiGatewayDecisionClient.js +1 -1
  205. package/dist/internal/AiGatewayDecisionClient.js.map +1 -1
  206. package/dist/internal/AiGatewayLanguageClient.d.ts +1 -1
  207. package/dist/internal/AiGatewayLanguageClient.d.ts.map +1 -1
  208. package/dist/internal/AiGatewayLanguageClient.js +1 -1
  209. package/dist/internal/AiGatewayLanguageClient.js.map +1 -1
  210. package/dist/internal/AiGatewayServiceToken.js +1 -1
  211. package/dist/internal/DocumentPatch.d.ts +16 -0
  212. package/dist/internal/DocumentPatch.d.ts.map +1 -0
  213. package/dist/internal/DocumentPatch.js +36 -0
  214. package/dist/internal/DocumentPatch.js.map +1 -0
  215. package/dist/node.d.ts +1 -1
  216. package/dist/node.d.ts.map +1 -1
  217. package/package.json +2 -2
  218. package/src/ActionCall.ts +82 -0
  219. package/src/ActionCtx.ts +1 -1
  220. package/src/AiGatewayDecisionClient.ts +3 -3
  221. package/src/AiGatewayLanguageClient.ts +3 -3
  222. package/src/Auth.ts +1 -1
  223. package/src/ComponentCtx.ts +1 -1
  224. package/src/ConvexFunctionDefinitions.ts +8 -8
  225. package/src/CronJobs.ts +1 -1
  226. package/src/DataModel.ts +3 -3
  227. package/src/DatabaseReader.ts +4 -4
  228. package/src/DatabaseSchema.ts +1 -1
  229. package/src/DatabaseWriter.ts +189 -31
  230. package/src/Document.ts +4 -4
  231. package/src/FunctionImpl.ts +5 -5
  232. package/src/FunctionRegistryItem.ts +1 -1
  233. package/src/GroupImpl.ts +66 -13
  234. package/src/GroupRegistry.ts +4 -4
  235. package/src/Handler.ts +43 -28
  236. package/src/HttpRouter.ts +17 -17
  237. package/src/MiddlewareImpl.ts +17 -17
  238. package/src/MutationCtx.ts +1 -1
  239. package/src/MutationRunner.ts +1 -1
  240. package/src/MutationTransactionContext.ts +2 -2
  241. package/src/OfficialComponent.ts +151 -0
  242. package/src/OrderedQuery.ts +4 -4
  243. package/src/QueryCtx.ts +1 -1
  244. package/src/QueryInitializer.ts +9 -9
  245. package/src/QueryRunner.ts +2 -2
  246. package/src/QueryStream.ts +212 -20
  247. package/src/QueryStreamCursor.ts +3 -3
  248. package/src/QueryStreamIndexPrefix.ts +2 -2
  249. package/src/QueryStreamIndexRange.ts +4 -4
  250. package/src/QueryStreamKey.ts +2 -2
  251. package/src/QueryStreamKeyBounds.ts +3 -3
  252. package/src/QueryStreamKeyLayout.ts +1 -1
  253. package/src/QueryStreamKeyValues.ts +1 -1
  254. package/src/QueryStreamPagination.ts +2 -2
  255. package/src/QueryStreamReadBudget.ts +19 -6
  256. package/src/RegisteredConvexFunction.ts +21 -21
  257. package/src/RegisteredFunction.ts +72 -19
  258. package/src/RegisteredFunctions.ts +4 -4
  259. package/src/RegisteredNodeFunction.ts +8 -8
  260. package/src/Registry.ts +1 -1
  261. package/src/RegistryItems.ts +33 -2
  262. package/src/ResolvedMiddleware.ts +2 -2
  263. package/src/Storage.ts +3 -3
  264. package/src/StorageActionWriter.ts +1 -1
  265. package/src/StorageReader.ts +1 -1
  266. package/src/StorageWriter.ts +1 -1
  267. package/src/TableInfo.ts +2 -2
  268. package/src/VectorSearch.ts +1 -1
  269. package/src/index.ts +62 -60
  270. package/src/internal/AiGatewayDecisionClient.ts +2 -2
  271. package/src/internal/AiGatewayLanguageClient.ts +2 -2
  272. package/src/internal/DocumentPatch.ts +87 -0
  273. package/src/node.ts +1 -1
@@ -22,8 +22,9 @@ export interface QueryStreamReadBudget {
22
22
  readonly getReadCounts: Effect.Effect<ReadCounts>;
23
23
  /**
24
24
  * Returns a stream that records reads against this budget and stops
25
- * requesting further batches once exhausted. Apply directly to the document
26
- * source before buffering, filtering, or combining its output.
25
+ * requesting further batches once exhausted, except for one limit-boundary
26
+ * lookahead to detect completion. Apply directly to the document source
27
+ * before buffering, filtering, or combining its output.
27
28
  */
28
29
  readonly accountFor: (
29
30
  encodedDocuments: Stream.Stream<unknown>,
@@ -133,10 +134,22 @@ export const make = Effect.fnUntraced(function* (
133
134
  SynchronizedRef.modifyEffect(stateRef, (state) =>
134
135
  Effect.gen(function* () {
135
136
  if (isExhausted(state, limits)) {
136
- return Tuple.make(
137
- Option.none(),
138
- State.Stopped(readCounts(state)),
139
- );
137
+ const canProbeEnd =
138
+ State.$is("Active")(state) &&
139
+ !Option.exists(
140
+ limits.maximumRowsRead,
141
+ (limit) => state.rowsRead > limit,
142
+ ) &&
143
+ !Option.exists(
144
+ limits.maximumBytesRead,
145
+ (limit) => state.bytesRead > limit,
146
+ );
147
+ // Iterators expose completion only through a pull. Count a
148
+ // lookahead row, but never publish it beyond either limit.
149
+ const counts = canProbeEnd
150
+ ? record(state, yield* pull)
151
+ : readCounts(state);
152
+ return Tuple.make(Option.none(), State.Stopped(counts));
140
153
  }
141
154
  const documents = yield* pull;
142
155
  return Tuple.make(
@@ -24,27 +24,27 @@ import * as Layer from "effect/Layer";
24
24
  import * as Match from "effect/Match";
25
25
  import * as Schema from "effect/Schema";
26
26
  import * as EffectScheduler from "effect/Scheduler";
27
- import * as Auth from "./Auth";
28
- import * as ConvexConfigProvider from "./ConvexConfigProvider";
29
- import * as DatabaseReader from "./DatabaseReader";
30
- import type * as DatabaseSchema from "./DatabaseSchema";
31
- import * as DatabaseWriter from "./DatabaseWriter";
32
- import type * as DataModel from "./DataModel";
33
- import * as ExecutionMetadata from "./ExecutionMetadata";
34
- import * as RequestMetadata from "./RequestMetadata";
35
- import * as TransactionMetadata from "./TransactionMetadata";
36
- import * as MutationCtx from "./MutationCtx";
37
- import * as MutationRunner from "./MutationRunner";
38
- import * as MutationTransactionContext from "./MutationTransactionContext";
39
- import * as QueryCtx from "./QueryCtx";
40
- import * as QueryRunner from "./QueryRunner";
41
- import * as QueryTransactionContext from "./QueryTransactionContext";
42
- import * as RegisteredFunction from "./RegisteredFunction";
43
- import type * as FunctionRegistryItem from "./FunctionRegistryItem";
44
- import type * as ResolvedMiddleware from "./ResolvedMiddleware";
45
- import * as Scheduler from "./Scheduler";
46
- import { StorageWriter } from "./StorageWriter";
47
- import type * as Handler from "./Handler";
27
+ import * as Auth from "./Auth.js";
28
+ import * as ConvexConfigProvider from "./ConvexConfigProvider.js";
29
+ import * as DatabaseReader from "./DatabaseReader.js";
30
+ import type * as DatabaseSchema from "./DatabaseSchema.js";
31
+ import * as DatabaseWriter from "./DatabaseWriter.js";
32
+ import type * as DataModel from "./DataModel.js";
33
+ import * as ExecutionMetadata from "./ExecutionMetadata.js";
34
+ import * as RequestMetadata from "./RequestMetadata.js";
35
+ import * as TransactionMetadata from "./TransactionMetadata.js";
36
+ import * as MutationCtx from "./MutationCtx.js";
37
+ import * as MutationRunner from "./MutationRunner.js";
38
+ import * as MutationTransactionContext from "./MutationTransactionContext.js";
39
+ import * as QueryCtx from "./QueryCtx.js";
40
+ import * as QueryRunner from "./QueryRunner.js";
41
+ import * as QueryTransactionContext from "./QueryTransactionContext.js";
42
+ import * as RegisteredFunction from "./RegisteredFunction.js";
43
+ import type * as FunctionRegistryItem from "./FunctionRegistryItem.js";
44
+ import type * as ResolvedMiddleware from "./ResolvedMiddleware.js";
45
+ import * as Scheduler from "./Scheduler.js";
46
+ import { StorageWriter } from "./StorageWriter.js";
47
+ import type * as Handler from "./Handler.js";
48
48
 
49
49
  export type Definition = Data.TaggedEnum<{
50
50
  PublicQuery: ReturnType<typeof queryFunction>;
@@ -1,3 +1,5 @@
1
+ import * as ActionCallSpec from "@confect/core/ActionCall";
2
+ import * as ActionCall from "./ActionCall.js";
1
3
  import type { FunctionSpec, RuntimeAndFunctionType } from "@confect/core";
2
4
  import * as IdScope from "@confect/core/IdScope";
3
5
  import type * as FunctionProvenance from "@confect/core/FunctionProvenance";
@@ -25,24 +27,24 @@ import * as Result from "effect/Result";
25
27
  import * as Layer from "effect/Layer";
26
28
  import * as Schema from "effect/Schema";
27
29
  import type * as EffectScheduler from "effect/Scheduler";
28
- import * as ActionCtx from "./ActionCtx";
29
- import * as ActionRunner from "./ActionRunner";
30
- import * as Auth from "./Auth";
31
- import * as ConvexLogger from "./ConvexLogger";
32
- import type * as DatabaseSchema from "./DatabaseSchema";
33
- import type * as DataModel from "./DataModel";
34
- import * as ExecutionMetadata from "./ExecutionMetadata";
35
- import * as RequestMetadata from "./RequestMetadata";
36
- import * as MutationRunner from "./MutationRunner";
37
- import * as QueryRunner from "./QueryRunner";
38
- import type * as ResolvedMiddleware from "./ResolvedMiddleware";
39
- import * as Scheduler from "./Scheduler";
40
- import * as Storage from "./Storage";
41
- import * as StorageActionWriter from "./StorageActionWriter";
42
- import type * as StorageReader from "./StorageReader";
43
- import * as StorageWriter from "./StorageWriter";
44
- import * as VectorSearch from "./VectorSearch";
45
- import type * as Handler from "./Handler";
30
+ import * as ActionCtx from "./ActionCtx.js";
31
+ import * as ActionRunner from "./ActionRunner.js";
32
+ import * as Auth from "./Auth.js";
33
+ import * as ConvexLogger from "./ConvexLogger.js";
34
+ import type * as DatabaseSchema from "./DatabaseSchema.js";
35
+ import type * as DataModel from "./DataModel.js";
36
+ import * as ExecutionMetadata from "./ExecutionMetadata.js";
37
+ import * as RequestMetadata from "./RequestMetadata.js";
38
+ import * as MutationRunner from "./MutationRunner.js";
39
+ import * as QueryRunner from "./QueryRunner.js";
40
+ import type * as ResolvedMiddleware from "./ResolvedMiddleware.js";
41
+ import * as Scheduler from "./Scheduler.js";
42
+ import * as Storage from "./Storage.js";
43
+ import * as StorageActionWriter from "./StorageActionWriter.js";
44
+ import type * as StorageReader from "./StorageReader.js";
45
+ import * as StorageWriter from "./StorageWriter.js";
46
+ import * as VectorSearch from "./VectorSearch.js";
47
+ import type * as Handler from "./Handler.js";
46
48
 
47
49
  export type Any =
48
50
  | RegisteredQuery<FunctionVisibility, DefaultFunctionArgs, any>
@@ -299,6 +301,12 @@ export const actionFunctionBase = <
299
301
  Schema.decodeUnknownEffect(args),
300
302
  Effect.catchTag("SchemaError", Effect.die),
301
303
  );
304
+ const restricted = resolvedMiddlewares.some(
305
+ ({ middlewareSpec }) =>
306
+ middlewareSpec.key === ActionCallSpec.Middleware.key,
307
+ )
308
+ ? restrict(ctx)
309
+ : undefined;
302
310
  // 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.
303
311
  const decodedReturns = yield* applyMiddleware(
304
312
  handler(decodedArgs),
@@ -309,7 +317,8 @@ export const actionFunctionBase = <
309
317
  functionVisibility,
310
318
  args: decodedArgs,
311
319
  },
312
- ).pipe(Effect.provide(createLayer(ctx)));
320
+ ).pipe(Effect.provide(createLayer(restricted?.ctx ?? ctx)));
321
+ if (restricted !== undefined) yield* restricted.check;
313
322
  return yield* pipe(
314
323
  decodedReturns,
315
324
  Schema.encodeEffect(returns),
@@ -389,3 +398,47 @@ export const storageLayer = <Scope extends IdScope.IdScope>(
389
398
  Storage.layer(reader) as Layer.Layer<
390
399
  Storage.Storage | StorageReader.ForScope<Scope>
391
400
  >;
401
+
402
+ /**
403
+ * Shares one dispatch budget across the entire middleware chain.
404
+ */
405
+ const restrict = <Model extends GenericDataModel>(
406
+ ctx: GenericActionCtx<Model>,
407
+ ) => {
408
+ let dispatched = false;
409
+ const claim = () => {
410
+ if (dispatched) throw new ActionCall.ActionCallAlreadyUsed();
411
+ dispatched = true;
412
+ };
413
+ const restricted: GenericActionCtx<Model> = {
414
+ ...ctx,
415
+ scheduler: {
416
+ runAfter: () => {
417
+ throw new ActionCall.SchedulingNotAllowed();
418
+ },
419
+ runAt: () => {
420
+ throw new ActionCall.SchedulingNotAllowed();
421
+ },
422
+ cancel: () => {
423
+ throw new ActionCall.SchedulingNotAllowed();
424
+ },
425
+ },
426
+ runQuery: (...args) => {
427
+ claim();
428
+ return ctx.runQuery(...args);
429
+ },
430
+ runMutation: (...args) => {
431
+ claim();
432
+ return ctx.runMutation(...args);
433
+ },
434
+ runAction: () => {
435
+ throw new ActionCall.NestedActionNotAllowed();
436
+ },
437
+ };
438
+ return {
439
+ ctx: restricted,
440
+ check: Effect.suspend(() =>
441
+ dispatched ? Effect.void : Effect.die(new ActionCall.ActionCallNotUsed()),
442
+ ),
443
+ };
444
+ };
@@ -1,11 +1,11 @@
1
- import * as ConvexFunctionDefinitions from "./ConvexFunctionDefinitions";
1
+ import * as ConvexFunctionDefinitions from "./ConvexFunctionDefinitions.js";
2
2
  import type * as FunctionSpec from "@confect/core/FunctionSpec";
3
3
  import type * as GroupSpec from "@confect/core/GroupSpec";
4
4
  import type * as Spec from "@confect/core/Spec";
5
5
  import type { Layer, Types } from "effect";
6
- import type * as DatabaseSchema from "./DatabaseSchema";
7
- import type * as GroupImpl from "./GroupImpl";
8
- import type * as RegisteredFunction from "./RegisteredFunction";
6
+ import type * as DatabaseSchema from "./DatabaseSchema.js";
7
+ import type * as GroupImpl from "./GroupImpl.js";
8
+ import type * as RegisteredFunction from "./RegisteredFunction.js";
9
9
 
10
10
  export type RegisteredFunctions<Spec_ extends Spec.AnyWithProps> =
11
11
  Types.Simplify<RegisteredFunctionsHelper<Spec.Groups<Spec_>>>;
@@ -9,15 +9,15 @@ import type { Effect } from "effect";
9
9
  import type { Schema } from "effect";
10
10
  import * as Layer from "effect/Layer";
11
11
  import * as Match from "effect/Match";
12
- import type * as DatabaseSchema from "./DatabaseSchema";
13
- import * as RegisteredFunction from "./RegisteredFunction";
14
- import * as FunctionRegistryItem from "./FunctionRegistryItem";
15
- import * as ResolvedMiddleware from "./ResolvedMiddleware";
16
- import * as GroupRegistry from "./GroupRegistry";
12
+ import type * as DatabaseSchema from "./DatabaseSchema.js";
13
+ import * as RegisteredFunction from "./RegisteredFunction.js";
14
+ import * as FunctionRegistryItem from "./FunctionRegistryItem.js";
15
+ import * as ResolvedMiddleware from "./ResolvedMiddleware.js";
16
+ import * as GroupRegistry from "./GroupRegistry.js";
17
17
  import type * as GroupSpec from "@confect/core/GroupSpec";
18
- import type * as GroupImpl from "./GroupImpl";
19
- import type * as RegisteredFunctions from "./RegisteredFunctions";
20
- import { mapLeaves } from "./internal/utils";
18
+ import type * as GroupImpl from "./GroupImpl.js";
19
+ import type * as RegisteredFunctions from "./RegisteredFunctions.js";
20
+ import { mapLeaves } from "./internal/utils.js";
21
21
 
22
22
  export const buildForGroup = <Group extends GroupSpec.AnyWithProps>(
23
23
  databaseSchema: DatabaseSchema.AnyWithProps,
package/src/Registry.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as Context from "effect/Context";
2
2
  import * as Ref from "effect/Ref";
3
- import type { RegistryItems } from "./RegistryItems";
3
+ import type { RegistryItems } from "./RegistryItems.js";
4
4
 
5
5
  /**
6
6
  * Effect `Context.Reference` shared by everything that touches a group's
@@ -1,8 +1,8 @@
1
1
  import * as Array from "effect/Array";
2
2
  import { pipe } from "effect/Function";
3
3
  import * as Record from "effect/Record";
4
- import * as FunctionRegistryItem from "./FunctionRegistryItem";
5
- import * as MiddlewareRegistryItem from "./MiddlewareRegistryItem";
4
+ import * as FunctionRegistryItem from "./FunctionRegistryItem.js";
5
+ import * as MiddlewareRegistryItem from "./MiddlewareRegistryItem.js";
6
6
 
7
7
  /**
8
8
  * Runtime tree that mirrors a `Spec`'s group structure. Values remain unknown
@@ -38,3 +38,34 @@ export const middlewareKeys = (items: RegistryItems): ReadonlyArray<string> =>
38
38
  Array.filter(MiddlewareRegistryItem.isMiddlewareRegistryItem),
39
39
  Array.map((item) => item.middlewareSpec.key),
40
40
  );
41
+
42
+ export interface MissingMiddleware {
43
+ readonly functionName: string;
44
+ readonly middlewareKey: string;
45
+ }
46
+
47
+ export const missingRequired = (
48
+ items: RegistryItems,
49
+ required: ReadonlyArray<{ readonly key: string }>,
50
+ groupPath = "",
51
+ ): ReadonlyArray<MissingMiddleware> =>
52
+ Object.entries(items)
53
+ .sort(([left], [right]) => left.localeCompare(right))
54
+ .flatMap(([functionName, value]) =>
55
+ FunctionRegistryItem.isFunctionRegistryItem(value)
56
+ ? required.flatMap(({ key }) =>
57
+ value._tag === "Confect" &&
58
+ value.middlewareAttachments.some(({ spec }) => spec.key === key)
59
+ ? []
60
+ : [
61
+ {
62
+ functionName:
63
+ groupPath === ""
64
+ ? functionName
65
+ : `${groupPath}.${functionName}`,
66
+ middlewareKey: key,
67
+ },
68
+ ],
69
+ )
70
+ : [],
71
+ );
@@ -1,8 +1,8 @@
1
1
  import * as MiddlewareAttachment from "@confect/core/MiddlewareAttachment";
2
2
  import type * as MiddlewareSpec from "@confect/core/MiddlewareSpec";
3
3
  import * as Result from "effect/Result";
4
- import type * as FunctionRegistryItem from "./FunctionRegistryItem";
5
- import type * as MiddlewareRegistryItem from "./MiddlewareRegistryItem";
4
+ import type * as FunctionRegistryItem from "./FunctionRegistryItem.js";
5
+ import type * as MiddlewareRegistryItem from "./MiddlewareRegistryItem.js";
6
6
 
7
7
  /**
8
8
  * A middleware spec paired with its implementation for one function's type—the
package/src/Storage.ts CHANGED
@@ -3,9 +3,9 @@ import type { GenericId } from "convex/values";
3
3
  import * as Context from "effect/Context";
4
4
  import * as Effect from "effect/Effect";
5
5
  import * as Layer from "effect/Layer";
6
- import { StorageActionWriter } from "./StorageActionWriter";
7
- import { StorageReader } from "./StorageReader";
8
- import { StorageWriter } from "./StorageWriter";
6
+ import { StorageActionWriter } from "./StorageActionWriter.js";
7
+ import { StorageReader } from "./StorageReader.js";
8
+ import { StorageWriter } from "./StorageWriter.js";
9
9
 
10
10
  const make = Effect.gen(function* () {
11
11
  const reader = yield* StorageReader;
@@ -6,7 +6,7 @@ import { flow } from "effect/Function";
6
6
  import * as Effect from "effect/Effect";
7
7
  import * as Layer from "effect/Layer";
8
8
  import * as Option from "effect/Option";
9
- import { BlobNotFoundError } from "./BlobNotFoundError";
9
+ import { BlobNotFoundError } from "./BlobNotFoundError.js";
10
10
  import type * as ScopedId from "@confect/core/GenericId";
11
11
 
12
12
  export type Service<Scope extends IdScope.IdScope = IdScope.App> = {
@@ -7,7 +7,7 @@ import * as Effect from "effect/Effect";
7
7
  import * as Layer from "effect/Layer";
8
8
  import * as Option from "effect/Option";
9
9
  import * as Schema from "effect/Schema";
10
- import { BlobNotFoundError } from "./BlobNotFoundError";
10
+ import { BlobNotFoundError } from "./BlobNotFoundError.js";
11
11
  import type * as ScopedId from "@confect/core/GenericId";
12
12
 
13
13
  export type Service<Scope extends IdScope.IdScope = IdScope.App> = {
@@ -6,7 +6,7 @@ import { pipe } from "effect/Function";
6
6
  import * as Effect from "effect/Effect";
7
7
  import * as Layer from "effect/Layer";
8
8
  import * as Schema from "effect/Schema";
9
- import { BlobNotFoundError } from "./BlobNotFoundError";
9
+ import { BlobNotFoundError } from "./BlobNotFoundError.js";
10
10
  import type * as ScopedId from "@confect/core/GenericId";
11
11
 
12
12
  export type Service<Scope extends IdScope.IdScope = IdScope.App> = {
package/src/TableInfo.ts CHANGED
@@ -12,8 +12,8 @@ import type {
12
12
  import type { GenericValidator } from "convex/values";
13
13
  import type { Schema, Types } from "effect";
14
14
  import type { WithSystemFields } from "@confect/core/SystemFields";
15
- import type * as Document_ from "./Document";
16
- import type * as Table from "./Table";
15
+ import type * as Document_ from "./Document.js";
16
+ import type * as Table from "./Table.js";
17
17
 
18
18
  export declare const TypeId: "~@confect/server/TableInfo";
19
19
  export type TypeId = typeof TypeId;
@@ -8,7 +8,7 @@ import type {
8
8
  import * as Context from "effect/Context";
9
9
  import * as Effect from "effect/Effect";
10
10
  import * as Layer from "effect/Layer";
11
- import type * as DataModel from "./DataModel";
11
+ import type * as DataModel from "./DataModel.js";
12
12
 
13
13
  type ConvexVectorSearch<DataModel_ extends DataModel.AnyWithProps> =
14
14
  GenericActionCtx<DataModel.ToConvex<DataModel_>>["vectorSearch"];
package/src/index.ts CHANGED
@@ -1,87 +1,89 @@
1
- export * as AiGatewayDecisionClient from "./AiGatewayDecisionClient";
2
- export * as AiGatewayDecisionModel from "./AiGatewayDecisionModel";
3
- export * as AiGatewayLanguageClient from "./AiGatewayLanguageClient";
4
- export * as AiGatewayLanguageModel from "./AiGatewayLanguageModel";
5
- export * as ActionCtx from "./ActionCtx";
6
- export * as ActionRunner from "./ActionRunner";
7
- export * as Auth from "./Auth";
8
- export * as BlobNotFoundError from "./BlobNotFoundError";
9
- export * as Callback from "./Callback";
10
- export * as ConvexConfigProvider from "./ConvexConfigProvider";
11
- export * as ConvexFunctionDefinitions from "./ConvexFunctionDefinitions";
12
- export * as ConvexLogger from "./ConvexLogger";
13
- export * as CronJob from "./CronJob";
14
- export * as CronJobs from "./CronJobs";
15
- export * as DatabaseReader from "./DatabaseReader";
16
- export * as DatabaseSchema from "./DatabaseSchema";
17
- export * as DatabaseWriter from "./DatabaseWriter";
18
- export * as DataModel from "./DataModel";
19
- export * as Document from "./Document";
20
- export * as ExecutionMetadata from "./ExecutionMetadata";
21
- export * as FunctionImpl from "./FunctionImpl";
22
- export * as FunctionRegistryItem from "./FunctionRegistryItem";
23
- export * as GroupImpl from "./GroupImpl";
24
- export * as Handler from "./Handler";
25
- export * as HttpRouter from "./HttpRouter";
26
- export * as MiddlewareImpl from "./MiddlewareImpl";
27
- export * as MiddlewareRegistryItem from "./MiddlewareRegistryItem";
28
- export * as MutationCtx from "./MutationCtx";
29
- export * as MutationRunner from "./MutationRunner";
30
- export * as MutationTransactionContext from "./MutationTransactionContext";
31
- export * as OrderedQuery from "./OrderedQuery";
32
- export * as QueryCtx from "./QueryCtx";
33
- export * as QueryInitializer from "./QueryInitializer";
34
- export * as QueryRunner from "./QueryRunner";
35
- export * as QueryTransactionContext from "./QueryTransactionContext";
1
+ export * as ActionCall from "./ActionCall.js";
2
+ export * as AiGatewayDecisionClient from "./AiGatewayDecisionClient.js";
3
+ export * as AiGatewayDecisionModel from "./AiGatewayDecisionModel.js";
4
+ export * as AiGatewayLanguageClient from "./AiGatewayLanguageClient.js";
5
+ export * as AiGatewayLanguageModel from "./AiGatewayLanguageModel.js";
6
+ export * as ActionCtx from "./ActionCtx.js";
7
+ export * as ActionRunner from "./ActionRunner.js";
8
+ export * as Auth from "./Auth.js";
9
+ export * as BlobNotFoundError from "./BlobNotFoundError.js";
10
+ export * as Callback from "./Callback.js";
11
+ export * as ConvexConfigProvider from "./ConvexConfigProvider.js";
12
+ export * as ConvexFunctionDefinitions from "./ConvexFunctionDefinitions.js";
13
+ export * as ConvexLogger from "./ConvexLogger.js";
14
+ export * as CronJob from "./CronJob.js";
15
+ export * as CronJobs from "./CronJobs.js";
16
+ export * as DatabaseReader from "./DatabaseReader.js";
17
+ export * as DatabaseSchema from "./DatabaseSchema.js";
18
+ export * as DatabaseWriter from "./DatabaseWriter.js";
19
+ export * as DataModel from "./DataModel.js";
20
+ export * as Document from "./Document.js";
21
+ export * as ExecutionMetadata from "./ExecutionMetadata.js";
22
+ export * as FunctionImpl from "./FunctionImpl.js";
23
+ export * as FunctionRegistryItem from "./FunctionRegistryItem.js";
24
+ export * as GroupImpl from "./GroupImpl.js";
25
+ export * as Handler from "./Handler.js";
26
+ export * as HttpRouter from "./HttpRouter.js";
27
+ export * as MiddlewareImpl from "./MiddlewareImpl.js";
28
+ export * as MiddlewareRegistryItem from "./MiddlewareRegistryItem.js";
29
+ export * as MutationCtx from "./MutationCtx.js";
30
+ export * as MutationRunner from "./MutationRunner.js";
31
+ export * as MutationTransactionContext from "./MutationTransactionContext.js";
32
+ export * as OfficialComponent from "./OfficialComponent.js";
33
+ export * as OrderedQuery from "./OrderedQuery.js";
34
+ export * as QueryCtx from "./QueryCtx.js";
35
+ export * as QueryInitializer from "./QueryInitializer.js";
36
+ export * as QueryRunner from "./QueryRunner.js";
37
+ export * as QueryTransactionContext from "./QueryTransactionContext.js";
36
38
  /**
37
39
  * @experimental
38
40
  */
39
- export * as QueryStream from "./QueryStream";
41
+ export * as QueryStream from "./QueryStream.js";
40
42
  /**
41
43
  * @experimental
42
44
  */
43
- export * as QueryStreamCursor from "./QueryStreamCursor";
45
+ export * as QueryStreamCursor from "./QueryStreamCursor.js";
44
46
  /**
45
47
  * @experimental
46
48
  */
47
- export * as QueryStreamKeyLabels from "./QueryStreamKeyLabels";
49
+ export * as QueryStreamKeyLabels from "./QueryStreamKeyLabels.js";
48
50
  /**
49
51
  * @experimental
50
52
  */
51
- export * as QueryStreamKeyLayout from "./QueryStreamKeyLayout";
53
+ export * as QueryStreamKeyLayout from "./QueryStreamKeyLayout.js";
52
54
  /**
53
55
  * @experimental
54
56
  */
55
- export * as QueryStreamOrderDirection from "./QueryStreamOrderDirection";
57
+ export * as QueryStreamOrderDirection from "./QueryStreamOrderDirection.js";
56
58
  /**
57
59
  * @experimental
58
60
  */
59
- export * as QueryStreamKeyValues from "./QueryStreamKeyValues";
61
+ export * as QueryStreamKeyValues from "./QueryStreamKeyValues.js";
60
62
  /**
61
63
  * @experimental
62
64
  */
63
- export * as QueryStreamKeyBounds from "./QueryStreamKeyBounds";
65
+ export * as QueryStreamKeyBounds from "./QueryStreamKeyBounds.js";
64
66
  /**
65
67
  * @experimental
66
68
  */
67
- export * as QueryStreamIndexRange from "./QueryStreamIndexRange";
69
+ export * as QueryStreamIndexRange from "./QueryStreamIndexRange.js";
68
70
  /**
69
71
  * @experimental
70
72
  */
71
- export * as QueryStreamReadBudget from "./QueryStreamReadBudget";
72
- export * as RegisteredConvexFunction from "./RegisteredConvexFunction";
73
- export * as RegisteredFunction from "./RegisteredFunction";
74
- export * as RegisteredFunctions from "./RegisteredFunctions";
75
- export * as Registry from "./Registry";
76
- export * as RegistryItems from "./RegistryItems";
77
- export * as ResolvedMiddleware from "./ResolvedMiddleware";
78
- export * as RequestMetadata from "./RequestMetadata";
79
- export * as Scheduler from "./Scheduler";
80
- export * as Storage from "./Storage";
81
- export * as StorageActionWriter from "./StorageActionWriter";
82
- export * as StorageReader from "./StorageReader";
83
- export * as StorageWriter from "./StorageWriter";
84
- export * as Table from "./Table";
85
- export * as TableInfo from "./TableInfo";
86
- export * as TransactionMetadata from "./TransactionMetadata";
87
- export * as VectorSearch from "./VectorSearch";
73
+ export * as QueryStreamReadBudget from "./QueryStreamReadBudget.js";
74
+ export * as RegisteredConvexFunction from "./RegisteredConvexFunction.js";
75
+ export * as RegisteredFunction from "./RegisteredFunction.js";
76
+ export * as RegisteredFunctions from "./RegisteredFunctions.js";
77
+ export * as Registry from "./Registry.js";
78
+ export * as RegistryItems from "./RegistryItems.js";
79
+ export * as ResolvedMiddleware from "./ResolvedMiddleware.js";
80
+ export * as RequestMetadata from "./RequestMetadata.js";
81
+ export * as Scheduler from "./Scheduler.js";
82
+ export * as Storage from "./Storage.js";
83
+ export * as StorageActionWriter from "./StorageActionWriter.js";
84
+ export * as StorageReader from "./StorageReader.js";
85
+ export * as StorageWriter from "./StorageWriter.js";
86
+ export * as Table from "./Table.js";
87
+ export * as TableInfo from "./TableInfo.js";
88
+ export * as TransactionMetadata from "./TransactionMetadata.js";
89
+ export * as VectorSearch from "./VectorSearch.js";
@@ -1,8 +1,8 @@
1
1
  import * as OpenRouterClient from "@effect/ai-openrouter/OpenRouterClient";
2
2
  import * as Effect from "effect/Effect";
3
3
  import * as Layer from "effect/Layer";
4
- import * as AiGatewayServiceToken from "./AiGatewayServiceToken";
5
- import { AI_GATEWAY_API_URL } from "./constants";
4
+ import * as AiGatewayServiceToken from "./AiGatewayServiceToken.js";
5
+ import { AI_GATEWAY_API_URL } from "./constants.js";
6
6
 
7
7
  export const make = Effect.gen(function* () {
8
8
  const serviceToken = yield* AiGatewayServiceToken.AiGatewayServiceToken;
@@ -1,8 +1,8 @@
1
1
  import * as OpenAiClient from "@effect/ai-openai-compat/OpenAiClient";
2
2
  import * as Effect from "effect/Effect";
3
3
  import * as Layer from "effect/Layer";
4
- import * as AiGatewayServiceToken from "./AiGatewayServiceToken";
5
- import { AI_GATEWAY_API_URL } from "./constants";
4
+ import * as AiGatewayServiceToken from "./AiGatewayServiceToken.js";
5
+ import { AI_GATEWAY_API_URL } from "./constants.js";
6
6
 
7
7
  export const make = Effect.gen(function* () {
8
8
  const serviceToken = yield* AiGatewayServiceToken.AiGatewayServiceToken;