effect 4.0.4 → 4.0.6
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/src/52_graphql/10_basics.ts +19 -13
- package/ai-docs/src/52_graphql/30_batching.ts +6 -4
- package/ai-docs/src/52_graphql/40_aliased-batching.ts +6 -4
- package/ai-docs/tsconfig.json +3 -1
- package/dist/Array.d.ts +207 -58
- package/dist/Array.d.ts.map +1 -1
- package/dist/Array.js +45 -22
- 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 +187 -14
- package/dist/Channel.d.ts.map +1 -1
- package/dist/Channel.js +142 -33
- 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 +34 -32
- 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/Duration.d.ts.map +1 -1
- package/dist/Duration.js +58 -21
- package/dist/Duration.js.map +1 -1
- package/dist/Effect.d.ts +548 -182
- package/dist/Effect.d.ts.map +1 -1
- package/dist/Effect.js +261 -76
- package/dist/Effect.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 +24 -9
- 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 +28 -9
- package/dist/FileSystem.d.ts.map +1 -1
- package/dist/FileSystem.js +3 -0
- package/dist/FileSystem.js.map +1 -1
- package/dist/Graph.d.ts.map +1 -1
- package/dist/Graph.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/JsonSchema.d.ts +9 -3
- package/dist/JsonSchema.d.ts.map +1 -1
- package/dist/JsonSchema.js +19 -3
- 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/Match.d.ts +20 -6
- package/dist/Match.d.ts.map +1 -1
- package/dist/Match.js +2 -2
- package/dist/Match.js.map +1 -1
- package/dist/Metric.d.ts +132 -0
- 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/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/Path.d.ts +37 -5
- package/dist/Path.d.ts.map +1 -1
- package/dist/Path.js +44 -6
- package/dist/Path.js.map +1 -1
- package/dist/PubSub.d.ts.map +1 -1
- package/dist/PubSub.js +12 -7
- 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.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.map +1 -1
- package/dist/Schema.d.ts +383 -326
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +338 -17
- package/dist/Schema.js.map +1 -1
- package/dist/SchemaAST.d.ts +5 -5
- package/dist/SchemaAST.d.ts.map +1 -1
- package/dist/SchemaAST.js +24 -8
- 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/SchemaRepresentation.d.ts +56 -1
- package/dist/SchemaRepresentation.d.ts.map +1 -1
- package/dist/SchemaRepresentation.js +18 -0
- package/dist/SchemaRepresentation.js.map +1 -1
- package/dist/SchemaTransformation.d.ts +1 -1
- package/dist/SchemaTransformation.js +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/Sink.d.ts.map +1 -1
- package/dist/Sink.js +6 -2
- 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 +145 -60
- package/dist/Stream.js.map +1 -1
- package/dist/String.d.ts +16 -2
- package/dist/String.d.ts.map +1 -1
- package/dist/String.js +25 -10
- 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/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/TxRef.d.ts.map +1 -1
- package/dist/TxRef.js +3 -2
- package/dist/TxRef.js.map +1 -1
- package/dist/ai/AiError.d.ts +78 -14
- package/dist/ai/AiError.d.ts.map +1 -1
- package/dist/ai/AiError.js +51 -3
- 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 +116 -20
- package/dist/ai/Decision.d.ts.map +1 -1
- package/dist/ai/Decision.js +37 -3
- 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 +183 -95
- 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 +47 -35
- 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 +368 -235
- 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 +6 -52
- package/dist/ai/McpServer.d.ts.map +1 -1
- package/dist/ai/McpServer.js +27 -50
- package/dist/ai/McpServer.js.map +1 -1
- package/dist/ai/Prompt.d.ts +22 -20
- package/dist/ai/Prompt.d.ts.map +1 -1
- package/dist/ai/Prompt.js +23 -1
- package/dist/ai/Prompt.js.map +1 -1
- package/dist/ai/Response.d.ts +148 -4
- package/dist/ai/Response.d.ts.map +1 -1
- package/dist/ai/Response.js +35 -37
- package/dist/ai/Response.js.map +1 -1
- package/dist/ai/Tool.d.ts +12 -4
- package/dist/ai/Tool.d.ts.map +1 -1
- 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 +65 -12
- 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/CliError.d.ts +42 -2
- package/dist/cli/CliError.d.ts.map +1 -1
- package/dist/cli/CliError.js +44 -5
- package/dist/cli/CliError.js.map +1 -1
- package/dist/cli/Command.d.ts +286 -2
- package/dist/cli/Command.d.ts.map +1 -1
- package/dist/cli/Command.js +107 -6
- package/dist/cli/Command.js.map +1 -1
- package/dist/cli/Completions.d.ts +10 -0
- package/dist/cli/Completions.d.ts.map +1 -1
- package/dist/cli/Completions.js.map +1 -1
- package/dist/cli/Flag.d.ts +215 -0
- package/dist/cli/Flag.d.ts.map +1 -1
- package/dist/cli/Flag.js +89 -0
- package/dist/cli/Flag.js.map +1 -1
- package/dist/cli/GlobalFlag.d.ts.map +1 -1
- package/dist/cli/GlobalFlag.js +3 -3
- package/dist/cli/GlobalFlag.js.map +1 -1
- package/dist/cli/Param.d.ts +194 -0
- package/dist/cli/Param.d.ts.map +1 -1
- package/dist/cli/Param.js +86 -0
- package/dist/cli/Param.js.map +1 -1
- package/dist/cli/TerminalCapabilities.d.ts +84 -0
- package/dist/cli/TerminalCapabilities.d.ts.map +1 -0
- package/dist/cli/TerminalCapabilities.js +122 -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 +7 -3
- package/dist/cli/internal/command.js.map +1 -1
- package/dist/cli/internal/completions/bash.js +7 -5
- package/dist/cli/internal/completions/bash.js.map +1 -1
- package/dist/cli/internal/completions/descriptor.js +16 -1
- package/dist/cli/internal/completions/descriptor.js.map +1 -1
- package/dist/cli/internal/completions/fish.js +12 -10
- package/dist/cli/internal/completions/fish.js.map +1 -1
- package/dist/cli/internal/completions/powershell.js +20 -10
- package/dist/cli/internal/completions/powershell.js.map +1 -1
- package/dist/cli/internal/completions/zsh.js +15 -8
- 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 +35 -15
- package/dist/cli/internal/parser.js.map +1 -1
- package/dist/cli/internal/wizard.d.ts.map +1 -1
- package/dist/cli/internal/wizard.js +2 -1
- package/dist/cli/internal/wizard.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 +2 -1
- package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.js +98 -18
- 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 +21 -0
- package/dist/cluster/MessageStorage.d.ts.map +1 -1
- package/dist/cluster/MessageStorage.js +20 -12
- package/dist/cluster/MessageStorage.js.map +1 -1
- package/dist/cluster/Runners.d.ts.map +1 -1
- package/dist/cluster/Runners.js +96 -37
- 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 +95 -32
- package/dist/cluster/Sharding.js.map +1 -1
- package/dist/cluster/ShardingConfig.d.ts +20 -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/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 +10 -4
- package/dist/cluster/SqlRunnerStorage.js.map +1 -1
- package/dist/cluster/internal/entityManager.js +66 -9
- 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 +31 -4
- package/dist/devtools/DevToolsClient.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.js +1 -1
- 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.js +3 -3
- 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 +387 -159
- 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 +47 -0
- package/dist/eventlog/internal/conflicts.d.ts.map +1 -0
- package/dist/eventlog/internal/conflicts.js +92 -0
- package/dist/eventlog/internal/conflicts.js.map +1 -0
- package/dist/graphql/GraphQLClient.d.ts.map +1 -1
- package/dist/graphql/GraphQLClient.js +12 -5
- package/dist/graphql/GraphQLClient.js.map +1 -1
- 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 +252 -11
- package/dist/graphql/GraphQLProtocol.d.ts.map +1 -1
- package/dist/graphql/GraphQLProtocol.js +99 -8
- package/dist/graphql/GraphQLProtocol.js.map +1 -1
- package/dist/graphql/GraphQLResolver.d.ts +3 -1
- package/dist/graphql/GraphQLResolver.d.ts.map +1 -1
- package/dist/graphql/GraphQLResolver.js +91 -19
- package/dist/graphql/GraphQLResolver.js.map +1 -1
- package/dist/http/FetchHttpClient.d.ts +13 -3
- package/dist/http/FetchHttpClient.d.ts.map +1 -1
- package/dist/http/FetchHttpClient.js +56 -6
- package/dist/http/FetchHttpClient.js.map +1 -1
- package/dist/http/FindMyWay/internal/router.js +12 -1
- package/dist/http/FindMyWay/internal/router.js.map +1 -1
- package/dist/http/Headers.d.ts +230 -3
- package/dist/http/Headers.d.ts.map +1 -1
- package/dist/http/Headers.js +267 -5
- package/dist/http/Headers.js.map +1 -1
- package/dist/http/HttpClient.d.ts +105 -0
- package/dist/http/HttpClient.d.ts.map +1 -1
- package/dist/http/HttpClient.js +69 -17
- package/dist/http/HttpClient.js.map +1 -1
- package/dist/http/HttpClientError.d.ts.map +1 -1
- package/dist/http/HttpClientError.js +8 -6
- package/dist/http/HttpClientError.js.map +1 -1
- package/dist/http/HttpClientRequest.d.ts +274 -7
- package/dist/http/HttpClientRequest.d.ts.map +1 -1
- package/dist/http/HttpClientRequest.js +91 -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 +179 -2
- package/dist/http/HttpMiddleware.d.ts.map +1 -1
- package/dist/http/HttpMiddleware.js +226 -18
- package/dist/http/HttpMiddleware.js.map +1 -1
- package/dist/http/HttpRouter.d.ts.map +1 -1
- package/dist/http/HttpRouter.js +58 -14
- 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 +11 -7
- package/dist/http/HttpServerError.js.map +1 -1
- package/dist/http/HttpServerRequest.d.ts +25 -5
- package/dist/http/HttpServerRequest.d.ts.map +1 -1
- package/dist/http/HttpServerRequest.js +38 -12
- 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 +25 -17
- package/dist/http/HttpStaticServer.js.map +1 -1
- package/dist/http/HttpTraceContext.js +1 -1
- package/dist/http/HttpTraceContext.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 +87 -5
- 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 +8 -2
- package/dist/http/Url.js.map +1 -1
- package/dist/http/UrlParams.d.ts +112 -8
- package/dist/http/UrlParams.d.ts.map +1 -1
- package/dist/http/UrlParams.js +141 -14
- package/dist/http/UrlParams.js.map +1 -1
- package/dist/http/internal/compression.d.ts +1 -1
- package/dist/http/internal/compression.d.ts.map +1 -1
- package/dist/http/internal/compression.js +2 -10
- package/dist/http/internal/compression.js.map +1 -1
- package/dist/http/internal/compressionBody.d.ts +2 -0
- package/dist/http/internal/compressionBody.d.ts.map +1 -0
- package/dist/http/internal/compressionBody.js +36 -0
- package/dist/http/internal/compressionBody.js.map +1 -0
- package/dist/http/internal/decompression.d.ts +2 -0
- package/dist/http/internal/decompression.d.ts.map +1 -0
- package/dist/http/internal/decompression.js +168 -0
- package/dist/http/internal/decompression.js.map +1 -0
- 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/tracing.js +14 -4
- package/dist/http/internal/tracing.js.map +1 -1
- package/dist/http/internal/urlParams.d.ts +2 -0
- package/dist/http/internal/urlParams.d.ts.map +1 -0
- package/dist/http/internal/urlParams.js +4 -0
- package/dist/http/internal/urlParams.js.map +1 -0
- 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.js +1 -1
- 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 +121 -18
- package/dist/http-api/HttpApiBuilder.js.map +1 -1
- package/dist/http-api/HttpApiClient.d.ts +29 -4
- package/dist/http-api/HttpApiClient.d.ts.map +1 -1
- package/dist/http-api/HttpApiClient.js +85 -24
- package/dist/http-api/HttpApiClient.js.map +1 -1
- package/dist/http-api/HttpApiEndpoint.d.ts +55 -29
- package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
- package/dist/http-api/HttpApiEndpoint.js +49 -5
- 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 +191 -9
- package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
- package/dist/http-api/HttpApiSchema.js +137 -4
- 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 +30 -9
- 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 +57 -32
- 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/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/core.js +18 -2
- 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 +89 -76
- package/dist/internal/effect.js.map +1 -1
- package/dist/internal/graphql.js +12 -2
- package/dist/internal/graphql.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/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/fromJsonSchemaDocument.js +136 -126
- package/dist/internal/schema/fromJsonSchemaDocument.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 +34 -33
- package/dist/internal/schema/standardSchema.js.map +1 -1
- package/dist/internal/schema/toCodeDocument.js +7 -2
- package/dist/internal/schema/toCodeDocument.js.map +1 -1
- package/dist/internal/schema/toCodec.js +86 -1
- 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 +60 -38
- package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
- 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/Otlp.d.ts +15 -0
- package/dist/observability/Otlp.d.ts.map +1 -1
- package/dist/observability/Otlp.js +3 -0
- package/dist/observability/Otlp.js.map +1 -1
- package/dist/observability/OtlpExporter.d.ts +8 -0
- package/dist/observability/OtlpExporter.d.ts.map +1 -1
- package/dist/observability/OtlpExporter.js +15 -13
- package/dist/observability/OtlpExporter.js.map +1 -1
- package/dist/observability/OtlpLogger.d.ts +17 -0
- package/dist/observability/OtlpLogger.d.ts.map +1 -1
- package/dist/observability/OtlpLogger.js +14 -1
- package/dist/observability/OtlpLogger.js.map +1 -1
- package/dist/observability/OtlpMetrics.d.ts +17 -0
- package/dist/observability/OtlpMetrics.d.ts.map +1 -1
- package/dist/observability/OtlpMetrics.js +18 -3
- package/dist/observability/OtlpMetrics.js.map +1 -1
- 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 +17 -0
- package/dist/observability/OtlpTracer.d.ts.map +1 -1
- package/dist/observability/OtlpTracer.js +15 -2
- package/dist/observability/OtlpTracer.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/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/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 +5 -0
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +5 -0
- package/dist/persistence/index.js.map +1 -1
- package/dist/process/ChildProcess.d.ts +2 -1
- package/dist/process/ChildProcess.d.ts.map +1 -1
- package/dist/process/ChildProcess.js.map +1 -1
- package/dist/reactivity/AsyncResult.d.ts +6 -0
- package/dist/reactivity/AsyncResult.d.ts.map +1 -1
- package/dist/reactivity/AsyncResult.js +28 -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 +47 -10
- 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 +202 -61
- package/dist/rpc/RpcClient.js.map +1 -1
- package/dist/rpc/RpcSerialization.d.ts +15 -0
- package/dist/rpc/RpcSerialization.d.ts.map +1 -1
- package/dist/rpc/RpcSerialization.js +21 -5
- package/dist/rpc/RpcSerialization.js.map +1 -1
- package/dist/rpc/RpcServer.d.ts.map +1 -1
- package/dist/rpc/RpcServer.js +9 -18
- package/dist/rpc/RpcServer.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.map +1 -1
- package/dist/sql/Migrator.js +15 -3
- package/dist/sql/Migrator.js.map +1 -1
- package/dist/sql/SqlClient.d.ts +151 -12
- package/dist/sql/SqlClient.d.ts.map +1 -1
- package/dist/sql/SqlClient.js +156 -34
- package/dist/sql/SqlClient.js.map +1 -1
- package/dist/sql/SqlResolver.d.ts +9 -0
- package/dist/sql/SqlResolver.d.ts.map +1 -1
- package/dist/sql/SqlResolver.js +9 -0
- package/dist/sql/SqlResolver.js.map +1 -1
- package/dist/sql/Statement.d.ts +3 -1
- package/dist/sql/Statement.d.ts.map +1 -1
- package/dist/sql/Statement.js +24 -5
- package/dist/sql/Statement.js.map +1 -1
- package/dist/testing/TestClock.d.ts +16 -3
- package/dist/testing/TestClock.d.ts.map +1 -1
- package/dist/testing/TestClock.js +115 -23
- 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/Activity.js +1 -0
- package/dist/workflow/Activity.js.map +1 -1
- package/dist/workflow/Workflow.d.ts +22 -0
- package/dist/workflow/Workflow.d.ts.map +1 -1
- package/dist/workflow/Workflow.js +15 -3
- package/dist/workflow/Workflow.js.map +1 -1
- package/dist/workflow/WorkflowEngine.d.ts +20 -1
- package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
- package/dist/workflow/WorkflowEngine.js +52 -24
- package/dist/workflow/WorkflowEngine.js.map +1 -1
- package/package.json +13 -3
- package/src/Array.ts +223 -61
- package/src/Bytes.ts +111 -0
- package/src/Channel.ts +287 -439
- package/src/ChannelSchema.ts +1 -49
- package/src/Chunk.ts +55 -61
- package/src/Config.ts +12 -86
- package/src/ConfigProvider.ts +41 -44
- package/src/Cron.ts +6 -3
- package/src/Duration.ts +70 -21
- package/src/Effect.ts +642 -220
- package/src/Equivalence.ts +7 -4
- package/src/Exit.ts +24 -9
- package/src/FiberHandle.ts +10 -9
- package/src/FiberMap.ts +13 -66
- package/src/FileSystem.ts +33 -9
- package/src/Graph.ts +171 -1263
- package/src/HashSet.ts +0 -60
- package/src/Iterable.ts +15 -14
- package/src/JsonSchema.ts +28 -3
- package/src/Layer.ts +2 -2
- package/src/ManagedRuntime.ts +72 -6
- package/src/Match.ts +65 -12
- package/src/Metric.ts +249 -507
- package/src/MutableHashMap.ts +4 -473
- package/src/Number.ts +2 -2
- package/src/Optic.ts +17 -332
- package/src/Path.ts +61 -8
- package/src/PubSub.ts +12 -7
- 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 +7 -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 +2 -94
- package/src/Schema.ts +596 -348
- package/src/SchemaAST.ts +20 -9
- package/src/SchemaGetter.ts +22 -5
- package/src/SchemaIssue.ts +44 -53
- package/src/SchemaRepresentation.ts +64 -1
- package/src/SchemaTransformation.ts +1 -1
- 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/Sink.ts +6 -2
- package/src/Stream.ts +334 -1011
- package/src/String.ts +25 -12
- package/src/TextDiff.ts +766 -0
- package/src/TxHashMap.ts +1 -103
- package/src/TxHashSet.ts +48 -753
- package/src/TxRef.ts +4 -2
- package/src/ai/AiError.ts +69 -5
- package/src/ai/Chat.ts +10 -5
- package/src/ai/Decision.ts +119 -22
- package/src/ai/DecisionModel.ts +265 -109
- package/src/ai/EmbeddingModel.ts +25 -13
- package/src/ai/LanguageModel.ts +57 -51
- 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 +232 -275
- package/src/ai/Prompt.ts +49 -35
- package/src/ai/Response.ts +195 -65
- package/src/ai/Tool.ts +12 -4
- package/src/ai/Toolkit.ts +78 -10
- 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/CliError.ts +49 -4
- package/src/cli/Command.ts +316 -9
- package/src/cli/Completions.ts +10 -0
- package/src/cli/Flag.ts +218 -0
- package/src/cli/GlobalFlag.ts +3 -3
- package/src/cli/Param.ts +218 -0
- package/src/cli/TerminalCapabilities.ts +156 -0
- package/src/cli/index.ts +6 -0
- package/src/cli/internal/command.ts +10 -4
- package/src/cli/internal/completions/bash.ts +7 -5
- package/src/cli/internal/completions/descriptor.ts +20 -1
- package/src/cli/internal/completions/fish.ts +12 -10
- package/src/cli/internal/completions/powershell.ts +25 -13
- package/src/cli/internal/completions/zsh.ts +15 -8
- package/src/cli/internal/formatter.ts +18 -0
- package/src/cli/internal/lexer.ts +12 -5
- package/src/cli/internal/parser.ts +43 -14
- package/src/cli/internal/wizard.ts +2 -1
- package/src/cluster/ClusterCron.ts +94 -35
- package/src/cluster/ClusterMetrics.ts +149 -7
- package/src/cluster/ClusterWorkflowEngine.ts +164 -53
- package/src/cluster/Entity.ts +4 -0
- package/src/cluster/MessageStorage.ts +21 -3
- package/src/cluster/Runners.ts +145 -72
- package/src/cluster/Sharding.ts +118 -38
- package/src/cluster/ShardingConfig.ts +15 -0
- package/src/cluster/SqlMessageStorage.ts +58 -55
- package/src/cluster/SqlRunnerStorage.ts +10 -4
- package/src/cluster/internal/entityManager.ts +81 -11
- package/src/devtools/DevTools.ts +3 -2
- package/src/devtools/DevToolsClient.ts +27 -10
- 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 +1 -1
- package/src/encoding/Tar.ts +1417 -0
- package/src/encoding/Toml.ts +3 -3
- 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 +453 -173
- 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 +123 -0
- package/src/graphql/GraphQLClient.ts +17 -5
- package/src/graphql/GraphQLClientError.ts +5 -12
- package/src/graphql/GraphQLProtocol.ts +277 -20
- package/src/graphql/GraphQLResolver.ts +109 -230
- package/src/http/FetchHttpClient.ts +61 -8
- package/src/http/FindMyWay/internal/router.ts +13 -1
- package/src/http/Headers.ts +343 -163
- package/src/http/HttpClient.ts +144 -136
- package/src/http/HttpClientError.ts +10 -6
- package/src/http/HttpClientRequest.ts +315 -11
- 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 +265 -28
- package/src/http/HttpRouter.ts +67 -14
- package/src/http/HttpServerError.ts +14 -7
- package/src/http/HttpServerRequest.ts +73 -14
- package/src/http/HttpServerResponse.ts +49 -23
- package/src/http/HttpStaticServer.ts +29 -19
- package/src/http/HttpTraceContext.ts +1 -1
- package/src/http/MultipartParser/internal/contentType.ts +107 -6
- package/src/http/MultipartParser/internal/headers.ts +4 -16
- package/src/http/MultipartParser/internal/multipart.ts +10 -32
- package/src/http/Url.ts +8 -2
- package/src/http/UrlParams.ts +225 -26
- package/src/http/internal/compression.ts +3 -17
- package/src/http/internal/compressionBody.ts +56 -0
- package/src/http/internal/decompression.ts +235 -0
- package/src/http/internal/lazyStream.ts +25 -0
- package/src/http/internal/requestState.ts +33 -0
- package/src/http/internal/tracing.ts +21 -4
- package/src/http/internal/urlParams.ts +5 -0
- package/src/http/internal/webResponse.ts +20 -0
- package/src/http-api/HttpApi.ts +1 -1
- package/src/http-api/HttpApiBuilder.ts +151 -23
- package/src/http-api/HttpApiClient.ts +160 -31
- package/src/http-api/HttpApiEndpoint.ts +144 -33
- package/src/http-api/HttpApiError.ts +55 -0
- package/src/http-api/HttpApiScalar.ts +4 -3
- package/src/http-api/HttpApiSchema.ts +275 -13
- package/src/http-api/HttpApiSwagger.ts +11 -4
- package/src/http-api/HttpApiTest.ts +33 -9
- package/src/http-api/OpenApi.ts +84 -42
- package/src/http-api/internal/path.ts +40 -12
- package/src/index.ts +24 -0
- package/src/internal/core.ts +22 -2
- package/src/internal/dateTime.ts +20 -7
- package/src/internal/effect.ts +125 -88
- package/src/internal/graphql.ts +30 -7
- package/src/internal/hashMap.ts +2 -2
- package/src/internal/hydration.ts +15 -0
- package/src/internal/inflate.ts +710 -0
- 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/fromJsonSchemaDocument.ts +262 -193
- package/src/internal/schema/interpreter.ts +58 -45
- package/src/internal/schema/standardSchema.ts +32 -30
- package/src/internal/schema/toCodeDocument.ts +8 -3
- package/src/internal/schema/toCodec.ts +116 -1
- package/src/internal/schema/toFormatter.ts +6 -6
- package/src/internal/schema/toJsonSchemaDocument.ts +69 -39
- 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/Otlp.ts +18 -0
- package/src/observability/OtlpExporter.ts +19 -15
- package/src/observability/OtlpLogger.ts +31 -2
- package/src/observability/OtlpMetrics.ts +35 -4
- package/src/observability/OtlpResource.ts +16 -6
- package/src/observability/OtlpSerialization.ts +17 -3
- package/src/observability/OtlpTracer.ts +32 -3
- package/src/observability/internal/protobuf.ts +2 -10
- 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/UserDirectories.ts +273 -0
- package/src/persistence/index.ts +6 -0
- package/src/process/ChildProcess.ts +2 -1
- package/src/reactivity/AsyncResult.ts +35 -38
- package/src/reactivity/Atom.ts +134 -166
- package/src/reactivity/AtomHttpApi.ts +10 -16
- package/src/reactivity/AtomRegistry.ts +53 -30
- 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 +285 -104
- package/src/rpc/RpcSerialization.ts +21 -5
- package/src/rpc/RpcServer.ts +11 -20
- package/src/schema/VariantSchema.ts +86 -22
- package/src/socket/Socket.ts +45 -20
- package/src/sql/Migrator.ts +19 -9
- package/src/sql/SqlClient.ts +275 -36
- package/src/sql/SqlResolver.ts +9 -0
- package/src/sql/Statement.ts +35 -8
- package/src/testing/TestClock.ts +147 -29
- package/src/testing/TestSchema.ts +9 -3
- package/src/workflow/Activity.ts +1 -0
- package/src/workflow/Workflow.ts +31 -5
- package/src/workflow/WorkflowEngine.ts +93 -31
- 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 { 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,298 @@ 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
|
+
})
|
|
271
|
+
|
|
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
|
+
})
|
|
93
288
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
sql
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
sql`
|
|
113
|
-
CREATE TABLE IF NOT EXISTS ${remotesTableSql} (
|
|
114
|
-
remote_id UNIQUEIDENTIFIER NOT NULL,
|
|
115
|
-
entry_id UNIQUEIDENTIFIER NOT NULL,
|
|
116
|
-
sequence INT NOT NULL,
|
|
117
|
-
PRIMARY KEY (remote_id, entry_id)
|
|
118
|
-
)`,
|
|
119
|
-
orElse: () =>
|
|
120
|
-
sql`
|
|
121
|
-
CREATE TABLE IF NOT EXISTS ${remotesTableSql} (
|
|
122
|
-
remote_id BLOB NOT NULL,
|
|
123
|
-
entry_id BLOB NOT NULL,
|
|
124
|
-
sequence INT NOT NULL,
|
|
125
|
-
PRIMARY KEY (remote_id, entry_id)
|
|
126
|
-
)`
|
|
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
318
|
execute: (entries) => sql`INSERT INTO ${entryTableSql} ${sql.insert(entries)} ON CONFLICT DO NOTHING`
|
|
140
319
|
})
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
320
|
+
const insertSources = (entries: ReadonlyArray<EventJournal.Entry>, remoteId: EventJournal.RemoteId) =>
|
|
321
|
+
sql`INSERT INTO ${sourcesTableSql} ${
|
|
322
|
+
sql.insert(entries.map((entry) => ({ entry_id: entry.id, remote_id: remoteId })))
|
|
323
|
+
} ON CONFLICT DO NOTHING`
|
|
324
|
+
// Serialize writers so checkpoints cannot skip out-of-order commits.
|
|
325
|
+
// Lock before callbacks in both paths to avoid projection-row deadlocks.
|
|
326
|
+
const lockWriters = sql.onDialectOrElse({
|
|
327
|
+
pg: () => Effect.asVoid(sql`LOCK TABLE ${sequenceTableSql} IN SHARE ROW EXCLUSIVE MODE`),
|
|
328
|
+
orElse: () => Effect.void
|
|
144
329
|
})
|
|
330
|
+
const insertSequence = (entries: ReadonlyArray<EventJournal.Entry>) =>
|
|
331
|
+
sql`INSERT INTO ${sequenceTableSql} ${
|
|
332
|
+
sql.insert(entries.map((entry) => ({ entry_id: entry.id })))
|
|
333
|
+
} ON CONFLICT DO NOTHING`
|
|
334
|
+
|
|
335
|
+
const decodeCursorRows = Schema.decodeUnknownEffect(CursorRowArray)
|
|
336
|
+
|
|
337
|
+
const readCursor = (remoteId: EventJournal.RemoteId) =>
|
|
338
|
+
sql`SELECT next_sequence FROM ${remoteCursorsTableSql} WHERE remote_id = ${remoteId}`.pipe(
|
|
339
|
+
Effect.flatMap(decodeCursorRows),
|
|
340
|
+
Effect.map((rows) => rows.length > 0 ? rows[0].next_sequence : 0)
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
// Cursors only move forward.
|
|
344
|
+
const writeCursor = (remoteId: EventJournal.RemoteId, next: number) =>
|
|
345
|
+
sql`
|
|
346
|
+
INSERT INTO ${remoteCursorsTableSql} ${sql.insert({ remote_id: remoteId, next_sequence: next })}
|
|
347
|
+
ON CONFLICT (remote_id) DO UPDATE SET next_sequence = excluded.next_sequence
|
|
348
|
+
WHERE ${remoteCursorsTableSql}.next_sequence < excluded.next_sequence
|
|
349
|
+
`
|
|
145
350
|
|
|
146
351
|
const pubsub = yield* PubSub.unbounded<EventJournal.Entry>()
|
|
352
|
+
const clock = yield* Clock.Clock
|
|
147
353
|
|
|
148
354
|
const writeFromRemote = Effect.fnUntraced(function*(options: WriteFromRemoteOptions): Effect.fn.Return<
|
|
149
355
|
{
|
|
@@ -152,11 +358,8 @@ export const make = (options?: {
|
|
|
152
358
|
EventJournal.EventJournalError | Schema.SchemaError | SqlError.SqlError
|
|
153
359
|
> {
|
|
154
360
|
const entries = options.entries.map((remoteEntry) => remoteEntry.entry)
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
entry_id: remoteEntry.entry.id,
|
|
158
|
-
sequence: remoteEntry.remoteSequence
|
|
159
|
-
}))
|
|
361
|
+
|
|
362
|
+
yield* lockWriters
|
|
160
363
|
|
|
161
364
|
const existingIds = new Set<string>()
|
|
162
365
|
if (entries.length > 0) {
|
|
@@ -176,14 +379,14 @@ export const make = (options?: {
|
|
|
176
379
|
)
|
|
177
380
|
)
|
|
178
381
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
382
|
+
// Overlapping batches can repeat an entry; the first copy wins.
|
|
383
|
+
const incomingIds = new Set<string>()
|
|
384
|
+
const uncommitted = options.entries.filter((entry) => {
|
|
385
|
+
const idString = entry.entry.idString
|
|
386
|
+
if (existingIds.has(idString) || incomingIds.has(idString)) return false
|
|
387
|
+
incomingIds.add(idString)
|
|
388
|
+
return true
|
|
389
|
+
})
|
|
187
390
|
const duplicateEntries = options.entries
|
|
188
391
|
.filter((entry) => existingIds.has(entry.entry.idString))
|
|
189
392
|
.map((entry) => entry.entry)
|
|
@@ -191,56 +394,111 @@ export const make = (options?: {
|
|
|
191
394
|
? yield* options.compact(uncommitted)
|
|
192
395
|
: uncommitted.map((remoteEntry) => remoteEntry.entry)
|
|
193
396
|
|
|
194
|
-
|
|
195
|
-
const
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
397
|
+
if (Arr.isReadonlyArrayNonEmpty(compacted)) {
|
|
398
|
+
const index = new ConflictIndex(compacted)
|
|
399
|
+
const primaryKeys = Array.from(new Set(compacted.map((entry) => entry.primaryKey)))
|
|
400
|
+
// Match the hash index; exact predicates below rule out hash collisions.
|
|
401
|
+
const hashed = sql.onDialectOrElse({
|
|
402
|
+
pg: () => [
|
|
403
|
+
sql`md5(event) IN (${sql.csv(index.events.map((event) => sql`md5(${event})`))})`,
|
|
404
|
+
sql`md5(primary_key) IN (${sql.csv(primaryKeys.map((primaryKey) => sql`md5(${primaryKey})`))})`
|
|
405
|
+
],
|
|
406
|
+
orElse: () => []
|
|
407
|
+
})
|
|
408
|
+
const conflicts = sql.and([
|
|
409
|
+
...hashed,
|
|
410
|
+
sql.in("event", index.events),
|
|
411
|
+
sql.in("primary_key", primaryKeys),
|
|
412
|
+
// A coarse filter: the index compares ids exactly.
|
|
413
|
+
sql`timestamp >= ${index.oldestMillis}`
|
|
414
|
+
])
|
|
415
|
+
const stored = yield* sql`SELECT * FROM ${entryTableSql} WHERE ${conflicts}`.pipe(
|
|
203
416
|
Effect.flatMap(decodeEntryRows),
|
|
204
417
|
Effect.map(toEntries)
|
|
205
418
|
)
|
|
206
|
-
|
|
419
|
+
for (const entry of stored) {
|
|
420
|
+
index.add(entry)
|
|
421
|
+
}
|
|
422
|
+
yield* options.effect(index.toBatch())
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
// Keep the incoming batch out of conflict queries and persist only after
|
|
426
|
+
// compaction and every callback have succeeded.
|
|
427
|
+
if (uncommitted.length > 0) {
|
|
428
|
+
const imported = uncommitted.map((remoteEntry) => remoteEntry.entry)
|
|
429
|
+
yield* insertEntries(imported.map(toEntryRow))
|
|
430
|
+
yield* insertSequence(imported)
|
|
431
|
+
yield* insertSources(imported, options.remoteId)
|
|
432
|
+
}
|
|
433
|
+
// The change stream is ordered, so every earlier sequence is now known.
|
|
434
|
+
if (options.entries.length > 0) {
|
|
435
|
+
yield* writeCursor(options.remoteId, EventJournal.nextSequenceAfter(options.entries))
|
|
207
436
|
}
|
|
437
|
+
yield* EventJournal.warnIfAhead(clock, uncommitted.map((remoteEntry) => remoteEntry.entry.id))
|
|
208
438
|
|
|
209
439
|
return {
|
|
210
440
|
duplicateEntries
|
|
211
441
|
}
|
|
212
442
|
})
|
|
213
443
|
|
|
444
|
+
// Other processes share the database but not the entry id sequence. Ids in
|
|
445
|
+
// the latest millisecond are few, and comparing them here avoids ordering
|
|
446
|
+
// id bytes in SQL.
|
|
447
|
+
const latestEntryIds = sql`
|
|
448
|
+
SELECT id FROM ${entryTableSql} WHERE timestamp = (SELECT MAX(timestamp) FROM ${entryTableSql})
|
|
449
|
+
`.pipe(
|
|
450
|
+
Effect.flatMap(decodeEntryIdRows),
|
|
451
|
+
Effect.map((rows) => rows.map((row) => row.id))
|
|
452
|
+
)
|
|
453
|
+
|
|
454
|
+
const writeMany: EventJournal.EventJournal["Service"]["writeMany"] = ({ effect, entries }) =>
|
|
455
|
+
Effect.uninterruptibleMask((restore) =>
|
|
456
|
+
Effect.gen(function*() {
|
|
457
|
+
yield* lockWriters
|
|
458
|
+
// Rows visible here include an enclosing transaction's uncommitted
|
|
459
|
+
// ones, which local ids must also sort after.
|
|
460
|
+
const committed = yield* EventJournal.makeEntries(entries, yield* latestEntryIds)
|
|
461
|
+
const result = yield* restore(effect(committed)).pipe(
|
|
462
|
+
Effect.mapError((error) => new CallbackFailure(error))
|
|
463
|
+
)
|
|
464
|
+
yield* insertEntries(committed.map(toEntryRow))
|
|
465
|
+
yield* insertSequence(committed)
|
|
466
|
+
return { result, committed }
|
|
467
|
+
}).pipe(
|
|
468
|
+
sql.withTransaction,
|
|
469
|
+
Effect.mapError((error) =>
|
|
470
|
+
error instanceof CallbackFailure
|
|
471
|
+
? error.error
|
|
472
|
+
: error instanceof EventJournal.EventJournalError
|
|
473
|
+
? error
|
|
474
|
+
: new EventJournal.EventJournalError({ cause: error, method: "writeMany" })
|
|
475
|
+
),
|
|
476
|
+
Effect.flatMap(({ committed, result }) => Effect.as(PubSub.publishAll(pubsub, committed), result))
|
|
477
|
+
)
|
|
478
|
+
).pipe(withTracerDisabled)
|
|
479
|
+
|
|
214
480
|
return EventJournal.EventJournal.of({
|
|
215
481
|
entries: sql`SELECT * FROM ${entryTableSql} ORDER BY timestamp ASC`.pipe(
|
|
216
482
|
withTracerDisabled,
|
|
217
483
|
Effect.flatMap(decodeEntryRows),
|
|
218
|
-
Effect.map(
|
|
484
|
+
Effect.map(toOrderedEntries),
|
|
219
485
|
Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "entries" }))
|
|
220
486
|
),
|
|
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
|
-
),
|
|
487
|
+
entriesById: (ids) =>
|
|
488
|
+
ids.length === 0 ? Effect.succeed([]) : sql`SELECT * FROM ${entryTableSql} WHERE ${sql.in("id", ids)}`.pipe(
|
|
489
|
+
withTracerDisabled,
|
|
490
|
+
Effect.flatMap(decodeEntryRows),
|
|
491
|
+
Effect.map((rows) => {
|
|
492
|
+
const byId = new Map(toEntries(rows).map((entry) => [entry.idString, entry]))
|
|
493
|
+
return ids.map((id) => byId.get(Uuid.stringify(id)))
|
|
494
|
+
}),
|
|
495
|
+
Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "entriesById" }))
|
|
496
|
+
),
|
|
497
|
+
write: ({ effect, ...entry }) => writeMany({ entries: [entry], effect: (entries) => effect(entries[0]) }),
|
|
498
|
+
writeMany,
|
|
242
499
|
writeFromRemote: (options) =>
|
|
243
500
|
writeFromRemote(options).pipe(
|
|
501
|
+
sql.withTransaction,
|
|
244
502
|
withTracerDisabled,
|
|
245
503
|
Effect.catchIf(
|
|
246
504
|
(e) => e._tag !== "EventJournalError",
|
|
@@ -249,36 +507,66 @@ export const make = (options?: {
|
|
|
249
507
|
),
|
|
250
508
|
withRemoteUncommited: Effect.fnUntraced(
|
|
251
509
|
function*(remoteId, f) {
|
|
510
|
+
const mapError = Effect.mapError((cause: unknown) =>
|
|
511
|
+
new EventJournal.EventJournalError({ cause, method: "withRemoteUncommited" })
|
|
512
|
+
)
|
|
513
|
+
// Capture an upper bound so entries committed during upload remain pending.
|
|
514
|
+
const [{ checkpoint, latest }] = yield* sql`
|
|
515
|
+
SELECT
|
|
516
|
+
COALESCE((SELECT sequence FROM ${checkpointsTableSql} WHERE remote_id = ${remoteId}), 0) AS checkpoint,
|
|
517
|
+
COALESCE((SELECT MAX(sequence) FROM ${sequenceTableSql}), 0) AS latest
|
|
518
|
+
`.pipe(Effect.flatMap(decodeUploadBounds), mapError)
|
|
519
|
+
if (latest <= checkpoint) return yield* Effect.succeedNone
|
|
252
520
|
const entries = yield* sql`
|
|
253
|
-
SELECT
|
|
254
|
-
FROM ${
|
|
255
|
-
|
|
256
|
-
|
|
521
|
+
SELECT e.*
|
|
522
|
+
FROM ${sequenceTableSql} s
|
|
523
|
+
JOIN ${entryTableSql} e ON e.id = s.entry_id
|
|
524
|
+
WHERE s.sequence > ${checkpoint} AND
|
|
525
|
+
s.sequence <= ${latest} AND
|
|
526
|
+
NOT EXISTS (
|
|
527
|
+
SELECT 1 FROM ${sourcesTableSql} src WHERE src.entry_id = s.entry_id AND src.remote_id = ${remoteId}
|
|
528
|
+
)
|
|
257
529
|
`.pipe(
|
|
258
530
|
Effect.flatMap(decodeEntryRows),
|
|
259
|
-
Effect.map(
|
|
260
|
-
|
|
531
|
+
Effect.map(toOrderedEntries),
|
|
532
|
+
mapError
|
|
533
|
+
)
|
|
534
|
+
// Uploads can complete out of order; the checkpoint only moves forward.
|
|
535
|
+
const saveCheckpoint = sql`
|
|
536
|
+
INSERT INTO ${checkpointsTableSql} ${sql.insert({ remote_id: remoteId, sequence: latest })}
|
|
537
|
+
ON CONFLICT (remote_id) DO UPDATE SET sequence = excluded.sequence
|
|
538
|
+
WHERE ${checkpointsTableSql}.sequence < excluded.sequence
|
|
539
|
+
`.pipe(mapError)
|
|
540
|
+
return yield* Effect.uninterruptibleMask((restore) =>
|
|
541
|
+
restore(Arr.isReadonlyArrayNonEmpty(entries) ? Effect.asSome(f(entries)) : Effect.succeedNone).pipe(
|
|
542
|
+
Effect.tap(saveCheckpoint)
|
|
543
|
+
)
|
|
261
544
|
)
|
|
262
|
-
if (!Arr.isReadonlyArrayNonEmpty(entries)) return yield* Effect.succeedNone
|
|
263
|
-
return yield* Effect.asSome(f(entries))
|
|
264
545
|
},
|
|
265
546
|
withTracerDisabled
|
|
266
547
|
),
|
|
548
|
+
writeRemoteAcks: Effect.fnUntraced(
|
|
549
|
+
function*({ acks, firstSequence, remoteId }) {
|
|
550
|
+
if (acks.length === 0) return
|
|
551
|
+
const next = yield* readCursor(remoteId)
|
|
552
|
+
yield* writeCursor(remoteId, EventJournal.advanceSequence(next, acks, firstSequence))
|
|
553
|
+
},
|
|
554
|
+
(_) => sql.withTransaction(_),
|
|
555
|
+
(_) => withTracerDisabled(_),
|
|
556
|
+
Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "writeRemoteAcks" }))
|
|
557
|
+
),
|
|
267
558
|
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
|
-
),
|
|
559
|
+
readCursor(remoteId).pipe(
|
|
560
|
+
withTracerDisabled,
|
|
561
|
+
Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "nextRemoteSequence" }))
|
|
562
|
+
),
|
|
278
563
|
changes: PubSub.subscribe(pubsub),
|
|
279
564
|
destroy: Effect.gen(function*() {
|
|
280
565
|
yield* sql`DROP TABLE ${entryTableSql}`
|
|
281
|
-
yield* sql`DROP TABLE ${
|
|
566
|
+
yield* sql`DROP TABLE ${sequenceTableSql}`
|
|
567
|
+
yield* sql`DROP TABLE ${sourcesTableSql}`
|
|
568
|
+
yield* sql`DROP TABLE ${checkpointsTableSql}`
|
|
569
|
+
yield* sql`DROP TABLE ${remoteCursorsTableSql}`
|
|
282
570
|
}).pipe(
|
|
283
571
|
withTracerDisabled,
|
|
284
572
|
Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "destroy" }))
|
|
@@ -293,25 +581,11 @@ export const make = (options?: {
|
|
|
293
581
|
})
|
|
294
582
|
|
|
295
583
|
/**
|
|
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`.
|
|
584
|
+
* Provides a SQL-backed `EventJournal` from an existing `SqlClient` service.
|
|
309
585
|
*
|
|
310
586
|
* **Gotchas**
|
|
311
587
|
*
|
|
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.
|
|
588
|
+
* Creating or migrating the schema requires a writable connection.
|
|
315
589
|
*
|
|
316
590
|
* @see {@link make} for constructing the SQL-backed service directly
|
|
317
591
|
* @see {@link EventJournal.layerMemory} for an in-memory `EventJournal` layer
|
|
@@ -324,6 +598,7 @@ export const make = (options?: {
|
|
|
324
598
|
export const layer = (options?: {
|
|
325
599
|
readonly entryTable?: string
|
|
326
600
|
readonly remotesTable?: string
|
|
601
|
+
readonly remoteCursorsTable?: string
|
|
327
602
|
}): Layer.Layer<EventJournal.EventJournal, SqlError.SqlError, SqlClient.SqlClient> =>
|
|
328
603
|
Layer.effect(EventJournal.EventJournal)(make(options))
|
|
329
604
|
|
|
@@ -366,6 +641,9 @@ const EntryRow = Schema.Struct({
|
|
|
366
641
|
})
|
|
367
642
|
|
|
368
643
|
const EntryRowArray = Schema.Array(EntryRow)
|
|
644
|
+
const decodeUploadBounds = Schema.decodeUnknownEffect(Schema.Tuple([
|
|
645
|
+
Schema.Struct({ checkpoint: SqlNatural, latest: SqlNatural })
|
|
646
|
+
]))
|
|
369
647
|
const EntryIdRowArray = Schema.Array(Schema.Struct({ id: SqlEntryId }))
|
|
370
648
|
|
|
371
649
|
type EntryRow = Schema.Schema.Type<typeof EntryRow>
|
|
@@ -386,12 +664,14 @@ const toEntryRow = (entry: EventJournal.Entry): EntryRow => ({
|
|
|
386
664
|
timestamp: EventJournal.entryIdMillis(entry.id)
|
|
387
665
|
})
|
|
388
666
|
|
|
389
|
-
const
|
|
390
|
-
remote_id: EventJournal.RemoteId,
|
|
391
|
-
entry_id: EventJournal.EntryId,
|
|
392
|
-
sequence: Schema.Natural
|
|
393
|
-
})
|
|
394
|
-
|
|
395
|
-
const RemoteRowArray = Schema.Array(RemoteRow)
|
|
667
|
+
const CursorRowArray = Schema.Array(Schema.Struct({ next_sequence: SqlNatural }))
|
|
396
668
|
|
|
397
669
|
const withTracerDisabled = Effect.withTracerEnabled(false)
|
|
670
|
+
|
|
671
|
+
// Preserve callback errors without wrapping them as journal SQL errors.
|
|
672
|
+
class CallbackFailure<E> {
|
|
673
|
+
readonly error: E
|
|
674
|
+
constructor(error: E) {
|
|
675
|
+
this.error = error
|
|
676
|
+
}
|
|
677
|
+
}
|