effect 4.0.5 → 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/tsconfig.json +3 -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 +125 -30
- 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/Duration.d.ts.map +1 -1
- package/dist/Duration.js +56 -16
- package/dist/Duration.js.map +1 -1
- package/dist/Effect.d.ts +487 -163
- package/dist/Effect.d.ts.map +1 -1
- package/dist/Effect.js +203 -37
- 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 +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/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/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.map +1 -1
- package/dist/Path.js +8 -1
- 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 +384 -332
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +333 -19
- 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 +4 -2
- package/dist/String.d.ts.map +1 -1
- package/dist/String.js +8 -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/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/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.map +1 -1
- package/dist/ai/McpServer.js +25 -22
- 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 +147 -3
- 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 +5 -0
- package/dist/cli/Completions.d.ts.map +1 -1
- package/dist/cli/Completions.js.map +1 -1
- package/dist/cli/Flag.d.ts +115 -0
- package/dist/cli/Flag.d.ts.map +1 -1
- package/dist/cli/Flag.js +56 -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 +107 -0
- package/dist/cli/Param.d.ts.map +1 -1
- package/dist/cli/Param.js +56 -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 +5 -2
- package/dist/cli/internal/command.js.map +1 -1
- package/dist/cli/internal/completions/bash.js +4 -3
- 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 +37 -11
- 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.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 +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 +65 -8
- 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/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/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/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 +93 -0
- package/dist/http/HttpClient.d.ts.map +1 -1
- package/dist/http/HttpClient.js +55 -16
- package/dist/http/HttpClient.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 +44 -2
- 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 +159 -13
- package/dist/http/HttpMiddleware.js.map +1 -1
- package/dist/http/HttpRouter.d.ts.map +1 -1
- package/dist/http/HttpRouter.js +7 -2
- 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 +5 -3
- 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 +36 -10
- 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 +21 -7
- 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 +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 +6 -1
- package/dist/http/Url.js.map +1 -1
- package/dist/http/internal/decompression.js +17 -11
- package/dist/http/internal/decompression.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/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 +83 -23
- 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 +1 -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 +85 -74
- package/dist/internal/effect.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/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/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/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.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 +196 -60
- 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 +143 -5
- package/dist/sql/SqlClient.d.ts.map +1 -1
- package/dist/sql/SqlClient.js +148 -27
- 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.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/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/Array.ts +128 -55
- package/src/Bytes.ts +111 -0
- package/src/Channel.ts +263 -436
- 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/Duration.ts +66 -16
- package/src/Effect.ts +502 -167
- 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 +10 -0
- 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/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 +9 -1
- 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 +591 -356
- 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 +8 -8
- package/src/TextDiff.ts +766 -0
- 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/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 +217 -220
- 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 +5 -0
- package/src/cli/Flag.ts +117 -0
- package/src/cli/GlobalFlag.ts +3 -3
- package/src/cli/Param.ts +122 -0
- package/src/cli/TerminalCapabilities.ts +156 -0
- package/src/cli/index.ts +6 -0
- package/src/cli/internal/command.ts +8 -3
- package/src/cli/internal/completions/bash.ts +4 -3
- 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 +84 -41
- package/src/cluster/Entity.ts +4 -0
- package/src/cluster/MessageStorage.ts +7 -0
- package/src/cluster/Runners.ts +76 -25
- 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 +80 -10
- 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/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/GraphQLClientError.ts +5 -12
- package/src/graphql/GraphQLProtocol.ts +12 -9
- package/src/graphql/GraphQLResolver.ts +90 -239
- 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 +126 -135
- package/src/http/HttpClientRequest.ts +142 -4
- 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 +180 -23
- package/src/http/HttpRouter.ts +8 -2
- package/src/http/HttpServerError.ts +6 -3
- package/src/http/HttpServerRequest.ts +71 -12
- package/src/http/HttpServerResponse.ts +49 -23
- package/src/http/HttpStaticServer.ts +25 -9
- 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 +6 -1
- package/src/http/internal/decompression.ts +26 -17
- package/src/http/internal/lazyStream.ts +25 -0
- package/src/http/internal/requestState.ts +33 -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 +158 -30
- 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 +1 -1
- package/src/internal/dateTime.ts +20 -7
- package/src/internal/effect.ts +120 -84
- 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/OtlpExporter.ts +5 -12
- package/src/observability/OtlpMetrics.ts +5 -3
- package/src/observability/OtlpResource.ts +16 -6
- package/src/observability/OtlpSerialization.ts +17 -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 +4 -38
- 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 +279 -103
- 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 +266 -29
- package/src/sql/SqlResolver.ts +9 -0
- package/src/sql/Statement.ts +35 -8
- package/src/testing/TestClock.ts +4 -1
- package/src/testing/TestSchema.ts +9 -3
- 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
|
@@ -13,17 +13,20 @@
|
|
|
13
13
|
* @since 4.0.0
|
|
14
14
|
*/
|
|
15
15
|
import * as Arr from "../Array.js";
|
|
16
|
+
import * as Clock from "../Clock.js";
|
|
16
17
|
import * as Context from "../Context.js";
|
|
17
18
|
import * as Data from "../Data.js";
|
|
18
19
|
import * as DateTime from "../DateTime.js";
|
|
19
20
|
import * as Effect from "../Effect.js";
|
|
20
21
|
import * as SchemaBinary from "../encoding/SchemaBinary.js";
|
|
22
|
+
import { constVoid } from "../Function.js";
|
|
21
23
|
import * as Uuid from "../internal/uuid.js";
|
|
22
24
|
import * as Layer from "../Layer.js";
|
|
23
25
|
import * as Order from "../Order.js";
|
|
24
26
|
import * as PubSub from "../PubSub.js";
|
|
25
27
|
import * as Schema from "../Schema.js";
|
|
26
28
|
import * as Semaphore from "../Semaphore.js";
|
|
29
|
+
import { ConflictIndex, entryIdOrder } from "./internal/conflicts.js";
|
|
27
30
|
/**
|
|
28
31
|
* Context service for storing and replaying event journal entries.
|
|
29
32
|
*
|
|
@@ -32,6 +35,9 @@ import * as Semaphore from "../Semaphore.js";
|
|
|
32
35
|
* The service writes local entries, imports entries from remote journals, exposes
|
|
33
36
|
* a stream of local changes, and provides per-store locking.
|
|
34
37
|
*
|
|
38
|
+
* Entries written by `EventLog` carry payloads encoded with their event's
|
|
39
|
+
* `payloadSchemaBinary`; see {@link Entry} for how to decode them.
|
|
40
|
+
*
|
|
35
41
|
* @stability unstable
|
|
36
42
|
* @category services
|
|
37
43
|
* @since 4.0.0
|
|
@@ -115,14 +121,50 @@ export const EntryId = /*#__PURE__*/Schema.Uint8Array.pipe(/*#__PURE__*/Schema.b
|
|
|
115
121
|
* @category ordering
|
|
116
122
|
* @since 4.0.0
|
|
117
123
|
*/
|
|
118
|
-
export const EntryIdOrder =
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
124
|
+
export const EntryIdOrder = entryIdOrder;
|
|
125
|
+
const maxEntryIdMillis = 2 ** 48 - 1;
|
|
126
|
+
const processEntryIds = {
|
|
127
|
+
millis: 0,
|
|
128
|
+
counter: 0
|
|
129
|
+
};
|
|
130
|
+
const nextEntryId = (sequence, now) => {
|
|
131
|
+
if (now > sequence.millis) {
|
|
132
|
+
sequence.millis = now;
|
|
133
|
+
sequence.counter = 0;
|
|
134
|
+
} else if (++sequence.counter > 0xfff) {
|
|
135
|
+
sequence.millis++;
|
|
136
|
+
sequence.counter = 0;
|
|
123
137
|
}
|
|
124
|
-
|
|
125
|
-
|
|
138
|
+
// The sequence only moves forward, so once exhausted it stays exhausted.
|
|
139
|
+
if (sequence.millis > maxEntryIdMillis) {
|
|
140
|
+
throw new RangeError("The entry id sequence has passed the last UUID v7 millisecond");
|
|
141
|
+
}
|
|
142
|
+
const bytes = Uuid.v7Bytes(sequence.millis);
|
|
143
|
+
// The counter replaces the 12 random `rand_a` bits after the version.
|
|
144
|
+
bytes[6] = 0x70 | sequence.counter >> 8;
|
|
145
|
+
bytes[7] = sequence.counter & 0xff;
|
|
146
|
+
return bytes;
|
|
147
|
+
};
|
|
148
|
+
// The process sequence, or a copy advanced to `floor` when that is later. The
|
|
149
|
+
// copy is never written back, so a floor read from uncommitted rows leaves the
|
|
150
|
+
// process sequence alone.
|
|
151
|
+
const sequenceAfter = floor => {
|
|
152
|
+
if (floor === undefined) return processEntryIds;
|
|
153
|
+
const millis = entryIdMillis(floor);
|
|
154
|
+
// Continuing from the floor's `rand_a` sorts the next id after it.
|
|
155
|
+
const counter = (floor[6] & 0x0f) << 8 | floor[7];
|
|
156
|
+
return millis > processEntryIds.millis || millis === processEntryIds.millis && counter > processEntryIds.counter ? {
|
|
157
|
+
millis,
|
|
158
|
+
counter
|
|
159
|
+
} : processEntryIds;
|
|
160
|
+
};
|
|
161
|
+
const maxEntryId = ids => {
|
|
162
|
+
let latest;
|
|
163
|
+
for (const id of ids) {
|
|
164
|
+
if (latest === undefined || EntryIdOrder(id, latest) === 1) latest = id;
|
|
165
|
+
}
|
|
166
|
+
return latest;
|
|
167
|
+
};
|
|
126
168
|
/**
|
|
127
169
|
* Generates a UUID v7 `EntryId`, optionally using the supplied millisecond
|
|
128
170
|
* timestamp.
|
|
@@ -132,16 +174,54 @@ export const EntryIdOrder = /*#__PURE__*/Order.make((a, b) => {
|
|
|
132
174
|
* Use when generating an event-log entry id internally and the UUID v7 bytes
|
|
133
175
|
* are trusted to satisfy the brand.
|
|
134
176
|
*
|
|
177
|
+
* **Details**
|
|
178
|
+
*
|
|
179
|
+
* Ids taken from the clock are strictly ascending within the current process.
|
|
180
|
+
* Ids created in the same millisecond carry an incrementing 12-bit counter. If
|
|
181
|
+
* the clock stalls or moves backwards, ids keep the last millisecond, and
|
|
182
|
+
* after 4096 ids in one millisecond they move to the next one.
|
|
183
|
+
*
|
|
184
|
+
* The journals generate local ids from this sequence, or from a copy of it
|
|
185
|
+
* advanced past the latest id in their store, so a local id sorts after every
|
|
186
|
+
* entry committed to that store, even when the local clock is behind.
|
|
187
|
+
*
|
|
135
188
|
* **Gotchas**
|
|
136
189
|
*
|
|
137
190
|
* This is unsafe because the generated UUID bytes are cast to the brand without
|
|
138
191
|
* schema validation.
|
|
139
192
|
*
|
|
193
|
+
* Throws a `RangeError` once the sequence passes the last UUID v7 millisecond.
|
|
194
|
+
* Every later call throws too, because any id it could return would sort before
|
|
195
|
+
* one already generated.
|
|
196
|
+
*
|
|
197
|
+
* Ids created with an explicit `msecs` are not part of the sequence, and clamp
|
|
198
|
+
* to the UUID v7 range.
|
|
199
|
+
*
|
|
140
200
|
* @stability unstable
|
|
141
201
|
* @category unsafe
|
|
142
202
|
* @since 4.0.0
|
|
143
203
|
*/
|
|
144
|
-
export const makeEntryIdUnsafe = (options = {}) => Uuid.v7Bytes(options.msecs
|
|
204
|
+
export const makeEntryIdUnsafe = (options = {}) => options.msecs !== undefined ? Uuid.v7Bytes(options.msecs) : nextEntryId(processEntryIds, Date.now());
|
|
205
|
+
// Imported ids further ahead of the local clock than this are logged.
|
|
206
|
+
const maxClockSkewMillis = 24 * 60 * 60 * 1000;
|
|
207
|
+
/**
|
|
208
|
+
* Logs a warning when the latest of the imported `ids` is more than 24 hours
|
|
209
|
+
* ahead of the supplied `clock`. Memory and IndexedDB journals call this after
|
|
210
|
+
* commit; SQL calls it at the end of its transaction body, so a later rollback
|
|
211
|
+
* (including an enclosing transaction rollback) can still leave a warning.
|
|
212
|
+
*
|
|
213
|
+
* @internal
|
|
214
|
+
*/
|
|
215
|
+
export const warnIfAhead = (clock, ids) => {
|
|
216
|
+
const latest = maxEntryId(ids);
|
|
217
|
+
if (latest === undefined) return Effect.void;
|
|
218
|
+
const ahead = entryIdMillis(latest) - clock.currentTimeMillisUnsafe();
|
|
219
|
+
if (ahead <= maxClockSkewMillis) return Effect.void;
|
|
220
|
+
return Effect.logWarning(`Imported an entry id ${Math.round(ahead / 3_600_000)} hours ahead of the local clock`).pipe(Effect.annotateLogs({
|
|
221
|
+
service: "EventJournal",
|
|
222
|
+
entryId: Uuid.stringify(latest)
|
|
223
|
+
}));
|
|
224
|
+
};
|
|
145
225
|
/**
|
|
146
226
|
* Extracts the millisecond timestamp encoded in a UUID v7 `EntryId`.
|
|
147
227
|
*
|
|
@@ -149,11 +229,9 @@ export const makeEntryIdUnsafe = (options = {}) => Uuid.v7Bytes(options.msecs ??
|
|
|
149
229
|
* @category getters
|
|
150
230
|
* @since 4.0.0
|
|
151
231
|
*/
|
|
152
|
-
export const entryIdMillis = entryId =>
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
return Number(new DataView(bytes.buffer).getBigUint64(0));
|
|
156
|
-
};
|
|
232
|
+
export const entryIdMillis = entryId =>
|
|
233
|
+
// Multiply instead of shifting: bitwise operators are signed 32-bit.
|
|
234
|
+
((((entryId[0] * 256 + entryId[1]) * 256 + entryId[2]) * 256 + entryId[3]) * 256 + entryId[4]) * 256 + entryId[5];
|
|
157
235
|
/**
|
|
158
236
|
* Schema for a committed event journal entry.
|
|
159
237
|
*
|
|
@@ -162,6 +240,14 @@ export const entryIdMillis = entryId => {
|
|
|
162
240
|
* An entry records its ID, event tag, primary key, and SchemaBinary-encoded
|
|
163
241
|
* payload, with helpers for array SchemaBinary encoding and creation timestamps.
|
|
164
242
|
*
|
|
243
|
+
* **Gotchas**
|
|
244
|
+
*
|
|
245
|
+
* `EventLog` encodes `payload` with the `payloadSchemaBinary` of the event whose
|
|
246
|
+
* tag is `entry.event`, so decode it with that event's codec. A codec with an
|
|
247
|
+
* incompatible wire layout, such as a union of a group's tagged payload schemas,
|
|
248
|
+
* cannot read it. Entries from remote journals can carry tags the local schema
|
|
249
|
+
* does not define.
|
|
250
|
+
*
|
|
165
251
|
* @stability unstable
|
|
166
252
|
* @category schemas
|
|
167
253
|
* @since 4.0.0
|
|
@@ -192,7 +278,7 @@ export class Entry extends /*#__PURE__*/Schema.Class("effect/eventlog/EventJourn
|
|
|
192
278
|
* @stability unstable
|
|
193
279
|
* @since 4.0.0
|
|
194
280
|
*/
|
|
195
|
-
static decodeArray =
|
|
281
|
+
static decodeArray = (input, options) => Effect.map(decodeEntryFieldsArray(input, options), Arr.map(entryFromFields));
|
|
196
282
|
/**
|
|
197
283
|
* Ordering for committed entries by their event journal entry id.
|
|
198
284
|
*
|
|
@@ -200,6 +286,7 @@ export class Entry extends /*#__PURE__*/Schema.Class("effect/eventlog/EventJourn
|
|
|
200
286
|
* @since 4.0.0
|
|
201
287
|
*/
|
|
202
288
|
static Order = /*#__PURE__*/Order.make((a, b) => EntryIdOrder(a.id, b.id));
|
|
289
|
+
#idString;
|
|
203
290
|
/**
|
|
204
291
|
* String representation of the entry id.
|
|
205
292
|
*
|
|
@@ -207,7 +294,7 @@ export class Entry extends /*#__PURE__*/Schema.Class("effect/eventlog/EventJourn
|
|
|
207
294
|
* @since 4.0.0
|
|
208
295
|
*/
|
|
209
296
|
get idString() {
|
|
210
|
-
return Uuid.stringify(this.id);
|
|
297
|
+
return this.#idString ??= Uuid.stringify(this.id);
|
|
211
298
|
}
|
|
212
299
|
/**
|
|
213
300
|
* Creation timestamp encoded in the UUID v7 entry id, in epoch milliseconds.
|
|
@@ -243,6 +330,41 @@ export class RemoteEntry extends /*#__PURE__*/Schema.Class("effect/eventlog/Even
|
|
|
243
330
|
remoteSequence: Schema.Natural,
|
|
244
331
|
entry: Entry
|
|
245
332
|
}) {}
|
|
333
|
+
// Decoding frames into the plain field structs and then constructing the
|
|
334
|
+
// classes from the already validated fields skips the per-instance class
|
|
335
|
+
// decode, which costs more than reading the frame. The wire format is the same.
|
|
336
|
+
/** @internal */
|
|
337
|
+
export const EntryFields = /*#__PURE__*/Schema.Struct(Entry.fields);
|
|
338
|
+
/** @internal */
|
|
339
|
+
export const entryFromFields = fields => Schema.makeClassTrusted(Entry, fields);
|
|
340
|
+
const decodeEntryFieldsArray = /*#__PURE__*/Schema.decodeUnknownEffect(/*#__PURE__*/Schema.Array(/*#__PURE__*/SchemaBinary.toCodec(EntryFields)));
|
|
341
|
+
/**
|
|
342
|
+
* Creates local entries with ids after every id in `after`, normally the
|
|
343
|
+
* latest id in the journal's store.
|
|
344
|
+
*
|
|
345
|
+
* @internal
|
|
346
|
+
*/
|
|
347
|
+
export const makeEntries = (entries, after) => Effect.try({
|
|
348
|
+
try: () => {
|
|
349
|
+
const sequence = sequenceAfter(maxEntryId(after));
|
|
350
|
+
return Arr.map(entries, ({
|
|
351
|
+
event,
|
|
352
|
+
payload,
|
|
353
|
+
primaryKey
|
|
354
|
+
}) => new Entry({
|
|
355
|
+
id: nextEntryId(sequence, Date.now()),
|
|
356
|
+
event,
|
|
357
|
+
primaryKey,
|
|
358
|
+
payload
|
|
359
|
+
}, {
|
|
360
|
+
disableChecks: true
|
|
361
|
+
}));
|
|
362
|
+
},
|
|
363
|
+
catch: cause => new EventJournalError({
|
|
364
|
+
method: "writeMany",
|
|
365
|
+
cause
|
|
366
|
+
})
|
|
367
|
+
});
|
|
246
368
|
/**
|
|
247
369
|
* Creates an in-memory `EventJournal` service.
|
|
248
370
|
*
|
|
@@ -257,6 +379,17 @@ export class RemoteEntry extends /*#__PURE__*/Schema.Class("effect/eventlog/Even
|
|
|
257
379
|
*/
|
|
258
380
|
export const makeMemory = /*#__PURE__*/Effect.gen(function* () {
|
|
259
381
|
const journal = [];
|
|
382
|
+
// Local writes append in commit order, which unserialized direct callers can
|
|
383
|
+
// make differ from id order, leaving the journal unordered until the next
|
|
384
|
+
// import re-sorts it. Remote backlogs are subsequences of the journal, so one
|
|
385
|
+
// flag covers them too.
|
|
386
|
+
let journalSorted = true;
|
|
387
|
+
// The latest committed id, the floor for local ids.
|
|
388
|
+
let latestId;
|
|
389
|
+
const commitLatest = ids => {
|
|
390
|
+
latestId = maxEntryId(latestId === undefined ? ids : [latestId, ...ids]);
|
|
391
|
+
};
|
|
392
|
+
const clock = yield* Clock.Clock;
|
|
260
393
|
const byId = new Map();
|
|
261
394
|
const remotes = new Map();
|
|
262
395
|
const pubsub = yield* PubSub.unbounded();
|
|
@@ -280,85 +413,80 @@ export const makeMemory = /*#__PURE__*/Effect.gen(function* () {
|
|
|
280
413
|
remotes.set(remoteIdString, created);
|
|
281
414
|
return created;
|
|
282
415
|
};
|
|
416
|
+
const writeMany = ({
|
|
417
|
+
effect,
|
|
418
|
+
entries
|
|
419
|
+
}) => Effect.acquireUseRelease(Effect.suspend(() => makeEntries(entries, latestId === undefined ? [] : [latestId])), effect, (entries, exit) => Effect.suspend(() => {
|
|
420
|
+
if (exit._tag === "Failure") return Effect.void;
|
|
421
|
+
for (const entry of entries) {
|
|
422
|
+
const last = journal[journal.length - 1];
|
|
423
|
+
if (last !== undefined && Entry.Order(last, entry) > 0) {
|
|
424
|
+
journalSorted = false;
|
|
425
|
+
}
|
|
426
|
+
journal.push(entry);
|
|
427
|
+
byId.set(entry.idString, entry);
|
|
428
|
+
remotes.forEach(remote => {
|
|
429
|
+
remote.missing.push(entry);
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
commitLatest(entries.map(entry => entry.id));
|
|
433
|
+
return PubSub.publishAll(pubsub, entries);
|
|
434
|
+
}));
|
|
283
435
|
return EventJournal.of({
|
|
284
436
|
entries: Effect.sync(() => journal.slice()),
|
|
285
|
-
write({
|
|
437
|
+
write: ({
|
|
286
438
|
effect,
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
event,
|
|
294
|
-
primaryKey,
|
|
295
|
-
payload
|
|
296
|
-
}, {
|
|
297
|
-
disableChecks: true
|
|
298
|
-
})), effect, (entry, exit) => Effect.suspend(() => {
|
|
299
|
-
if (exit._tag === "Failure" || byId.has(entry.idString)) return Effect.void;
|
|
300
|
-
journal.push(entry);
|
|
301
|
-
byId.set(entry.idString, entry);
|
|
302
|
-
remotes.forEach(remote => {
|
|
303
|
-
remote.missing.push(entry);
|
|
304
|
-
});
|
|
305
|
-
return PubSub.publish(pubsub, entry);
|
|
306
|
-
}));
|
|
307
|
-
},
|
|
439
|
+
...entry
|
|
440
|
+
}) => writeMany({
|
|
441
|
+
entries: [entry],
|
|
442
|
+
effect: entries => effect(entries[0])
|
|
443
|
+
}),
|
|
444
|
+
writeMany,
|
|
308
445
|
writeFromRemote: Effect.fnUntraced(function* (options) {
|
|
309
446
|
const remote = ensureRemote(options.remoteId);
|
|
310
447
|
const uncommittedRemotes = [];
|
|
311
|
-
const uncommitted = [];
|
|
312
448
|
const duplicateEntries = [];
|
|
449
|
+
// Overlapping batches can repeat an entry; the first copy wins.
|
|
450
|
+
const incomingIds = new Set();
|
|
313
451
|
for (const remoteEntry of options.entries) {
|
|
314
|
-
|
|
452
|
+
const idString = remoteEntry.entry.idString;
|
|
453
|
+
if (byId.has(idString)) {
|
|
315
454
|
duplicateEntries.push(remoteEntry.entry);
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
continue;
|
|
455
|
+
} else if (!incomingIds.has(idString)) {
|
|
456
|
+
incomingIds.add(idString);
|
|
457
|
+
uncommittedRemotes.push(remoteEntry);
|
|
320
458
|
}
|
|
321
|
-
uncommittedRemotes.push(remoteEntry);
|
|
322
|
-
uncommitted.push(remoteEntry.entry);
|
|
323
459
|
}
|
|
324
|
-
const compacted = options.compact ? yield* options.compact(uncommittedRemotes) :
|
|
325
|
-
|
|
326
|
-
const
|
|
327
|
-
const
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
const scannedEntry = journal[j];
|
|
335
|
-
if (scannedEntry.event === originEntry.event && scannedEntry.primaryKey === originEntry.primaryKey) {
|
|
336
|
-
conflicts.push(scannedEntry);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
yield* options.effect({
|
|
340
|
-
entry: originEntry,
|
|
341
|
-
conflicts
|
|
342
|
-
});
|
|
343
|
-
break;
|
|
460
|
+
const compacted = options.compact ? yield* options.compact(uncommittedRemotes) : uncommittedRemotes.map(remoteEntry => remoteEntry.entry);
|
|
461
|
+
if (Arr.isReadonlyArrayNonEmpty(compacted)) {
|
|
462
|
+
const index = new ConflictIndex(compacted);
|
|
463
|
+
const oldest = index.oldest;
|
|
464
|
+
// Only the suffix with greater ids can conflict, unless local writes
|
|
465
|
+
// left the journal unordered.
|
|
466
|
+
let i = journalSorted ? journal.length : 0;
|
|
467
|
+
while (i > 0 && Entry.Order(journal[i - 1], oldest) > 0) i--;
|
|
468
|
+
for (; i < journal.length; i++) {
|
|
469
|
+
index.add(journal[i]);
|
|
344
470
|
}
|
|
471
|
+
yield* options.effect(index.toBatch());
|
|
345
472
|
}
|
|
346
473
|
for (const remoteEntry of uncommittedRemotes) {
|
|
347
|
-
journal.push(remoteEntry.entry);
|
|
348
474
|
byId.set(remoteEntry.entry.idString, remoteEntry.entry);
|
|
349
|
-
remotes.forEach(target => {
|
|
350
|
-
if (target !== remote) {
|
|
351
|
-
target.missing.push(remoteEntry.entry);
|
|
352
|
-
}
|
|
353
|
-
});
|
|
354
|
-
if (remoteEntry.remoteSequence >= remote.sequence) {
|
|
355
|
-
remote.sequence = remoteEntry.remoteSequence + 1;
|
|
356
|
-
}
|
|
357
475
|
}
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
476
|
+
// Sequences advance with the commit, so a failed batch is redelivered.
|
|
477
|
+
remote.sequence = nextSequenceAfter(options.entries, remote.sequence);
|
|
478
|
+
const imported = uncommittedRemotes.map(remoteEntry => remoteEntry.entry).sort(Entry.Order);
|
|
479
|
+
insertOrdered(journal, journalSorted, imported);
|
|
480
|
+
remotes.forEach(target => {
|
|
481
|
+
if (target !== remote) {
|
|
482
|
+
insertOrdered(target.missing, journalSorted, imported);
|
|
483
|
+
} else if (!journalSorted) {
|
|
484
|
+
target.missing.sort(Entry.Order);
|
|
485
|
+
}
|
|
361
486
|
});
|
|
487
|
+
journalSorted = true;
|
|
488
|
+
commitLatest(imported.map(entry => entry.id));
|
|
489
|
+
yield* warnIfAhead(clock, imported.map(entry => entry.id));
|
|
362
490
|
return {
|
|
363
491
|
duplicateEntries
|
|
364
492
|
};
|
|
@@ -375,16 +503,48 @@ export const makeMemory = /*#__PURE__*/Effect.gen(function* () {
|
|
|
375
503
|
}
|
|
376
504
|
}
|
|
377
505
|
})),
|
|
506
|
+
writeRemoteAcks: ({
|
|
507
|
+
acks,
|
|
508
|
+
firstSequence,
|
|
509
|
+
remoteId
|
|
510
|
+
}) => Effect.sync(() => {
|
|
511
|
+
const remote = ensureRemote(remoteId);
|
|
512
|
+
remote.sequence = advanceSequence(remote.sequence, acks, firstSequence);
|
|
513
|
+
}),
|
|
378
514
|
nextRemoteSequence: remoteId => Effect.sync(() => ensureRemote(remoteId).sequence),
|
|
515
|
+
entriesById: ids => Effect.sync(() => ids.map(id => byId.get(Uuid.stringify(id)))),
|
|
379
516
|
changes: PubSub.subscribe(pubsub),
|
|
380
517
|
destroy: Effect.sync(() => {
|
|
381
518
|
journal.length = 0;
|
|
519
|
+
journalSorted = true;
|
|
520
|
+
latestId = undefined;
|
|
382
521
|
byId.clear();
|
|
383
522
|
remotes.clear();
|
|
384
523
|
}),
|
|
385
524
|
withLock
|
|
386
525
|
});
|
|
387
526
|
});
|
|
527
|
+
// Same result as appending `additions` and sorting by id.
|
|
528
|
+
const insertOrdered = (entries, sorted, additions) => {
|
|
529
|
+
let i = entries.length - 1;
|
|
530
|
+
for (let n = 0; n < additions.length; n++) {
|
|
531
|
+
entries.push(additions[n]);
|
|
532
|
+
}
|
|
533
|
+
if (!sorted) {
|
|
534
|
+
entries.sort(Entry.Order);
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
// Merge from the back, so additions sorting after the whole array cost O(additions).
|
|
538
|
+
let j = additions.length - 1;
|
|
539
|
+
let k = entries.length - 1;
|
|
540
|
+
while (j >= 0) {
|
|
541
|
+
if (i >= 0 && Entry.Order(entries[i], additions[j]) > 0) {
|
|
542
|
+
entries[k--] = entries[i--];
|
|
543
|
+
} else {
|
|
544
|
+
entries[k--] = additions[j--];
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
};
|
|
388
548
|
/**
|
|
389
549
|
* Layer that provides an in-memory `EventJournal`.
|
|
390
550
|
*
|
|
@@ -413,194 +573,239 @@ export const layerMemory = /*#__PURE__*/Layer.effect(EventJournal, makeMemory);
|
|
|
413
573
|
*/
|
|
414
574
|
export const makeIndexedDb = options => Effect.gen(function* () {
|
|
415
575
|
const database = options?.database ?? "effect_event_journal";
|
|
416
|
-
const openRequest = indexedDB.open(database,
|
|
417
|
-
openRequest.onupgradeneeded =
|
|
576
|
+
const openRequest = indexedDB.open(database, 2);
|
|
577
|
+
openRequest.onupgradeneeded = event => {
|
|
418
578
|
const db = openRequest.result;
|
|
419
|
-
const
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
579
|
+
const tx = openRequest.transaction;
|
|
580
|
+
if (event.oldVersion < 1) {
|
|
581
|
+
const entries = db.createObjectStore("entries", {
|
|
582
|
+
keyPath: "id"
|
|
583
|
+
});
|
|
584
|
+
entries.createIndex("id", "id", {
|
|
585
|
+
unique: true
|
|
586
|
+
});
|
|
587
|
+
entries.createIndex("event", "event");
|
|
588
|
+
db.createObjectStore("remoteEntryId", {
|
|
589
|
+
keyPath: ["remoteId"]
|
|
590
|
+
}).createIndex("id", "remoteId", {
|
|
591
|
+
unique: true
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
const entries = tx.objectStore("entries");
|
|
595
|
+
// Bounds conflict reads to one event and primary key.
|
|
596
|
+
entries.createIndex("conflict", ["event", "primaryKey", "id"]);
|
|
597
|
+
// Entry ids order creation, not insertion, so uploads checkpoint an
|
|
598
|
+
// insertion sequence instead.
|
|
599
|
+
const sequence = db.createObjectStore("entrySequence", {
|
|
600
|
+
autoIncrement: true
|
|
440
601
|
});
|
|
602
|
+
// The remote each imported entry came from, so uploads skip it.
|
|
603
|
+
const sources = db.createObjectStore("entrySource");
|
|
604
|
+
if (event.oldVersion < 1) return;
|
|
605
|
+
// Number the existing entries in creation order.
|
|
606
|
+
const entryIds = entries.openKeyCursor();
|
|
607
|
+
entryIds.onsuccess = () => {
|
|
608
|
+
const cursor = entryIds.result;
|
|
609
|
+
if (!cursor) return;
|
|
610
|
+
sequence.add(cursor.primaryKey);
|
|
611
|
+
cursor.continue();
|
|
612
|
+
};
|
|
613
|
+
// Version 1 kept a `remotes` row per entry per remote and recorded upload
|
|
614
|
+
// progress as an entry id, which cannot become a checkpoint. Keep one
|
|
615
|
+
// source per entry and, walking each remote's rows in sequence order, its
|
|
616
|
+
// download cursor; then drop the store.
|
|
617
|
+
const progress = tx.objectStore("remoteEntryId");
|
|
618
|
+
progress.clear();
|
|
619
|
+
const remotes = tx.objectStore("remotes").index("sequence").openCursor();
|
|
620
|
+
remotes.onsuccess = () => {
|
|
621
|
+
const cursor = remotes.result;
|
|
622
|
+
if (!cursor) {
|
|
623
|
+
db.deleteObjectStore("remotes");
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
const row = cursor.value;
|
|
627
|
+
sources.put(row.remoteId, row.entryId);
|
|
628
|
+
progress.put({
|
|
629
|
+
remoteId: row.remoteId,
|
|
630
|
+
nextSequence: row.sequence + 1
|
|
631
|
+
});
|
|
632
|
+
cursor.continue();
|
|
633
|
+
};
|
|
441
634
|
};
|
|
442
635
|
const db = yield* Effect.acquireRelease(idbReq("open", () => openRequest), db => Effect.sync(() => db.close()));
|
|
443
636
|
const pubsub = yield* PubSub.unbounded();
|
|
637
|
+
const clock = yield* Clock.Clock;
|
|
638
|
+
// Other tabs share the database but not the entry id sequence.
|
|
639
|
+
const latestEntryId = Effect.callback(resume => {
|
|
640
|
+
const tx = db.transaction("entries", "readonly");
|
|
641
|
+
const request = tx.objectStore("entries").openKeyCursor(null, "prev");
|
|
642
|
+
onTransactionDone(tx, "writeMany", resume, () => {
|
|
643
|
+
const key = request.result?.primaryKey;
|
|
644
|
+
if (key === undefined) return [];
|
|
645
|
+
return [ArrayBuffer.isView(key) ? new Uint8Array(key.buffer, key.byteOffset, key.byteLength) : new Uint8Array(key)];
|
|
646
|
+
});
|
|
647
|
+
return Effect.sync(() => tx.abort());
|
|
648
|
+
});
|
|
649
|
+
const writeMany = ({
|
|
650
|
+
effect,
|
|
651
|
+
entries
|
|
652
|
+
}) => Effect.uninterruptibleMask(restore => latestEntryId.pipe(Effect.flatMap(latest => makeEntries(entries, latest)), Effect.flatMap(committed => restore(effect(committed)).pipe(Effect.tap(Effect.callback(resume => {
|
|
653
|
+
const tx = db.transaction(["entries", "entrySequence"], "readwrite");
|
|
654
|
+
const store = tx.objectStore("entries");
|
|
655
|
+
const sequence = tx.objectStore("entrySequence");
|
|
656
|
+
for (const entry of committed) {
|
|
657
|
+
store.put(encodeEntryIdb(entry));
|
|
658
|
+
sequence.add(entry.id);
|
|
659
|
+
}
|
|
660
|
+
onTransactionDone(tx, "writeMany", resume, constVoid);
|
|
661
|
+
})), Effect.tap(PubSub.publishAll(pubsub, committed))))));
|
|
444
662
|
return EventJournal.of({
|
|
445
|
-
entries: idbReq("entries", () => db.transaction("entries", "readonly").objectStore("entries").index("id").getAll()).pipe(Effect.
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
663
|
+
entries: idbReq("entries", () => db.transaction("entries", "readonly").objectStore("entries").index("id").getAll()).pipe(Effect.map(rows => rows.map(entryFromIdb))),
|
|
664
|
+
entriesById: ids => Effect.callback(resume => {
|
|
665
|
+
const entries = ids.map(() => undefined);
|
|
666
|
+
const tx = db.transaction("entries", "readonly");
|
|
667
|
+
const store = tx.objectStore("entries");
|
|
668
|
+
for (let i = 0; i < ids.length; i++) {
|
|
669
|
+
const request = store.get(ids[i]);
|
|
670
|
+
request.onsuccess = () => {
|
|
671
|
+
if (request.result !== undefined) entries[i] = entryFromIdb(request.result);
|
|
672
|
+
};
|
|
673
|
+
}
|
|
674
|
+
onTransactionDone(tx, "entriesById", resume, () => entries);
|
|
675
|
+
return Effect.sync(() => tx.abort());
|
|
676
|
+
}),
|
|
449
677
|
write: ({
|
|
450
678
|
effect,
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
const entry = new Entry({
|
|
456
|
-
id: makeEntryIdUnsafe(),
|
|
457
|
-
event,
|
|
458
|
-
primaryKey,
|
|
459
|
-
payload
|
|
460
|
-
}, {
|
|
461
|
-
disableChecks: true
|
|
462
|
-
});
|
|
463
|
-
return restore(effect(entry)).pipe(Effect.tap(idbReq("write", () => db.transaction("entries", "readwrite").objectStore("entries").put(encodeEntryIdb(entry)))), Effect.tap(PubSub.publish(pubsub, entry)));
|
|
679
|
+
...entry
|
|
680
|
+
}) => writeMany({
|
|
681
|
+
entries: [entry],
|
|
682
|
+
effect: entries => effect(entries[0])
|
|
464
683
|
}),
|
|
684
|
+
writeMany,
|
|
465
685
|
writeFromRemote: Effect.fnUntraced(function* (options) {
|
|
466
|
-
const uncommitted = [];
|
|
467
686
|
const uncommittedRemotes = [];
|
|
468
687
|
const duplicateEntries = [];
|
|
688
|
+
// Overlapping batches can repeat an entry; the first copy wins.
|
|
689
|
+
const incomingIds = new Set();
|
|
469
690
|
yield* Effect.callback(resume => {
|
|
470
|
-
const tx = db.transaction(
|
|
691
|
+
const tx = db.transaction("entries", "readonly");
|
|
471
692
|
const entries = tx.objectStore("entries");
|
|
472
|
-
|
|
473
|
-
const
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
remotes.put({
|
|
483
|
-
remoteId: options.remoteId,
|
|
484
|
-
entryId: entry.id,
|
|
485
|
-
sequence: remoteEntry.remoteSequence
|
|
486
|
-
});
|
|
487
|
-
handleNext(iterator.next());
|
|
488
|
-
return;
|
|
693
|
+
// Requests in a transaction complete in the order they were issued.
|
|
694
|
+
for (const remoteEntry of options.entries) {
|
|
695
|
+
const request = entries.getKey(remoteEntry.entry.id);
|
|
696
|
+
request.onsuccess = () => {
|
|
697
|
+
const idString = remoteEntry.entry.idString;
|
|
698
|
+
if (request.result !== undefined) {
|
|
699
|
+
duplicateEntries.push(remoteEntry.entry);
|
|
700
|
+
} else if (!incomingIds.has(idString)) {
|
|
701
|
+
incomingIds.add(idString);
|
|
702
|
+
uncommittedRemotes.push(remoteEntry);
|
|
489
703
|
}
|
|
490
|
-
uncommitted.push(entry);
|
|
491
|
-
uncommittedRemotes.push(remoteEntry);
|
|
492
|
-
handleNext(iterator.next());
|
|
493
704
|
};
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
tx.oncomplete = () => resume(Effect.void);
|
|
497
|
-
tx.onerror = () => resume(Effect.fail(new EventJournalError({
|
|
498
|
-
method: "writeFromRemote",
|
|
499
|
-
cause: tx.error
|
|
500
|
-
})));
|
|
705
|
+
}
|
|
706
|
+
onTransactionDone(tx, "writeFromRemote", resume, constVoid);
|
|
501
707
|
return Effect.sync(() => tx.abort());
|
|
502
708
|
});
|
|
503
|
-
const compacted = options.compact ? yield* options.compact(uncommittedRemotes) :
|
|
504
|
-
|
|
505
|
-
const
|
|
709
|
+
const compacted = options.compact ? yield* options.compact(uncommittedRemotes) : uncommittedRemotes.map(remoteEntry => remoteEntry.entry);
|
|
710
|
+
if (Arr.isReadonlyArrayNonEmpty(compacted)) {
|
|
711
|
+
const index = new ConflictIndex(compacted);
|
|
506
712
|
yield* Effect.callback(resume => {
|
|
507
713
|
const tx = db.transaction("entries", "readonly");
|
|
508
|
-
const
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
};
|
|
519
|
-
tx.oncomplete = () => resume(Effect.void);
|
|
520
|
-
tx.onerror = () => resume(Effect.fail(new EventJournalError({
|
|
521
|
-
method: "writeFromRemote",
|
|
522
|
-
cause: tx.error
|
|
523
|
-
})));
|
|
714
|
+
const conflicts = tx.objectStore("entries").index("conflict");
|
|
715
|
+
// One read per group of the entries with a greater id than its
|
|
716
|
+
// oldest, in id order.
|
|
717
|
+
for (const group of index.groups()) {
|
|
718
|
+
const request = conflicts.getAll(IDBKeyRange.bound([group.event, group.primaryKey, group.oldest.id], [group.event, group.primaryKey, entryIdUpperBound], true));
|
|
719
|
+
request.onsuccess = () => {
|
|
720
|
+
for (const row of request.result) index.add(entryFromIdb(row));
|
|
721
|
+
};
|
|
722
|
+
}
|
|
723
|
+
onTransactionDone(tx, "writeFromRemote", resume, constVoid);
|
|
524
724
|
return Effect.sync(() => tx.abort());
|
|
525
725
|
});
|
|
526
|
-
yield* options.effect(
|
|
527
|
-
entry: originEntry,
|
|
528
|
-
conflicts
|
|
529
|
-
});
|
|
726
|
+
yield* options.effect(index.toBatch());
|
|
530
727
|
}
|
|
531
728
|
yield* Effect.callback(resume => {
|
|
532
|
-
const tx = db.transaction(["entries", "
|
|
729
|
+
const tx = db.transaction(["entries", "entrySource", "entrySequence", "remoteEntryId"], "readwrite");
|
|
533
730
|
const entries = tx.objectStore("entries");
|
|
534
|
-
const
|
|
731
|
+
const sources = tx.objectStore("entrySource");
|
|
732
|
+
const sequence = tx.objectStore("entrySequence");
|
|
535
733
|
for (const remoteEntry of uncommittedRemotes) {
|
|
536
734
|
entries.add(encodeEntryIdb(remoteEntry.entry));
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
entryId: remoteEntry.entry.id,
|
|
540
|
-
sequence: remoteEntry.remoteSequence
|
|
541
|
-
});
|
|
735
|
+
sequence.add(remoteEntry.entry.id);
|
|
736
|
+
sources.put(options.remoteId, remoteEntry.entry.id);
|
|
542
737
|
}
|
|
543
|
-
|
|
544
|
-
tx.
|
|
545
|
-
|
|
546
|
-
cause: tx.error
|
|
547
|
-
})));
|
|
738
|
+
// Sequences advance with the commit, so a failed batch is redelivered.
|
|
739
|
+
advanceProgress(tx.objectStore("remoteEntryId"), options.remoteId, "nextSequence", () => nextSequenceAfter(options.entries));
|
|
740
|
+
onTransactionDone(tx, "writeFromRemote", resume, constVoid);
|
|
548
741
|
return Effect.sync(() => tx.abort());
|
|
549
742
|
});
|
|
743
|
+
yield* warnIfAhead(clock, uncommittedRemotes.map(remoteEntry => remoteEntry.entry.id));
|
|
550
744
|
return {
|
|
551
745
|
duplicateEntries
|
|
552
746
|
};
|
|
553
747
|
}),
|
|
554
|
-
withRemoteUncommited: (remoteId, f) =>
|
|
555
|
-
const entries = [];
|
|
556
|
-
const tx = db.transaction(["entries", "remotes", "remoteEntryId"], "readwrite");
|
|
557
|
-
const entriesStore = tx.objectStore("entries");
|
|
558
|
-
const remotesStore = tx.objectStore("remotes");
|
|
559
|
-
const remoteEntryIdStore = tx.objectStore("remoteEntryId");
|
|
748
|
+
withRemoteUncommited: (remoteId, f) => {
|
|
560
749
|
const remoteIdKey = remoteId;
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
750
|
+
return Effect.callback(resume => {
|
|
751
|
+
const entries = [];
|
|
752
|
+
// The last insertion sequence visited, or 0 when nothing follows the checkpoint.
|
|
753
|
+
let sequence = 0;
|
|
754
|
+
const tx = db.transaction(["entries", "entrySource", "remoteEntryId", "entrySequence"], "readonly");
|
|
755
|
+
const entriesStore = tx.objectStore("entries");
|
|
756
|
+
const sourcesStore = tx.objectStore("entrySource");
|
|
757
|
+
const checkpoint = tx.objectStore("remoteEntryId").get([remoteIdKey]);
|
|
758
|
+
checkpoint.onsuccess = () => {
|
|
759
|
+
const cursorRequest = tx.objectStore("entrySequence").openCursor(IDBKeyRange.lowerBound(checkpoint.result?.sequence ?? 0, true));
|
|
760
|
+
cursorRequest.onsuccess = () => {
|
|
761
|
+
const cursor = cursorRequest.result;
|
|
762
|
+
if (!cursor) return;
|
|
763
|
+
sequence = cursor.key;
|
|
764
|
+
const entryId = cursor.value;
|
|
765
|
+
const source = sourcesStore.get(entryId);
|
|
766
|
+
source.onsuccess = () => {
|
|
767
|
+
if (source.result !== undefined && indexedDB.cmp(source.result, remoteIdKey) === 0) return;
|
|
768
|
+
const entry = entriesStore.get(entryId);
|
|
769
|
+
entry.onsuccess = () => {
|
|
770
|
+
entries.push(entryFromIdb(entry.result));
|
|
771
|
+
};
|
|
772
|
+
};
|
|
571
773
|
cursor.continue();
|
|
572
774
|
};
|
|
573
775
|
};
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
})
|
|
776
|
+
onTransactionDone(tx, "withRemoteUncommited", resume, () => ({
|
|
777
|
+
entries,
|
|
778
|
+
sequence
|
|
779
|
+
}));
|
|
780
|
+
return Effect.sync(() => tx.abort());
|
|
781
|
+
}).pipe(Effect.flatMap(({
|
|
782
|
+
entries,
|
|
783
|
+
sequence
|
|
784
|
+
}) => {
|
|
785
|
+
if (sequence === 0) return Effect.succeedNone;
|
|
786
|
+
entries.sort(byEntryId);
|
|
787
|
+
return Effect.uninterruptibleMask(restore => restore(Arr.isReadonlyArrayNonEmpty(entries) ? Effect.asSome(f(entries)) : Effect.succeedNone).pipe(Effect.tap(Effect.callback(resume => {
|
|
788
|
+
// Uploads can complete out of order; the checkpoint only moves forward.
|
|
789
|
+
const tx = db.transaction("remoteEntryId", "readwrite");
|
|
790
|
+
advanceProgress(tx.objectStore("remoteEntryId"), remoteId, "sequence", () => sequence);
|
|
791
|
+
onTransactionDone(tx, "withRemoteUncommited", resume, constVoid);
|
|
792
|
+
}))));
|
|
793
|
+
}));
|
|
794
|
+
},
|
|
795
|
+
writeRemoteAcks: ({
|
|
796
|
+
acks,
|
|
797
|
+
firstSequence,
|
|
798
|
+
remoteId
|
|
799
|
+
}) => Effect.callback(resume => {
|
|
800
|
+
const tx = db.transaction("remoteEntryId", "readwrite");
|
|
801
|
+
advanceProgress(tx.objectStore("remoteEntryId"), remoteId, "nextSequence", next => advanceSequence(next, acks, firstSequence));
|
|
802
|
+
onTransactionDone(tx, "writeRemoteAcks", resume, constVoid);
|
|
580
803
|
return Effect.sync(() => tx.abort());
|
|
581
|
-
})
|
|
582
|
-
if (!Arr.isReadonlyArrayNonEmpty(entries)) return Effect.succeedNone;
|
|
583
|
-
const entryId = entries[entries.length - 1].id;
|
|
584
|
-
return Effect.uninterruptibleMask(restore => restore(f(entries)).pipe(Effect.tap(idbReq("withRemoteUncommited", () => db.transaction("remoteEntryId", "readwrite").objectStore("remoteEntryId").put({
|
|
585
|
-
remoteId,
|
|
586
|
-
entryId
|
|
587
|
-
}))), Effect.asSome));
|
|
588
|
-
})),
|
|
804
|
+
}),
|
|
589
805
|
nextRemoteSequence: remoteId => Effect.callback(resume => {
|
|
590
|
-
const tx = db.transaction("
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
const cursorRequest = tx.objectStore("remotes").index("sequence").openCursor(IDBKeyRange.bound([remoteIdKey, 0], [remoteIdKey, Infinity]), "prev");
|
|
594
|
-
cursorRequest.onsuccess = () => {
|
|
595
|
-
const cursor = cursorRequest.result;
|
|
596
|
-
if (!cursor) return;
|
|
597
|
-
sequence = cursor.value.sequence + 1;
|
|
598
|
-
};
|
|
599
|
-
tx.oncomplete = () => resume(Effect.succeed(sequence));
|
|
600
|
-
tx.onerror = () => resume(Effect.fail(new EventJournalError({
|
|
601
|
-
method: "nextRemoteSequence",
|
|
602
|
-
cause: tx.error
|
|
603
|
-
})));
|
|
806
|
+
const tx = db.transaction("remoteEntryId", "readonly");
|
|
807
|
+
const progress = tx.objectStore("remoteEntryId").get([remoteId]);
|
|
808
|
+
onTransactionDone(tx, "nextRemoteSequence", resume, () => progress.result?.nextSequence ?? 0);
|
|
604
809
|
return Effect.sync(() => tx.abort());
|
|
605
810
|
}),
|
|
606
811
|
changes: PubSub.subscribe(pubsub),
|
|
@@ -610,6 +815,30 @@ export const makeIndexedDb = options => Effect.gen(function* () {
|
|
|
610
815
|
withLock: yield* makeBrowserWithLock(database)
|
|
611
816
|
});
|
|
612
817
|
});
|
|
818
|
+
/**
|
|
819
|
+
* The sequence following every entry in a delivered batch.
|
|
820
|
+
*
|
|
821
|
+
* @internal
|
|
822
|
+
*/
|
|
823
|
+
export const nextSequenceAfter = (entries, next = 0) => {
|
|
824
|
+
for (const remoteEntry of entries) {
|
|
825
|
+
if (remoteEntry.remoteSequence >= next) next = remoteEntry.remoteSequence + 1;
|
|
826
|
+
}
|
|
827
|
+
return next;
|
|
828
|
+
};
|
|
829
|
+
/**
|
|
830
|
+
* Advances across contiguous acknowledgements without skipping unseen entries.
|
|
831
|
+
*
|
|
832
|
+
* @internal
|
|
833
|
+
*/
|
|
834
|
+
export const advanceSequence = (next, acks, firstSequence = 0) => {
|
|
835
|
+
next = Math.max(next, firstSequence);
|
|
836
|
+
const sequences = acks.map(ack => ack.sequence).sort((a, b) => a - b);
|
|
837
|
+
for (const sequence of sequences) {
|
|
838
|
+
if (sequence === next) next++;else if (sequence > next) break;
|
|
839
|
+
}
|
|
840
|
+
return next;
|
|
841
|
+
};
|
|
613
842
|
const makeBrowserWithLock = /*#__PURE__*/Effect.fnUntraced(function* (key) {
|
|
614
843
|
if (typeof navigator !== "undefined" && "locks" in navigator) {
|
|
615
844
|
return storeId => self => Effect.callback((resume, signal) => {
|
|
@@ -633,10 +862,32 @@ const makeBrowserWithLock = /*#__PURE__*/Effect.fnUntraced(function* (key) {
|
|
|
633
862
|
return semaphore.withPermit;
|
|
634
863
|
};
|
|
635
864
|
});
|
|
636
|
-
|
|
865
|
+
// Raises one progress field within the store's transaction; progress only moves forward.
|
|
866
|
+
const advanceProgress = (store, remoteId, field, next) => {
|
|
867
|
+
const request = store.get([remoteId]);
|
|
868
|
+
request.onsuccess = () => {
|
|
869
|
+
const current = request.result?.[field] ?? 0;
|
|
870
|
+
const value = next(current);
|
|
871
|
+
if (value > current) store.put({
|
|
872
|
+
...request.result,
|
|
873
|
+
remoteId,
|
|
874
|
+
[field]: value
|
|
875
|
+
});
|
|
876
|
+
};
|
|
877
|
+
};
|
|
878
|
+
const byEntryId = (a, b) => indexedDB.cmp(a.id, b.id);
|
|
879
|
+
// Greater than or equal to every entry id.
|
|
880
|
+
const entryIdUpperBound = /*#__PURE__*/new Uint8Array(16).fill(0xff);
|
|
881
|
+
// Rows are written by `encodeEntryIdb`, so they are not validated again.
|
|
882
|
+
const entryFromIdb = row => new Entry({
|
|
883
|
+
id: row.id,
|
|
884
|
+
event: row.event,
|
|
885
|
+
primaryKey: row.primaryKey,
|
|
886
|
+
payload: row.payload
|
|
887
|
+
}, {
|
|
888
|
+
disableChecks: true
|
|
889
|
+
});
|
|
637
890
|
const encodeEntryIdb = /*#__PURE__*/Schema.encodeSync(Entry);
|
|
638
|
-
const EntryIdbArray = /*#__PURE__*/Schema.Array(Entry);
|
|
639
|
-
const decodeEntryIdbArray = /*#__PURE__*/Schema.decodeUnknownEffect(EntryIdbArray);
|
|
640
891
|
/**
|
|
641
892
|
* Provides `EventJournal` using the IndexedDB-backed implementation created by
|
|
642
893
|
* `makeIndexedDb`.
|
|
@@ -646,6 +897,15 @@ const decodeEntryIdbArray = /*#__PURE__*/Schema.decodeUnknownEffect(EntryIdbArra
|
|
|
646
897
|
* @since 4.0.0
|
|
647
898
|
*/
|
|
648
899
|
export const layerIndexedDb = options => Layer.effect(EventJournal, makeIndexedDb(options));
|
|
900
|
+
// Resumes when the transaction commits, and fails if it errors or aborts. An
|
|
901
|
+
// abort, such as a failed commit, does not always dispatch an error first.
|
|
902
|
+
const onTransactionDone = (tx, method, resume, onComplete) => {
|
|
903
|
+
tx.oncomplete = () => resume(Effect.succeed(onComplete()));
|
|
904
|
+
tx.onerror = tx.onabort = () => resume(Effect.fail(new EventJournalError({
|
|
905
|
+
method,
|
|
906
|
+
cause: tx.error
|
|
907
|
+
})));
|
|
908
|
+
};
|
|
649
909
|
const idbReq = (method, evaluate) => Effect.callback(resume => {
|
|
650
910
|
const request = evaluate();
|
|
651
911
|
if (request.readyState === "done") {
|