effect 4.0.5 → 4.0.7
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/ai-docs/package.json +1 -1
- package/ai-docs/src/06_schedule/10_schedules.ts +5 -4
- package/ai-docs/tsconfig.json +3 -1
- package/dist/Arbitrary.d.ts +10 -2
- package/dist/Arbitrary.d.ts.map +1 -1
- package/dist/Arbitrary.js +2 -1
- package/dist/Arbitrary.js.map +1 -1
- package/dist/Array.d.ts +117 -52
- package/dist/Array.d.ts.map +1 -1
- package/dist/Array.js +41 -20
- package/dist/Array.js.map +1 -1
- package/dist/Bytes.d.ts +79 -0
- package/dist/Bytes.d.ts.map +1 -0
- package/dist/Bytes.js +109 -0
- package/dist/Bytes.js.map +1 -0
- package/dist/Channel.d.ts +181 -13
- package/dist/Channel.d.ts.map +1 -1
- package/dist/Channel.js +144 -34
- package/dist/Channel.js.map +1 -1
- package/dist/ChannelSchema.d.ts.map +1 -1
- package/dist/ChannelSchema.js.map +1 -1
- package/dist/Chunk.d.ts +39 -21
- package/dist/Chunk.d.ts.map +1 -1
- package/dist/Chunk.js +26 -17
- package/dist/Chunk.js.map +1 -1
- package/dist/Config.d.ts.map +1 -1
- package/dist/Config.js +8 -3
- package/dist/Config.js.map +1 -1
- package/dist/ConfigProvider.d.ts.map +1 -1
- package/dist/ConfigProvider.js +2 -1
- package/dist/ConfigProvider.js.map +1 -1
- package/dist/Cron.d.ts +2 -2
- package/dist/Cron.d.ts.map +1 -1
- package/dist/Cron.js +6 -3
- package/dist/Cron.js.map +1 -1
- package/dist/Data.d.ts +54 -235
- package/dist/Data.d.ts.map +1 -1
- package/dist/Data.js.map +1 -1
- package/dist/Duration.d.ts.map +1 -1
- package/dist/Duration.js +56 -16
- package/dist/Duration.js.map +1 -1
- package/dist/Effect.d.ts +488 -164
- package/dist/Effect.d.ts.map +1 -1
- package/dist/Effect.js +204 -38
- package/dist/Effect.js.map +1 -1
- package/dist/Equal.d.ts.map +1 -1
- package/dist/Equal.js +8 -1
- package/dist/Equal.js.map +1 -1
- package/dist/Equivalence.d.ts +2 -1
- package/dist/Equivalence.d.ts.map +1 -1
- package/dist/Equivalence.js +12 -8
- package/dist/Equivalence.js.map +1 -1
- package/dist/Exit.d.ts +27 -12
- package/dist/Exit.d.ts.map +1 -1
- package/dist/Exit.js +8 -3
- package/dist/Exit.js.map +1 -1
- package/dist/FiberHandle.d.ts +2 -0
- package/dist/FiberHandle.d.ts.map +1 -1
- package/dist/FiberHandle.js +9 -4
- package/dist/FiberHandle.js.map +1 -1
- package/dist/FiberMap.d.ts +2 -0
- package/dist/FiberMap.d.ts.map +1 -1
- package/dist/FiberMap.js +5 -2
- package/dist/FiberMap.js.map +1 -1
- package/dist/FileSystem.d.ts +5 -0
- package/dist/FileSystem.d.ts.map +1 -1
- package/dist/FileSystem.js +3 -0
- package/dist/FileSystem.js.map +1 -1
- package/dist/Formatter.d.ts.map +1 -1
- package/dist/Formatter.js +27 -13
- package/dist/Formatter.js.map +1 -1
- package/dist/Graph.d.ts.map +1 -1
- package/dist/Graph.js.map +1 -1
- package/dist/Hash.d.ts.map +1 -1
- package/dist/Hash.js +4 -1
- package/dist/Hash.js.map +1 -1
- package/dist/HashSet.d.ts.map +1 -1
- package/dist/HashSet.js.map +1 -1
- package/dist/Iterable.d.ts.map +1 -1
- package/dist/Iterable.js +18 -17
- package/dist/Iterable.js.map +1 -1
- package/dist/JsonPatch.js +4 -0
- package/dist/JsonPatch.js.map +1 -1
- package/dist/JsonSchema.d.ts +9 -3
- package/dist/JsonSchema.d.ts.map +1 -1
- package/dist/JsonSchema.js +32 -43
- package/dist/JsonSchema.js.map +1 -1
- package/dist/Layer.d.ts.map +1 -1
- package/dist/Layer.js +2 -2
- package/dist/Layer.js.map +1 -1
- package/dist/ManagedRuntime.d.ts +19 -1
- package/dist/ManagedRuntime.d.ts.map +1 -1
- package/dist/ManagedRuntime.js +62 -6
- package/dist/ManagedRuntime.js.map +1 -1
- package/dist/Metric.d.ts +135 -3
- package/dist/Metric.d.ts.map +1 -1
- package/dist/Metric.js +197 -25
- package/dist/Metric.js.map +1 -1
- package/dist/MutableHashMap.d.ts.map +1 -1
- package/dist/MutableHashMap.js.map +1 -1
- package/dist/MutableList.d.ts +5 -2
- package/dist/MutableList.d.ts.map +1 -1
- package/dist/MutableList.js +7 -5
- package/dist/MutableList.js.map +1 -1
- package/dist/MutableRef.d.ts.map +1 -1
- package/dist/MutableRef.js +7 -0
- package/dist/MutableRef.js.map +1 -1
- package/dist/Number.js +2 -2
- package/dist/Number.js.map +1 -1
- package/dist/Optic.d.ts.map +1 -1
- package/dist/Optic.js.map +1 -1
- package/dist/PartitionedSemaphore.d.ts +2 -1
- package/dist/PartitionedSemaphore.d.ts.map +1 -1
- package/dist/PartitionedSemaphore.js +22 -12
- package/dist/PartitionedSemaphore.js.map +1 -1
- package/dist/Path.d.ts.map +1 -1
- package/dist/Path.js +8 -1
- package/dist/Path.js.map +1 -1
- package/dist/Pool.d.ts.map +1 -1
- package/dist/Pool.js +77 -27
- package/dist/Pool.js.map +1 -1
- package/dist/PubSub.d.ts.map +1 -1
- package/dist/PubSub.js +17 -13
- package/dist/PubSub.js.map +1 -1
- package/dist/Queue.d.ts +4 -1
- package/dist/Queue.d.ts.map +1 -1
- package/dist/Queue.js +4 -1
- package/dist/Queue.js.map +1 -1
- package/dist/Random.d.ts.map +1 -1
- package/dist/Random.js +1 -1
- package/dist/Random.js.map +1 -1
- package/dist/RcMap.d.ts +12 -7
- package/dist/RcMap.d.ts.map +1 -1
- package/dist/RcMap.js +9 -6
- package/dist/RcMap.js.map +1 -1
- package/dist/Record.d.ts +51 -0
- package/dist/Record.d.ts.map +1 -1
- package/dist/Record.js +17 -0
- package/dist/Record.js.map +1 -1
- package/dist/Ref.d.ts.map +1 -1
- package/dist/Ref.js +8 -0
- package/dist/Ref.js.map +1 -1
- package/dist/References.d.ts +5 -4
- package/dist/References.d.ts.map +1 -1
- package/dist/References.js +5 -4
- package/dist/References.js.map +1 -1
- package/dist/RequestResolver.d.ts +31 -1
- package/dist/RequestResolver.d.ts.map +1 -1
- package/dist/RequestResolver.js +39 -4
- package/dist/RequestResolver.js.map +1 -1
- package/dist/Resource.js +1 -1
- package/dist/Resource.js.map +1 -1
- package/dist/Runtime.d.ts +3 -3
- package/dist/Runtime.d.ts.map +1 -1
- package/dist/Runtime.js +18 -15
- package/dist/Runtime.js.map +1 -1
- package/dist/Schedule.d.ts.map +1 -1
- package/dist/Schedule.js +1 -1
- package/dist/Schedule.js.map +1 -1
- package/dist/Schema.d.ts +408 -340
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +370 -47
- package/dist/Schema.js.map +1 -1
- package/dist/SchemaAST.d.ts +9 -7
- package/dist/SchemaAST.d.ts.map +1 -1
- package/dist/SchemaAST.js +38 -25
- package/dist/SchemaAST.js.map +1 -1
- package/dist/SchemaGetter.d.ts +8 -3
- package/dist/SchemaGetter.d.ts.map +1 -1
- package/dist/SchemaGetter.js +15 -5
- package/dist/SchemaGetter.js.map +1 -1
- package/dist/SchemaIssue.d.ts +4 -4
- package/dist/SchemaIssue.d.ts.map +1 -1
- package/dist/SchemaIssue.js +29 -51
- package/dist/SchemaIssue.js.map +1 -1
- package/dist/SchemaParser.d.ts.map +1 -1
- package/dist/SchemaParser.js +48 -22
- package/dist/SchemaParser.js.map +1 -1
- package/dist/SchemaRepresentation.d.ts +75 -11
- package/dist/SchemaRepresentation.d.ts.map +1 -1
- package/dist/SchemaRepresentation.js +41 -13
- package/dist/SchemaRepresentation.js.map +1 -1
- package/dist/SchemaTransformation.d.ts +5 -2
- package/dist/SchemaTransformation.d.ts.map +1 -1
- package/dist/SchemaTransformation.js +10 -3
- package/dist/SchemaTransformation.js.map +1 -1
- package/dist/Scope.d.ts +12 -2
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +5 -0
- package/dist/Scope.js.map +1 -1
- package/dist/ScopedCache.d.ts +10 -7
- package/dist/ScopedCache.d.ts.map +1 -1
- package/dist/ScopedCache.js +9 -5
- package/dist/ScopedCache.js.map +1 -1
- package/dist/SemVer.d.ts +1196 -0
- package/dist/SemVer.d.ts.map +1 -0
- package/dist/SemVer.js +756 -0
- package/dist/SemVer.js.map +1 -0
- package/dist/SemVerRange.d.ts +559 -0
- package/dist/SemVerRange.d.ts.map +1 -0
- package/dist/SemVerRange.js +551 -0
- package/dist/SemVerRange.js.map +1 -0
- package/dist/Semaphore.d.ts.map +1 -1
- package/dist/Semaphore.js +54 -35
- package/dist/Semaphore.js.map +1 -1
- package/dist/Sink.d.ts.map +1 -1
- package/dist/Sink.js +13 -4
- package/dist/Sink.js.map +1 -1
- package/dist/Stream.d.ts +235 -8
- package/dist/Stream.d.ts.map +1 -1
- package/dist/Stream.js +167 -70
- package/dist/Stream.js.map +1 -1
- package/dist/String.d.ts +7 -2
- package/dist/String.d.ts.map +1 -1
- package/dist/String.js +11 -6
- package/dist/String.js.map +1 -1
- package/dist/TextDiff.d.ts +399 -0
- package/dist/TextDiff.d.ts.map +1 -0
- package/dist/TextDiff.js +634 -0
- package/dist/TextDiff.js.map +1 -0
- package/dist/Tracer.d.ts +11 -1
- package/dist/Tracer.d.ts.map +1 -1
- package/dist/Tracer.js +6 -1
- package/dist/Tracer.js.map +1 -1
- package/dist/TxHashMap.d.ts.map +1 -1
- package/dist/TxHashMap.js.map +1 -1
- package/dist/TxHashSet.d.ts.map +1 -1
- package/dist/TxHashSet.js.map +1 -1
- package/dist/ai/AiError.d.ts +68 -4
- package/dist/ai/AiError.d.ts.map +1 -1
- package/dist/ai/AiError.js +50 -2
- package/dist/ai/AiError.js.map +1 -1
- package/dist/ai/Chat.d.ts +1 -2
- package/dist/ai/Chat.d.ts.map +1 -1
- package/dist/ai/Chat.js +6 -3
- package/dist/ai/Chat.js.map +1 -1
- package/dist/ai/Decision.d.ts +46 -1
- package/dist/ai/Decision.d.ts.map +1 -1
- package/dist/ai/Decision.js.map +1 -1
- package/dist/ai/DecisionModel.d.ts +129 -11
- package/dist/ai/DecisionModel.d.ts.map +1 -1
- package/dist/ai/DecisionModel.js +182 -94
- package/dist/ai/DecisionModel.js.map +1 -1
- package/dist/ai/EmbeddingModel.d.ts +10 -0
- package/dist/ai/EmbeddingModel.d.ts.map +1 -1
- package/dist/ai/EmbeddingModel.js +21 -7
- package/dist/ai/EmbeddingModel.js.map +1 -1
- package/dist/ai/LanguageModel.d.ts.map +1 -1
- package/dist/ai/LanguageModel.js +9 -0
- package/dist/ai/LanguageModel.js.map +1 -1
- package/dist/ai/McpClient.d.ts +289 -0
- package/dist/ai/McpClient.d.ts.map +1 -0
- package/dist/ai/McpClient.js +819 -0
- package/dist/ai/McpClient.js.map +1 -0
- package/dist/ai/McpClientError.d.ts +254 -0
- package/dist/ai/McpClientError.d.ts.map +1 -0
- package/dist/ai/McpClientError.js +260 -0
- package/dist/ai/McpClientError.js.map +1 -0
- package/dist/ai/McpProtocol.d.ts +2 -2
- package/dist/ai/McpProtocol.d.ts.map +1 -1
- package/dist/ai/McpSchema.d.ts +258 -125
- package/dist/ai/McpSchema.d.ts.map +1 -1
- package/dist/ai/McpSchema.js +94 -24
- package/dist/ai/McpSchema.js.map +1 -1
- package/dist/ai/McpServer.d.ts.map +1 -1
- package/dist/ai/McpServer.js +46 -37
- package/dist/ai/McpServer.js.map +1 -1
- package/dist/ai/Prompt.d.ts +74 -20
- package/dist/ai/Prompt.d.ts.map +1 -1
- package/dist/ai/Prompt.js +61 -1
- package/dist/ai/Prompt.js.map +1 -1
- package/dist/ai/Response.d.ts +160 -3
- package/dist/ai/Response.d.ts.map +1 -1
- package/dist/ai/Response.js +39 -37
- package/dist/ai/Response.js.map +1 -1
- package/dist/ai/Tool.d.ts +36 -4
- package/dist/ai/Tool.d.ts.map +1 -1
- package/dist/ai/Tool.js +5 -2
- package/dist/ai/Tool.js.map +1 -1
- package/dist/ai/Toolkit.d.ts +48 -1
- package/dist/ai/Toolkit.d.ts.map +1 -1
- package/dist/ai/Toolkit.js +73 -13
- package/dist/ai/Toolkit.js.map +1 -1
- package/dist/ai/index.d.ts +10 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +10 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/internal/mcpCore.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2024_11_05.js +1 -1
- package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_03_26.js +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_06_18.js +2 -2
- package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_11_25.js +2 -2
- package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js +4 -7
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
- package/dist/ai/internal/mcpProtocol.js +16 -2
- package/dist/ai/internal/mcpProtocol.js.map +1 -1
- package/dist/ai/internal/mcpRuntime.js +3 -4
- package/dist/ai/internal/mcpRuntime.js.map +1 -1
- package/dist/ai/internal/mcpSchema/v2024_11_05.js +19 -13
- package/dist/ai/internal/mcpSchema/v2024_11_05.js.map +1 -1
- package/dist/ai/internal/mcpSchema/v2025_03_26.js +3 -2
- package/dist/ai/internal/mcpSchema/v2025_03_26.js.map +1 -1
- package/dist/ai/internal/mcpSchema/v2025_06_18.js +7 -7
- package/dist/ai/internal/mcpSchema/v2025_06_18.js.map +1 -1
- package/dist/ai/internal/mcpSchema/v2025_11_25.js +8 -8
- package/dist/ai/internal/mcpSchema/v2025_11_25.js.map +1 -1
- package/dist/ai/internal/mcpSchema/v2026_07_28.js +43 -42
- package/dist/ai/internal/mcpSchema/v2026_07_28.js.map +1 -1
- package/dist/cli/Argument.d.ts +15 -0
- package/dist/cli/Argument.d.ts.map +1 -1
- package/dist/cli/Argument.js +5 -0
- package/dist/cli/Argument.js.map +1 -1
- package/dist/cli/CliError.d.ts +120 -2
- package/dist/cli/CliError.d.ts.map +1 -1
- package/dist/cli/CliError.js +106 -5
- package/dist/cli/CliError.js.map +1 -1
- package/dist/cli/CliOutput.d.ts +155 -6
- package/dist/cli/CliOutput.d.ts.map +1 -1
- package/dist/cli/CliOutput.js +62 -6
- package/dist/cli/CliOutput.js.map +1 -1
- package/dist/cli/Command.d.ts +310 -18
- package/dist/cli/Command.d.ts.map +1 -1
- package/dist/cli/Command.js +164 -33
- package/dist/cli/Command.js.map +1 -1
- package/dist/cli/Completions.d.ts +63 -0
- package/dist/cli/Completions.d.ts.map +1 -1
- package/dist/cli/Completions.js +49 -9
- package/dist/cli/Completions.js.map +1 -1
- package/dist/cli/Flag.d.ts +130 -0
- package/dist/cli/Flag.d.ts.map +1 -1
- package/dist/cli/Flag.js +61 -0
- package/dist/cli/Flag.js.map +1 -1
- package/dist/cli/GlobalFlag.d.ts.map +1 -1
- package/dist/cli/GlobalFlag.js +14 -6
- package/dist/cli/GlobalFlag.js.map +1 -1
- package/dist/cli/Param.d.ts +116 -0
- package/dist/cli/Param.d.ts.map +1 -1
- package/dist/cli/Param.js +77 -2
- package/dist/cli/Param.js.map +1 -1
- package/dist/cli/TerminalCapabilities.d.ts +85 -0
- package/dist/cli/TerminalCapabilities.d.ts.map +1 -0
- package/dist/cli/TerminalCapabilities.js +124 -0
- package/dist/cli/TerminalCapabilities.js.map +1 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +5 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/internal/command.d.ts +2 -1
- package/dist/cli/internal/command.d.ts.map +1 -1
- package/dist/cli/internal/command.js +5 -2
- package/dist/cli/internal/command.js.map +1 -1
- package/dist/cli/internal/completions/bash.js +77 -30
- package/dist/cli/internal/completions/bash.js.map +1 -1
- package/dist/cli/internal/completions/descriptor.js +9 -1
- package/dist/cli/internal/completions/descriptor.js.map +1 -1
- package/dist/cli/internal/completions/fish.js +10 -8
- package/dist/cli/internal/completions/fish.js.map +1 -1
- package/dist/cli/internal/completions/powershell.js +18 -9
- package/dist/cli/internal/completions/powershell.js.map +1 -1
- package/dist/cli/internal/completions/zsh.js +8 -5
- package/dist/cli/internal/completions/zsh.js.map +1 -1
- package/dist/cli/internal/formatter.d.ts +2 -0
- package/dist/cli/internal/formatter.d.ts.map +1 -0
- package/dist/cli/internal/formatter.js +15 -0
- package/dist/cli/internal/formatter.js.map +1 -0
- package/dist/cli/internal/lexer.js +24 -10
- package/dist/cli/internal/lexer.js.map +1 -1
- package/dist/cli/internal/parser.js +24 -12
- package/dist/cli/internal/parser.js.map +1 -1
- package/dist/cluster/ClusterCron.d.ts +29 -1
- package/dist/cluster/ClusterCron.d.ts.map +1 -1
- package/dist/cluster/ClusterCron.js +64 -32
- package/dist/cluster/ClusterCron.js.map +1 -1
- package/dist/cluster/ClusterMetrics.d.ts +143 -7
- package/dist/cluster/ClusterMetrics.d.ts.map +1 -1
- package/dist/cluster/ClusterMetrics.js +151 -7
- package/dist/cluster/ClusterMetrics.js.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.d.ts +1 -1
- package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.js +82 -21
- package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
- package/dist/cluster/Entity.d.ts +2 -0
- package/dist/cluster/Entity.d.ts.map +1 -1
- package/dist/cluster/Entity.js.map +1 -1
- package/dist/cluster/MessageStorage.d.ts +44 -45
- package/dist/cluster/MessageStorage.d.ts.map +1 -1
- package/dist/cluster/MessageStorage.js +6 -7
- package/dist/cluster/MessageStorage.js.map +1 -1
- package/dist/cluster/Runners.d.ts.map +1 -1
- package/dist/cluster/Runners.js +54 -15
- package/dist/cluster/Runners.js.map +1 -1
- package/dist/cluster/Sharding.d.ts +1 -0
- package/dist/cluster/Sharding.d.ts.map +1 -1
- package/dist/cluster/Sharding.js +155 -52
- package/dist/cluster/Sharding.js.map +1 -1
- package/dist/cluster/ShardingConfig.d.ts +30 -0
- package/dist/cluster/ShardingConfig.d.ts.map +1 -1
- package/dist/cluster/ShardingConfig.js +4 -0
- package/dist/cluster/ShardingConfig.js.map +1 -1
- package/dist/cluster/Snowflake.d.ts.map +1 -1
- package/dist/cluster/Snowflake.js +3 -7
- package/dist/cluster/Snowflake.js.map +1 -1
- package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
- package/dist/cluster/SqlMessageStorage.js +40 -50
- package/dist/cluster/SqlMessageStorage.js.map +1 -1
- package/dist/cluster/SqlRunnerStorage.d.ts +2 -2
- package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
- package/dist/cluster/SqlRunnerStorage.js +97 -43
- package/dist/cluster/SqlRunnerStorage.js.map +1 -1
- package/dist/cluster/internal/entityManager.js +119 -28
- package/dist/cluster/internal/entityManager.js.map +1 -1
- package/dist/devtools/DevTools.d.ts +3 -2
- package/dist/devtools/DevTools.d.ts.map +1 -1
- package/dist/devtools/DevTools.js +3 -2
- package/dist/devtools/DevTools.js.map +1 -1
- package/dist/devtools/DevToolsClient.d.ts +11 -0
- package/dist/devtools/DevToolsClient.d.ts.map +1 -1
- package/dist/devtools/DevToolsClient.js +33 -4
- package/dist/devtools/DevToolsClient.js.map +1 -1
- package/dist/encoding/Base64.js +36 -0
- package/dist/encoding/Base64.js.map +1 -1
- package/dist/encoding/Base64Url.d.ts +29 -0
- package/dist/encoding/Base64Url.d.ts.map +1 -1
- package/dist/encoding/Base64Url.js +29 -0
- package/dist/encoding/Base64Url.js.map +1 -1
- package/dist/encoding/Ini.d.ts.map +1 -1
- package/dist/encoding/Ini.js +3 -0
- package/dist/encoding/Ini.js.map +1 -1
- package/dist/encoding/JsonArray.d.ts +270 -0
- package/dist/encoding/JsonArray.d.ts.map +1 -0
- package/dist/encoding/JsonArray.js +691 -0
- package/dist/encoding/JsonArray.js.map +1 -0
- package/dist/encoding/Ndjson.d.ts +43 -4
- package/dist/encoding/Ndjson.d.ts.map +1 -1
- package/dist/encoding/Ndjson.js +169 -18
- package/dist/encoding/Ndjson.js.map +1 -1
- package/dist/encoding/SchemaBinary.d.ts +9 -1
- package/dist/encoding/SchemaBinary.d.ts.map +1 -1
- package/dist/encoding/SchemaBinary.js +12 -19
- package/dist/encoding/SchemaBinary.js.map +1 -1
- package/dist/encoding/Sse.d.ts.map +1 -1
- package/dist/encoding/Sse.js +3 -3
- package/dist/encoding/Sse.js.map +1 -1
- package/dist/encoding/Tar.d.ts +309 -0
- package/dist/encoding/Tar.d.ts.map +1 -0
- package/dist/encoding/Tar.js +1182 -0
- package/dist/encoding/Tar.js.map +1 -0
- package/dist/encoding/Toml.d.ts.map +1 -1
- package/dist/encoding/Toml.js +24 -19
- package/dist/encoding/Toml.js.map +1 -1
- package/dist/encoding/Xml.d.ts +464 -0
- package/dist/encoding/Xml.d.ts.map +1 -0
- package/dist/encoding/Xml.js +1619 -0
- package/dist/encoding/Xml.js.map +1 -0
- package/dist/encoding/Yaml.d.ts +6 -2
- package/dist/encoding/Yaml.d.ts.map +1 -1
- package/dist/encoding/Yaml.js +97 -34
- package/dist/encoding/Yaml.js.map +1 -1
- package/dist/encoding/Zip.d.ts +413 -0
- package/dist/encoding/Zip.d.ts.map +1 -0
- package/dist/encoding/Zip.js +1255 -0
- package/dist/encoding/Zip.js.map +1 -0
- package/dist/encoding/index.d.ts +20 -0
- package/dist/encoding/index.d.ts.map +1 -1
- package/dist/encoding/index.js +20 -0
- package/dist/encoding/index.js.map +1 -1
- package/dist/eventlog/EventJournal.d.ts +90 -5
- package/dist/eventlog/EventJournal.d.ts.map +1 -1
- package/dist/eventlog/EventJournal.js +488 -228
- package/dist/eventlog/EventJournal.js.map +1 -1
- package/dist/eventlog/EventLog.d.ts +180 -12
- package/dist/eventlog/EventLog.d.ts.map +1 -1
- package/dist/eventlog/EventLog.js +394 -146
- package/dist/eventlog/EventLog.js.map +1 -1
- package/dist/eventlog/EventLogEncryption.d.ts +36 -30
- package/dist/eventlog/EventLogEncryption.d.ts.map +1 -1
- package/dist/eventlog/EventLogEncryption.js +97 -38
- package/dist/eventlog/EventLogEncryption.js.map +1 -1
- package/dist/eventlog/EventLogMessage.d.ts +74 -34
- package/dist/eventlog/EventLogMessage.d.ts.map +1 -1
- package/dist/eventlog/EventLogMessage.js +45 -11
- package/dist/eventlog/EventLogMessage.js.map +1 -1
- package/dist/eventlog/EventLogRemote.d.ts +45 -8
- package/dist/eventlog/EventLogRemote.d.ts.map +1 -1
- package/dist/eventlog/EventLogRemote.js +51 -14
- package/dist/eventlog/EventLogRemote.js.map +1 -1
- package/dist/eventlog/EventLogServer.d.ts +46 -3
- package/dist/eventlog/EventLogServer.d.ts.map +1 -1
- package/dist/eventlog/EventLogServer.js +119 -19
- package/dist/eventlog/EventLogServer.js.map +1 -1
- package/dist/eventlog/EventLogServerEncrypted.d.ts +23 -33
- package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
- package/dist/eventlog/EventLogServerEncrypted.js +97 -70
- package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
- package/dist/eventlog/EventLogServerUnencrypted.d.ts +39 -5
- package/dist/eventlog/EventLogServerUnencrypted.d.ts.map +1 -1
- package/dist/eventlog/EventLogServerUnencrypted.js +151 -69
- package/dist/eventlog/EventLogServerUnencrypted.js.map +1 -1
- package/dist/eventlog/EventRow.d.ts +288 -0
- package/dist/eventlog/EventRow.d.ts.map +1 -0
- package/dist/eventlog/EventRow.js +435 -0
- package/dist/eventlog/EventRow.js.map +1 -0
- package/dist/eventlog/SqlEventJournal.d.ts +18 -18
- package/dist/eventlog/SqlEventJournal.d.ts.map +1 -1
- package/dist/eventlog/SqlEventJournal.js +417 -169
- package/dist/eventlog/SqlEventJournal.js.map +1 -1
- package/dist/eventlog/SqlEventLogServerEncrypted.d.ts +10 -18
- package/dist/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -1
- package/dist/eventlog/SqlEventLogServerEncrypted.js +179 -69
- package/dist/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
- package/dist/eventlog/SqlEventLogServerUnencrypted.d.ts +23 -3
- package/dist/eventlog/SqlEventLogServerUnencrypted.d.ts.map +1 -1
- package/dist/eventlog/SqlEventLogServerUnencrypted.js +102 -51
- package/dist/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
- package/dist/eventlog/index.d.ts +5 -0
- package/dist/eventlog/index.d.ts.map +1 -1
- package/dist/eventlog/index.js +5 -0
- package/dist/eventlog/index.js.map +1 -1
- package/dist/eventlog/internal/conflicts.d.ts +46 -0
- package/dist/eventlog/internal/conflicts.d.ts.map +1 -0
- package/dist/eventlog/internal/conflicts.js +89 -0
- package/dist/eventlog/internal/conflicts.js.map +1 -0
- package/dist/graphql/GraphQLClientError.d.ts +2 -2
- package/dist/graphql/GraphQLClientError.d.ts.map +1 -1
- package/dist/graphql/GraphQLClientError.js +4 -18
- package/dist/graphql/GraphQLClientError.js.map +1 -1
- package/dist/graphql/GraphQLProtocol.d.ts +12 -9
- package/dist/graphql/GraphQLProtocol.d.ts.map +1 -1
- package/dist/graphql/GraphQLProtocol.js +4 -3
- package/dist/graphql/GraphQLProtocol.js.map +1 -1
- package/dist/graphql/GraphQLResolver.d.ts +2 -0
- package/dist/graphql/GraphQLResolver.d.ts.map +1 -1
- package/dist/graphql/GraphQLResolver.js +74 -32
- package/dist/graphql/GraphQLResolver.js.map +1 -1
- package/dist/http/Cookies.d.ts.map +1 -1
- package/dist/http/Cookies.js +10 -9
- package/dist/http/Cookies.js.map +1 -1
- package/dist/http/FetchHttpClient.d.ts +8 -1
- package/dist/http/FetchHttpClient.d.ts.map +1 -1
- package/dist/http/FetchHttpClient.js +51 -4
- package/dist/http/FetchHttpClient.js.map +1 -1
- package/dist/http/FindMyWay/internal/router.js +10 -0
- package/dist/http/FindMyWay/internal/router.js.map +1 -1
- package/dist/http/Headers.d.ts +227 -0
- package/dist/http/Headers.d.ts.map +1 -1
- package/dist/http/Headers.js +261 -0
- package/dist/http/Headers.js.map +1 -1
- package/dist/http/HttpClient.d.ts +516 -0
- package/dist/http/HttpClient.d.ts.map +1 -1
- package/dist/http/HttpClient.js +286 -23
- package/dist/http/HttpClient.js.map +1 -1
- package/dist/http/HttpClientError.d.ts +8 -1
- package/dist/http/HttpClientError.d.ts.map +1 -1
- package/dist/http/HttpClientError.js +37 -1
- package/dist/http/HttpClientError.js.map +1 -1
- package/dist/http/HttpClientRequest.d.ts +127 -3
- package/dist/http/HttpClientRequest.d.ts.map +1 -1
- package/dist/http/HttpClientRequest.js +45 -3
- package/dist/http/HttpClientRequest.js.map +1 -1
- package/dist/http/HttpClientResponse.d.ts +53 -0
- package/dist/http/HttpClientResponse.d.ts.map +1 -1
- package/dist/http/HttpClientResponse.js +47 -0
- package/dist/http/HttpClientResponse.js.map +1 -1
- package/dist/http/HttpEffect.d.ts +6 -2
- package/dist/http/HttpEffect.d.ts.map +1 -1
- package/dist/http/HttpEffect.js +21 -17
- package/dist/http/HttpEffect.js.map +1 -1
- package/dist/http/HttpIncomingMessage.d.ts +2 -1
- package/dist/http/HttpIncomingMessage.d.ts.map +1 -1
- package/dist/http/HttpIncomingMessage.js +3 -23
- package/dist/http/HttpIncomingMessage.js.map +1 -1
- package/dist/http/HttpMiddleware.d.ts +119 -2
- package/dist/http/HttpMiddleware.d.ts.map +1 -1
- package/dist/http/HttpMiddleware.js +173 -29
- package/dist/http/HttpMiddleware.js.map +1 -1
- package/dist/http/HttpRouter.d.ts.map +1 -1
- package/dist/http/HttpRouter.js +9 -3
- package/dist/http/HttpRouter.js.map +1 -1
- package/dist/http/HttpServerError.d.ts +5 -2
- package/dist/http/HttpServerError.d.ts.map +1 -1
- package/dist/http/HttpServerError.js +7 -5
- package/dist/http/HttpServerError.js.map +1 -1
- package/dist/http/HttpServerRequest.d.ts +30 -5
- package/dist/http/HttpServerRequest.d.ts.map +1 -1
- package/dist/http/HttpServerRequest.js +109 -20
- package/dist/http/HttpServerRequest.js.map +1 -1
- package/dist/http/HttpServerResponse.d.ts +17 -8
- package/dist/http/HttpServerResponse.d.ts.map +1 -1
- package/dist/http/HttpServerResponse.js +37 -21
- package/dist/http/HttpServerResponse.js.map +1 -1
- package/dist/http/HttpStaticServer.d.ts +0 -12
- package/dist/http/HttpStaticServer.d.ts.map +1 -1
- package/dist/http/HttpStaticServer.js +65 -24
- package/dist/http/HttpStaticServer.js.map +1 -1
- package/dist/http/MultipartParser/internal/contentType.d.ts +15 -1
- package/dist/http/MultipartParser/internal/contentType.d.ts.map +1 -1
- package/dist/http/MultipartParser/internal/contentType.js +89 -7
- package/dist/http/MultipartParser/internal/contentType.js.map +1 -1
- package/dist/http/MultipartParser/internal/headers.d.ts.map +1 -1
- package/dist/http/MultipartParser/internal/headers.js +4 -12
- package/dist/http/MultipartParser/internal/headers.js.map +1 -1
- package/dist/http/MultipartParser/internal/multipart.d.ts.map +1 -1
- package/dist/http/MultipartParser/internal/multipart.js +6 -27
- package/dist/http/MultipartParser/internal/multipart.js.map +1 -1
- package/dist/http/Url.d.ts.map +1 -1
- package/dist/http/Url.js +6 -1
- package/dist/http/Url.js.map +1 -1
- package/dist/http/UrlParams.d.ts +3 -1
- package/dist/http/UrlParams.d.ts.map +1 -1
- package/dist/http/UrlParams.js +4 -2
- package/dist/http/UrlParams.js.map +1 -1
- package/dist/http/internal/compression.js +4 -5
- package/dist/http/internal/compression.js.map +1 -1
- package/dist/http/internal/decompression.js +20 -11
- package/dist/http/internal/decompression.js.map +1 -1
- package/dist/http/internal/httpBody.js +8 -1
- package/dist/http/internal/httpBody.js.map +1 -1
- package/dist/http/internal/lazyStream.d.ts +2 -0
- package/dist/http/internal/lazyStream.d.ts.map +1 -0
- package/dist/http/internal/lazyStream.js +18 -0
- package/dist/http/internal/lazyStream.js.map +1 -0
- package/dist/http/internal/requestState.d.ts +2 -0
- package/dist/http/internal/requestState.d.ts.map +1 -0
- package/dist/http/internal/requestState.js +28 -0
- package/dist/http/internal/requestState.js.map +1 -0
- package/dist/http/internal/urlParams.js +25 -0
- package/dist/http/internal/urlParams.js.map +1 -1
- package/dist/http/internal/webResponse.d.ts +2 -0
- package/dist/http/internal/webResponse.d.ts.map +1 -0
- package/dist/http/internal/webResponse.js +12 -0
- package/dist/http/internal/webResponse.js.map +1 -0
- package/dist/http-api/HttpApi.d.ts +3 -6
- package/dist/http-api/HttpApi.d.ts.map +1 -1
- package/dist/http-api/HttpApi.js +4 -7
- package/dist/http-api/HttpApi.js.map +1 -1
- package/dist/http-api/HttpApiBuilder.d.ts.map +1 -1
- package/dist/http-api/HttpApiBuilder.js +142 -23
- package/dist/http-api/HttpApiBuilder.js.map +1 -1
- package/dist/http-api/HttpApiClient.d.ts +99 -4
- package/dist/http-api/HttpApiClient.d.ts.map +1 -1
- package/dist/http-api/HttpApiClient.js +218 -60
- package/dist/http-api/HttpApiClient.js.map +1 -1
- package/dist/http-api/HttpApiEndpoint.d.ts +72 -29
- package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
- package/dist/http-api/HttpApiEndpoint.js +140 -14
- package/dist/http-api/HttpApiEndpoint.js.map +1 -1
- package/dist/http-api/HttpApiError.d.ts +58 -0
- package/dist/http-api/HttpApiError.d.ts.map +1 -1
- package/dist/http-api/HttpApiError.js +38 -12
- package/dist/http-api/HttpApiError.js.map +1 -1
- package/dist/http-api/HttpApiScalar.d.ts +2 -1
- package/dist/http-api/HttpApiScalar.d.ts.map +1 -1
- package/dist/http-api/HttpApiScalar.js +6 -3
- package/dist/http-api/HttpApiScalar.js.map +1 -1
- package/dist/http-api/HttpApiSchema.d.ts +242 -13
- package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
- package/dist/http-api/HttpApiSchema.js +149 -5
- package/dist/http-api/HttpApiSchema.js.map +1 -1
- package/dist/http-api/HttpApiSwagger.d.ts +5 -0
- package/dist/http-api/HttpApiSwagger.d.ts.map +1 -1
- package/dist/http-api/HttpApiSwagger.js +14 -4
- package/dist/http-api/HttpApiSwagger.js.map +1 -1
- package/dist/http-api/HttpApiTest.d.ts +13 -2
- package/dist/http-api/HttpApiTest.d.ts.map +1 -1
- package/dist/http-api/HttpApiTest.js +33 -11
- package/dist/http-api/HttpApiTest.js.map +1 -1
- package/dist/http-api/OpenApi.d.ts +17 -3
- package/dist/http-api/OpenApi.d.ts.map +1 -1
- package/dist/http-api/OpenApi.js +81 -47
- package/dist/http-api/OpenApi.js.map +1 -1
- package/dist/http-api/internal/path.js +35 -10
- package/dist/http-api/internal/path.js.map +1 -1
- package/dist/http-api/internal/toCodecHttpProperties.d.ts +2 -0
- package/dist/http-api/internal/toCodecHttpProperties.d.ts.map +1 -0
- package/dist/http-api/internal/toCodecHttpProperties.js +38 -0
- package/dist/http-api/internal/toCodecHttpProperties.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/arbitrary/runner.d.ts.map +1 -1
- package/dist/internal/arbitrary/runner.js +120 -44
- package/dist/internal/arbitrary/runner.js.map +1 -1
- package/dist/internal/core.js +3 -1
- package/dist/internal/core.js.map +1 -1
- package/dist/internal/dateTime.js +19 -7
- package/dist/internal/dateTime.js.map +1 -1
- package/dist/internal/effect.js +106 -87
- package/dist/internal/effect.js.map +1 -1
- package/dist/internal/equal.js +14 -0
- package/dist/internal/equal.js.map +1 -1
- package/dist/internal/hashMap.js +2 -2
- package/dist/internal/hashMap.js.map +1 -1
- package/dist/internal/hydration.d.ts +2 -0
- package/dist/internal/hydration.d.ts.map +1 -0
- package/dist/internal/hydration.js +15 -0
- package/dist/internal/hydration.js.map +1 -0
- package/dist/internal/inflate.d.ts +2 -0
- package/dist/internal/inflate.d.ts.map +1 -0
- package/dist/internal/inflate.js +680 -0
- package/dist/internal/inflate.js.map +1 -0
- package/dist/internal/jsonSchema.d.ts +2 -0
- package/dist/internal/jsonSchema.d.ts.map +1 -0
- package/dist/internal/jsonSchema.js +28 -0
- package/dist/internal/jsonSchema.js.map +1 -0
- package/dist/internal/matcher.js +1 -1
- package/dist/internal/matcher.js.map +1 -1
- package/dist/internal/record.js +6 -0
- package/dist/internal/record.js.map +1 -1
- package/dist/internal/request.js +20 -7
- package/dist/internal/request.js.map +1 -1
- package/dist/internal/schedule.js +17 -22
- package/dist/internal/schedule.js.map +1 -1
- package/dist/internal/schema/compilerRegistry.js +4 -1
- package/dist/internal/schema/compilerRegistry.js.map +1 -1
- package/dist/internal/schema/content.d.ts +2 -0
- package/dist/internal/schema/content.d.ts.map +1 -0
- package/dist/internal/schema/content.js +13 -0
- package/dist/internal/schema/content.js.map +1 -0
- package/dist/internal/schema/fromJsonSchemaDocument.js +253 -255
- package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
- package/dist/internal/schema/fromRepresentation.js +2 -1
- package/dist/internal/schema/fromRepresentation.js.map +1 -1
- package/dist/internal/schema/interpreter.js +51 -36
- package/dist/internal/schema/interpreter.js.map +1 -1
- package/dist/internal/schema/standardSchema.js +42 -35
- package/dist/internal/schema/standardSchema.js.map +1 -1
- package/dist/internal/schema/toCodeDocument.js +10 -5
- package/dist/internal/schema/toCodeDocument.js.map +1 -1
- package/dist/internal/schema/toCodec.js +99 -17
- package/dist/internal/schema/toCodec.js.map +1 -1
- package/dist/internal/schema/toFormatter.js +5 -5
- package/dist/internal/schema/toFormatter.js.map +1 -1
- package/dist/internal/schema/toJsonSchemaDocument.js +257 -170
- package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
- package/dist/internal/schema/toRepresentation.js +107 -129
- package/dist/internal/schema/toRepresentation.js.map +1 -1
- package/dist/internal/sql.d.ts +2 -0
- package/dist/internal/sql.d.ts.map +1 -0
- package/dist/internal/sql.js +13 -0
- package/dist/internal/sql.js.map +1 -0
- package/dist/internal/trie.js +1 -3
- package/dist/internal/trie.js.map +1 -1
- package/dist/internal/uuid.js +7 -3
- package/dist/internal/uuid.js.map +1 -1
- package/dist/internal/version.js +1 -1
- package/dist/net/NetAddress.d.ts.map +1 -1
- package/dist/net/NetAddress.js +2 -8
- package/dist/net/NetAddress.js.map +1 -1
- package/dist/observability/OtlpExporter.d.ts.map +1 -1
- package/dist/observability/OtlpExporter.js +5 -12
- package/dist/observability/OtlpExporter.js.map +1 -1
- package/dist/observability/OtlpMetrics.d.ts.map +1 -1
- package/dist/observability/OtlpMetrics.js +5 -3
- package/dist/observability/OtlpMetrics.js.map +1 -1
- package/dist/observability/OtlpProxy.d.ts +154 -0
- package/dist/observability/OtlpProxy.d.ts.map +1 -0
- package/dist/observability/OtlpProxy.js +235 -0
- package/dist/observability/OtlpProxy.js.map +1 -0
- package/dist/observability/OtlpResource.d.ts +3 -1
- package/dist/observability/OtlpResource.d.ts.map +1 -1
- package/dist/observability/OtlpResource.js +11 -4
- package/dist/observability/OtlpResource.js.map +1 -1
- package/dist/observability/OtlpSerialization.d.ts +5 -0
- package/dist/observability/OtlpSerialization.d.ts.map +1 -1
- package/dist/observability/OtlpSerialization.js +14 -3
- package/dist/observability/OtlpSerialization.js.map +1 -1
- package/dist/observability/OtlpTracer.d.ts.map +1 -1
- package/dist/observability/OtlpTracer.js +4 -0
- package/dist/observability/OtlpTracer.js.map +1 -1
- package/dist/observability/index.d.ts +5 -0
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +5 -0
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/internal/protobuf.d.ts +0 -9
- package/dist/observability/internal/protobuf.d.ts.map +1 -1
- package/dist/observability/internal/protobuf.js +2 -10
- package/dist/observability/internal/protobuf.js.map +1 -1
- package/dist/persistence/CircuitBreaker.d.ts +897 -0
- package/dist/persistence/CircuitBreaker.d.ts.map +1 -0
- package/dist/persistence/CircuitBreaker.js +1165 -0
- package/dist/persistence/CircuitBreaker.js.map +1 -0
- package/dist/persistence/PersistedCache.d.ts.map +1 -1
- package/dist/persistence/PersistedCache.js +1 -1
- package/dist/persistence/PersistedCache.js.map +1 -1
- package/dist/persistence/PersistedQueue.d.ts +6 -2
- package/dist/persistence/PersistedQueue.d.ts.map +1 -1
- package/dist/persistence/PersistedQueue.js +162 -84
- package/dist/persistence/PersistedQueue.js.map +1 -1
- package/dist/persistence/Persistence.d.ts +28 -0
- package/dist/persistence/Persistence.d.ts.map +1 -1
- package/dist/persistence/Persistence.js +36 -8
- package/dist/persistence/Persistence.js.map +1 -1
- package/dist/persistence/RateLimiter.d.ts.map +1 -1
- package/dist/persistence/RateLimiter.js +8 -12
- package/dist/persistence/RateLimiter.js.map +1 -1
- package/dist/persistence/Redis.d.ts +78 -2
- package/dist/persistence/Redis.d.ts.map +1 -1
- package/dist/persistence/Redis.js +62 -7
- package/dist/persistence/Redis.js.map +1 -1
- package/dist/persistence/UserDirectories.d.ts +129 -0
- package/dist/persistence/UserDirectories.d.ts.map +1 -0
- package/dist/persistence/UserDirectories.js +178 -0
- package/dist/persistence/UserDirectories.js.map +1 -0
- package/dist/persistence/index.d.ts +10 -0
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +10 -0
- package/dist/persistence/index.js.map +1 -1
- package/dist/process/ChildProcess.d.ts +32 -5
- package/dist/process/ChildProcess.d.ts.map +1 -1
- package/dist/process/ChildProcess.js.map +1 -1
- package/dist/process/ChildProcessSpawner.d.ts +30 -0
- package/dist/process/ChildProcessSpawner.d.ts.map +1 -1
- package/dist/process/ChildProcessSpawner.js +5 -2
- package/dist/process/ChildProcessSpawner.js.map +1 -1
- package/dist/reactivity/AsyncResult.d.ts +1 -1
- package/dist/reactivity/AsyncResult.d.ts.map +1 -1
- package/dist/reactivity/AsyncResult.js +1 -1
- package/dist/reactivity/AsyncResult.js.map +1 -1
- package/dist/reactivity/Atom.d.ts +69 -30
- package/dist/reactivity/Atom.d.ts.map +1 -1
- package/dist/reactivity/Atom.js +40 -15
- package/dist/reactivity/Atom.js.map +1 -1
- package/dist/reactivity/AtomHttpApi.d.ts +5 -5
- package/dist/reactivity/AtomHttpApi.d.ts.map +1 -1
- package/dist/reactivity/AtomHttpApi.js +1 -1
- package/dist/reactivity/AtomHttpApi.js.map +1 -1
- package/dist/reactivity/AtomRegistry.d.ts +2 -2
- package/dist/reactivity/AtomRegistry.d.ts.map +1 -1
- package/dist/reactivity/AtomRegistry.js +44 -9
- package/dist/reactivity/AtomRegistry.js.map +1 -1
- package/dist/reactivity/AtomRpc.d.ts +3 -3
- package/dist/reactivity/AtomRpc.d.ts.map +1 -1
- package/dist/reactivity/AtomRpc.js +1 -1
- package/dist/reactivity/AtomRpc.js.map +1 -1
- package/dist/reactivity/Hydration.d.ts.map +1 -1
- package/dist/reactivity/Hydration.js +46 -12
- package/dist/reactivity/Hydration.js.map +1 -1
- package/dist/reactivity/Reactivity.d.ts +71 -7
- package/dist/reactivity/Reactivity.d.ts.map +1 -1
- package/dist/reactivity/Reactivity.js +21 -12
- package/dist/reactivity/Reactivity.js.map +1 -1
- package/dist/rpc/Rpc.d.ts +18 -0
- package/dist/rpc/Rpc.d.ts.map +1 -1
- package/dist/rpc/Rpc.js +20 -0
- package/dist/rpc/Rpc.js.map +1 -1
- package/dist/rpc/RpcClient.d.ts +26 -2
- package/dist/rpc/RpcClient.d.ts.map +1 -1
- package/dist/rpc/RpcClient.js +198 -61
- package/dist/rpc/RpcClient.js.map +1 -1
- package/dist/rpc/RpcSerialization.d.ts +29 -0
- package/dist/rpc/RpcSerialization.d.ts.map +1 -1
- package/dist/rpc/RpcSerialization.js +41 -13
- package/dist/rpc/RpcSerialization.js.map +1 -1
- package/dist/rpc/RpcServer.d.ts.map +1 -1
- package/dist/rpc/RpcServer.js +20 -19
- package/dist/rpc/RpcServer.js.map +1 -1
- package/dist/rpc/RpcTest.d.ts +1 -0
- package/dist/rpc/RpcTest.d.ts.map +1 -1
- package/dist/rpc/RpcTest.js +1 -0
- package/dist/rpc/RpcTest.js.map +1 -1
- package/dist/schema/Model.d.ts +1 -1
- package/dist/schema/VariantSchema.d.ts +22 -3
- package/dist/schema/VariantSchema.d.ts.map +1 -1
- package/dist/schema/VariantSchema.js +32 -18
- package/dist/schema/VariantSchema.js.map +1 -1
- package/dist/socket/Socket.d.ts +23 -1
- package/dist/socket/Socket.d.ts.map +1 -1
- package/dist/socket/Socket.js +36 -3
- package/dist/socket/Socket.js.map +1 -1
- package/dist/sql/Migrator.d.ts +2 -1
- package/dist/sql/Migrator.d.ts.map +1 -1
- package/dist/sql/Migrator.js +21 -6
- package/dist/sql/Migrator.js.map +1 -1
- package/dist/sql/SqlClient.d.ts +148 -5
- package/dist/sql/SqlClient.d.ts.map +1 -1
- package/dist/sql/SqlClient.js +155 -27
- package/dist/sql/SqlClient.js.map +1 -1
- package/dist/sql/SqlResolver.d.ts +13 -0
- package/dist/sql/SqlResolver.d.ts.map +1 -1
- package/dist/sql/SqlResolver.js +27 -4
- package/dist/sql/SqlResolver.js.map +1 -1
- package/dist/sql/Statement.d.ts +10 -1
- package/dist/sql/Statement.d.ts.map +1 -1
- package/dist/sql/Statement.js +45 -7
- package/dist/sql/Statement.js.map +1 -1
- package/dist/testing/TestClock.d.ts.map +1 -1
- package/dist/testing/TestClock.js +4 -2
- package/dist/testing/TestClock.js.map +1 -1
- package/dist/testing/TestSchema.d.ts +7 -1
- package/dist/testing/TestSchema.d.ts.map +1 -1
- package/dist/testing/TestSchema.js +9 -3
- package/dist/testing/TestSchema.js.map +1 -1
- package/dist/workflow/DurableDeferred.d.ts.map +1 -1
- package/dist/workflow/DurableDeferred.js +21 -2
- package/dist/workflow/DurableDeferred.js.map +1 -1
- package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
- package/dist/workflow/WorkflowEngine.js +18 -4
- package/dist/workflow/WorkflowEngine.js.map +1 -1
- package/package.json +13 -3
- package/src/Arbitrary.ts +10 -2
- package/src/Array.ts +128 -55
- package/src/Bytes.ts +111 -0
- package/src/Channel.ts +308 -452
- package/src/ChannelSchema.ts +1 -49
- package/src/Chunk.ts +55 -61
- package/src/Config.ts +12 -86
- package/src/ConfigProvider.ts +2 -1
- package/src/Cron.ts +6 -3
- package/src/Data.ts +60 -265
- package/src/Duration.ts +66 -16
- package/src/Effect.ts +503 -168
- package/src/Equal.ts +8 -1
- package/src/Equivalence.ts +7 -4
- package/src/Exit.ts +27 -12
- package/src/FiberHandle.ts +10 -9
- package/src/FiberMap.ts +13 -66
- package/src/FileSystem.ts +10 -0
- package/src/Formatter.ts +28 -13
- package/src/Graph.ts +171 -1263
- package/src/Hash.ts +4 -1
- package/src/HashSet.ts +0 -60
- package/src/Iterable.ts +15 -14
- package/src/JsonPatch.ts +4 -0
- package/src/JsonSchema.ts +40 -43
- package/src/Layer.ts +2 -2
- package/src/ManagedRuntime.ts +72 -6
- package/src/Metric.ts +252 -510
- package/src/MutableHashMap.ts +4 -473
- package/src/MutableList.ts +7 -5
- package/src/MutableRef.ts +8 -1
- package/src/Number.ts +2 -2
- package/src/Optic.ts +17 -332
- package/src/PartitionedSemaphore.ts +24 -13
- package/src/Path.ts +9 -1
- package/src/Pool.ts +109 -37
- package/src/PubSub.ts +17 -13
- package/src/Queue.ts +5 -37
- package/src/Random.ts +1 -1
- package/src/RcMap.ts +14 -8
- package/src/Record.ts +51 -0
- package/src/Ref.ts +15 -104
- package/src/References.ts +5 -4
- package/src/RequestResolver.ts +46 -87
- package/src/Resource.ts +1 -1
- package/src/Runtime.ts +19 -18
- package/src/Schedule.ts +3 -95
- package/src/Schema.ts +639 -381
- package/src/SchemaAST.ts +40 -29
- package/src/SchemaGetter.ts +22 -5
- package/src/SchemaIssue.ts +44 -53
- package/src/SchemaParser.ts +51 -18
- package/src/SchemaRepresentation.ts +95 -35
- package/src/SchemaTransformation.ts +10 -3
- package/src/Scope.ts +12 -2
- package/src/ScopedCache.ts +17 -142
- package/src/SemVer.ts +1528 -0
- package/src/SemVerRange.ts +883 -0
- package/src/Semaphore.ts +67 -40
- package/src/Sink.ts +21 -4
- package/src/Stream.ts +367 -1027
- package/src/String.ts +11 -8
- package/src/TextDiff.ts +766 -0
- package/src/Tracer.ts +15 -1
- package/src/TxHashMap.ts +1 -103
- package/src/TxHashSet.ts +48 -753
- package/src/ai/AiError.ts +66 -4
- package/src/ai/Chat.ts +10 -5
- package/src/ai/Decision.ts +49 -1
- package/src/ai/DecisionModel.ts +264 -108
- package/src/ai/EmbeddingModel.ts +25 -13
- package/src/ai/LanguageModel.ts +9 -0
- package/src/ai/McpClient.ts +1211 -0
- package/src/ai/McpClientError.ts +329 -0
- package/src/ai/McpProtocol.ts +2 -2
- package/src/ai/McpSchema.ts +153 -35
- package/src/ai/McpServer.ts +231 -233
- package/src/ai/Prompt.ts +114 -35
- package/src/ai/Response.ts +220 -65
- package/src/ai/Tool.ts +50 -6
- package/src/ai/Toolkit.ts +82 -11
- package/src/ai/index.ts +12 -0
- package/src/ai/internal/mcpCore.ts +13 -14
- package/src/ai/internal/mcpProtocol/v2024_11_05.ts +1 -1
- package/src/ai/internal/mcpProtocol/v2025_03_26.ts +1 -1
- package/src/ai/internal/mcpProtocol/v2025_06_18.ts +3 -3
- package/src/ai/internal/mcpProtocol/v2025_11_25.ts +3 -3
- package/src/ai/internal/mcpProtocol/v2026_07_28.ts +12 -14
- package/src/ai/internal/mcpProtocol.ts +22 -2
- package/src/ai/internal/mcpRuntime.ts +3 -4
- package/src/ai/internal/mcpSchema/v2024_11_05.ts +20 -13
- package/src/ai/internal/mcpSchema/v2025_03_26.ts +4 -2
- package/src/ai/internal/mcpSchema/v2025_06_18.ts +7 -7
- package/src/ai/internal/mcpSchema/v2025_11_25.ts +8 -8
- package/src/ai/internal/mcpSchema/v2026_07_28.ts +44 -42
- package/src/cli/Argument.ts +15 -0
- package/src/cli/CliError.ts +136 -4
- package/src/cli/CliOutput.ts +183 -6
- package/src/cli/Command.ts +367 -48
- package/src/cli/Completions.ts +56 -0
- package/src/cli/Flag.ts +132 -0
- package/src/cli/GlobalFlag.ts +5 -6
- package/src/cli/Param.ts +151 -6
- package/src/cli/TerminalCapabilities.ts +159 -0
- package/src/cli/index.ts +6 -0
- package/src/cli/internal/command.ts +8 -3
- package/src/cli/internal/completions/bash.ts +83 -32
- package/src/cli/internal/completions/descriptor.ts +11 -1
- package/src/cli/internal/completions/fish.ts +10 -8
- package/src/cli/internal/completions/powershell.ts +23 -14
- package/src/cli/internal/completions/zsh.ts +8 -5
- package/src/cli/internal/formatter.ts +18 -0
- package/src/cli/internal/lexer.ts +12 -5
- package/src/cli/internal/parser.ts +31 -11
- package/src/cluster/ClusterCron.ts +94 -35
- package/src/cluster/ClusterMetrics.ts +149 -7
- package/src/cluster/ClusterWorkflowEngine.ts +130 -57
- package/src/cluster/Entity.ts +4 -0
- package/src/cluster/MessageStorage.ts +26 -14
- package/src/cluster/Runners.ts +76 -25
- package/src/cluster/Sharding.ts +200 -58
- package/src/cluster/ShardingConfig.ts +20 -0
- package/src/cluster/Snowflake.ts +3 -7
- package/src/cluster/SqlMessageStorage.ts +58 -55
- package/src/cluster/SqlRunnerStorage.ts +120 -51
- package/src/cluster/internal/entityManager.ts +155 -32
- package/src/devtools/DevTools.ts +3 -2
- package/src/devtools/DevToolsClient.ts +29 -10
- package/src/encoding/Base64.ts +38 -0
- package/src/encoding/Base64Url.ts +31 -0
- package/src/encoding/Ini.ts +3 -0
- package/src/encoding/JsonArray.ts +849 -0
- package/src/encoding/Ndjson.ts +211 -20
- package/src/encoding/SchemaBinary.ts +14 -48
- package/src/encoding/Sse.ts +4 -3
- package/src/encoding/Tar.ts +1417 -0
- package/src/encoding/Toml.ts +36 -19
- package/src/encoding/Xml.ts +2037 -0
- package/src/encoding/Yaml.ts +108 -36
- package/src/encoding/Zip.ts +1558 -0
- package/src/encoding/index.ts +24 -0
- package/src/eventlog/EventJournal.ts +611 -227
- package/src/eventlog/EventLog.ts +496 -196
- package/src/eventlog/EventLogEncryption.ts +128 -43
- package/src/eventlog/EventLogMessage.ts +62 -11
- package/src/eventlog/EventLogRemote.ts +77 -21
- package/src/eventlog/EventLogServer.ts +162 -20
- package/src/eventlog/EventLogServerEncrypted.ts +121 -80
- package/src/eventlog/EventLogServerUnencrypted.ts +180 -77
- package/src/eventlog/EventRow.ts +706 -0
- package/src/eventlog/SqlEventJournal.ts +496 -193
- package/src/eventlog/SqlEventLogServerEncrypted.ts +212 -83
- package/src/eventlog/SqlEventLogServerUnencrypted.ts +141 -62
- package/src/eventlog/index.ts +6 -0
- package/src/eventlog/internal/conflicts.ts +119 -0
- package/src/graphql/GraphQLClientError.ts +5 -12
- package/src/graphql/GraphQLProtocol.ts +12 -9
- package/src/graphql/GraphQLResolver.ts +90 -239
- package/src/http/Cookies.ts +10 -11
- package/src/http/FetchHttpClient.ts +56 -6
- package/src/http/FindMyWay/internal/router.ts +11 -0
- package/src/http/Headers.ts +337 -154
- package/src/http/HttpClient.ts +673 -142
- package/src/http/HttpClientError.ts +35 -1
- package/src/http/HttpClientRequest.ts +151 -5
- package/src/http/HttpClientResponse.ts +71 -0
- package/src/http/HttpEffect.ts +25 -33
- package/src/http/HttpIncomingMessage.ts +3 -23
- package/src/http/HttpMiddleware.ts +194 -40
- package/src/http/HttpRouter.ts +10 -3
- package/src/http/HttpServerError.ts +8 -5
- package/src/http/HttpServerRequest.ts +172 -27
- package/src/http/HttpServerResponse.ts +49 -23
- package/src/http/HttpStaticServer.ts +71 -26
- package/src/http/MultipartParser/internal/contentType.ts +109 -8
- package/src/http/MultipartParser/internal/headers.ts +4 -16
- package/src/http/MultipartParser/internal/multipart.ts +10 -32
- package/src/http/Url.ts +6 -1
- package/src/http/UrlParams.ts +6 -1
- package/src/http/internal/compression.ts +4 -5
- package/src/http/internal/decompression.ts +32 -17
- package/src/http/internal/httpBody.ts +10 -2
- package/src/http/internal/lazyStream.ts +25 -0
- package/src/http/internal/requestState.ts +33 -0
- package/src/http/internal/urlParams.ts +29 -0
- package/src/http/internal/webResponse.ts +20 -0
- package/src/http-api/HttpApi.ts +4 -7
- package/src/http-api/HttpApiBuilder.ts +190 -32
- package/src/http-api/HttpApiClient.ts +364 -90
- package/src/http-api/HttpApiEndpoint.ts +248 -46
- package/src/http-api/HttpApiError.ts +55 -0
- package/src/http-api/HttpApiScalar.ts +4 -3
- package/src/http-api/HttpApiSchema.ts +373 -18
- package/src/http-api/HttpApiSwagger.ts +11 -4
- package/src/http-api/HttpApiTest.ts +36 -11
- package/src/http-api/OpenApi.ts +103 -58
- package/src/http-api/internal/path.ts +40 -12
- package/src/http-api/internal/toCodecHttpProperties.ts +56 -0
- package/src/index.ts +24 -0
- package/src/internal/arbitrary/runner.ts +133 -36
- package/src/internal/core.ts +3 -1
- package/src/internal/dateTime.ts +20 -7
- package/src/internal/effect.ts +144 -100
- package/src/internal/equal.ts +17 -0
- package/src/internal/hashMap.ts +2 -2
- package/src/internal/hydration.ts +15 -0
- package/src/internal/inflate.ts +710 -0
- package/src/internal/jsonSchema.ts +27 -0
- package/src/internal/matcher.ts +1 -1
- package/src/internal/record.ts +6 -0
- package/src/internal/request.ts +21 -6
- package/src/internal/schedule.ts +20 -39
- package/src/internal/schema/compilerRegistry.ts +6 -1
- package/src/internal/schema/content.ts +18 -0
- package/src/internal/schema/fromJsonSchemaDocument.ts +458 -351
- package/src/internal/schema/fromRepresentation.ts +2 -1
- package/src/internal/schema/interpreter.ts +58 -45
- package/src/internal/schema/standardSchema.ts +34 -32
- package/src/internal/schema/toCodeDocument.ts +12 -7
- package/src/internal/schema/toCodec.ts +134 -15
- package/src/internal/schema/toFormatter.ts +6 -6
- package/src/internal/schema/toJsonSchemaDocument.ts +246 -194
- package/src/internal/schema/toRepresentation.ts +122 -140
- package/src/internal/sql.ts +14 -0
- package/src/internal/trie.ts +1 -3
- package/src/internal/uuid.ts +15 -10
- package/src/internal/version.ts +1 -1
- package/src/net/NetAddress.ts +2 -9
- package/src/observability/OtlpExporter.ts +5 -12
- package/src/observability/OtlpMetrics.ts +5 -3
- package/src/observability/OtlpProxy.ts +314 -0
- package/src/observability/OtlpResource.ts +16 -6
- package/src/observability/OtlpSerialization.ts +17 -3
- package/src/observability/OtlpTracer.ts +4 -0
- package/src/observability/index.ts +6 -0
- package/src/observability/internal/protobuf.ts +2 -10
- package/src/persistence/CircuitBreaker.ts +1678 -0
- package/src/persistence/PersistedCache.ts +3 -1
- package/src/persistence/PersistedQueue.ts +223 -153
- package/src/persistence/Persistence.ts +64 -30
- package/src/persistence/RateLimiter.ts +18 -21
- package/src/persistence/Redis.ts +129 -8
- package/src/persistence/UserDirectories.ts +273 -0
- package/src/persistence/index.ts +12 -0
- package/src/process/ChildProcess.ts +32 -5
- package/src/process/ChildProcessSpawner.ts +41 -2
- package/src/reactivity/AsyncResult.ts +5 -39
- package/src/reactivity/Atom.ts +134 -166
- package/src/reactivity/AtomHttpApi.ts +10 -16
- package/src/reactivity/AtomRegistry.ts +50 -29
- package/src/reactivity/AtomRpc.ts +6 -22
- package/src/reactivity/Hydration.ts +53 -12
- package/src/reactivity/Reactivity.ts +97 -39
- package/src/rpc/Rpc.ts +21 -0
- package/src/rpc/RpcClient.ts +283 -104
- package/src/rpc/RpcSerialization.ts +53 -14
- package/src/rpc/RpcServer.ts +27 -21
- package/src/rpc/RpcTest.ts +3 -0
- package/src/schema/VariantSchema.ts +86 -22
- package/src/socket/Socket.ts +45 -20
- package/src/sql/Migrator.ts +26 -11
- package/src/sql/SqlClient.ts +273 -29
- package/src/sql/SqlResolver.ts +32 -9
- package/src/sql/Statement.ts +65 -10
- package/src/testing/TestClock.ts +4 -1
- package/src/testing/TestSchema.ts +9 -3
- package/src/workflow/DurableDeferred.ts +23 -6
- package/src/workflow/WorkflowEngine.ts +34 -10
- package/dist/http/internal/preResponseHandler.d.ts +0 -2
- package/dist/http/internal/preResponseHandler.d.ts.map +0 -1
- package/dist/http/internal/preResponseHandler.js +0 -14
- package/dist/http/internal/preResponseHandler.js.map +0 -1
- package/src/http/internal/preResponseHandler.ts +0 -19
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SQL-backed
|
|
3
|
-
*
|
|
4
|
-
* This module implements `EventJournal` on top of a `SqlClient`. It stores event
|
|
5
|
-
* entries as encoded bytes and stores per-remote sequence metadata in separate
|
|
6
|
-
* tables, giving event-log programs a durable journal that can be replayed after
|
|
7
|
-
* restart and synchronized with remote journals.
|
|
2
|
+
* SQL-backed event journal with per-remote upload checkpoints.
|
|
8
3
|
*
|
|
9
4
|
* @stability unstable
|
|
10
5
|
* @since 4.0.0
|
|
11
6
|
*/
|
|
12
7
|
import * as Arr from "../Array.ts"
|
|
8
|
+
import * as Clock from "../Clock.ts"
|
|
13
9
|
import * as Effect from "../Effect.ts"
|
|
14
10
|
import * as Uuid from "../internal/uuid.ts"
|
|
15
11
|
import * as Layer from "../Layer.ts"
|
|
@@ -20,6 +16,7 @@ import * as SqlClient from "../sql/SqlClient.ts"
|
|
|
20
16
|
import * as SqlError from "../sql/SqlError.ts"
|
|
21
17
|
import * as SqlSchema from "../sql/SqlSchema.ts"
|
|
22
18
|
import * as EventJournal from "./EventJournal.ts"
|
|
19
|
+
import { type ConflictGroup, ConflictIndex } from "./internal/conflicts.ts"
|
|
23
20
|
|
|
24
21
|
type WriteFromRemoteOptions = Parameters<EventJournal.EventJournal["Service"]["writeFromRemote"]>[0]
|
|
25
22
|
|
|
@@ -28,8 +25,20 @@ type WriteFromRemoteOptions = Parameters<EventJournal.EventJournal["Service"]["w
|
|
|
28
25
|
*
|
|
29
26
|
* **Details**
|
|
30
27
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
28
|
+
* Maintains `entryTable`, `${entryTable}_sequence`, `${entryTable}_sources`,
|
|
29
|
+
* `${remotesTable}_checkpoints` and `remoteCursorsTable` (default
|
|
30
|
+
* `${remotesTable}_cursors`) using the configured `SqlClient`.
|
|
31
|
+
*
|
|
32
|
+
* **Gotchas**
|
|
33
|
+
*
|
|
34
|
+
* Creating or migrating the schema requires a writable connection. Migrated
|
|
35
|
+
* databases can be reopened read-only.
|
|
36
|
+
*
|
|
37
|
+
* Journals from earlier releases keep one `remotesTable` row per entry per
|
|
38
|
+
* remote. Opening one replaces those rows with entry sources and drops the
|
|
39
|
+
* table; an entry known to several remotes keeps one of them as its source.
|
|
40
|
+
*
|
|
41
|
+
* Upload acknowledgements do not advance past unseen entries.
|
|
33
42
|
*
|
|
34
43
|
* @stability unstable
|
|
35
44
|
* @category constructors
|
|
@@ -38,6 +47,7 @@ type WriteFromRemoteOptions = Parameters<EventJournal.EventJournal["Service"]["w
|
|
|
38
47
|
export const make = (options?: {
|
|
39
48
|
readonly entryTable?: string
|
|
40
49
|
readonly remotesTable?: string
|
|
50
|
+
readonly remoteCursorsTable?: string
|
|
41
51
|
}): Effect.Effect<
|
|
42
52
|
EventJournal.EventJournal["Service"],
|
|
43
53
|
SqlError.SqlError,
|
|
@@ -48,102 +58,305 @@ export const make = (options?: {
|
|
|
48
58
|
|
|
49
59
|
const entryTable = options?.entryTable ?? "effect_event_journal"
|
|
50
60
|
const remotesTable = options?.remotesTable ?? "effect_event_remotes"
|
|
61
|
+
const remoteCursorsTable = options?.remoteCursorsTable ?? `${remotesTable}_cursors`
|
|
62
|
+
|
|
63
|
+
const sequenceTable = `${entryTable}_sequence`
|
|
64
|
+
const sourcesTable = `${entryTable}_sources`
|
|
65
|
+
const checkpointsTable = `${remotesTable}_checkpoints`
|
|
51
66
|
|
|
52
67
|
const entryTableSql = sql(entryTable)
|
|
53
68
|
const remotesTableSql = sql(remotesTable)
|
|
69
|
+
const sequenceTableSql = sql(sequenceTable)
|
|
70
|
+
const sourcesTableSql = sql(sourcesTable)
|
|
71
|
+
const checkpointsTableSql = sql(checkpointsTable)
|
|
72
|
+
const remoteCursorsTableSql = sql(remoteCursorsTable)
|
|
54
73
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
74
|
+
// to_regclass folds unquoted names to lowercase, so pass the quoted identifier.
|
|
75
|
+
const quoted = (table: string) => sql`${sql(table)}`.compile(true)[0]
|
|
76
|
+
|
|
77
|
+
const tableExists = (table: string) =>
|
|
78
|
+
sql.onDialectOrElse({
|
|
79
|
+
// Reading the catalog refreshes cached names after concurrent DDL.
|
|
80
|
+
pg: () => sql`SELECT 1 AS found FROM pg_class WHERE oid = to_regclass(${quoted(table)})`,
|
|
81
|
+
mysql: () =>
|
|
82
|
+
sql`SELECT 1 AS found FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ${table}`,
|
|
83
|
+
mssql: () => sql`SELECT 1 AS found WHERE OBJECT_ID(${table}, 'U') IS NOT NULL`,
|
|
84
|
+
orElse: () => sql`SELECT 1 AS found FROM sqlite_master WHERE type = 'table' AND name = ${table}`
|
|
85
|
+
}).pipe(Effect.map((rows) => rows.length > 0))
|
|
86
|
+
|
|
87
|
+
const createSchema = Effect.gen(function*() {
|
|
88
|
+
const eventIndex = sql(`${entryTable}_event_idx`)
|
|
89
|
+
const timestampIndex = sql(`${entryTable}_timestamp_idx`)
|
|
90
|
+
|
|
91
|
+
yield* sql.onDialectOrElse({
|
|
92
|
+
pg: () =>
|
|
93
|
+
sql`
|
|
94
|
+
CREATE TABLE IF NOT EXISTS ${entryTableSql} (
|
|
95
|
+
id BYTEA PRIMARY KEY,
|
|
96
|
+
event TEXT NOT NULL,
|
|
97
|
+
primary_key TEXT NOT NULL,
|
|
98
|
+
payload BYTEA NOT NULL,
|
|
99
|
+
timestamp BIGINT NOT NULL
|
|
100
|
+
)`,
|
|
101
|
+
mysql: () =>
|
|
102
|
+
sql`
|
|
103
|
+
CREATE TABLE IF NOT EXISTS ${entryTableSql} (
|
|
104
|
+
id BINARY(16) PRIMARY KEY,
|
|
105
|
+
event TEXT NOT NULL,
|
|
106
|
+
primary_key TEXT NOT NULL,
|
|
107
|
+
payload BLOB NOT NULL,
|
|
108
|
+
timestamp BIGINT NOT NULL
|
|
109
|
+
)`,
|
|
110
|
+
mssql: () =>
|
|
111
|
+
sql`
|
|
112
|
+
CREATE TABLE IF NOT EXISTS ${entryTableSql} (
|
|
113
|
+
id UNIQUEIDENTIFIER PRIMARY KEY,
|
|
114
|
+
event NVARCHAR(MAX) NOT NULL,
|
|
115
|
+
primary_key NVARCHAR(MAX) NOT NULL,
|
|
116
|
+
payload VARBINARY(MAX) NOT NULL,
|
|
117
|
+
timestamp BIGINT NOT NULL
|
|
118
|
+
)`,
|
|
119
|
+
orElse: () =>
|
|
120
|
+
sql`
|
|
121
|
+
CREATE TABLE IF NOT EXISTS ${entryTableSql} (
|
|
122
|
+
id BLOB PRIMARY KEY,
|
|
123
|
+
event TEXT NOT NULL,
|
|
124
|
+
primary_key TEXT NOT NULL,
|
|
125
|
+
payload BLOB NOT NULL,
|
|
126
|
+
timestamp INTEGER NOT NULL
|
|
127
|
+
)`
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
// Insertion sequences let uploads include older entries imported later.
|
|
131
|
+
yield* sql.onDialectOrElse({
|
|
132
|
+
pg: () =>
|
|
133
|
+
sql`
|
|
134
|
+
CREATE TABLE IF NOT EXISTS ${sequenceTableSql} (
|
|
135
|
+
sequence BIGSERIAL PRIMARY KEY,
|
|
136
|
+
entry_id BYTEA NOT NULL UNIQUE
|
|
137
|
+
)`,
|
|
138
|
+
mysql: () =>
|
|
139
|
+
sql`
|
|
140
|
+
CREATE TABLE IF NOT EXISTS ${sequenceTableSql} (
|
|
141
|
+
sequence BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
142
|
+
entry_id BINARY(16) NOT NULL UNIQUE
|
|
143
|
+
)`,
|
|
144
|
+
mssql: () =>
|
|
145
|
+
sql`
|
|
146
|
+
CREATE TABLE ${sequenceTableSql} (
|
|
147
|
+
sequence BIGINT IDENTITY(1,1) PRIMARY KEY,
|
|
148
|
+
entry_id UNIQUEIDENTIFIER NOT NULL UNIQUE
|
|
149
|
+
)`,
|
|
150
|
+
orElse: () =>
|
|
151
|
+
sql`
|
|
152
|
+
CREATE TABLE IF NOT EXISTS ${sequenceTableSql} (
|
|
153
|
+
sequence INTEGER PRIMARY KEY,
|
|
154
|
+
entry_id BLOB NOT NULL UNIQUE
|
|
155
|
+
)`
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
yield* sql.onDialectOrElse({
|
|
159
|
+
pg: () =>
|
|
160
|
+
sql`
|
|
161
|
+
CREATE TABLE IF NOT EXISTS ${checkpointsTableSql} (
|
|
162
|
+
remote_id BYTEA PRIMARY KEY,
|
|
163
|
+
sequence BIGINT NOT NULL
|
|
164
|
+
)`,
|
|
165
|
+
mysql: () =>
|
|
166
|
+
sql`
|
|
167
|
+
CREATE TABLE IF NOT EXISTS ${checkpointsTableSql} (
|
|
168
|
+
remote_id BINARY(16) PRIMARY KEY,
|
|
169
|
+
sequence BIGINT NOT NULL
|
|
170
|
+
)`,
|
|
171
|
+
mssql: () =>
|
|
172
|
+
sql`
|
|
173
|
+
CREATE TABLE ${checkpointsTableSql} (
|
|
174
|
+
remote_id UNIQUEIDENTIFIER PRIMARY KEY,
|
|
175
|
+
sequence BIGINT NOT NULL
|
|
176
|
+
)`,
|
|
177
|
+
orElse: () =>
|
|
178
|
+
sql`
|
|
179
|
+
CREATE TABLE IF NOT EXISTS ${checkpointsTableSql} (
|
|
180
|
+
remote_id BLOB PRIMARY KEY,
|
|
181
|
+
sequence INTEGER NOT NULL
|
|
182
|
+
)`
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
yield* sql.onDialectOrElse({
|
|
186
|
+
pg: () =>
|
|
187
|
+
sql`
|
|
188
|
+
CREATE TABLE IF NOT EXISTS ${remoteCursorsTableSql} (
|
|
189
|
+
remote_id BYTEA PRIMARY KEY,
|
|
190
|
+
next_sequence INT NOT NULL
|
|
191
|
+
)`,
|
|
192
|
+
mysql: () =>
|
|
193
|
+
sql`
|
|
194
|
+
CREATE TABLE IF NOT EXISTS ${remoteCursorsTableSql} (
|
|
195
|
+
remote_id BINARY(16) PRIMARY KEY,
|
|
196
|
+
next_sequence INT NOT NULL
|
|
197
|
+
)`,
|
|
198
|
+
mssql: () =>
|
|
199
|
+
sql`
|
|
200
|
+
CREATE TABLE ${remoteCursorsTableSql} (
|
|
201
|
+
remote_id UNIQUEIDENTIFIER PRIMARY KEY,
|
|
202
|
+
next_sequence INT NOT NULL
|
|
203
|
+
)`,
|
|
204
|
+
orElse: () =>
|
|
205
|
+
sql`
|
|
206
|
+
CREATE TABLE IF NOT EXISTS ${remoteCursorsTableSql} (
|
|
207
|
+
remote_id BLOB PRIMARY KEY,
|
|
208
|
+
next_sequence INT NOT NULL
|
|
209
|
+
)`
|
|
210
|
+
})
|
|
211
|
+
|
|
212
|
+
// The remote each imported entry came from, so uploads skip it.
|
|
213
|
+
yield* sql.onDialectOrElse({
|
|
214
|
+
pg: () =>
|
|
215
|
+
sql`
|
|
216
|
+
CREATE TABLE IF NOT EXISTS ${sourcesTableSql} (
|
|
217
|
+
entry_id BYTEA PRIMARY KEY,
|
|
218
|
+
remote_id BYTEA NOT NULL
|
|
219
|
+
)`,
|
|
220
|
+
mysql: () =>
|
|
221
|
+
sql`
|
|
222
|
+
CREATE TABLE IF NOT EXISTS ${sourcesTableSql} (
|
|
223
|
+
entry_id BINARY(16) PRIMARY KEY,
|
|
224
|
+
remote_id BINARY(16) NOT NULL
|
|
225
|
+
)`,
|
|
226
|
+
mssql: () =>
|
|
227
|
+
sql`
|
|
228
|
+
CREATE TABLE ${sourcesTableSql} (
|
|
229
|
+
entry_id UNIQUEIDENTIFIER PRIMARY KEY,
|
|
230
|
+
remote_id UNIQUEIDENTIFIER NOT NULL
|
|
231
|
+
)`,
|
|
232
|
+
orElse: () =>
|
|
233
|
+
sql`
|
|
234
|
+
CREATE TABLE IF NOT EXISTS ${sourcesTableSql} (
|
|
235
|
+
entry_id BLOB PRIMARY KEY,
|
|
236
|
+
remote_id BLOB NOT NULL
|
|
237
|
+
)`
|
|
238
|
+
})
|
|
239
|
+
|
|
240
|
+
yield* sql.onDialectOrElse({
|
|
241
|
+
// MySQL indexes TEXT columns by prefix only.
|
|
242
|
+
mysql: () =>
|
|
243
|
+
Effect.andThen(
|
|
244
|
+
sql`CREATE INDEX ${eventIndex} ON ${entryTableSql} (event(191), primary_key(191), timestamp)`,
|
|
245
|
+
sql`CREATE INDEX ${timestampIndex} ON ${entryTableSql} (timestamp)`
|
|
246
|
+
),
|
|
247
|
+
// B-tree entries are limited to about 2.7 KB, so index hashes of the
|
|
248
|
+
// unbounded columns.
|
|
249
|
+
pg: () =>
|
|
250
|
+
Effect.andThen(
|
|
251
|
+
sql`CREATE INDEX IF NOT EXISTS ${eventIndex} ON ${entryTableSql} (md5(event), md5(primary_key), timestamp)`,
|
|
252
|
+
sql`CREATE INDEX IF NOT EXISTS ${timestampIndex} ON ${entryTableSql} (timestamp)`
|
|
253
|
+
),
|
|
254
|
+
// NVARCHAR(MAX) columns cannot be index keys.
|
|
255
|
+
mssql: () => sql`CREATE INDEX ${timestampIndex} ON ${entryTableSql} (timestamp)`,
|
|
256
|
+
orElse: () =>
|
|
257
|
+
Effect.andThen(
|
|
258
|
+
sql`CREATE INDEX IF NOT EXISTS ${eventIndex} ON ${entryTableSql} (event, primary_key, timestamp)`,
|
|
259
|
+
sql`CREATE INDEX IF NOT EXISTS ${timestampIndex} ON ${entryTableSql} (timestamp)`
|
|
260
|
+
)
|
|
261
|
+
})
|
|
262
|
+
|
|
263
|
+
// Number existing entries in creation order. `WHERE true` keeps SQLite
|
|
264
|
+
// from parsing ON CONFLICT as a join constraint.
|
|
265
|
+
yield* sql`
|
|
266
|
+
INSERT INTO ${sequenceTableSql} (entry_id)
|
|
267
|
+
SELECT id FROM ${entryTableSql} WHERE true ORDER BY timestamp ASC, id ASC
|
|
268
|
+
ON CONFLICT DO NOTHING
|
|
269
|
+
`
|
|
270
|
+
})
|
|
93
271
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
272
|
+
// Earlier releases kept a remotes row per entry per remote. An entry known
|
|
273
|
+
// to several remotes keeps one of them as its source, and a remote without
|
|
274
|
+
// a cursor resumes after its highest downloaded sequence.
|
|
275
|
+
const importRemotes = Effect.gen(function*() {
|
|
276
|
+
yield* sql`
|
|
277
|
+
INSERT INTO ${sourcesTableSql} (entry_id, remote_id)
|
|
278
|
+
SELECT entry_id, remote_id FROM ${remotesTableSql} WHERE true
|
|
279
|
+
ON CONFLICT DO NOTHING
|
|
280
|
+
`
|
|
281
|
+
yield* sql`
|
|
282
|
+
INSERT INTO ${remoteCursorsTableSql} (remote_id, next_sequence)
|
|
283
|
+
SELECT remote_id, MAX(sequence) + 1 FROM ${remotesTableSql} GROUP BY remote_id
|
|
284
|
+
ON CONFLICT DO NOTHING
|
|
285
|
+
`
|
|
286
|
+
yield* sql`DROP TABLE ${remotesTableSql}`
|
|
287
|
+
})
|
|
288
|
+
|
|
289
|
+
// Both steps run in one transaction, so a complete schema has the sources
|
|
290
|
+
// table and no remotes table. Checking that first lets complete databases
|
|
291
|
+
// open read-only; PostgreSQL also locks and rechecks so concurrent opens
|
|
292
|
+
// migrate once.
|
|
293
|
+
const schemaState = Effect.all({ sources: tableExists(sourcesTable), remotes: tableExists(remotesTable) })
|
|
294
|
+
const isComplete = (state: { readonly sources: boolean; readonly remotes: boolean }) =>
|
|
295
|
+
state.sources && !state.remotes
|
|
296
|
+
yield* Effect.gen(function*() {
|
|
297
|
+
if (isComplete(yield* schemaState)) return
|
|
298
|
+
yield* Effect.gen(function*() {
|
|
299
|
+
yield* sql.onDialectOrElse({
|
|
300
|
+
pg: () => sql`SELECT pg_advisory_xact_lock(hashtext(${quoted(entryTable)}))`,
|
|
301
|
+
orElse: () => Effect.void
|
|
302
|
+
})
|
|
303
|
+
const state = yield* schemaState
|
|
304
|
+
if (!state.sources) yield* createSchema
|
|
305
|
+
if (state.remotes) yield* importRemotes
|
|
306
|
+
}).pipe(sql.withTransaction)
|
|
127
307
|
}).pipe(withTracerDisabled)
|
|
128
308
|
|
|
129
309
|
const decodeEntryRows = Schema.decodeUnknownEffect(EntryRowArray)
|
|
130
310
|
const decodeEntryIdRows = Schema.decodeUnknownEffect(EntryIdRowArray)
|
|
131
311
|
const toEntries = (rows: ReadonlyArray<EntryRow>): ReadonlyArray<EventJournal.Entry> => rows.map(toEntry)
|
|
312
|
+
// Sort timestamp ties by id bytes consistently across dialects.
|
|
313
|
+
const toOrderedEntries = (rows: ReadonlyArray<EntryRow>): ReadonlyArray<EventJournal.Entry> =>
|
|
314
|
+
rows.map(toEntry).sort(EventJournal.Entry.Order)
|
|
132
315
|
|
|
133
|
-
const insertEntry = SqlSchema.void({
|
|
134
|
-
Request: EntryRow,
|
|
135
|
-
execute: (entry) => sql`INSERT INTO ${entryTableSql} ${sql.insert(entry)} ON CONFLICT DO NOTHING`
|
|
136
|
-
})
|
|
137
316
|
const insertEntries = SqlSchema.void({
|
|
138
317
|
Request: EntryRowArray,
|
|
139
|
-
execute: (entries) =>
|
|
318
|
+
execute: (entries) =>
|
|
319
|
+
forEachChunk(
|
|
320
|
+
entries,
|
|
321
|
+
entryColumns,
|
|
322
|
+
(chunk) => sql`INSERT INTO ${entryTableSql} ${sql.insert(chunk)} ON CONFLICT DO NOTHING`
|
|
323
|
+
)
|
|
140
324
|
})
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
325
|
+
const insertSources = (entries: ReadonlyArray<EventJournal.Entry>, remoteId: EventJournal.RemoteId) =>
|
|
326
|
+
forEachChunk(entries, 2, (chunk) => {
|
|
327
|
+
const rows = chunk.map((entry) => ({ entry_id: entry.id, remote_id: remoteId }))
|
|
328
|
+
return sql`INSERT INTO ${sourcesTableSql} ${sql.insert(rows)} ON CONFLICT DO NOTHING`
|
|
329
|
+
})
|
|
330
|
+
// Serialize writers so checkpoints cannot skip out-of-order commits.
|
|
331
|
+
// Lock before callbacks in both paths to avoid projection-row deadlocks.
|
|
332
|
+
const lockWriters = sql.onDialectOrElse({
|
|
333
|
+
pg: () => Effect.asVoid(sql`LOCK TABLE ${sequenceTableSql} IN SHARE ROW EXCLUSIVE MODE`),
|
|
334
|
+
orElse: () => Effect.void
|
|
144
335
|
})
|
|
336
|
+
const insertSequence = (entries: ReadonlyArray<EventJournal.Entry>) =>
|
|
337
|
+
forEachChunk(entries, 1, (chunk) => {
|
|
338
|
+
const rows = chunk.map((entry) => ({ entry_id: entry.id }))
|
|
339
|
+
return sql`INSERT INTO ${sequenceTableSql} ${sql.insert(rows)} ON CONFLICT DO NOTHING`
|
|
340
|
+
})
|
|
341
|
+
|
|
342
|
+
const decodeCursorRows = Schema.decodeUnknownEffect(CursorRowArray)
|
|
343
|
+
|
|
344
|
+
const readCursor = (remoteId: EventJournal.RemoteId) =>
|
|
345
|
+
sql`SELECT next_sequence FROM ${remoteCursorsTableSql} WHERE remote_id = ${remoteId}`.pipe(
|
|
346
|
+
Effect.flatMap(decodeCursorRows),
|
|
347
|
+
Effect.map((rows) => rows.length > 0 ? rows[0].next_sequence : 0)
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
// Cursors only move forward.
|
|
351
|
+
const writeCursor = (remoteId: EventJournal.RemoteId, next: number) =>
|
|
352
|
+
sql`
|
|
353
|
+
INSERT INTO ${remoteCursorsTableSql} ${sql.insert({ remote_id: remoteId, next_sequence: next })}
|
|
354
|
+
ON CONFLICT (remote_id) DO UPDATE SET next_sequence = excluded.next_sequence
|
|
355
|
+
WHERE ${remoteCursorsTableSql}.next_sequence < excluded.next_sequence
|
|
356
|
+
`
|
|
145
357
|
|
|
146
358
|
const pubsub = yield* PubSub.unbounded<EventJournal.Entry>()
|
|
359
|
+
const clock = yield* Clock.Clock
|
|
147
360
|
|
|
148
361
|
const writeFromRemote = Effect.fnUntraced(function*(options: WriteFromRemoteOptions): Effect.fn.Return<
|
|
149
362
|
{
|
|
@@ -152,38 +365,23 @@ export const make = (options?: {
|
|
|
152
365
|
EventJournal.EventJournalError | Schema.SchemaError | SqlError.SqlError
|
|
153
366
|
> {
|
|
154
367
|
const entries = options.entries.map((remoteEntry) => remoteEntry.entry)
|
|
155
|
-
const remoteRows = options.entries.map((remoteEntry) => ({
|
|
156
|
-
remote_id: options.remoteId,
|
|
157
|
-
entry_id: remoteEntry.entry.id,
|
|
158
|
-
sequence: remoteEntry.remoteSequence
|
|
159
|
-
}))
|
|
160
|
-
|
|
161
|
-
const existingIds = new Set<string>()
|
|
162
|
-
if (entries.length > 0) {
|
|
163
|
-
yield* sql`SELECT id FROM ${entryTableSql} WHERE ${
|
|
164
|
-
sql.in(
|
|
165
|
-
"id",
|
|
166
|
-
entries.map((entry) => entry.id)
|
|
167
|
-
)
|
|
168
|
-
}`.pipe(
|
|
169
|
-
Effect.flatMap(decodeEntryIdRows),
|
|
170
|
-
Effect.tap((rows) =>
|
|
171
|
-
Effect.sync(() => {
|
|
172
|
-
for (const row of rows) {
|
|
173
|
-
existingIds.add(Uuid.stringify(row.id))
|
|
174
|
-
}
|
|
175
|
-
})
|
|
176
|
-
)
|
|
177
|
-
)
|
|
178
|
-
}
|
|
179
|
-
if (entries.length > 0) {
|
|
180
|
-
yield* insertEntries(entries.map(toEntryRow))
|
|
181
|
-
}
|
|
182
|
-
if (remoteRows.length > 0) {
|
|
183
|
-
yield* insertRemotes(remoteRows)
|
|
184
|
-
}
|
|
185
368
|
|
|
186
|
-
|
|
369
|
+
yield* lockWriters
|
|
370
|
+
|
|
371
|
+
const existingRows = yield* forEachChunk(
|
|
372
|
+
entries,
|
|
373
|
+
1,
|
|
374
|
+
(chunk) => sql`SELECT id FROM ${entryTableSql} WHERE ${sql.in("id", chunk.map((entry) => entry.id))}`
|
|
375
|
+
).pipe(Effect.flatMap(decodeEntryIdRows))
|
|
376
|
+
const existingIds = new Set(existingRows.map((row) => Uuid.stringify(row.id)))
|
|
377
|
+
// Overlapping batches can repeat an entry; the first copy wins.
|
|
378
|
+
const incomingIds = new Set<string>()
|
|
379
|
+
const uncommitted = options.entries.filter((entry) => {
|
|
380
|
+
const idString = entry.entry.idString
|
|
381
|
+
if (existingIds.has(idString) || incomingIds.has(idString)) return false
|
|
382
|
+
incomingIds.add(idString)
|
|
383
|
+
return true
|
|
384
|
+
})
|
|
187
385
|
const duplicateEntries = options.entries
|
|
188
386
|
.filter((entry) => existingIds.has(entry.entry.idString))
|
|
189
387
|
.map((entry) => entry.entry)
|
|
@@ -191,56 +389,122 @@ export const make = (options?: {
|
|
|
191
389
|
? yield* options.compact(uncommitted)
|
|
192
390
|
: uncommitted.map((remoteEntry) => remoteEntry.entry)
|
|
193
391
|
|
|
194
|
-
|
|
195
|
-
const
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
392
|
+
if (Arr.isReadonlyArrayNonEmpty(compacted)) {
|
|
393
|
+
const index = new ConflictIndex(compacted)
|
|
394
|
+
const conflicts = (groups: ReadonlyArray<ConflictGroup>) => {
|
|
395
|
+
const events = Array.from(new Set(groups.map((group) => group.event)))
|
|
396
|
+
const primaryKeys = Array.from(new Set(groups.map((group) => group.primaryKey)))
|
|
397
|
+
return sql`SELECT * FROM ${entryTableSql} WHERE ${
|
|
398
|
+
sql.and([
|
|
399
|
+
// Match the hash index; exact predicates below rule out hash collisions.
|
|
400
|
+
...sql.onDialectOrElse({
|
|
401
|
+
pg: () => [
|
|
402
|
+
sql`md5(event) IN (${sql.csv(events.map((event) => sql`md5(${event})`))})`,
|
|
403
|
+
sql`md5(primary_key) IN (${sql.csv(primaryKeys.map((primaryKey) => sql`md5(${primaryKey})`))})`
|
|
404
|
+
],
|
|
405
|
+
orElse: () => []
|
|
406
|
+
}),
|
|
407
|
+
sql.in("event", events),
|
|
408
|
+
sql.in("primary_key", primaryKeys),
|
|
409
|
+
// A coarse filter: the index compares ids exactly.
|
|
410
|
+
sql`timestamp >= ${index.oldestMillis}`
|
|
411
|
+
])
|
|
412
|
+
}`
|
|
413
|
+
}
|
|
414
|
+
// Each group binds its event and key, twice on PostgreSQL, and one
|
|
415
|
+
// parameter is left for the timestamp.
|
|
416
|
+
const groupsPerChunk = Math.floor((maxParameters - 1) / sql.onDialectOrElse({ pg: () => 4, orElse: () => 2 }))
|
|
417
|
+
const stored = yield* Effect.forEach(Arr.chunksOf(index.groups(), groupsPerChunk), conflicts).pipe(
|
|
418
|
+
Effect.flatMap((rows) => decodeEntryRows(rows.flat())),
|
|
204
419
|
Effect.map(toEntries)
|
|
205
420
|
)
|
|
206
|
-
|
|
421
|
+
// Chunks can share an event and a key, so a row can be returned twice.
|
|
422
|
+
const added = new Set<string>()
|
|
423
|
+
for (const entry of stored) {
|
|
424
|
+
if (added.has(entry.idString)) continue
|
|
425
|
+
added.add(entry.idString)
|
|
426
|
+
index.add(entry)
|
|
427
|
+
}
|
|
428
|
+
yield* options.effect(index.toBatch())
|
|
207
429
|
}
|
|
208
430
|
|
|
431
|
+
// Keep the incoming batch out of conflict queries and persist only after
|
|
432
|
+
// compaction and every callback have succeeded.
|
|
433
|
+
if (uncommitted.length > 0) {
|
|
434
|
+
const imported = uncommitted.map((remoteEntry) => remoteEntry.entry)
|
|
435
|
+
yield* insertEntries(imported.map(toEntryRow))
|
|
436
|
+
yield* insertSequence(imported)
|
|
437
|
+
yield* insertSources(imported, options.remoteId)
|
|
438
|
+
}
|
|
439
|
+
// The change stream is ordered, so every earlier sequence is now known.
|
|
440
|
+
if (options.entries.length > 0) {
|
|
441
|
+
yield* writeCursor(options.remoteId, EventJournal.nextSequenceAfter(options.entries))
|
|
442
|
+
}
|
|
443
|
+
yield* EventJournal.warnIfAhead(clock, uncommitted.map((remoteEntry) => remoteEntry.entry.id))
|
|
444
|
+
|
|
209
445
|
return {
|
|
210
446
|
duplicateEntries
|
|
211
447
|
}
|
|
212
448
|
})
|
|
213
449
|
|
|
450
|
+
// Other processes share the database but not the entry id sequence. Ids in
|
|
451
|
+
// the latest millisecond are few, and comparing them here avoids ordering
|
|
452
|
+
// id bytes in SQL.
|
|
453
|
+
const latestEntryIds = sql`
|
|
454
|
+
SELECT id FROM ${entryTableSql} WHERE timestamp = (SELECT MAX(timestamp) FROM ${entryTableSql})
|
|
455
|
+
`.pipe(
|
|
456
|
+
Effect.flatMap(decodeEntryIdRows),
|
|
457
|
+
Effect.map((rows) => rows.map((row) => row.id))
|
|
458
|
+
)
|
|
459
|
+
|
|
460
|
+
const writeMany: EventJournal.EventJournal["Service"]["writeMany"] = ({ effect, entries }) =>
|
|
461
|
+
Effect.uninterruptibleMask((restore) =>
|
|
462
|
+
Effect.gen(function*() {
|
|
463
|
+
yield* lockWriters
|
|
464
|
+
// Rows visible here include an enclosing transaction's uncommitted
|
|
465
|
+
// ones, which local ids must also sort after.
|
|
466
|
+
const committed = yield* EventJournal.makeEntries(entries, yield* latestEntryIds)
|
|
467
|
+
const result = yield* restore(effect(committed)).pipe(
|
|
468
|
+
Effect.mapError((error) => new CallbackFailure(error))
|
|
469
|
+
)
|
|
470
|
+
yield* insertEntries(committed.map(toEntryRow))
|
|
471
|
+
yield* insertSequence(committed)
|
|
472
|
+
return { result, committed }
|
|
473
|
+
}).pipe(
|
|
474
|
+
sql.withTransaction,
|
|
475
|
+
Effect.mapError((error) =>
|
|
476
|
+
error instanceof CallbackFailure
|
|
477
|
+
? error.error
|
|
478
|
+
: error instanceof EventJournal.EventJournalError
|
|
479
|
+
? error
|
|
480
|
+
: new EventJournal.EventJournalError({ cause: error, method: "writeMany" })
|
|
481
|
+
),
|
|
482
|
+
Effect.flatMap(({ committed, result }) => Effect.as(PubSub.publishAll(pubsub, committed), result))
|
|
483
|
+
)
|
|
484
|
+
).pipe(withTracerDisabled)
|
|
485
|
+
|
|
214
486
|
return EventJournal.EventJournal.of({
|
|
215
487
|
entries: sql`SELECT * FROM ${entryTableSql} ORDER BY timestamp ASC`.pipe(
|
|
216
488
|
withTracerDisabled,
|
|
217
489
|
Effect.flatMap(decodeEntryRows),
|
|
218
|
-
Effect.map(
|
|
490
|
+
Effect.map(toOrderedEntries),
|
|
219
491
|
Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "entries" }))
|
|
220
492
|
),
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
},
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "write" }))
|
|
234
|
-
)
|
|
235
|
-
),
|
|
236
|
-
Effect.tap(PubSub.publish(pubsub, entry))
|
|
237
|
-
)
|
|
238
|
-
)
|
|
239
|
-
},
|
|
240
|
-
withTracerDisabled
|
|
241
|
-
),
|
|
493
|
+
entriesById: (ids) =>
|
|
494
|
+
forEachChunk(ids, 1, (chunk) => sql`SELECT * FROM ${entryTableSql} WHERE ${sql.in("id", chunk)}`).pipe(
|
|
495
|
+
withTracerDisabled,
|
|
496
|
+
Effect.flatMap(decodeEntryRows),
|
|
497
|
+
Effect.map((rows) => {
|
|
498
|
+
const byId = new Map(toEntries(rows).map((entry) => [entry.idString, entry]))
|
|
499
|
+
return ids.map((id) => byId.get(Uuid.stringify(id)))
|
|
500
|
+
}),
|
|
501
|
+
Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "entriesById" }))
|
|
502
|
+
),
|
|
503
|
+
write: ({ effect, ...entry }) => writeMany({ entries: [entry], effect: (entries) => effect(entries[0]) }),
|
|
504
|
+
writeMany,
|
|
242
505
|
writeFromRemote: (options) =>
|
|
243
506
|
writeFromRemote(options).pipe(
|
|
507
|
+
sql.withTransaction,
|
|
244
508
|
withTracerDisabled,
|
|
245
509
|
Effect.catchIf(
|
|
246
510
|
(e) => e._tag !== "EventJournalError",
|
|
@@ -249,36 +513,66 @@ export const make = (options?: {
|
|
|
249
513
|
),
|
|
250
514
|
withRemoteUncommited: Effect.fnUntraced(
|
|
251
515
|
function*(remoteId, f) {
|
|
516
|
+
const mapError = Effect.mapError((cause: unknown) =>
|
|
517
|
+
new EventJournal.EventJournalError({ cause, method: "withRemoteUncommited" })
|
|
518
|
+
)
|
|
519
|
+
// Capture an upper bound so entries committed during upload remain pending.
|
|
520
|
+
const [{ checkpoint, latest }] = yield* sql`
|
|
521
|
+
SELECT
|
|
522
|
+
COALESCE((SELECT sequence FROM ${checkpointsTableSql} WHERE remote_id = ${remoteId}), 0) AS checkpoint,
|
|
523
|
+
COALESCE((SELECT MAX(sequence) FROM ${sequenceTableSql}), 0) AS latest
|
|
524
|
+
`.pipe(Effect.flatMap(decodeUploadBounds), mapError)
|
|
525
|
+
if (latest <= checkpoint) return yield* Effect.succeedNone
|
|
252
526
|
const entries = yield* sql`
|
|
253
|
-
SELECT
|
|
254
|
-
FROM ${
|
|
255
|
-
|
|
256
|
-
|
|
527
|
+
SELECT e.*
|
|
528
|
+
FROM ${sequenceTableSql} s
|
|
529
|
+
JOIN ${entryTableSql} e ON e.id = s.entry_id
|
|
530
|
+
WHERE s.sequence > ${checkpoint} AND
|
|
531
|
+
s.sequence <= ${latest} AND
|
|
532
|
+
NOT EXISTS (
|
|
533
|
+
SELECT 1 FROM ${sourcesTableSql} src WHERE src.entry_id = s.entry_id AND src.remote_id = ${remoteId}
|
|
534
|
+
)
|
|
257
535
|
`.pipe(
|
|
258
536
|
Effect.flatMap(decodeEntryRows),
|
|
259
|
-
Effect.map(
|
|
260
|
-
|
|
537
|
+
Effect.map(toOrderedEntries),
|
|
538
|
+
mapError
|
|
539
|
+
)
|
|
540
|
+
// Uploads can complete out of order; the checkpoint only moves forward.
|
|
541
|
+
const saveCheckpoint = sql`
|
|
542
|
+
INSERT INTO ${checkpointsTableSql} ${sql.insert({ remote_id: remoteId, sequence: latest })}
|
|
543
|
+
ON CONFLICT (remote_id) DO UPDATE SET sequence = excluded.sequence
|
|
544
|
+
WHERE ${checkpointsTableSql}.sequence < excluded.sequence
|
|
545
|
+
`.pipe(mapError)
|
|
546
|
+
return yield* Effect.uninterruptibleMask((restore) =>
|
|
547
|
+
restore(Arr.isReadonlyArrayNonEmpty(entries) ? Effect.asSome(f(entries)) : Effect.succeedNone).pipe(
|
|
548
|
+
Effect.tap(saveCheckpoint)
|
|
549
|
+
)
|
|
261
550
|
)
|
|
262
|
-
if (!Arr.isReadonlyArrayNonEmpty(entries)) return yield* Effect.succeedNone
|
|
263
|
-
return yield* Effect.asSome(f(entries))
|
|
264
551
|
},
|
|
265
552
|
withTracerDisabled
|
|
266
553
|
),
|
|
554
|
+
writeRemoteAcks: Effect.fnUntraced(
|
|
555
|
+
function*({ acks, firstSequence, remoteId }) {
|
|
556
|
+
if (acks.length === 0) return
|
|
557
|
+
const next = yield* readCursor(remoteId)
|
|
558
|
+
yield* writeCursor(remoteId, EventJournal.advanceSequence(next, acks, firstSequence))
|
|
559
|
+
},
|
|
560
|
+
(_) => sql.withTransaction(_),
|
|
561
|
+
(_) => withTracerDisabled(_),
|
|
562
|
+
Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "writeRemoteAcks" }))
|
|
563
|
+
),
|
|
267
564
|
nextRemoteSequence: (remoteId) =>
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
if (value === null || value === undefined) return 0
|
|
273
|
-
return Number(value) + 1
|
|
274
|
-
}),
|
|
275
|
-
withTracerDisabled,
|
|
276
|
-
Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "nextRemoteSequence" }))
|
|
277
|
-
),
|
|
565
|
+
readCursor(remoteId).pipe(
|
|
566
|
+
withTracerDisabled,
|
|
567
|
+
Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "nextRemoteSequence" }))
|
|
568
|
+
),
|
|
278
569
|
changes: PubSub.subscribe(pubsub),
|
|
279
570
|
destroy: Effect.gen(function*() {
|
|
280
571
|
yield* sql`DROP TABLE ${entryTableSql}`
|
|
281
|
-
yield* sql`DROP TABLE ${
|
|
572
|
+
yield* sql`DROP TABLE ${sequenceTableSql}`
|
|
573
|
+
yield* sql`DROP TABLE ${sourcesTableSql}`
|
|
574
|
+
yield* sql`DROP TABLE ${checkpointsTableSql}`
|
|
575
|
+
yield* sql`DROP TABLE ${remoteCursorsTableSql}`
|
|
282
576
|
}).pipe(
|
|
283
577
|
withTracerDisabled,
|
|
284
578
|
Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "destroy" }))
|
|
@@ -293,25 +587,11 @@ export const make = (options?: {
|
|
|
293
587
|
})
|
|
294
588
|
|
|
295
589
|
/**
|
|
296
|
-
* Provides `EventJournal`
|
|
297
|
-
* `make`.
|
|
298
|
-
*
|
|
299
|
-
* **When to use**
|
|
300
|
-
*
|
|
301
|
-
* Use when composing a Layer graph that should provide a persistent SQL-backed
|
|
302
|
-
* `EventJournal` from an existing `SqlClient` service.
|
|
303
|
-
*
|
|
304
|
-
* **Details**
|
|
305
|
-
*
|
|
306
|
-
* The layer delegates to `make(options)`, so the same optional `entryTable` and
|
|
307
|
-
* `remotesTable` settings are used and construction requires `SqlClient` and
|
|
308
|
-
* may fail with `SqlError`.
|
|
590
|
+
* Provides a SQL-backed `EventJournal` from an existing `SqlClient` service.
|
|
309
591
|
*
|
|
310
592
|
* **Gotchas**
|
|
311
593
|
*
|
|
312
|
-
*
|
|
313
|
-
* setup as `make`; manage indexes and schema migrations outside this layer when
|
|
314
|
-
* your SQL schema needs more than the built-in tables.
|
|
594
|
+
* Creating or migrating the schema requires a writable connection.
|
|
315
595
|
*
|
|
316
596
|
* @see {@link make} for constructing the SQL-backed service directly
|
|
317
597
|
* @see {@link EventJournal.layerMemory} for an in-memory `EventJournal` layer
|
|
@@ -324,6 +604,7 @@ export const make = (options?: {
|
|
|
324
604
|
export const layer = (options?: {
|
|
325
605
|
readonly entryTable?: string
|
|
326
606
|
readonly remotesTable?: string
|
|
607
|
+
readonly remoteCursorsTable?: string
|
|
327
608
|
}): Layer.Layer<EventJournal.EventJournal, SqlError.SqlError, SqlClient.SqlClient> =>
|
|
328
609
|
Layer.effect(EventJournal.EventJournal)(make(options))
|
|
329
610
|
|
|
@@ -366,6 +647,10 @@ const EntryRow = Schema.Struct({
|
|
|
366
647
|
})
|
|
367
648
|
|
|
368
649
|
const EntryRowArray = Schema.Array(EntryRow)
|
|
650
|
+
const entryColumns = Object.keys(EntryRow.fields).length
|
|
651
|
+
const decodeUploadBounds = Schema.decodeUnknownEffect(Schema.Tuple([
|
|
652
|
+
Schema.Struct({ checkpoint: SqlNatural, latest: SqlNatural })
|
|
653
|
+
]))
|
|
369
654
|
const EntryIdRowArray = Schema.Array(Schema.Struct({ id: SqlEntryId }))
|
|
370
655
|
|
|
371
656
|
type EntryRow = Schema.Schema.Type<typeof EntryRow>
|
|
@@ -386,12 +671,30 @@ const toEntryRow = (entry: EventJournal.Entry): EntryRow => ({
|
|
|
386
671
|
timestamp: EventJournal.entryIdMillis(entry.id)
|
|
387
672
|
})
|
|
388
673
|
|
|
389
|
-
const
|
|
390
|
-
remote_id: EventJournal.RemoteId,
|
|
391
|
-
entry_id: EventJournal.EntryId,
|
|
392
|
-
sequence: Schema.Natural
|
|
393
|
-
})
|
|
394
|
-
|
|
395
|
-
const RemoteRowArray = Schema.Array(RemoteRow)
|
|
674
|
+
const CursorRowArray = Schema.Array(Schema.Struct({ next_sequence: SqlNatural }))
|
|
396
675
|
|
|
397
676
|
const withTracerDisabled = Effect.withTracerEnabled(false)
|
|
677
|
+
|
|
678
|
+
// Statements bind at most this many parameters: Cloudflare Durable Object
|
|
679
|
+
// SQLite's per-statement limit, the lowest of the supported databases.
|
|
680
|
+
const maxParameters = 100
|
|
681
|
+
|
|
682
|
+
// Runs `f` in order over chunks of `values`, each binding `parametersPerValue`
|
|
683
|
+
// parameters per value, and concatenates the rows.
|
|
684
|
+
const forEachChunk = <A, B, E, R>(
|
|
685
|
+
values: ReadonlyArray<A>,
|
|
686
|
+
parametersPerValue: number,
|
|
687
|
+
f: (chunk: Arr.NonEmptyReadonlyArray<A>) => Effect.Effect<ReadonlyArray<B>, E, R>
|
|
688
|
+
): Effect.Effect<Array<B>, E, R> =>
|
|
689
|
+
Effect.map(
|
|
690
|
+
Effect.forEach(Arr.chunksOf(values, Math.floor(maxParameters / parametersPerValue)), f),
|
|
691
|
+
(rows) => rows.flat()
|
|
692
|
+
)
|
|
693
|
+
|
|
694
|
+
// Preserve callback errors without wrapping them as journal SQL errors.
|
|
695
|
+
class CallbackFailure<E> {
|
|
696
|
+
readonly error: E
|
|
697
|
+
constructor(error: E) {
|
|
698
|
+
this.error = error
|
|
699
|
+
}
|
|
700
|
+
}
|