@gaganref/confect-server 0.0.0-stage → 10.3.1-fork.2
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/CHANGELOG.md +2119 -0
- package/LICENSE +7 -0
- package/README.md +16 -2
- package/dist/ActionCtx.d.ts +10 -0
- package/dist/ActionCtx.d.ts.map +1 -0
- package/dist/ActionCtx.js +18 -0
- package/dist/ActionCtx.js.map +1 -0
- package/dist/ActionRunner.d.ts +16 -0
- package/dist/ActionRunner.d.ts.map +1 -0
- package/dist/ActionRunner.js +18 -0
- package/dist/ActionRunner.js.map +1 -0
- package/dist/AiGatewayDecisionClient.d.ts +20 -0
- package/dist/AiGatewayDecisionClient.d.ts.map +1 -0
- package/dist/AiGatewayDecisionClient.js +31 -0
- package/dist/AiGatewayDecisionClient.js.map +1 -0
- package/dist/AiGatewayDecisionModel.d.ts +24 -0
- package/dist/AiGatewayDecisionModel.d.ts.map +1 -0
- package/dist/AiGatewayDecisionModel.js +27 -0
- package/dist/AiGatewayDecisionModel.js.map +1 -0
- package/dist/AiGatewayLanguageClient.d.ts +21 -0
- package/dist/AiGatewayLanguageClient.d.ts.map +1 -0
- package/dist/AiGatewayLanguageClient.js +32 -0
- package/dist/AiGatewayLanguageClient.js.map +1 -0
- package/dist/AiGatewayLanguageModel.d.ts +95 -0
- package/dist/AiGatewayLanguageModel.d.ts.map +1 -0
- package/dist/AiGatewayLanguageModel.js +42 -0
- package/dist/AiGatewayLanguageModel.js.map +1 -0
- package/dist/Auth.d.ts +20 -0
- package/dist/Auth.d.ts.map +1 -0
- package/dist/Auth.js +31 -0
- package/dist/Auth.js.map +1 -0
- package/dist/BlobNotFoundError.d.ts +9 -0
- package/dist/BlobNotFoundError.d.ts.map +1 -0
- package/dist/BlobNotFoundError.js +13 -0
- package/dist/BlobNotFoundError.js.map +1 -0
- package/dist/Callback.d.ts +31 -0
- package/dist/Callback.d.ts.map +1 -0
- package/dist/Callback.js +182 -0
- package/dist/Callback.js.map +1 -0
- package/dist/ComponentCtx.d.ts +71 -0
- package/dist/ComponentCtx.d.ts.map +1 -0
- package/dist/ComponentCtx.js +0 -0
- package/dist/ConvexConfigProvider.d.ts +21 -0
- package/dist/ConvexConfigProvider.d.ts.map +1 -0
- package/dist/ConvexConfigProvider.js +36 -0
- package/dist/ConvexConfigProvider.js.map +1 -0
- package/dist/ConvexFunctionDefinitions.d.ts +25 -0
- package/dist/ConvexFunctionDefinitions.d.ts.map +1 -0
- package/dist/ConvexFunctionDefinitions.js +25 -0
- package/dist/ConvexFunctionDefinitions.js.map +1 -0
- package/dist/ConvexLogger.d.ts +17 -0
- package/dist/ConvexLogger.d.ts.map +1 -0
- package/dist/ConvexLogger.js +33 -0
- package/dist/ConvexLogger.js.map +1 -0
- package/dist/CronJob.d.ts +14 -0
- package/dist/CronJob.d.ts.map +1 -0
- package/dist/CronJob.js +22 -0
- package/dist/CronJob.js.map +1 -0
- package/dist/CronJobs.d.ts +22 -0
- package/dist/CronJobs.d.ts.map +1 -0
- package/dist/CronJobs.js +83 -0
- package/dist/CronJobs.js.map +1 -0
- package/dist/DataModel.d.ts +28 -0
- package/dist/DataModel.d.ts.map +1 -0
- package/dist/DataModel.js +7 -0
- package/dist/DataModel.js.map +1 -0
- package/dist/DatabaseReader.d.ts +26 -0
- package/dist/DatabaseReader.d.ts.map +1 -0
- package/dist/DatabaseReader.js +33 -0
- package/dist/DatabaseReader.js.map +1 -0
- package/dist/DatabaseSchema.d.ts +67 -0
- package/dist/DatabaseSchema.d.ts.map +1 -0
- package/dist/DatabaseSchema.js +61 -0
- package/dist/DatabaseSchema.js.map +1 -0
- package/dist/DatabaseWriter.d.ts +44 -0
- package/dist/DatabaseWriter.d.ts.map +1 -0
- package/dist/DatabaseWriter.js +47 -0
- package/dist/DatabaseWriter.js.map +1 -0
- package/dist/Document.d.ts +37 -0
- package/dist/Document.d.ts.map +1 -0
- package/dist/Document.js +54 -0
- package/dist/Document.js.map +1 -0
- package/dist/ExecutionMetadata.d.ts +13 -0
- package/dist/ExecutionMetadata.d.ts.map +1 -0
- package/dist/ExecutionMetadata.js +19 -0
- package/dist/ExecutionMetadata.js.map +1 -0
- package/dist/FunctionImpl.d.ts +39 -0
- package/dist/FunctionImpl.d.ts.map +1 -0
- package/dist/FunctionImpl.js +46 -0
- package/dist/FunctionImpl.js.map +1 -0
- package/dist/FunctionRegistryItem.d.ts +36 -0
- package/dist/FunctionRegistryItem.d.ts.map +1 -0
- package/dist/FunctionRegistryItem.js +34 -0
- package/dist/FunctionRegistryItem.js.map +1 -0
- package/dist/GroupImpl.d.ts +77 -0
- package/dist/GroupImpl.d.ts.map +1 -0
- package/dist/GroupImpl.js +81 -0
- package/dist/GroupImpl.js.map +1 -0
- package/dist/GroupRegistry.d.ts +8 -0
- package/dist/GroupRegistry.d.ts.map +1 -0
- package/dist/GroupRegistry.js +26 -0
- package/dist/GroupRegistry.js.map +1 -0
- package/dist/Handler.d.ts +47 -0
- package/dist/Handler.d.ts.map +1 -0
- package/dist/Handler.js +7 -0
- package/dist/Handler.js.map +1 -0
- package/dist/HttpRouter.d.ts +80 -0
- package/dist/HttpRouter.d.ts.map +1 -0
- package/dist/HttpRouter.js +195 -0
- package/dist/HttpRouter.js.map +1 -0
- package/dist/MiddlewareImpl.d.ts +79 -0
- package/dist/MiddlewareImpl.d.ts.map +1 -0
- package/dist/MiddlewareImpl.js +58 -0
- package/dist/MiddlewareImpl.js.map +1 -0
- package/dist/MiddlewareRegistryItem.d.ts +12 -0
- package/dist/MiddlewareRegistryItem.d.ts.map +1 -0
- package/dist/MiddlewareRegistryItem.js +15 -0
- package/dist/MiddlewareRegistryItem.js.map +1 -0
- package/dist/MutationCtx.d.ts +10 -0
- package/dist/MutationCtx.d.ts.map +1 -0
- package/dist/MutationCtx.js +18 -0
- package/dist/MutationCtx.js.map +1 -0
- package/dist/MutationRunner.d.ts +27 -0
- package/dist/MutationRunner.d.ts.map +1 -0
- package/dist/MutationRunner.js +28 -0
- package/dist/MutationRunner.js.map +1 -0
- package/dist/MutationTransactionContext.d.ts +17 -0
- package/dist/MutationTransactionContext.d.ts.map +1 -0
- package/dist/MutationTransactionContext.js +20 -0
- package/dist/MutationTransactionContext.js.map +1 -0
- package/dist/OrderedQuery.d.ts +32 -0
- package/dist/OrderedQuery.d.ts.map +1 -0
- package/dist/OrderedQuery.js +36 -0
- package/dist/OrderedQuery.js.map +1 -0
- package/dist/QueryCtx.d.ts +10 -0
- package/dist/QueryCtx.d.ts.map +1 -0
- package/dist/QueryCtx.js +18 -0
- package/dist/QueryCtx.js.map +1 -0
- package/dist/QueryInitializer.d.ts +75 -0
- package/dist/QueryInitializer.d.ts.map +1 -0
- package/dist/QueryInitializer.js +105 -0
- package/dist/QueryInitializer.js.map +1 -0
- package/dist/QueryRunner.d.ts +46 -0
- package/dist/QueryRunner.d.ts.map +1 -0
- package/dist/QueryRunner.js +30 -0
- package/dist/QueryRunner.js.map +1 -0
- package/dist/QueryStream.d.ts +678 -0
- package/dist/QueryStream.d.ts.map +1 -0
- package/dist/QueryStream.js +943 -0
- package/dist/QueryStream.js.map +1 -0
- package/dist/QueryStreamCursor.d.ts +39 -0
- package/dist/QueryStreamCursor.d.ts.map +1 -0
- package/dist/QueryStreamCursor.js +52 -0
- package/dist/QueryStreamCursor.js.map +1 -0
- package/dist/QueryStreamIndexPrefix.d.ts +48 -0
- package/dist/QueryStreamIndexPrefix.d.ts.map +1 -0
- package/dist/QueryStreamIndexPrefix.js +38 -0
- package/dist/QueryStreamIndexPrefix.js.map +1 -0
- package/dist/QueryStreamIndexRange.d.ts +193 -0
- package/dist/QueryStreamIndexRange.d.ts.map +1 -0
- package/dist/QueryStreamIndexRange.js +241 -0
- package/dist/QueryStreamIndexRange.js.map +1 -0
- package/dist/QueryStreamKey.d.ts +64 -0
- package/dist/QueryStreamKey.d.ts.map +1 -0
- package/dist/QueryStreamKey.js +69 -0
- package/dist/QueryStreamKey.js.map +1 -0
- package/dist/QueryStreamKeyBounds.d.ts +136 -0
- package/dist/QueryStreamKeyBounds.d.ts.map +1 -0
- package/dist/QueryStreamKeyBounds.js +208 -0
- package/dist/QueryStreamKeyBounds.js.map +1 -0
- package/dist/QueryStreamKeyLabels.d.ts +27 -0
- package/dist/QueryStreamKeyLabels.d.ts.map +1 -0
- package/dist/QueryStreamKeyLabels.js +22 -0
- package/dist/QueryStreamKeyLabels.js.map +1 -0
- package/dist/QueryStreamKeyLayout.d.ts +179 -0
- package/dist/QueryStreamKeyLayout.d.ts.map +1 -0
- package/dist/QueryStreamKeyLayout.js +167 -0
- package/dist/QueryStreamKeyLayout.js.map +1 -0
- package/dist/QueryStreamKeyValues.d.ts +40 -0
- package/dist/QueryStreamKeyValues.d.ts.map +1 -0
- package/dist/QueryStreamKeyValues.js +57 -0
- package/dist/QueryStreamKeyValues.js.map +1 -0
- package/dist/QueryStreamOrderDirection.d.ts +24 -0
- package/dist/QueryStreamOrderDirection.d.ts.map +1 -0
- package/dist/QueryStreamOrderDirection.js +11 -0
- package/dist/QueryStreamOrderDirection.js.map +1 -0
- package/dist/QueryStreamPagination.d.ts +264 -0
- package/dist/QueryStreamPagination.d.ts.map +1 -0
- package/dist/QueryStreamPagination.js +172 -0
- package/dist/QueryStreamPagination.js.map +1 -0
- package/dist/QueryStreamReadBudget.d.ts +63 -0
- package/dist/QueryStreamReadBudget.d.ts.map +1 -0
- package/dist/QueryStreamReadBudget.js +81 -0
- package/dist/QueryStreamReadBudget.js.map +1 -0
- package/dist/QueryTransactionContext.d.ts +16 -0
- package/dist/QueryTransactionContext.d.ts.map +1 -0
- package/dist/QueryTransactionContext.js +17 -0
- package/dist/QueryTransactionContext.js.map +1 -0
- package/dist/RegisteredConvexFunction.d.ts +359 -0
- package/dist/RegisteredConvexFunction.d.ts.map +1 -0
- package/dist/RegisteredConvexFunction.js +154 -0
- package/dist/RegisteredConvexFunction.js.map +1 -0
- package/dist/RegisteredFunction.d.ts +143 -0
- package/dist/RegisteredFunction.d.ts.map +1 -0
- package/dist/RegisteredFunction.js +125 -0
- package/dist/RegisteredFunction.js.map +1 -0
- package/dist/RegisteredFunctions.d.ts +57 -0
- package/dist/RegisteredFunctions.d.ts.map +1 -0
- package/dist/RegisteredFunctions.js +32 -0
- package/dist/RegisteredFunctions.js.map +1 -0
- package/dist/RegisteredNodeFunction.d.ts +11 -0
- package/dist/RegisteredNodeFunction.d.ts.map +1 -0
- package/dist/RegisteredNodeFunction.js +45 -0
- package/dist/RegisteredNodeFunction.js.map +1 -0
- package/dist/Registry.d.ts +12 -0
- package/dist/Registry.d.ts.map +1 -0
- package/dist/Registry.js +17 -0
- package/dist/Registry.js.map +1 -0
- package/dist/RegistryItems.d.ts +21 -0
- package/dist/RegistryItems.d.ts.map +1 -0
- package/dist/RegistryItems.js +27 -0
- package/dist/RegistryItems.js.map +1 -0
- package/dist/RequestMetadata.d.ts +12 -0
- package/dist/RequestMetadata.d.ts.map +1 -0
- package/dist/RequestMetadata.js +16 -0
- package/dist/RequestMetadata.js.map +1 -0
- package/dist/ResolvedMiddleware.d.ts +24 -0
- package/dist/ResolvedMiddleware.d.ts.map +1 -0
- package/dist/ResolvedMiddleware.js +34 -0
- package/dist/ResolvedMiddleware.js.map +1 -0
- package/dist/Scheduler.d.ts +31 -0
- package/dist/Scheduler.d.ts.map +1 -0
- package/dist/Scheduler.js +35 -0
- package/dist/Scheduler.js.map +1 -0
- package/dist/Storage.d.ts +22 -0
- package/dist/Storage.d.ts.map +1 -0
- package/dist/Storage.js +27 -0
- package/dist/Storage.js.map +1 -0
- package/dist/StorageActionWriter.d.ts +35 -0
- package/dist/StorageActionWriter.d.ts.map +1 -0
- package/dist/StorageActionWriter.js +24 -0
- package/dist/StorageActionWriter.js.map +1 -0
- package/dist/StorageReader.d.ts +26 -0
- package/dist/StorageReader.d.ts.map +1 -0
- package/dist/StorageReader.js +22 -0
- package/dist/StorageReader.js.map +1 -0
- package/dist/StorageWriter.d.ts +29 -0
- package/dist/StorageWriter.d.ts.map +1 -0
- package/dist/StorageWriter.js +24 -0
- package/dist/StorageWriter.js.map +1 -0
- package/dist/Table.d.ts +274 -0
- package/dist/Table.d.ts.map +1 -0
- package/dist/Table.js +70 -0
- package/dist/Table.js.map +1 -0
- package/dist/TableInfo.d.ts +44 -0
- package/dist/TableInfo.d.ts.map +1 -0
- package/dist/TableInfo.js +7 -0
- package/dist/TableInfo.js.map +1 -0
- package/dist/TransactionMetadata.d.ts +12 -0
- package/dist/TransactionMetadata.d.ts.map +1 -0
- package/dist/TransactionMetadata.js +16 -0
- package/dist/TransactionMetadata.js.map +1 -0
- package/dist/VectorSearch.d.ts +23 -0
- package/dist/VectorSearch.d.ts.map +1 -0
- package/dist/VectorSearch.js +17 -0
- package/dist/VectorSearch.js.map +1 -0
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/index.d.ts +88 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/internal/AiGatewayDecisionClient.d.ts +7 -0
- package/dist/internal/AiGatewayDecisionClient.d.ts.map +1 -0
- package/dist/internal/AiGatewayDecisionClient.js +19 -0
- package/dist/internal/AiGatewayDecisionClient.js.map +1 -0
- package/dist/internal/AiGatewayLanguageClient.d.ts +7 -0
- package/dist/internal/AiGatewayLanguageClient.d.ts.map +1 -0
- package/dist/internal/AiGatewayLanguageClient.js +19 -0
- package/dist/internal/AiGatewayLanguageClient.js.map +1 -0
- package/dist/internal/AiGatewayServiceToken.d.ts +46 -0
- package/dist/internal/AiGatewayServiceToken.d.ts.map +1 -0
- package/dist/internal/AiGatewayServiceToken.js +62 -0
- package/dist/internal/AiGatewayServiceToken.js.map +1 -0
- package/dist/internal/constants.d.ts +2 -0
- package/dist/internal/constants.d.ts.map +1 -0
- package/dist/internal/constants.js +6 -0
- package/dist/internal/constants.js.map +1 -0
- package/dist/internal/utils.d.ts +13 -0
- package/dist/internal/utils.d.ts.map +1 -0
- package/dist/internal/utils.js +50 -0
- package/dist/internal/utils.js.map +1 -0
- package/dist/node.d.ts +2 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +1 -0
- package/package.json +68 -3
- package/src/ActionCtx.ts +45 -0
- package/src/ActionRunner.ts +36 -0
- package/src/AiGatewayDecisionClient.ts +40 -0
- package/src/AiGatewayDecisionModel.ts +46 -0
- package/src/AiGatewayLanguageClient.ts +41 -0
- package/src/AiGatewayLanguageModel.ts +61 -0
- package/src/Auth.ts +51 -0
- package/src/BlobNotFoundError.ts +12 -0
- package/src/Callback.ts +313 -0
- package/src/ComponentCtx.ts +192 -0
- package/src/ConvexConfigProvider.ts +39 -0
- package/src/ConvexFunctionDefinitions.ts +91 -0
- package/src/ConvexLogger.ts +43 -0
- package/src/CronJob.ts +42 -0
- package/src/CronJobs.ts +165 -0
- package/src/DataModel.ts +81 -0
- package/src/DatabaseReader.ts +118 -0
- package/src/DatabaseSchema.ts +139 -0
- package/src/DatabaseWriter.ts +232 -0
- package/src/Document.ts +146 -0
- package/src/ExecutionMetadata.ts +26 -0
- package/src/FunctionImpl.ts +96 -0
- package/src/FunctionRegistryItem.ts +85 -0
- package/src/GroupImpl.ts +167 -0
- package/src/GroupRegistry.ts +41 -0
- package/src/Handler.ts +191 -0
- package/src/HttpRouter.ts +388 -0
- package/src/MiddlewareImpl.ts +247 -0
- package/src/MiddlewareRegistryItem.ts +21 -0
- package/src/MutationCtx.ts +45 -0
- package/src/MutationRunner.ts +66 -0
- package/src/MutationTransactionContext.ts +48 -0
- package/src/OrderedQuery.ts +136 -0
- package/src/QueryCtx.ts +45 -0
- package/src/QueryInitializer.ts +537 -0
- package/src/QueryRunner.ts +91 -0
- package/src/QueryStream.ts +2476 -0
- package/src/QueryStreamCursor.ts +99 -0
- package/src/QueryStreamIndexPrefix.ts +79 -0
- package/src/QueryStreamIndexRange.ts +489 -0
- package/src/QueryStreamKey.ts +118 -0
- package/src/QueryStreamKeyBounds.ts +395 -0
- package/src/QueryStreamKeyLabels.ts +56 -0
- package/src/QueryStreamKeyLayout.ts +382 -0
- package/src/QueryStreamKeyValues.ts +112 -0
- package/src/QueryStreamOrderDirection.ts +29 -0
- package/src/QueryStreamPagination.ts +357 -0
- package/src/QueryStreamReadBudget.ts +167 -0
- package/src/QueryTransactionContext.ts +37 -0
- package/src/RegisteredConvexFunction.ts +415 -0
- package/src/RegisteredFunction.ts +391 -0
- package/src/RegisteredFunctions.ts +88 -0
- package/src/RegisteredNodeFunction.ts +120 -0
- package/src/Registry.ts +17 -0
- package/src/RegistryItems.ts +40 -0
- package/src/RequestMetadata.ts +20 -0
- package/src/ResolvedMiddleware.ts +70 -0
- package/src/Scheduler.ts +85 -0
- package/src/Storage.ts +37 -0
- package/src/StorageActionWriter.ts +59 -0
- package/src/StorageReader.ts +59 -0
- package/src/StorageWriter.ts +58 -0
- package/src/Table.ts +156 -0
- package/src/TableInfo.ts +106 -0
- package/src/TransactionMetadata.ts +20 -0
- package/src/VectorSearch.ts +75 -0
- package/src/index.ts +87 -0
- package/src/internal/AiGatewayDecisionClient.ts +16 -0
- package/src/internal/AiGatewayLanguageClient.ts +16 -0
- package/src/internal/AiGatewayServiceToken.ts +129 -0
- package/src/internal/constants.ts +1 -0
- package/src/internal/utils.ts +89 -0
- package/src/node.ts +1 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { Order } from "./QueryStreamKeyValues.js";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import * as Match from "effect/Match";
|
|
4
|
+
import * as Option from "effect/Option";
|
|
5
|
+
import * as Result from "effect/Result";
|
|
6
|
+
import * as Data from "effect/Data";
|
|
7
|
+
import * as Chunk from "effect/Chunk";
|
|
8
|
+
//#region src/QueryStreamPagination.ts
|
|
9
|
+
const PageSize = Schema.Natural.pipe(Schema.brand("~@confect/server/QueryStreamPagination/PageSize"));
|
|
10
|
+
/**
|
|
11
|
+
* @experimental
|
|
12
|
+
*/
|
|
13
|
+
var InvalidPageSizeError = class extends Data.TaggedError("InvalidPageSizeError") {
|
|
14
|
+
get message() {
|
|
15
|
+
return `QueryStream.paginate: numItems must be a nonnegative integer (received ${this.numItems})`;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* @experimental
|
|
20
|
+
*/
|
|
21
|
+
var EmptyInitialPageError = class extends Data.TaggedError("EmptyInitialPageError") {
|
|
22
|
+
get message() {
|
|
23
|
+
return "QueryStream.paginate: numItems of 0 with a null cursor is not supported";
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* @experimental
|
|
28
|
+
*/
|
|
29
|
+
const Range = Data.taggedEnum();
|
|
30
|
+
/**
|
|
31
|
+
* @experimental
|
|
32
|
+
*/
|
|
33
|
+
const Start = Data.taggedEnum();
|
|
34
|
+
const Request = Data.taggedEnum();
|
|
35
|
+
/**
|
|
36
|
+
* @experimental
|
|
37
|
+
*/
|
|
38
|
+
const parseRequest = (numItems, start, range) => Result.flatMap(Schema.decodeResult(PageSize)(numItems).pipe(Result.mapError(() => new InvalidPageSizeError({ numItems }))), (size) => size === 0 ? Start.$match(start, {
|
|
39
|
+
Beginning: () => Result.fail(new EmptyInitialPageError()),
|
|
40
|
+
After: ({ cursor }) => Result.succeed(Request.Unchanged({ cursor }))
|
|
41
|
+
}) : Result.succeed(Request.Scan({
|
|
42
|
+
numItems: size,
|
|
43
|
+
after: Start.$match(start, {
|
|
44
|
+
Beginning: () => Option.none(),
|
|
45
|
+
After: ({ key }) => Option.some(key)
|
|
46
|
+
}),
|
|
47
|
+
range
|
|
48
|
+
})));
|
|
49
|
+
const append = (progress, key) => Option.match(progress, {
|
|
50
|
+
onNone: () => Chunk.of(key),
|
|
51
|
+
onSome: (keys) => Chunk.append(keys, key)
|
|
52
|
+
});
|
|
53
|
+
const midpoint = (progress) => Option.getOrElse(Chunk.get(progress, Math.floor((Chunk.size(progress) - 1) / 2)), () => Chunk.headNonEmpty(progress));
|
|
54
|
+
const QueryStreamPagination = Data.taggedEnum();
|
|
55
|
+
/**
|
|
56
|
+
* @experimental
|
|
57
|
+
*/
|
|
58
|
+
const initial = () => QueryStreamPagination.Reading({
|
|
59
|
+
page: Chunk.empty(),
|
|
60
|
+
progress: Option.none()
|
|
61
|
+
});
|
|
62
|
+
/**
|
|
63
|
+
* @experimental
|
|
64
|
+
*/
|
|
65
|
+
const record = (request, self, doc, key, readLimit) => Match.value(self).pipe(Match.tagsExhaustive({
|
|
66
|
+
Reading: (reading) => {
|
|
67
|
+
const progress = append(reading.progress, key);
|
|
68
|
+
const page = Option.match(doc, {
|
|
69
|
+
onNone: () => reading.page,
|
|
70
|
+
onSome: (value) => Chunk.append(reading.page, value)
|
|
71
|
+
});
|
|
72
|
+
const continueReading = () => QueryStreamPagination.Reading({
|
|
73
|
+
page,
|
|
74
|
+
progress: Option.some(progress)
|
|
75
|
+
});
|
|
76
|
+
return readLimit ? QueryStreamPagination.ReadLimit({
|
|
77
|
+
page,
|
|
78
|
+
progress
|
|
79
|
+
}) : Range.$match(request.range, {
|
|
80
|
+
Unpinned: () => Chunk.size(page) >= request.numItems ? QueryStreamPagination.ItemLimit({
|
|
81
|
+
page,
|
|
82
|
+
progress
|
|
83
|
+
}) : continueReading(),
|
|
84
|
+
ThroughKey: continueReading,
|
|
85
|
+
ThroughEnd: continueReading
|
|
86
|
+
});
|
|
87
|
+
},
|
|
88
|
+
ItemLimit: () => self,
|
|
89
|
+
ReadLimit: () => self
|
|
90
|
+
}));
|
|
91
|
+
const Continuation = Data.taggedEnum();
|
|
92
|
+
/**
|
|
93
|
+
* @experimental
|
|
94
|
+
*/
|
|
95
|
+
var UnsafePageBoundaryError = class extends Data.TaggedError("UnsafePageBoundaryError") {
|
|
96
|
+
get message() {
|
|
97
|
+
return Match.value(this.reason).pipe(Match.when("NoProgress", () => "The read budget stopped the page before any key was scanned"), Match.when("NoInteriorSplit", () => "The read budget stopped the page without an interior split key"), Match.exhaustive);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
const SOFT_MAX_SCAN_LENGTH = 16e3;
|
|
101
|
+
/**
|
|
102
|
+
* Decide the page result without reading a stream or serializing a cursor.
|
|
103
|
+
*
|
|
104
|
+
* @experimental
|
|
105
|
+
*/
|
|
106
|
+
const finish = (request, self, upstreamStopped) => {
|
|
107
|
+
const page = Chunk.toArray(self.page);
|
|
108
|
+
const stopped = (progress, readLimit) => Result.flatMap(Result.fromOption(progress, () => new UnsafePageBoundaryError({ reason: "NoProgress" })), (scanned) => {
|
|
109
|
+
const splitKey = midpoint(scanned);
|
|
110
|
+
const atEnd = Range.$match(request.range, {
|
|
111
|
+
Unpinned: () => false,
|
|
112
|
+
ThroughEnd: () => false,
|
|
113
|
+
ThroughKey: ({ key }) => Order("asc")(splitKey.values, key.values) === 0
|
|
114
|
+
});
|
|
115
|
+
if (readLimit && atEnd) return Result.fail(new UnsafePageBoundaryError({ reason: "NoInteriorSplit" }));
|
|
116
|
+
const key = Chunk.lastNonEmpty(scanned);
|
|
117
|
+
if (readLimit) return Result.succeed({
|
|
118
|
+
_tag: "SplitRequired",
|
|
119
|
+
page,
|
|
120
|
+
continuation: Continuation.Key({ key }),
|
|
121
|
+
splitKey
|
|
122
|
+
});
|
|
123
|
+
return Result.succeed(Chunk.size(scanned) >= SOFT_MAX_SCAN_LENGTH ? {
|
|
124
|
+
_tag: "SplitRecommended",
|
|
125
|
+
page,
|
|
126
|
+
continuation: Continuation.Key({ key }),
|
|
127
|
+
splitKey
|
|
128
|
+
} : {
|
|
129
|
+
_tag: "Continue",
|
|
130
|
+
page,
|
|
131
|
+
key
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
const exhausted = (progress) => {
|
|
135
|
+
const finishRange = (continuation, pinned) => {
|
|
136
|
+
const split = Option.filter(progress, (scanned) => pinned && (Chunk.size(scanned) >= SOFT_MAX_SCAN_LENGTH || page.length > request.numItems + 1));
|
|
137
|
+
return Option.match(split, {
|
|
138
|
+
onSome: (scanned) => ({
|
|
139
|
+
_tag: "SplitRecommended",
|
|
140
|
+
page,
|
|
141
|
+
continuation,
|
|
142
|
+
splitKey: midpoint(scanned)
|
|
143
|
+
}),
|
|
144
|
+
onNone: () => Continuation.$match(continuation, {
|
|
145
|
+
End: () => ({
|
|
146
|
+
_tag: "Done",
|
|
147
|
+
page
|
|
148
|
+
}),
|
|
149
|
+
Key: ({ key }) => ({
|
|
150
|
+
_tag: "Continue",
|
|
151
|
+
page,
|
|
152
|
+
key
|
|
153
|
+
})
|
|
154
|
+
})
|
|
155
|
+
});
|
|
156
|
+
};
|
|
157
|
+
return Range.$match(request.range, {
|
|
158
|
+
Unpinned: () => finishRange(Continuation.End(), false),
|
|
159
|
+
ThroughEnd: () => finishRange(Continuation.End(), true),
|
|
160
|
+
ThroughKey: ({ key }) => finishRange(Continuation.Key({ key }), true)
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
return Match.value(self).pipe(Match.tagsExhaustive({
|
|
164
|
+
Reading: ({ progress }) => upstreamStopped ? stopped(progress, true) : Result.succeed(exhausted(progress)),
|
|
165
|
+
ItemLimit: ({ progress }) => stopped(Option.some(progress), upstreamStopped),
|
|
166
|
+
ReadLimit: ({ progress }) => stopped(Option.some(progress), true)
|
|
167
|
+
}));
|
|
168
|
+
};
|
|
169
|
+
//#endregion
|
|
170
|
+
export { EmptyInitialPageError, InvalidPageSizeError, Range, Start, UnsafePageBoundaryError, finish, initial, parseRequest, record };
|
|
171
|
+
|
|
172
|
+
//# sourceMappingURL=QueryStreamPagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryStreamPagination.js","names":["QueryStreamKeyValues.Order"],"sources":["../src/QueryStreamPagination.ts"],"sourcesContent":["import * as Chunk from \"effect/Chunk\";\nimport * as Data from \"effect/Data\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport * as Result from \"effect/Result\";\nimport * as Schema from \"effect/Schema\";\nimport type * as QueryStreamKey from \"./QueryStreamKey\";\nimport * as QueryStreamKeyValues from \"./QueryStreamKeyValues\";\n\nconst PageSize = Schema.Natural.pipe(\n Schema.brand(\"~@confect/server/QueryStreamPagination/PageSize\"),\n);\ntype PageSize = typeof PageSize.Type;\n\n/**\n * @experimental\n */\nexport class InvalidPageSizeError extends Data.TaggedError(\n \"InvalidPageSizeError\",\n)<{\n readonly numItems: number;\n}> {\n override get message(): string {\n return `QueryStream.paginate: numItems must be a nonnegative integer (received ${this.numItems})`;\n }\n}\n\n/**\n * @experimental\n */\nexport class EmptyInitialPageError extends Data.TaggedError(\n \"EmptyInitialPageError\",\n) {\n override get message(): string {\n return \"QueryStream.paginate: numItems of 0 with a null cursor is not supported\";\n }\n}\n\n/**\n * @experimental\n */\nexport type Range = Data.TaggedEnum<{\n Unpinned: {};\n ThroughKey: { readonly key: QueryStreamKey.Complete };\n ThroughEnd: {};\n}>;\n/**\n * @experimental\n */\nexport const Range = Data.taggedEnum<Range>();\n\n/**\n * @experimental\n */\nexport type Start = Data.TaggedEnum<{\n Beginning: {};\n After: {\n readonly key: QueryStreamKey.Complete;\n readonly cursor: string;\n };\n}>;\n/**\n * @experimental\n */\nexport const Start = Data.taggedEnum<Start>();\n\n/**\n * @experimental\n */\nexport interface ScanRequest {\n readonly numItems: PageSize;\n readonly after: Option.Option<QueryStreamKey.Complete>;\n readonly range: Range;\n}\n\n/**\n * @experimental\n */\nexport type Request = Data.TaggedEnum<{\n Unchanged: { readonly cursor: string };\n Scan: ScanRequest;\n}>;\nconst Request = Data.taggedEnum<Request>();\n\n/**\n * @experimental\n */\nexport const parseRequest = (\n numItems: number,\n start: Start,\n range: Range,\n): Result.Result<Request, InvalidPageSizeError | EmptyInitialPageError> =>\n Result.flatMap(\n Schema.decodeResult(PageSize)(numItems).pipe(\n Result.mapError(() => new InvalidPageSizeError({ numItems })),\n ),\n (size): Result.Result<Request, EmptyInitialPageError> =>\n size === 0\n ? Start.$match(start, {\n Beginning: () => Result.fail(new EmptyInitialPageError()),\n After: ({ cursor }) =>\n Result.succeed(Request.Unchanged({ cursor })),\n })\n : Result.succeed(\n Request.Scan({\n numItems: size,\n after: Start.$match(start, {\n Beginning: () => Option.none(),\n After: ({ key }) => Option.some(key),\n }),\n range,\n }),\n ),\n );\n\n/**\n * A nonempty scan, including filtered markers.\n */\ntype Progress = Chunk.NonEmptyChunk<QueryStreamKey.Complete>;\nconst append = (\n progress: Option.Option<Progress>,\n key: QueryStreamKey.Complete,\n): Progress =>\n Option.match(progress, {\n onNone: () => Chunk.of(key),\n onSome: (keys) => Chunk.append(keys, key),\n });\nconst midpoint = (progress: Progress): QueryStreamKey.Complete =>\n Option.getOrElse(\n Chunk.get(progress, Math.floor((Chunk.size(progress) - 1) / 2)),\n () => Chunk.headNonEmpty(progress),\n );\n\ninterface Stopped<Doc> {\n readonly page: Chunk.Chunk<Doc>;\n readonly progress: Progress;\n}\n\n/**\n * @experimental\n */\nexport type QueryStreamPagination<Doc> = Data.TaggedEnum<{\n Reading: {\n readonly page: Chunk.Chunk<Doc>;\n readonly progress: Option.Option<Progress>;\n };\n ItemLimit: Stopped<Doc>;\n ReadLimit: Stopped<Doc>;\n}>;\ninterface PaginationDefinition extends Data.TaggedEnum.WithGenerics<1> {\n readonly taggedEnum: QueryStreamPagination<this[\"A\"]>;\n}\nconst QueryStreamPagination = Data.taggedEnum<PaginationDefinition>();\n\n/**\n * @experimental\n */\nexport const initial = <Doc>(): QueryStreamPagination<Doc> =>\n QueryStreamPagination.Reading({\n page: Chunk.empty<Doc>(),\n progress: Option.none(),\n });\n\n/**\n * @experimental\n */\nexport const record = <Doc>(\n request: ScanRequest,\n self: QueryStreamPagination<Doc>,\n doc: Option.Option<Doc>,\n key: QueryStreamKey.Complete,\n readLimit: boolean,\n): QueryStreamPagination<Doc> =>\n Match.value(self).pipe(\n Match.tagsExhaustive({\n Reading: (reading) => {\n const progress = append(reading.progress, key);\n const page = Option.match(doc, {\n onNone: () => reading.page,\n onSome: (value) => Chunk.append(reading.page, value),\n });\n const continueReading = () =>\n QueryStreamPagination.Reading({\n page,\n progress: Option.some(progress),\n });\n return readLimit\n ? QueryStreamPagination.ReadLimit({ page, progress })\n : Range.$match(request.range, {\n Unpinned: () =>\n Chunk.size(page) >= request.numItems\n ? QueryStreamPagination.ItemLimit({ page, progress })\n : continueReading(),\n ThroughKey: continueReading,\n ThroughEnd: continueReading,\n });\n },\n ItemLimit: () => self,\n ReadLimit: () => self,\n }),\n );\n\n/**\n * @experimental\n */\nexport type Continuation = Data.TaggedEnum<{\n End: {};\n Key: { readonly key: QueryStreamKey.Complete };\n}>;\nconst Continuation = Data.taggedEnum<Continuation>();\n\ninterface Split<Doc> {\n readonly page: ReadonlyArray<Doc>;\n readonly continuation: Continuation;\n readonly splitKey: QueryStreamKey.Complete;\n}\n\n/**\n * @experimental\n */\nexport type Outcome<Doc> = Data.TaggedEnum<{\n Done: { readonly page: ReadonlyArray<Doc> };\n Continue: {\n readonly page: ReadonlyArray<Doc>;\n readonly key: QueryStreamKey.Complete;\n };\n SplitRequired: Split<Doc>;\n SplitRecommended: Split<Doc>;\n}>;\n\n/**\n * @experimental\n */\nexport class UnsafePageBoundaryError extends Data.TaggedError(\n \"UnsafePageBoundaryError\",\n)<{\n readonly reason: \"NoProgress\" | \"NoInteriorSplit\";\n}> {\n override get message(): string {\n return Match.value(this.reason).pipe(\n Match.when(\n \"NoProgress\",\n () => \"The read budget stopped the page before any key was scanned\",\n ),\n Match.when(\n \"NoInteriorSplit\",\n () => \"The read budget stopped the page without an interior split key\",\n ),\n Match.exhaustive,\n );\n }\n}\n\nconst SOFT_MAX_SCAN_LENGTH = 16000;\n\n/**\n * Decide the page result without reading a stream or serializing a cursor.\n *\n * @experimental\n */\nexport const finish = <Doc>(\n request: ScanRequest,\n self: QueryStreamPagination<Doc>,\n upstreamStopped: boolean,\n): Result.Result<Outcome<Doc>, UnsafePageBoundaryError> => {\n const page = Chunk.toArray(self.page);\n const stopped = (\n progress: Option.Option<Progress>,\n readLimit: boolean,\n ): Result.Result<Outcome<Doc>, UnsafePageBoundaryError> =>\n Result.flatMap(\n Result.fromOption(\n progress,\n () => new UnsafePageBoundaryError({ reason: \"NoProgress\" }),\n ),\n (scanned): Result.Result<Outcome<Doc>, UnsafePageBoundaryError> => {\n const splitKey = midpoint(scanned);\n const atEnd = Range.$match(request.range, {\n Unpinned: () => false,\n ThroughEnd: () => false,\n ThroughKey: ({ key }) =>\n QueryStreamKeyValues.Order(\"asc\")(splitKey.values, key.values) ===\n 0,\n });\n if (readLimit && atEnd) {\n return Result.fail(\n new UnsafePageBoundaryError({ reason: \"NoInteriorSplit\" }),\n );\n }\n const key = Chunk.lastNonEmpty(scanned);\n if (readLimit)\n return Result.succeed({\n _tag: \"SplitRequired\",\n page,\n continuation: Continuation.Key({ key }),\n splitKey,\n });\n return Result.succeed(\n Chunk.size(scanned) >= SOFT_MAX_SCAN_LENGTH\n ? {\n _tag: \"SplitRecommended\",\n page,\n continuation: Continuation.Key({ key }),\n splitKey,\n }\n : { _tag: \"Continue\", page, key },\n );\n },\n );\n const exhausted = (progress: Option.Option<Progress>): Outcome<Doc> => {\n const finishRange = (\n continuation: Continuation,\n pinned: boolean,\n ): Outcome<Doc> => {\n const split = Option.filter(\n progress,\n (scanned) =>\n pinned &&\n (Chunk.size(scanned) >= SOFT_MAX_SCAN_LENGTH ||\n page.length > request.numItems + 1),\n );\n return Option.match(split, {\n onSome: (scanned): Outcome<Doc> => ({\n _tag: \"SplitRecommended\",\n page,\n continuation,\n splitKey: midpoint(scanned),\n }),\n onNone: () =>\n Continuation.$match(continuation, {\n End: (): Outcome<Doc> => ({ _tag: \"Done\", page }),\n Key: ({ key }): Outcome<Doc> => ({\n _tag: \"Continue\",\n page,\n key,\n }),\n }),\n });\n };\n return Range.$match(request.range, {\n Unpinned: () => finishRange(Continuation.End(), false),\n ThroughEnd: () => finishRange(Continuation.End(), true),\n ThroughKey: ({ key }) => finishRange(Continuation.Key({ key }), true),\n });\n };\n return Match.value(self).pipe(\n Match.tagsExhaustive({\n Reading: ({ progress }) =>\n upstreamStopped\n ? stopped(progress, true)\n : Result.succeed(exhausted(progress)),\n ItemLimit: ({ progress }) =>\n stopped(Option.some(progress), upstreamStopped),\n ReadLimit: ({ progress }) => stopped(Option.some(progress), true),\n }),\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as Cause from "effect/Cause";
|
|
2
|
+
import * as Context from "effect/Context";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import * as Option from "effect/Option";
|
|
5
|
+
import * as Schema from "effect/Schema";
|
|
6
|
+
import * as Stream from "effect/Stream";
|
|
7
|
+
/**
|
|
8
|
+
* @experimental
|
|
9
|
+
*/
|
|
10
|
+
export interface QueryStreamReadBudget {
|
|
11
|
+
readonly isUnlimited: Effect.Effect<boolean>;
|
|
12
|
+
readonly isStopped: Effect.Effect<boolean>;
|
|
13
|
+
readonly isExhausted: Effect.Effect<boolean>;
|
|
14
|
+
readonly getReadCounts: Effect.Effect<ReadCounts>;
|
|
15
|
+
/**
|
|
16
|
+
* Returns a stream that records reads against this budget and stops
|
|
17
|
+
* requesting further batches once exhausted. Apply directly to the document
|
|
18
|
+
* source before buffering, filtering, or combining its output.
|
|
19
|
+
*/
|
|
20
|
+
readonly accountFor: (encodedDocuments: Stream.Stream<unknown>) => Stream.Stream<unknown>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* @experimental
|
|
24
|
+
*/
|
|
25
|
+
export declare const Limits: Schema.Struct<{
|
|
26
|
+
readonly maximumRowsRead: Schema.OptionFromOptionalKey<Schema.brand<Schema.Natural, "~@confect/server/QueryStreamReadBudget/ReadLimit">>;
|
|
27
|
+
readonly maximumBytesRead: Schema.OptionFromOptionalKey<Schema.brand<Schema.Natural, "~@confect/server/QueryStreamReadBudget/ReadLimit">>;
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* @experimental
|
|
31
|
+
*/
|
|
32
|
+
export type Limits = typeof Limits.Type;
|
|
33
|
+
declare const InvalidReadLimitError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => Cause.YieldableError & {
|
|
34
|
+
readonly _tag: "InvalidReadLimitError";
|
|
35
|
+
} & Readonly<A>;
|
|
36
|
+
/**
|
|
37
|
+
* @experimental
|
|
38
|
+
*/
|
|
39
|
+
export declare class InvalidReadLimitError extends InvalidReadLimitError_base<{
|
|
40
|
+
readonly cause: Schema.SchemaError;
|
|
41
|
+
}> {
|
|
42
|
+
get message(): string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* @experimental
|
|
46
|
+
*/
|
|
47
|
+
export interface ReadCounts {
|
|
48
|
+
readonly rowsRead: number;
|
|
49
|
+
readonly bytesRead: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* @experimental
|
|
53
|
+
*/
|
|
54
|
+
export declare const QueryStreamReadBudget: Context.Service<QueryStreamReadBudget, QueryStreamReadBudget>;
|
|
55
|
+
/**
|
|
56
|
+
* @experimental
|
|
57
|
+
*/
|
|
58
|
+
export declare const make: (limits: {
|
|
59
|
+
readonly maximumRowsRead: Option.Option<number & import("effect/Brand").Brand<"~@confect/server/QueryStreamReadBudget/ReadLimit">>;
|
|
60
|
+
readonly maximumBytesRead: Option.Option<number & import("effect/Brand").Brand<"~@confect/server/QueryStreamReadBudget/ReadLimit">>;
|
|
61
|
+
}) => Effect.Effect<QueryStreamReadBudget, never, never>;
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=QueryStreamReadBudget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryStreamReadBudget.d.ts","sourceRoot":"","sources":["../src/QueryStreamReadBudget.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAE1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAIxC;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAClD;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,CACnB,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KACrC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;CAC7B;AAMD;;GAEG;AACH,eAAO,MAAM,MAAM;;;EAGjB,CAAC;AACH;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAC;;;;AAExC;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,2BAEzC;IACA,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC;CACpC,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AASD;;GAEG;AACH,eAAO,MAAM,qBAAqB,+DAEjC,CAAC;AA2BF;;GAEG;AACH,eAAO,MAAM,IAAI;;;wDAuDf,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { __exportAll } from "./_virtual/_rolldown/runtime.js";
|
|
2
|
+
import * as Context from "effect/Context";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import * as Schema from "effect/Schema";
|
|
5
|
+
import * as Option from "effect/Option";
|
|
6
|
+
import { getDocumentSize } from "convex/values";
|
|
7
|
+
import * as Array from "effect/Array";
|
|
8
|
+
import * as Data from "effect/Data";
|
|
9
|
+
import * as Stream from "effect/Stream";
|
|
10
|
+
import * as Tuple from "effect/Tuple";
|
|
11
|
+
import * as Cause from "effect/Cause";
|
|
12
|
+
import * as SynchronizedRef from "effect/SynchronizedRef";
|
|
13
|
+
//#region src/QueryStreamReadBudget.ts
|
|
14
|
+
var QueryStreamReadBudget_exports = /* @__PURE__ */ __exportAll({
|
|
15
|
+
InvalidReadLimitError: () => InvalidReadLimitError,
|
|
16
|
+
Limits: () => Limits,
|
|
17
|
+
QueryStreamReadBudget: () => QueryStreamReadBudget,
|
|
18
|
+
make: () => make
|
|
19
|
+
});
|
|
20
|
+
const ReadLimit = Schema.Natural.pipe(Schema.brand("~@confect/server/QueryStreamReadBudget/ReadLimit"));
|
|
21
|
+
/**
|
|
22
|
+
* @experimental
|
|
23
|
+
*/
|
|
24
|
+
const Limits = Schema.Struct({
|
|
25
|
+
maximumRowsRead: Schema.OptionFromOptionalKey(ReadLimit),
|
|
26
|
+
maximumBytesRead: Schema.OptionFromOptionalKey(ReadLimit)
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* @experimental
|
|
30
|
+
*/
|
|
31
|
+
var InvalidReadLimitError = class extends Data.TaggedError("InvalidReadLimitError") {
|
|
32
|
+
get message() {
|
|
33
|
+
return `Invalid read limits: ${this.cause.message}`;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const State = Data.taggedEnum();
|
|
37
|
+
/**
|
|
38
|
+
* @experimental
|
|
39
|
+
*/
|
|
40
|
+
const QueryStreamReadBudget = Context.Service("@confect/server/QueryStreamReadBudget");
|
|
41
|
+
const isExhausted = (state, limits) => State.$match(state, {
|
|
42
|
+
Stopped: () => true,
|
|
43
|
+
Active: ({ rowsRead, bytesRead }) => Option.exists(limits.maximumRowsRead, (limit) => rowsRead >= limit) || Option.exists(limits.maximumBytesRead, (limit) => bytesRead >= limit)
|
|
44
|
+
});
|
|
45
|
+
const readCounts = ({ rowsRead, bytesRead }) => ({
|
|
46
|
+
rowsRead,
|
|
47
|
+
bytesRead
|
|
48
|
+
});
|
|
49
|
+
const record = (counts, documents) => ({
|
|
50
|
+
rowsRead: counts.rowsRead + documents.length,
|
|
51
|
+
bytesRead: Array.reduce(documents, counts.bytesRead, (bytes, document) => bytes + getDocumentSize(document))
|
|
52
|
+
});
|
|
53
|
+
/**
|
|
54
|
+
* @experimental
|
|
55
|
+
*/
|
|
56
|
+
const make = Effect.fnUntraced(function* (limits) {
|
|
57
|
+
const unlimited = Option.isNone(limits.maximumRowsRead) && Option.isNone(limits.maximumBytesRead);
|
|
58
|
+
const stateRef = yield* SynchronizedRef.make(State.Active({
|
|
59
|
+
rowsRead: 0,
|
|
60
|
+
bytesRead: 0
|
|
61
|
+
}));
|
|
62
|
+
const accountForPull = unlimited ? (pull) => Effect.uninterruptibleMask((restore) => Effect.tap(restore(pull), (documents) => SynchronizedRef.update(stateRef, (state) => State.Active(record(state, documents))))) : (pull) => SynchronizedRef.modifyEffect(stateRef, (state) => Effect.gen(function* () {
|
|
63
|
+
if (isExhausted(state, limits)) return Tuple.make(Option.none(), State.Stopped(readCounts(state)));
|
|
64
|
+
const documents = yield* pull;
|
|
65
|
+
return Tuple.make(Option.some(documents), State.Active(record(state, documents)));
|
|
66
|
+
})).pipe(Effect.flatMap(Option.match({
|
|
67
|
+
onNone: () => Cause.done(),
|
|
68
|
+
onSome: Effect.succeed
|
|
69
|
+
})));
|
|
70
|
+
return QueryStreamReadBudget.of({
|
|
71
|
+
isUnlimited: Effect.succeed(unlimited),
|
|
72
|
+
isStopped: Effect.map(SynchronizedRef.get(stateRef), State.$is("Stopped")),
|
|
73
|
+
isExhausted: Effect.map(SynchronizedRef.get(stateRef), (state) => isExhausted(state, limits)),
|
|
74
|
+
getReadCounts: Effect.map(SynchronizedRef.get(stateRef), readCounts),
|
|
75
|
+
accountFor: (encodedDocuments) => Stream.transformPull(encodedDocuments, (pull) => Effect.succeed(accountForPull(pull))).pipe(Stream.scoped)
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
//#endregion
|
|
79
|
+
export { InvalidReadLimitError, Limits, QueryStreamReadBudget, QueryStreamReadBudget_exports, make };
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=QueryStreamReadBudget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryStreamReadBudget.js","names":[],"sources":["../src/QueryStreamReadBudget.ts"],"sourcesContent":["import type { GenericDocument } from \"convex/server\";\nimport { getDocumentSize } from \"convex/values\";\nimport * as Array from \"effect/Array\";\nimport * as Cause from \"effect/Cause\";\nimport * as Context from \"effect/Context\";\nimport * as Data from \"effect/Data\";\nimport * as Effect from \"effect/Effect\";\nimport * as Option from \"effect/Option\";\nimport type * as Pull from \"effect/Pull\";\nimport * as Schema from \"effect/Schema\";\nimport * as Stream from \"effect/Stream\";\nimport * as SynchronizedRef from \"effect/SynchronizedRef\";\nimport * as Tuple from \"effect/Tuple\";\n\n/**\n * @experimental\n */\nexport interface QueryStreamReadBudget {\n readonly isUnlimited: Effect.Effect<boolean>;\n readonly isStopped: Effect.Effect<boolean>;\n readonly isExhausted: Effect.Effect<boolean>;\n readonly getReadCounts: Effect.Effect<ReadCounts>;\n /**\n * Returns a stream that records reads against this budget and stops\n * requesting further batches once exhausted. Apply directly to the document\n * source before buffering, filtering, or combining its output.\n */\n readonly accountFor: (\n encodedDocuments: Stream.Stream<unknown>,\n ) => Stream.Stream<unknown>;\n}\n\nconst ReadLimit = Schema.Natural.pipe(\n Schema.brand(\"~@confect/server/QueryStreamReadBudget/ReadLimit\"),\n);\n\n/**\n * @experimental\n */\nexport const Limits = Schema.Struct({\n maximumRowsRead: Schema.OptionFromOptionalKey(ReadLimit),\n maximumBytesRead: Schema.OptionFromOptionalKey(ReadLimit),\n});\n/**\n * @experimental\n */\nexport type Limits = typeof Limits.Type;\n\n/**\n * @experimental\n */\nexport class InvalidReadLimitError extends Data.TaggedError(\n \"InvalidReadLimitError\",\n)<{\n readonly cause: Schema.SchemaError;\n}> {\n override get message(): string {\n return `Invalid read limits: ${this.cause.message}`;\n }\n}\n\n/**\n * @experimental\n */\nexport interface ReadCounts {\n readonly rowsRead: number;\n readonly bytesRead: number;\n}\n\ntype State = Data.TaggedEnum<{\n Active: ReadCounts;\n Stopped: ReadCounts;\n}>;\n\nconst State = Data.taggedEnum<State>();\n\n/**\n * @experimental\n */\nexport const QueryStreamReadBudget = Context.Service<QueryStreamReadBudget>(\n \"@confect/server/QueryStreamReadBudget\",\n);\n\nconst isExhausted = (state: State, limits: Limits): boolean =>\n State.$match(state, {\n Stopped: () => true,\n Active: ({ rowsRead, bytesRead }) =>\n Option.exists(limits.maximumRowsRead, (limit) => rowsRead >= limit) ||\n Option.exists(limits.maximumBytesRead, (limit) => bytesRead >= limit),\n });\n\nconst readCounts = ({ rowsRead, bytesRead }: ReadCounts): ReadCounts => ({\n rowsRead,\n bytesRead,\n});\n\nconst record = (\n counts: ReadCounts,\n documents: Array.NonEmptyReadonlyArray<unknown>,\n): ReadCounts => ({\n rowsRead: counts.rowsRead + documents.length,\n bytesRead: Array.reduce(\n documents,\n counts.bytesRead,\n (bytes, document) => bytes + getDocumentSize(document as GenericDocument),\n ),\n});\n\n/**\n * @experimental\n */\nexport const make = Effect.fnUntraced(function* (\n limits: Limits,\n): Effect.fn.Return<QueryStreamReadBudget> {\n const unlimited =\n Option.isNone(limits.maximumRowsRead) &&\n Option.isNone(limits.maximumBytesRead);\n const stateRef = yield* SynchronizedRef.make<State>(\n State.Active({ rowsRead: 0, bytesRead: 0 }),\n );\n const accountForPull: (\n pull: Pull.Pull<Array.NonEmptyReadonlyArray<unknown>>,\n ) => Pull.Pull<Array.NonEmptyReadonlyArray<unknown>> = unlimited\n ? (pull) =>\n Effect.uninterruptibleMask((restore) =>\n Effect.tap(restore(pull), (documents) =>\n SynchronizedRef.update(stateRef, (state) =>\n State.Active(record(state, documents)),\n ),\n ),\n )\n : (pull) =>\n SynchronizedRef.modifyEffect(stateRef, (state) =>\n Effect.gen(function* () {\n if (isExhausted(state, limits)) {\n return Tuple.make(\n Option.none(),\n State.Stopped(readCounts(state)),\n );\n }\n const documents = yield* pull;\n return Tuple.make(\n Option.some(documents),\n State.Active(record(state, documents)),\n );\n }),\n ).pipe(\n Effect.flatMap(\n Option.match({\n onNone: () => Cause.done(),\n onSome: Effect.succeed,\n }),\n ),\n );\n return QueryStreamReadBudget.of({\n isUnlimited: Effect.succeed(unlimited),\n isStopped: Effect.map(SynchronizedRef.get(stateRef), State.$is(\"Stopped\")),\n isExhausted: Effect.map(SynchronizedRef.get(stateRef), (state) =>\n isExhausted(state, limits),\n ),\n getReadCounts: Effect.map(SynchronizedRef.get(stateRef), readCounts),\n accountFor: (encodedDocuments) =>\n Stream.transformPull(encodedDocuments, (pull) =>\n Effect.succeed(accountForPull(pull)),\n ).pipe(Stream.scoped),\n });\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAgCA,MAAM,YAAY,OAAO,QAAQ,KAC/B,OAAO,MAAM,kDAAkD,CACjE;;;;AAKA,MAAa,SAAS,OAAO,OAAO;CAClC,iBAAiB,OAAO,sBAAsB,SAAS;CACvD,kBAAkB,OAAO,sBAAsB,SAAS;AAC1D,CAAC;;;;AASD,IAAa,wBAAb,cAA2C,KAAK,YAC9C,uBACF,CAAC,CAEE;CACD,IAAa,UAAkB;EAC7B,OAAO,wBAAwB,KAAK,MAAM;CAC5C;AACF;AAeA,MAAM,QAAQ,KAAK,WAAkB;;;;AAKrC,MAAa,wBAAwB,QAAQ,QAC3C,uCACF;AAEA,MAAM,eAAe,OAAc,WACjC,MAAM,OAAO,OAAO;CAClB,eAAe;CACf,SAAS,EAAE,UAAU,gBACnB,OAAO,OAAO,OAAO,kBAAkB,UAAU,YAAY,KAAK,KAClE,OAAO,OAAO,OAAO,mBAAmB,UAAU,aAAa,KAAK;AACxE,CAAC;AAEH,MAAM,cAAc,EAAE,UAAU,iBAAyC;CACvE;CACA;AACF;AAEA,MAAM,UACJ,QACA,eACgB;CAChB,UAAU,OAAO,WAAW,UAAU;CACtC,WAAW,MAAM,OACf,WACA,OAAO,YACN,OAAO,aAAa,QAAQ,gBAAgB,QAA2B,CAC1E;AACF;;;;AAKA,MAAa,OAAO,OAAO,WAAW,WACpC,QACyC;CACzC,MAAM,YACJ,OAAO,OAAO,OAAO,eAAe,KACpC,OAAO,OAAO,OAAO,gBAAgB;CACvC,MAAM,WAAW,OAAO,gBAAgB,KACtC,MAAM,OAAO;EAAE,UAAU;EAAG,WAAW;CAAE,CAAC,CAC5C;CACA,MAAM,iBAEiD,aAClD,SACC,OAAO,qBAAqB,YAC1B,OAAO,IAAI,QAAQ,IAAI,IAAI,cACzB,gBAAgB,OAAO,WAAW,UAChC,MAAM,OAAO,OAAO,OAAO,SAAS,CAAC,CACvC,CACF,CACF,KACD,SACC,gBAAgB,aAAa,WAAW,UACtC,OAAO,IAAI,aAAa;EACtB,IAAI,YAAY,OAAO,MAAM,GAC3B,OAAO,MAAM,KACX,OAAO,KAAK,GACZ,MAAM,QAAQ,WAAW,KAAK,CAAC,CACjC;EAEF,MAAM,YAAY,OAAO;EACzB,OAAO,MAAM,KACX,OAAO,KAAK,SAAS,GACrB,MAAM,OAAO,OAAO,OAAO,SAAS,CAAC,CACvC;CACF,CAAC,CACH,CAAC,CAAC,KACA,OAAO,QACL,OAAO,MAAM;EACX,cAAc,MAAM,KAAK;EACzB,QAAQ,OAAO;CACjB,CAAC,CACH,CACF;CACN,OAAO,sBAAsB,GAAG;EAC9B,aAAa,OAAO,QAAQ,SAAS;EACrC,WAAW,OAAO,IAAI,gBAAgB,IAAI,QAAQ,GAAG,MAAM,IAAI,SAAS,CAAC;EACzE,aAAa,OAAO,IAAI,gBAAgB,IAAI,QAAQ,IAAI,UACtD,YAAY,OAAO,MAAM,CAC3B;EACA,eAAe,OAAO,IAAI,gBAAgB,IAAI,QAAQ,GAAG,UAAU;EACnE,aAAa,qBACX,OAAO,cAAc,mBAAmB,SACtC,OAAO,QAAQ,eAAe,IAAI,CAAC,CACrC,CAAC,CAAC,KAAK,OAAO,MAAM;CACxB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as Ref from "@confect/core/Ref";
|
|
2
|
+
import type { GenericDataModel, GenericQueryCtx, TransactionLimits } from "convex/server";
|
|
3
|
+
import * as Context from "effect/Context";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as Layer from "effect/Layer";
|
|
6
|
+
export type { TransactionLimits } from "convex/server";
|
|
7
|
+
export interface Options {
|
|
8
|
+
readonly transactionLimits?: TransactionLimits;
|
|
9
|
+
}
|
|
10
|
+
declare const QueryTransactionContext_base: Context.ServiceClass<QueryTransactionContext, "@confect/server/QueryTransactionContext", {
|
|
11
|
+
runQuery: <Query extends Ref.AnyQuery>(query: Query, args: Ref.Args<Query>, options: Options) => Effect.Effect<Ref.Returns<Query>, import("effect/Schema").SchemaError | Ref.Error<Query>, never>;
|
|
12
|
+
}>;
|
|
13
|
+
export declare class QueryTransactionContext extends QueryTransactionContext_base {
|
|
14
|
+
}
|
|
15
|
+
export declare const layer: (ctx: Pick<GenericQueryCtx<GenericDataModel>, "runQuery">) => Layer.Layer<QueryTransactionContext, never, never>;
|
|
16
|
+
//# sourceMappingURL=QueryTransactionContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryTransactionContext.d.ts","sourceRoot":"","sources":["../src/QueryTransactionContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,mBAAmB,CAAC;AACzC,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EAClB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CAChD;;eAII,KAAK,SAAS,GAAG,CAAC,QAAQ;;AAW/B,qBAAa,uBAAwB,SAAQ,4BAGC;CAAG;AAEjD,eAAO,MAAM,KAAK,QACX,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,uDACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { __exportAll } from "./_virtual/_rolldown/runtime.js";
|
|
2
|
+
import * as Context from "effect/Context";
|
|
3
|
+
import * as Layer from "effect/Layer";
|
|
4
|
+
import * as Ref from "@confect/core/Ref";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
//#region src/QueryTransactionContext.ts
|
|
7
|
+
var QueryTransactionContext_exports = /* @__PURE__ */ __exportAll({
|
|
8
|
+
QueryTransactionContext: () => QueryTransactionContext,
|
|
9
|
+
layer: () => layer
|
|
10
|
+
});
|
|
11
|
+
const make = (ctx) => ({ runQuery: Effect.fn("QueryTransactionContext.runQuery")((query, args, options) => Ref.runWithCodec(query, args, (ref, encodedArgs) => ctx.runQuery(ref, encodedArgs, options))) });
|
|
12
|
+
var QueryTransactionContext = class extends Context.Service()("@confect/server/QueryTransactionContext") {};
|
|
13
|
+
const layer = (ctx) => Layer.succeed(QueryTransactionContext, make(ctx));
|
|
14
|
+
//#endregion
|
|
15
|
+
export { QueryTransactionContext, QueryTransactionContext_exports, layer };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=QueryTransactionContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryTransactionContext.js","names":[],"sources":["../src/QueryTransactionContext.ts"],"sourcesContent":["import * as Ref from \"@confect/core/Ref\";\nimport type {\n GenericDataModel,\n GenericQueryCtx,\n TransactionLimits,\n} from \"convex/server\";\nimport * as Context from \"effect/Context\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\n\nexport type { TransactionLimits } from \"convex/server\";\n\nexport interface Options {\n readonly transactionLimits?: TransactionLimits;\n}\n\nconst make = (ctx: Pick<GenericQueryCtx<GenericDataModel>, \"runQuery\">) => ({\n runQuery: Effect.fn(\"QueryTransactionContext.runQuery\")(\n <Query extends Ref.AnyQuery>(\n query: Query,\n args: Ref.Args<Query>,\n options: Options,\n ) =>\n Ref.runWithCodec(query, args, (ref, encodedArgs) =>\n ctx.runQuery(ref, encodedArgs, options),\n ),\n ),\n});\n\nexport class QueryTransactionContext extends Context.Service<\n QueryTransactionContext,\n ReturnType<typeof make>\n>()(\"@confect/server/QueryTransactionContext\") {}\n\nexport const layer = (\n ctx: Pick<GenericQueryCtx<GenericDataModel>, \"runQuery\">,\n) => Layer.succeed(QueryTransactionContext, make(ctx));\n"],"mappings":";;;;;;;;;;AAgBA,MAAM,QAAQ,SAA8D,EAC1E,UAAU,OAAO,GAAG,kCAAkC,CAAC,EAEnD,OACA,MACA,YAEA,IAAI,aAAa,OAAO,OAAO,KAAK,gBAClC,IAAI,SAAS,KAAK,aAAa,OAAO,CACxC,CACJ,EACF;AAEA,IAAa,0BAAb,cAA6C,QAAQ,QAGnD,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC;AAEhD,MAAa,SACX,QACG,MAAM,QAAQ,yBAAyB,KAAK,GAAG,CAAC"}
|