effect 4.0.6 → 4.1.0
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/README.md +1 -1
- package/dist/Arbitrary.d.ts +10 -2
- package/dist/Arbitrary.d.ts.map +1 -1
- package/dist/Arbitrary.js +2 -1
- package/dist/Arbitrary.js.map +1 -1
- package/dist/BigDecimal.d.ts.map +1 -1
- package/dist/BigDecimal.js +3 -0
- package/dist/BigDecimal.js.map +1 -1
- package/dist/Channel.d.ts +12 -6
- package/dist/Channel.d.ts.map +1 -1
- package/dist/Channel.js +30 -9
- package/dist/Channel.js.map +1 -1
- package/dist/Config.d.ts +7 -1
- package/dist/Config.d.ts.map +1 -1
- package/dist/Config.js.map +1 -1
- package/dist/Context.d.ts +18 -1
- package/dist/Context.d.ts.map +1 -1
- package/dist/Context.js +27 -8
- package/dist/Context.js.map +1 -1
- package/dist/Cron.d.ts +81 -11
- package/dist/Cron.d.ts.map +1 -1
- package/dist/Cron.js +101 -26
- package/dist/Cron.js.map +1 -1
- package/dist/Data.d.ts +54 -235
- package/dist/Data.d.ts.map +1 -1
- package/dist/Data.js.map +1 -1
- package/dist/Duration.d.ts +78 -0
- package/dist/Duration.d.ts.map +1 -1
- package/dist/Duration.js +123 -0
- package/dist/Duration.js.map +1 -1
- package/dist/Effect.d.ts +165 -8
- package/dist/Effect.d.ts.map +1 -1
- package/dist/Effect.js +12 -2
- package/dist/Effect.js.map +1 -1
- package/dist/Equal.d.ts.map +1 -1
- package/dist/Equal.js +8 -1
- package/dist/Equal.js.map +1 -1
- package/dist/Exit.d.ts +3 -3
- package/dist/Exit.d.ts.map +1 -1
- package/dist/Exit.js.map +1 -1
- package/dist/FileSystem.d.ts +59 -4
- package/dist/FileSystem.d.ts.map +1 -1
- package/dist/FileSystem.js +9 -2
- package/dist/FileSystem.js.map +1 -1
- package/dist/Formatter.d.ts.map +1 -1
- package/dist/Formatter.js +27 -13
- package/dist/Formatter.js.map +1 -1
- package/dist/Glob.d.ts +165 -0
- package/dist/Glob.d.ts.map +1 -0
- package/dist/Glob.js +127 -0
- package/dist/Glob.js.map +1 -0
- package/dist/Hash.d.ts.map +1 -1
- package/dist/Hash.js +4 -1
- package/dist/Hash.js.map +1 -1
- package/dist/JsonPatch.js +4 -0
- package/dist/JsonPatch.js.map +1 -1
- package/dist/JsonSchema.d.ts.map +1 -1
- package/dist/JsonSchema.js +13 -40
- package/dist/JsonSchema.js.map +1 -1
- package/dist/Match.d.ts +86 -0
- package/dist/Match.d.ts.map +1 -1
- package/dist/Match.js +72 -0
- package/dist/Match.js.map +1 -1
- package/dist/Metric.d.ts +3 -3
- package/dist/MutableList.d.ts +5 -2
- package/dist/MutableList.d.ts.map +1 -1
- package/dist/MutableList.js +7 -5
- package/dist/MutableList.js.map +1 -1
- package/dist/MutableRef.d.ts.map +1 -1
- package/dist/MutableRef.js +7 -0
- package/dist/MutableRef.js.map +1 -1
- package/dist/PartitionedSemaphore.d.ts +2 -1
- package/dist/PartitionedSemaphore.d.ts.map +1 -1
- package/dist/PartitionedSemaphore.js +22 -12
- package/dist/PartitionedSemaphore.js.map +1 -1
- package/dist/Pool.d.ts +51 -0
- package/dist/Pool.d.ts.map +1 -1
- package/dist/Pool.js +136 -36
- package/dist/Pool.js.map +1 -1
- package/dist/PubSub.d.ts.map +1 -1
- package/dist/PubSub.js +5 -6
- package/dist/PubSub.js.map +1 -1
- package/dist/Random.d.ts.map +1 -1
- package/dist/Random.js +3 -3
- package/dist/Random.js.map +1 -1
- package/dist/RcMap.d.ts.map +1 -1
- package/dist/RcMap.js +8 -2
- package/dist/RcMap.js.map +1 -1
- package/dist/Ref.d.ts.map +1 -1
- package/dist/Ref.js +8 -0
- package/dist/Ref.js.map +1 -1
- package/dist/Schedule.d.ts +18 -1
- package/dist/Schedule.d.ts.map +1 -1
- package/dist/Schedule.js +8 -3
- package/dist/Schedule.js.map +1 -1
- package/dist/Schema.d.ts +690 -49
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +687 -28
- package/dist/Schema.js.map +1 -1
- package/dist/SchemaAST.d.ts +4 -2
- package/dist/SchemaAST.d.ts.map +1 -1
- package/dist/SchemaAST.js +14 -17
- package/dist/SchemaAST.js.map +1 -1
- package/dist/SchemaGetter.d.ts +6 -1
- package/dist/SchemaGetter.d.ts.map +1 -1
- package/dist/SchemaGetter.js +22 -11
- package/dist/SchemaGetter.js.map +1 -1
- package/dist/SchemaParser.d.ts.map +1 -1
- package/dist/SchemaParser.js +48 -22
- package/dist/SchemaParser.js.map +1 -1
- package/dist/SchemaRepresentation.d.ts +33 -10
- package/dist/SchemaRepresentation.d.ts.map +1 -1
- package/dist/SchemaRepresentation.js +39 -13
- package/dist/SchemaRepresentation.js.map +1 -1
- package/dist/SchemaTransformation.d.ts +12 -4
- package/dist/SchemaTransformation.d.ts.map +1 -1
- package/dist/SchemaTransformation.js +15 -5
- package/dist/SchemaTransformation.js.map +1 -1
- package/dist/ScopedCache.d.ts.map +1 -1
- package/dist/ScopedCache.js +5 -7
- package/dist/ScopedCache.js.map +1 -1
- package/dist/Semaphore.d.ts +130 -0
- package/dist/Semaphore.d.ts.map +1 -1
- package/dist/Semaphore.js +94 -35
- package/dist/Semaphore.js.map +1 -1
- package/dist/Sink.d.ts.map +1 -1
- package/dist/Sink.js +7 -2
- package/dist/Sink.js.map +1 -1
- package/dist/Stream.d.ts +13 -4
- package/dist/Stream.d.ts.map +1 -1
- package/dist/Stream.js +31 -10
- package/dist/Stream.js.map +1 -1
- package/dist/String.d.ts +3 -0
- package/dist/String.d.ts.map +1 -1
- package/dist/String.js +3 -0
- package/dist/String.js.map +1 -1
- package/dist/Terminal.d.ts +18 -1
- package/dist/Terminal.d.ts.map +1 -1
- package/dist/Terminal.js +1 -1
- package/dist/Terminal.js.map +1 -1
- package/dist/Tracer.d.ts +11 -1
- package/dist/Tracer.d.ts.map +1 -1
- package/dist/Tracer.js +6 -1
- package/dist/Tracer.js.map +1 -1
- package/dist/ai/AiError.d.ts +43 -116
- package/dist/ai/AiError.d.ts.map +1 -1
- package/dist/ai/AiError.js +53 -72
- package/dist/ai/AiError.js.map +1 -1
- package/dist/ai/Decision.d.ts +196 -15
- package/dist/ai/Decision.d.ts.map +1 -1
- package/dist/ai/Decision.js +130 -0
- package/dist/ai/Decision.js.map +1 -1
- package/dist/ai/DecisionModel.d.ts +54 -13
- package/dist/ai/DecisionModel.d.ts.map +1 -1
- package/dist/ai/DecisionModel.js +123 -12
- package/dist/ai/DecisionModel.js.map +1 -1
- package/dist/ai/LanguageModel.d.ts.map +1 -1
- package/dist/ai/LanguageModel.js +9 -0
- package/dist/ai/LanguageModel.js.map +1 -1
- package/dist/ai/McpSchema.d.ts +110 -110
- package/dist/ai/McpSchema.d.ts.map +1 -1
- package/dist/ai/McpServer.d.ts +630 -29
- package/dist/ai/McpServer.d.ts.map +1 -1
- package/dist/ai/McpServer.js +583 -131
- package/dist/ai/McpServer.js.map +1 -1
- package/dist/ai/McpTest.d.ts +130 -0
- package/dist/ai/McpTest.d.ts.map +1 -0
- package/dist/ai/McpTest.js +237 -0
- package/dist/ai/McpTest.js.map +1 -0
- package/dist/ai/Prompt.d.ts +52 -0
- package/dist/ai/Prompt.d.ts.map +1 -1
- package/dist/ai/Prompt.js +38 -0
- package/dist/ai/Prompt.js.map +1 -1
- package/dist/ai/Response.d.ts +17 -28
- package/dist/ai/Response.d.ts.map +1 -1
- package/dist/ai/Response.js +5 -10
- package/dist/ai/Response.js.map +1 -1
- package/dist/ai/Tool.d.ts +43 -1
- package/dist/ai/Tool.d.ts.map +1 -1
- package/dist/ai/Tool.js +5 -2
- package/dist/ai/Tool.js.map +1 -1
- package/dist/ai/Toolkit.d.ts.map +1 -1
- package/dist/ai/Toolkit.js +8 -1
- package/dist/ai/Toolkit.js.map +1 -1
- package/dist/ai/index.d.ts +5 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +5 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/internal/mcpCore.js +17 -12
- package/dist/ai/internal/mcpCore.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2024_11_05.js +4 -5
- package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_03_26.js +4 -5
- package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_06_18.js +4 -5
- package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_11_25.js +4 -5
- package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js +18 -10
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
- package/dist/ai/internal/mcpProtocol.js +13 -0
- package/dist/ai/internal/mcpProtocol.js.map +1 -1
- package/dist/ai/internal/mcpRuntime.js +5 -3
- package/dist/ai/internal/mcpRuntime.js.map +1 -1
- package/dist/ai/internal/mcpStatefulRuntime.js +6 -1
- package/dist/ai/internal/mcpStatefulRuntime.js.map +1 -1
- package/dist/cli/Argument.d.ts +21 -0
- package/dist/cli/Argument.d.ts.map +1 -1
- package/dist/cli/Argument.js +7 -0
- package/dist/cli/Argument.js.map +1 -1
- package/dist/cli/CliError.d.ts +78 -0
- package/dist/cli/CliError.d.ts.map +1 -1
- package/dist/cli/CliError.js +65 -3
- package/dist/cli/CliError.js.map +1 -1
- package/dist/cli/CliOutput.d.ts +220 -7
- package/dist/cli/CliOutput.d.ts.map +1 -1
- package/dist/cli/CliOutput.js +156 -43
- package/dist/cli/CliOutput.js.map +1 -1
- package/dist/cli/Command.d.ts +47 -16
- package/dist/cli/Command.d.ts.map +1 -1
- package/dist/cli/Command.js +67 -29
- package/dist/cli/Command.js.map +1 -1
- package/dist/cli/Completions.d.ts +58 -0
- package/dist/cli/Completions.d.ts.map +1 -1
- package/dist/cli/Completions.js +49 -9
- package/dist/cli/Completions.js.map +1 -1
- package/dist/cli/Flag.d.ts +122 -0
- package/dist/cli/Flag.d.ts.map +1 -1
- package/dist/cli/Flag.js +42 -0
- package/dist/cli/Flag.js.map +1 -1
- package/dist/cli/GlobalFlag.d.ts.map +1 -1
- package/dist/cli/GlobalFlag.js +15 -7
- package/dist/cli/GlobalFlag.js.map +1 -1
- package/dist/cli/HelpDoc.d.ts +15 -1
- package/dist/cli/HelpDoc.d.ts.map +1 -1
- package/dist/cli/Param.d.ts +15 -0
- package/dist/cli/Param.d.ts.map +1 -1
- package/dist/cli/Param.js +23 -2
- package/dist/cli/Param.js.map +1 -1
- package/dist/cli/Primitive.d.ts +14 -0
- package/dist/cli/Primitive.d.ts.map +1 -1
- package/dist/cli/Primitive.js +15 -1
- package/dist/cli/Primitive.js.map +1 -1
- package/dist/cli/Prompt.d.ts +1 -0
- package/dist/cli/Prompt.d.ts.map +1 -1
- package/dist/cli/Prompt.js +1 -0
- package/dist/cli/Prompt.js.map +1 -1
- package/dist/cli/TerminalCapabilities.d.ts +3 -2
- package/dist/cli/TerminalCapabilities.d.ts.map +1 -1
- package/dist/cli/TerminalCapabilities.js +3 -1
- package/dist/cli/TerminalCapabilities.js.map +1 -1
- package/dist/cli/internal/completions/bash.js +73 -27
- package/dist/cli/internal/completions/bash.js.map +1 -1
- package/dist/cli/internal/help.d.ts.map +1 -1
- package/dist/cli/internal/help.js +17 -10
- package/dist/cli/internal/help.js.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.js +45 -10
- package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
- package/dist/cluster/MessageStorage.d.ts +23 -45
- package/dist/cluster/MessageStorage.d.ts.map +1 -1
- package/dist/cluster/MessageStorage.js +6 -7
- package/dist/cluster/MessageStorage.js.map +1 -1
- package/dist/cluster/Sharding.d.ts.map +1 -1
- package/dist/cluster/Sharding.js +151 -49
- package/dist/cluster/Sharding.js.map +1 -1
- package/dist/cluster/ShardingConfig.d.ts +76 -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/SingleRunner.d.ts +3 -3
- package/dist/cluster/SingleRunner.d.ts.map +1 -1
- package/dist/cluster/SingleRunner.js +1 -1
- package/dist/cluster/Snowflake.d.ts.map +1 -1
- package/dist/cluster/Snowflake.js +3 -7
- package/dist/cluster/Snowflake.js.map +1 -1
- package/dist/cluster/SqlMessageStorage.d.ts +37 -6
- package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
- package/dist/cluster/SqlMessageStorage.js +34 -7
- package/dist/cluster/SqlMessageStorage.js.map +1 -1
- package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
- package/dist/cluster/SqlRunnerStorage.js +109 -46
- package/dist/cluster/SqlRunnerStorage.js.map +1 -1
- package/dist/cluster/internal/entityManager.js +54 -20
- package/dist/cluster/internal/entityManager.js.map +1 -1
- package/dist/crypto/Aead.d.ts +322 -0
- package/dist/crypto/Aead.d.ts.map +1 -0
- package/dist/crypto/Aead.js +331 -0
- package/dist/crypto/Aead.js.map +1 -0
- package/dist/crypto/Cipher.d.ts +235 -0
- package/dist/crypto/Cipher.d.ts.map +1 -0
- package/dist/crypto/Cipher.js +233 -0
- package/dist/crypto/Cipher.js.map +1 -0
- package/dist/crypto/CryptoError.d.ts +212 -0
- package/dist/crypto/CryptoError.d.ts.map +1 -0
- package/dist/crypto/CryptoError.js +202 -0
- package/dist/crypto/CryptoError.js.map +1 -0
- package/dist/crypto/Digest.d.ts +143 -0
- package/dist/crypto/Digest.d.ts.map +1 -0
- package/dist/crypto/Digest.js +146 -0
- package/dist/crypto/Digest.js.map +1 -0
- package/dist/crypto/Kdf.d.ts +220 -0
- package/dist/crypto/Kdf.d.ts.map +1 -0
- package/dist/crypto/Kdf.js +212 -0
- package/dist/crypto/Kdf.js.map +1 -0
- package/dist/crypto/KeyAgreement.d.ts +323 -0
- package/dist/crypto/KeyAgreement.d.ts.map +1 -0
- package/dist/crypto/KeyAgreement.js +303 -0
- package/dist/crypto/KeyAgreement.js.map +1 -0
- package/dist/crypto/KeyFormat.d.ts +309 -0
- package/dist/crypto/KeyFormat.d.ts.map +1 -0
- package/dist/crypto/KeyFormat.js +556 -0
- package/dist/crypto/KeyFormat.js.map +1 -0
- package/dist/crypto/KeyWrap.d.ts +389 -0
- package/dist/crypto/KeyWrap.d.ts.map +1 -0
- package/dist/crypto/KeyWrap.js +381 -0
- package/dist/crypto/KeyWrap.js.map +1 -0
- package/dist/crypto/Mac.d.ts +277 -0
- package/dist/crypto/Mac.d.ts.map +1 -0
- package/dist/crypto/Mac.js +288 -0
- package/dist/crypto/Mac.js.map +1 -0
- package/dist/crypto/SecureRandom.d.ts +340 -0
- package/dist/crypto/SecureRandom.d.ts.map +1 -0
- package/dist/crypto/SecureRandom.js +257 -0
- package/dist/crypto/SecureRandom.js.map +1 -0
- package/dist/crypto/Signature.d.ts +448 -0
- package/dist/crypto/Signature.d.ts.map +1 -0
- package/dist/crypto/Signature.js +484 -0
- package/dist/crypto/Signature.js.map +1 -0
- package/dist/crypto/WebCrypto.d.ts +61 -0
- package/dist/crypto/WebCrypto.d.ts.map +1 -0
- package/dist/crypto/WebCrypto.js +63 -0
- package/dist/crypto/WebCrypto.js.map +1 -0
- package/dist/crypto/index.d.ts +65 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +66 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/internal/asymmetric.d.ts +2 -0
- package/dist/crypto/internal/asymmetric.d.ts.map +1 -0
- package/dist/crypto/internal/asymmetric.js +210 -0
- package/dist/crypto/internal/asymmetric.js.map +1 -0
- package/dist/crypto/internal/chacha.d.ts +46 -0
- package/dist/crypto/internal/chacha.d.ts.map +1 -0
- package/dist/crypto/internal/chacha.js +885 -0
- package/dist/crypto/internal/chacha.js.map +1 -0
- package/dist/crypto/internal/der.d.ts +6 -0
- package/dist/crypto/internal/der.d.ts.map +1 -0
- package/dist/crypto/internal/der.js +86 -0
- package/dist/crypto/internal/der.js.map +1 -0
- package/dist/crypto/internal/digest.d.ts +2 -0
- package/dist/crypto/internal/digest.d.ts.map +1 -0
- package/dist/crypto/internal/digest.js +15 -0
- package/dist/crypto/internal/digest.js.map +1 -0
- package/dist/crypto/internal/key.d.ts +2 -0
- package/dist/crypto/internal/key.d.ts.map +1 -0
- package/dist/crypto/internal/key.js +170 -0
- package/dist/crypto/internal/key.js.map +1 -0
- package/dist/crypto/internal/md5.d.ts +39 -0
- package/dist/crypto/internal/md5.d.ts.map +1 -0
- package/dist/crypto/internal/md5.js +179 -0
- package/dist/crypto/internal/md5.js.map +1 -0
- package/dist/crypto/internal/webCrypto.d.ts +2 -0
- package/dist/crypto/internal/webCrypto.d.ts.map +1 -0
- package/dist/crypto/internal/webCrypto.js +111 -0
- package/dist/crypto/internal/webCrypto.js.map +1 -0
- package/dist/devtools/DevToolsClient.d.ts.map +1 -1
- package/dist/devtools/DevToolsClient.js +2 -0
- package/dist/devtools/DevToolsClient.js.map +1 -1
- package/dist/encoding/Base64.js +36 -0
- package/dist/encoding/Base64.js.map +1 -1
- package/dist/encoding/Base64Url.d.ts.map +1 -1
- package/dist/encoding/Base64Url.js +3 -2
- package/dist/encoding/Base64Url.js.map +1 -1
- package/dist/encoding/Csv.d.ts +608 -0
- package/dist/encoding/Csv.d.ts.map +1 -0
- package/dist/encoding/Csv.js +718 -0
- package/dist/encoding/Csv.js.map +1 -0
- package/dist/encoding/Hex.d.ts +3 -2
- package/dist/encoding/Hex.d.ts.map +1 -1
- package/dist/encoding/Hex.js +3 -2
- package/dist/encoding/Hex.js.map +1 -1
- package/dist/encoding/SchemaBinary.d.ts.map +1 -1
- package/dist/encoding/SchemaBinary.js +42 -4
- package/dist/encoding/SchemaBinary.js.map +1 -1
- package/dist/encoding/Sse.d.ts.map +1 -1
- package/dist/encoding/Sse.js +3 -3
- package/dist/encoding/Sse.js.map +1 -1
- package/dist/encoding/Toml.d.ts +17 -3
- package/dist/encoding/Toml.d.ts.map +1 -1
- package/dist/encoding/Toml.js +124 -31
- package/dist/encoding/Toml.js.map +1 -1
- package/dist/encoding/Yaml.d.ts +8 -1
- package/dist/encoding/Yaml.d.ts.map +1 -1
- package/dist/encoding/Yaml.js +54 -18
- package/dist/encoding/Yaml.js.map +1 -1
- package/dist/encoding/index.d.ts +5 -0
- package/dist/encoding/index.d.ts.map +1 -1
- package/dist/encoding/index.js +5 -0
- package/dist/encoding/index.js.map +1 -1
- package/dist/eventlog/EventJournal.d.ts.map +1 -1
- package/dist/eventlog/EventJournal.js +6 -3
- package/dist/eventlog/EventJournal.js.map +1 -1
- package/dist/eventlog/EventLog.d.ts +119 -4
- package/dist/eventlog/EventLog.d.ts.map +1 -1
- package/dist/eventlog/EventLog.js +200 -12
- package/dist/eventlog/EventLog.js.map +1 -1
- package/dist/eventlog/EventLogEncryption.d.ts +41 -4
- package/dist/eventlog/EventLogEncryption.d.ts.map +1 -1
- package/dist/eventlog/EventLogEncryption.js +83 -64
- package/dist/eventlog/EventLogEncryption.js.map +1 -1
- package/dist/eventlog/EventLogMessage.d.ts +279 -0
- package/dist/eventlog/EventLogMessage.d.ts.map +1 -1
- package/dist/eventlog/EventLogMessage.js +217 -1
- package/dist/eventlog/EventLogMessage.js.map +1 -1
- package/dist/eventlog/EventLogRemote.d.ts +200 -28
- package/dist/eventlog/EventLogRemote.d.ts.map +1 -1
- package/dist/eventlog/EventLogRemote.js +186 -16
- package/dist/eventlog/EventLogRemote.js.map +1 -1
- package/dist/eventlog/EventLogServer.d.ts +3 -0
- package/dist/eventlog/EventLogServer.d.ts.map +1 -1
- package/dist/eventlog/EventLogServer.js +18 -10
- package/dist/eventlog/EventLogServer.js.map +1 -1
- package/dist/eventlog/EventLogServerEncrypted.d.ts +326 -5
- package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
- package/dist/eventlog/EventLogServerEncrypted.js +769 -14
- package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
- package/dist/eventlog/EventLogSessionAuth.d.ts +5 -3
- package/dist/eventlog/EventLogSessionAuth.d.ts.map +1 -1
- package/dist/eventlog/EventLogSessionAuth.js +41 -64
- package/dist/eventlog/EventLogSessionAuth.js.map +1 -1
- package/dist/eventlog/EventRow.d.ts +4 -0
- package/dist/eventlog/EventRow.d.ts.map +1 -1
- package/dist/eventlog/EventRow.js +12 -2
- package/dist/eventlog/EventRow.js.map +1 -1
- package/dist/eventlog/SqlEventJournal.d.ts.map +1 -1
- package/dist/eventlog/SqlEventJournal.js +47 -27
- package/dist/eventlog/SqlEventJournal.js.map +1 -1
- package/dist/eventlog/SqlEventLogServerEncrypted.d.ts +21 -5
- package/dist/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -1
- package/dist/eventlog/SqlEventLogServerEncrypted.js +1048 -113
- package/dist/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
- package/dist/eventlog/SqlEventLogServerUnencrypted.js +2 -2
- package/dist/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
- package/dist/eventlog/internal/batches.d.ts +12 -0
- package/dist/eventlog/internal/batches.d.ts.map +1 -0
- package/dist/eventlog/internal/batches.js +26 -0
- package/dist/eventlog/internal/batches.js.map +1 -0
- package/dist/eventlog/internal/compaction.d.ts +38 -0
- package/dist/eventlog/internal/compaction.d.ts.map +1 -0
- package/dist/eventlog/internal/compaction.js +33 -0
- package/dist/eventlog/internal/compaction.js.map +1 -0
- package/dist/eventlog/internal/conflicts.d.ts +0 -1
- package/dist/eventlog/internal/conflicts.d.ts.map +1 -1
- package/dist/eventlog/internal/conflicts.js +0 -3
- package/dist/eventlog/internal/conflicts.js.map +1 -1
- package/dist/eventlog/internal/identityRootSecretDerivation.js +66 -67
- package/dist/eventlog/internal/identityRootSecretDerivation.js.map +1 -1
- package/dist/eventlog/internal/remoteCompaction.d.ts +31 -0
- package/dist/eventlog/internal/remoteCompaction.d.ts.map +1 -0
- package/dist/eventlog/internal/remoteCompaction.js +76 -0
- package/dist/eventlog/internal/remoteCompaction.js.map +1 -0
- package/dist/http/Cookies.d.ts +172 -0
- package/dist/http/Cookies.d.ts.map +1 -1
- package/dist/http/Cookies.js +153 -10
- package/dist/http/Cookies.js.map +1 -1
- package/dist/http/FetchHttpClient.d.ts +26 -2
- package/dist/http/FetchHttpClient.d.ts.map +1 -1
- package/dist/http/FetchHttpClient.js +78 -15
- package/dist/http/FetchHttpClient.js.map +1 -1
- package/dist/http/HttpClient.d.ts +502 -8
- package/dist/http/HttpClient.d.ts.map +1 -1
- package/dist/http/HttpClient.js +296 -12
- package/dist/http/HttpClient.js.map +1 -1
- package/dist/http/HttpClientError.d.ts +8 -1
- package/dist/http/HttpClientError.d.ts.map +1 -1
- package/dist/http/HttpClientError.js +37 -1
- package/dist/http/HttpClientError.js.map +1 -1
- package/dist/http/HttpClientRequest.d.ts +9 -5
- package/dist/http/HttpClientRequest.d.ts.map +1 -1
- package/dist/http/HttpClientRequest.js +3 -4
- package/dist/http/HttpClientRequest.js.map +1 -1
- package/dist/http/HttpClientResponse.d.ts.map +1 -1
- package/dist/http/HttpClientResponse.js +3 -2
- package/dist/http/HttpClientResponse.js.map +1 -1
- package/dist/http/HttpMethod.d.ts +7 -1
- package/dist/http/HttpMethod.d.ts.map +1 -1
- package/dist/http/HttpMethod.js +3 -8
- package/dist/http/HttpMethod.js.map +1 -1
- package/dist/http/HttpMiddleware.d.ts +1 -1
- package/dist/http/HttpMiddleware.d.ts.map +1 -1
- package/dist/http/HttpMiddleware.js +14 -16
- package/dist/http/HttpMiddleware.js.map +1 -1
- package/dist/http/HttpRouter.d.ts.map +1 -1
- package/dist/http/HttpRouter.js +2 -1
- package/dist/http/HttpRouter.js.map +1 -1
- package/dist/http/HttpServerError.js +2 -2
- package/dist/http/HttpServerError.js.map +1 -1
- package/dist/http/HttpServerRequest.d.ts +11 -3
- package/dist/http/HttpServerRequest.d.ts.map +1 -1
- package/dist/http/HttpServerRequest.js +77 -25
- package/dist/http/HttpServerRequest.js.map +1 -1
- package/dist/http/HttpServerResponse.d.ts.map +1 -1
- package/dist/http/HttpServerResponse.js +3 -2
- package/dist/http/HttpServerResponse.js.map +1 -1
- package/dist/http/HttpStaticServer.d.ts.map +1 -1
- package/dist/http/HttpStaticServer.js +48 -21
- package/dist/http/HttpStaticServer.js.map +1 -1
- package/dist/http/HttpTraceContext.d.ts +2 -1
- package/dist/http/HttpTraceContext.d.ts.map +1 -1
- package/dist/http/HttpTraceContext.js +7 -5
- package/dist/http/HttpTraceContext.js.map +1 -1
- package/dist/http/MultipartParser/internal/contentType.js +3 -3
- package/dist/http/ProblemDetails.d.ts +96 -0
- package/dist/http/ProblemDetails.d.ts.map +1 -0
- package/dist/http/ProblemDetails.js +98 -0
- package/dist/http/ProblemDetails.js.map +1 -0
- package/dist/http/UrlParams.d.ts +3 -1
- package/dist/http/UrlParams.d.ts.map +1 -1
- package/dist/http/UrlParams.js +4 -2
- package/dist/http/UrlParams.js.map +1 -1
- package/dist/http/index.d.ts +5 -0
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +5 -0
- package/dist/http/index.js.map +1 -1
- package/dist/http/internal/compression.js +4 -5
- package/dist/http/internal/compression.js.map +1 -1
- package/dist/http/internal/decompression.js +6 -2
- package/dist/http/internal/decompression.js.map +1 -1
- package/dist/http/internal/httpBody.js +8 -1
- package/dist/http/internal/httpBody.js.map +1 -1
- package/dist/http/internal/urlParams.js +33 -0
- package/dist/http/internal/urlParams.js.map +1 -1
- package/dist/http-api/HttpApi.d.ts +3 -6
- package/dist/http-api/HttpApi.d.ts.map +1 -1
- package/dist/http-api/HttpApi.js +3 -6
- 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 +43 -13
- package/dist/http-api/HttpApiBuilder.js.map +1 -1
- package/dist/http-api/HttpApiClient.d.ts +140 -7
- package/dist/http-api/HttpApiClient.d.ts.map +1 -1
- package/dist/http-api/HttpApiClient.js +193 -44
- package/dist/http-api/HttpApiClient.js.map +1 -1
- package/dist/http-api/HttpApiEndpoint.d.ts +24 -7
- package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
- package/dist/http-api/HttpApiEndpoint.js +123 -32
- package/dist/http-api/HttpApiEndpoint.js.map +1 -1
- package/dist/http-api/HttpApiError.d.ts +185 -13
- package/dist/http-api/HttpApiError.d.ts.map +1 -1
- package/dist/http-api/HttpApiError.js +128 -0
- package/dist/http-api/HttpApiError.js.map +1 -1
- package/dist/http-api/HttpApiMiddleware.d.ts +64 -17
- package/dist/http-api/HttpApiMiddleware.d.ts.map +1 -1
- package/dist/http-api/HttpApiMiddleware.js +85 -1
- package/dist/http-api/HttpApiMiddleware.js.map +1 -1
- package/dist/http-api/HttpApiSchema.d.ts +142 -33
- package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
- package/dist/http-api/HttpApiSchema.js +123 -59
- package/dist/http-api/HttpApiSchema.js.map +1 -1
- package/dist/http-api/HttpApiTest.d.ts.map +1 -1
- package/dist/http-api/HttpApiTest.js +3 -2
- package/dist/http-api/HttpApiTest.js.map +1 -1
- package/dist/http-api/OpenApi.d.ts.map +1 -1
- package/dist/http-api/OpenApi.js +25 -16
- package/dist/http-api/OpenApi.js.map +1 -1
- package/dist/http-api/internal/toCodecHttpProperties.d.ts +2 -0
- package/dist/http-api/internal/toCodecHttpProperties.d.ts.map +1 -0
- package/dist/http-api/internal/toCodecHttpProperties.js +38 -0
- package/dist/http-api/internal/toCodecHttpProperties.js.map +1 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/internal/arbitrary/runner.d.ts.map +1 -1
- package/dist/internal/arbitrary/runner.js +120 -44
- package/dist/internal/arbitrary/runner.js.map +1 -1
- package/dist/internal/core.js +2 -0
- package/dist/internal/core.js.map +1 -1
- package/dist/internal/effect.js +46 -27
- package/dist/internal/effect.js.map +1 -1
- package/dist/internal/equal.js +14 -0
- package/dist/internal/equal.js.map +1 -1
- package/dist/internal/glob.d.ts +2 -0
- package/dist/internal/glob.d.ts.map +1 -0
- package/dist/internal/glob.js +630 -0
- package/dist/internal/glob.js.map +1 -0
- package/dist/internal/jsonSchema.d.ts +2 -0
- package/dist/internal/jsonSchema.d.ts.map +1 -0
- package/dist/internal/jsonSchema.js +28 -0
- package/dist/internal/jsonSchema.js.map +1 -0
- package/dist/internal/matcher.js +11 -1
- package/dist/internal/matcher.js.map +1 -1
- package/dist/internal/persistence.js +9 -0
- package/dist/internal/persistence.js.map +1 -1
- package/dist/internal/rcRef.js +4 -1
- package/dist/internal/rcRef.js.map +1 -1
- package/dist/internal/schema/compilerRegistry.js +4 -1
- package/dist/internal/schema/compilerRegistry.js.map +1 -1
- package/dist/internal/schema/content.d.ts +2 -0
- package/dist/internal/schema/content.d.ts.map +1 -0
- package/dist/internal/schema/content.js +13 -0
- package/dist/internal/schema/content.js.map +1 -0
- package/dist/internal/schema/fromJsonSchemaDocument.js +173 -185
- package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
- package/dist/internal/schema/fromRepresentation.js +2 -1
- package/dist/internal/schema/fromRepresentation.js.map +1 -1
- package/dist/internal/schema/standardSchema.js +8 -2
- package/dist/internal/schema/standardSchema.js.map +1 -1
- package/dist/internal/schema/toCodeDocument.js +9 -6
- package/dist/internal/schema/toCodeDocument.js.map +1 -1
- package/dist/internal/schema/toCodec.js +21 -24
- package/dist/internal/schema/toCodec.js.map +1 -1
- package/dist/internal/schema/toJsonSchemaDocument.js +205 -140
- package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
- package/dist/internal/schema/toRepresentation.js +107 -129
- package/dist/internal/schema/toRepresentation.js.map +1 -1
- package/dist/internal/sql.d.ts +2 -0
- package/dist/internal/sql.d.ts.map +1 -0
- package/dist/internal/sql.js +13 -0
- package/dist/internal/sql.js.map +1 -0
- package/dist/internal/trie.js +42 -13
- package/dist/internal/trie.js.map +1 -1
- package/dist/internal/ulid.js +41 -0
- package/dist/internal/ulid.js.map +1 -1
- package/dist/internal/uuid.js +52 -8
- package/dist/internal/uuid.js.map +1 -1
- package/dist/internal/version.js +1 -1
- package/dist/observability/Otlp.d.ts +15 -4
- package/dist/observability/Otlp.d.ts.map +1 -1
- package/dist/observability/Otlp.js +10 -0
- package/dist/observability/Otlp.js.map +1 -1
- package/dist/observability/OtlpProxy.d.ts +154 -0
- package/dist/observability/OtlpProxy.d.ts.map +1 -0
- package/dist/observability/OtlpProxy.js +235 -0
- package/dist/observability/OtlpProxy.js.map +1 -0
- package/dist/observability/OtlpResource.d.ts +7 -0
- package/dist/observability/OtlpResource.d.ts.map +1 -1
- package/dist/observability/OtlpResource.js +11 -1
- package/dist/observability/OtlpResource.js.map +1 -1
- package/dist/observability/OtlpTracer.d.ts.map +1 -1
- package/dist/observability/OtlpTracer.js +4 -0
- package/dist/observability/OtlpTracer.js.map +1 -1
- package/dist/observability/index.d.ts +5 -0
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +5 -0
- package/dist/observability/index.js.map +1 -1
- package/dist/persistence/CircuitBreaker.d.ts +897 -0
- package/dist/persistence/CircuitBreaker.d.ts.map +1 -0
- package/dist/persistence/CircuitBreaker.js +1165 -0
- package/dist/persistence/CircuitBreaker.js.map +1 -0
- package/dist/persistence/KeyValueStore.d.ts +47 -2
- package/dist/persistence/KeyValueStore.d.ts.map +1 -1
- package/dist/persistence/KeyValueStore.js +129 -18
- package/dist/persistence/KeyValueStore.js.map +1 -1
- package/dist/persistence/PersistedQueue.d.ts +9 -0
- package/dist/persistence/PersistedQueue.d.ts.map +1 -1
- package/dist/persistence/PersistedQueue.js +94 -52
- package/dist/persistence/PersistedQueue.js.map +1 -1
- package/dist/persistence/Persistence.d.ts +10 -4
- package/dist/persistence/Persistence.d.ts.map +1 -1
- package/dist/persistence/Persistence.js +18 -11
- package/dist/persistence/Persistence.js.map +1 -1
- package/dist/persistence/Redis.d.ts +78 -2
- package/dist/persistence/Redis.d.ts.map +1 -1
- package/dist/persistence/Redis.js +62 -7
- package/dist/persistence/Redis.js.map +1 -1
- package/dist/persistence/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 +237 -71
- package/dist/process/ChildProcess.d.ts.map +1 -1
- package/dist/process/ChildProcess.js +56 -158
- package/dist/process/ChildProcess.js.map +1 -1
- package/dist/process/ChildProcessSpawner.d.ts +35 -0
- package/dist/process/ChildProcessSpawner.d.ts.map +1 -1
- package/dist/process/ChildProcessSpawner.js +5 -2
- package/dist/process/ChildProcessSpawner.js.map +1 -1
- package/dist/process/CommandLine.d.ts +294 -0
- package/dist/process/CommandLine.d.ts.map +1 -0
- package/dist/process/CommandLine.js +481 -0
- package/dist/process/CommandLine.js.map +1 -0
- package/dist/process/index.d.ts +5 -0
- package/dist/process/index.d.ts.map +1 -1
- package/dist/process/index.js +5 -0
- package/dist/process/index.js.map +1 -1
- package/dist/reactivity/AsyncResult.d.ts +1 -1
- package/dist/reactivity/AsyncResult.d.ts.map +1 -1
- package/dist/reactivity/Atom.d.ts +2 -1
- package/dist/reactivity/Atom.d.ts.map +1 -1
- package/dist/reactivity/Atom.js +3 -4
- package/dist/reactivity/Atom.js.map +1 -1
- package/dist/reactivity/AtomRegistry.js.map +1 -1
- package/dist/rpc/RpcClient.d.ts +16 -1
- package/dist/rpc/RpcClient.d.ts.map +1 -1
- package/dist/rpc/RpcClient.js +59 -24
- package/dist/rpc/RpcClient.js.map +1 -1
- package/dist/rpc/RpcMessage.d.ts +10 -1
- package/dist/rpc/RpcMessage.d.ts.map +1 -1
- package/dist/rpc/RpcMessage.js +1 -0
- package/dist/rpc/RpcMessage.js.map +1 -1
- package/dist/rpc/RpcSerialization.d.ts +14 -0
- package/dist/rpc/RpcSerialization.d.ts.map +1 -1
- package/dist/rpc/RpcSerialization.js +26 -8
- package/dist/rpc/RpcSerialization.js.map +1 -1
- package/dist/rpc/RpcServer.d.ts +31 -0
- package/dist/rpc/RpcServer.d.ts.map +1 -1
- package/dist/rpc/RpcServer.js +139 -56
- package/dist/rpc/RpcServer.js.map +1 -1
- package/dist/rpc/RpcTest.d.ts +1 -0
- package/dist/rpc/RpcTest.d.ts.map +1 -1
- package/dist/rpc/RpcTest.js +1 -0
- package/dist/rpc/RpcTest.js.map +1 -1
- package/dist/schema/Model.d.ts +14 -0
- package/dist/schema/Model.d.ts.map +1 -1
- package/dist/schema/Model.js +18 -3
- package/dist/schema/Model.js.map +1 -1
- package/dist/sql/Migrator.d.ts +2 -20
- package/dist/sql/Migrator.d.ts.map +1 -1
- package/dist/sql/Migrator.js +13 -55
- package/dist/sql/Migrator.js.map +1 -1
- package/dist/sql/MigratorFileSystem.d.ts +21 -0
- package/dist/sql/MigratorFileSystem.d.ts.map +1 -0
- package/dist/sql/MigratorFileSystem.js +57 -0
- package/dist/sql/MigratorFileSystem.js.map +1 -0
- package/dist/sql/SqlClient.d.ts +9 -4
- package/dist/sql/SqlClient.d.ts.map +1 -1
- package/dist/sql/SqlClient.js +13 -10
- package/dist/sql/SqlClient.js.map +1 -1
- package/dist/sql/SqlResolver.d.ts +4 -0
- package/dist/sql/SqlResolver.d.ts.map +1 -1
- package/dist/sql/SqlResolver.js +18 -4
- package/dist/sql/SqlResolver.js.map +1 -1
- package/dist/sql/Statement.d.ts +27 -6
- package/dist/sql/Statement.d.ts.map +1 -1
- package/dist/sql/Statement.js +21 -15
- package/dist/sql/Statement.js.map +1 -1
- package/dist/sql/index.js +1 -1
- package/dist/testing/index.d.ts +0 -5
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +0 -5
- package/dist/testing/index.js.map +1 -1
- package/dist/workflow/DurableDeferred.d.ts.map +1 -1
- package/dist/workflow/DurableDeferred.js +21 -2
- package/dist/workflow/DurableDeferred.js.map +1 -1
- package/dist/workflow/internal/crypto.js +9 -8
- package/dist/workflow/internal/crypto.js.map +1 -1
- package/package.json +3 -1
- package/src/Arbitrary.ts +10 -2
- package/src/BigDecimal.ts +3 -0
- package/src/Channel.ts +64 -29
- package/src/Config.ts +7 -1
- package/src/Context.ts +34 -10
- package/src/Cron.ts +178 -29
- package/src/Data.ts +60 -265
- package/src/Duration.ts +140 -0
- package/src/Effect.ts +915 -86
- package/src/Equal.ts +8 -1
- package/src/Exit.ts +3 -3
- package/src/FileSystem.ts +65 -4
- package/src/Formatter.ts +28 -13
- package/src/Glob.ts +205 -0
- package/src/Hash.ts +4 -1
- package/src/JsonPatch.ts +4 -0
- package/src/JsonSchema.ts +12 -40
- package/src/Match.ts +127 -0
- package/src/Metric.ts +3 -3
- package/src/MutableList.ts +7 -5
- package/src/MutableRef.ts +8 -1
- package/src/PartitionedSemaphore.ts +24 -13
- package/src/Pool.ts +182 -52
- package/src/PubSub.ts +5 -6
- package/src/Random.ts +3 -3
- package/src/RcMap.ts +5 -1
- package/src/Ref.ts +8 -0
- package/src/Schedule.ts +27 -4
- package/src/Schema.ts +1237 -87
- package/src/SchemaAST.ts +20 -20
- package/src/SchemaGetter.ts +27 -11
- package/src/SchemaParser.ts +51 -18
- package/src/SchemaRepresentation.ts +50 -34
- package/src/SchemaTransformation.ts +17 -5
- package/src/ScopedCache.ts +5 -9
- package/src/Semaphore.ts +208 -40
- package/src/Sink.ts +15 -2
- package/src/Stream.ts +48 -22
- package/src/String.ts +3 -0
- package/src/Terminal.ts +19 -1
- package/src/Tracer.ts +15 -1
- package/src/ai/AiError.ts +56 -80
- package/src/ai/Decision.ts +257 -6
- package/src/ai/DecisionModel.ts +171 -28
- package/src/ai/LanguageModel.ts +9 -0
- package/src/ai/McpServer.ts +1283 -299
- package/src/ai/McpTest.ts +380 -0
- package/src/ai/Prompt.ts +65 -0
- package/src/ai/Response.ts +36 -31
- package/src/ai/Tool.ts +65 -10
- package/src/ai/Toolkit.ts +4 -1
- package/src/ai/index.ts +6 -0
- package/src/ai/internal/mcpCore.ts +78 -44
- package/src/ai/internal/mcpProtocol/v2024_11_05.ts +4 -7
- package/src/ai/internal/mcpProtocol/v2025_03_26.ts +4 -7
- package/src/ai/internal/mcpProtocol/v2025_06_18.ts +4 -7
- package/src/ai/internal/mcpProtocol/v2025_11_25.ts +4 -7
- package/src/ai/internal/mcpProtocol/v2026_07_28.ts +15 -10
- package/src/ai/internal/mcpProtocol.ts +29 -0
- package/src/ai/internal/mcpRuntime.ts +9 -5
- package/src/ai/internal/mcpStatefulRuntime.ts +14 -2
- package/src/cli/Argument.ts +21 -0
- package/src/cli/CliError.ts +90 -3
- package/src/cli/CliOutput.ts +300 -55
- package/src/cli/Command.ts +76 -41
- package/src/cli/Completions.ts +51 -0
- package/src/cli/Flag.ts +122 -0
- package/src/cli/GlobalFlag.ts +6 -7
- package/src/cli/HelpDoc.ts +18 -1
- package/src/cli/Param.ts +35 -6
- package/src/cli/Primitive.ts +16 -1
- package/src/cli/Prompt.ts +1 -0
- package/src/cli/TerminalCapabilities.ts +6 -3
- package/src/cli/internal/completions/bash.ts +79 -29
- package/src/cli/internal/help.ts +21 -9
- package/src/cluster/ClusterWorkflowEngine.ts +46 -16
- package/src/cluster/MessageStorage.ts +19 -14
- package/src/cluster/Sharding.ts +176 -47
- package/src/cluster/ShardingConfig.ts +43 -0
- package/src/cluster/SingleRunner.ts +3 -3
- package/src/cluster/Snowflake.ts +3 -7
- package/src/cluster/SqlMessageStorage.ts +49 -17
- package/src/cluster/SqlRunnerStorage.ts +143 -70
- package/src/cluster/internal/entityManager.ts +75 -22
- package/src/crypto/Aead.ts +517 -0
- package/src/crypto/Cipher.ts +326 -0
- package/src/crypto/CryptoError.ts +242 -0
- package/src/crypto/Digest.ts +167 -0
- package/src/crypto/Kdf.ts +315 -0
- package/src/crypto/KeyAgreement.ts +489 -0
- package/src/crypto/KeyFormat.ts +712 -0
- package/src/crypto/KeyWrap.ts +639 -0
- package/src/crypto/Mac.ts +386 -0
- package/src/crypto/SecureRandom.ts +459 -0
- package/src/crypto/Signature.ts +673 -0
- package/src/crypto/WebCrypto.ts +64 -0
- package/src/crypto/index.ts +78 -0
- package/src/crypto/internal/asymmetric.ts +329 -0
- package/src/crypto/internal/chacha.ts +1088 -0
- package/src/crypto/internal/der.ts +110 -0
- package/src/crypto/internal/digest.ts +16 -0
- package/src/crypto/internal/key.ts +235 -0
- package/src/crypto/internal/md5.ts +170 -0
- package/src/crypto/internal/webCrypto.ts +150 -0
- package/src/devtools/DevToolsClient.ts +2 -0
- package/src/encoding/Base64.ts +38 -0
- package/src/encoding/Base64Url.ts +5 -2
- package/src/encoding/Csv.ts +1298 -0
- package/src/encoding/Hex.ts +3 -2
- package/src/encoding/SchemaBinary.ts +40 -4
- package/src/encoding/Sse.ts +4 -3
- package/src/encoding/Toml.ts +117 -35
- package/src/encoding/Yaml.ts +61 -18
- package/src/encoding/index.ts +6 -0
- package/src/eventlog/EventJournal.ts +4 -3
- package/src/eventlog/EventLog.ts +340 -15
- package/src/eventlog/EventLogEncryption.ts +118 -110
- package/src/eventlog/EventLogMessage.ts +273 -1
- package/src/eventlog/EventLogRemote.ts +367 -23
- package/src/eventlog/EventLogServer.ts +23 -8
- package/src/eventlog/EventLogServerEncrypted.ts +1130 -67
- package/src/eventlog/EventLogSessionAuth.ts +56 -70
- package/src/eventlog/EventRow.ts +12 -3
- package/src/eventlog/SqlEventJournal.ts +68 -45
- package/src/eventlog/SqlEventLogServerEncrypted.ts +1244 -136
- package/src/eventlog/SqlEventLogServerUnencrypted.ts +2 -2
- package/src/eventlog/internal/batches.ts +30 -0
- package/src/eventlog/internal/compaction.ts +64 -0
- package/src/eventlog/internal/conflicts.ts +0 -4
- package/src/eventlog/internal/identityRootSecretDerivation.ts +93 -123
- package/src/eventlog/internal/remoteCompaction.ts +92 -0
- package/src/http/Cookies.ts +291 -12
- package/src/http/FetchHttpClient.ts +88 -16
- package/src/http/HttpClient.ts +636 -29
- package/src/http/HttpClientError.ts +35 -1
- package/src/http/HttpClientRequest.ts +21 -10
- package/src/http/HttpClientResponse.ts +3 -2
- package/src/http/HttpMethod.ts +10 -2
- package/src/http/HttpMiddleware.ts +15 -18
- package/src/http/HttpRouter.ts +2 -1
- package/src/http/HttpServerError.ts +2 -2
- package/src/http/HttpServerRequest.ts +101 -30
- package/src/http/HttpServerResponse.ts +3 -2
- package/src/http/HttpStaticServer.ts +51 -22
- package/src/http/HttpTraceContext.ts +7 -4
- package/src/http/MultipartParser/internal/contentType.ts +3 -3
- package/src/http/ProblemDetails.ts +149 -0
- package/src/http/UrlParams.ts +6 -1
- package/src/http/index.ts +6 -0
- package/src/http/internal/compression.ts +4 -5
- package/src/http/internal/decompression.ts +10 -4
- package/src/http/internal/httpBody.ts +10 -2
- package/src/http/internal/urlParams.ts +37 -0
- package/src/http-api/HttpApi.ts +3 -6
- package/src/http-api/HttpApiBuilder.ts +61 -19
- package/src/http-api/HttpApiClient.ts +284 -72
- package/src/http-api/HttpApiEndpoint.ts +135 -35
- package/src/http-api/HttpApiError.ts +250 -0
- package/src/http-api/HttpApiMiddleware.ts +95 -1
- package/src/http-api/HttpApiSchema.ts +236 -52
- package/src/http-api/HttpApiTest.ts +3 -2
- package/src/http-api/OpenApi.ts +20 -17
- package/src/http-api/internal/toCodecHttpProperties.ts +56 -0
- package/src/index.ts +6 -6
- package/src/internal/arbitrary/runner.ts +133 -36
- package/src/internal/core.ts +2 -0
- package/src/internal/effect.ts +58 -34
- package/src/internal/equal.ts +17 -0
- package/src/internal/glob.ts +736 -0
- package/src/internal/jsonSchema.ts +27 -0
- package/src/internal/matcher.ts +18 -1
- package/src/internal/persistence.ts +11 -0
- package/src/internal/rcRef.ts +4 -1
- package/src/internal/schema/compilerRegistry.ts +6 -1
- package/src/internal/schema/content.ts +18 -0
- package/src/internal/schema/fromJsonSchemaDocument.ts +228 -190
- package/src/internal/schema/fromRepresentation.ts +2 -1
- package/src/internal/schema/standardSchema.ts +2 -2
- package/src/internal/schema/toCodeDocument.ts +11 -7
- package/src/internal/schema/toCodec.ts +26 -22
- package/src/internal/schema/toJsonSchemaDocument.ts +189 -167
- package/src/internal/schema/toRepresentation.ts +122 -140
- package/src/internal/sql.ts +14 -0
- package/src/internal/trie.ts +43 -14
- package/src/internal/ulid.ts +44 -0
- package/src/internal/uuid.ts +57 -16
- package/src/internal/version.ts +1 -1
- package/src/observability/Otlp.ts +21 -4
- package/src/observability/OtlpProxy.ts +314 -0
- package/src/observability/OtlpResource.ts +9 -1
- package/src/observability/OtlpTracer.ts +4 -0
- package/src/observability/index.ts +6 -0
- package/src/persistence/CircuitBreaker.ts +1678 -0
- package/src/persistence/KeyValueStore.ts +219 -22
- package/src/persistence/PersistedQueue.ts +128 -59
- package/src/persistence/Persistence.ts +20 -13
- package/src/persistence/Redis.ts +129 -8
- package/src/persistence/index.ts +6 -0
- package/src/process/ChildProcess.ts +285 -264
- package/src/process/ChildProcessSpawner.ts +46 -2
- package/src/process/CommandLine.ts +630 -0
- package/src/process/index.ts +6 -0
- package/src/reactivity/AsyncResult.ts +1 -1
- package/src/reactivity/Atom.ts +5 -5
- package/src/reactivity/AtomRegistry.ts +1 -1
- package/src/rpc/RpcClient.ts +75 -36
- package/src/rpc/RpcMessage.ts +10 -1
- package/src/rpc/RpcSerialization.ts +35 -9
- package/src/rpc/RpcServer.ts +176 -63
- package/src/rpc/RpcTest.ts +3 -0
- package/src/schema/Model.ts +26 -3
- package/src/sql/Migrator.ts +15 -69
- package/src/sql/MigratorFileSystem.ts +71 -0
- package/src/sql/SqlClient.ts +13 -20
- package/src/sql/SqlResolver.ts +23 -9
- package/src/sql/Statement.ts +38 -9
- package/src/sql/index.ts +1 -1
- package/src/testing/index.ts +0 -6
- package/src/workflow/DurableDeferred.ts +23 -6
- package/src/workflow/internal/crypto.ts +15 -11
- package/dist/Crypto.d.ts +0 -244
- package/dist/Crypto.d.ts.map +0 -1
- package/dist/Crypto.js +0 -139
- package/dist/Crypto.js.map +0 -1
- package/dist/testing/TestCrypto.d.ts +0 -73
- package/dist/testing/TestCrypto.d.ts.map +0 -1
- package/dist/testing/TestCrypto.js +0 -87
- package/dist/testing/TestCrypto.js.map +0 -1
- package/src/Crypto.ts +0 -347
- package/src/testing/TestCrypto.ts +0 -94
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
* `layer`, `layerWith`, `make`, and `makeEncoded` run the migrations before
|
|
12
12
|
* building the storage. To run migrations with a different connection, such as
|
|
13
13
|
* a schema owner in a deploy step, use `layerMigrations` there and
|
|
14
|
-
* `layerStorage` in the runtime.
|
|
14
|
+
* `layerStorage` or `makeEncodedStorage` in the runtime.
|
|
15
15
|
*
|
|
16
16
|
* Request deduplication keys that exceed the 255-character `message_id`
|
|
17
|
-
* column are hashed with the `
|
|
17
|
+
* column are hashed with the `Digest.Digest` service before they are written, so
|
|
18
18
|
* composed keys of any length are supported; shorter keys are stored as
|
|
19
19
|
* plaintext, byte-compatible with rows written by previous versions.
|
|
20
20
|
*
|
|
@@ -23,12 +23,10 @@
|
|
|
23
23
|
*/
|
|
24
24
|
// eslint-disable effect/no-bigint-literals
|
|
25
25
|
import * as Arr from "../Array.ts"
|
|
26
|
-
import * as
|
|
26
|
+
import * as Digest from "../crypto/Digest.ts"
|
|
27
27
|
import * as Effect from "../Effect.ts"
|
|
28
|
-
import * as Hex from "../encoding/Hex.ts"
|
|
29
28
|
import * as Layer from "../Layer.ts"
|
|
30
29
|
import * as Option from "../Option.ts"
|
|
31
|
-
import type * as PlatformError from "../PlatformError.ts"
|
|
32
30
|
import * as Migrator from "../sql/Migrator.ts"
|
|
33
31
|
import * as SqlClient from "../sql/SqlClient.ts"
|
|
34
32
|
import type { Row } from "../sql/SqlConnection.ts"
|
|
@@ -66,6 +64,7 @@ const withTracerDisabled = Effect.withTracerEnabled(false)
|
|
|
66
64
|
* tables, including the migration history table.
|
|
67
65
|
*
|
|
68
66
|
* @see {@link make} for the decoded `MessageStorage` constructor
|
|
67
|
+
* @see {@link makeEncodedStorage} for construction without migrations
|
|
69
68
|
*
|
|
70
69
|
* @stability unstable
|
|
71
70
|
* @category constructors
|
|
@@ -76,16 +75,49 @@ export const makeEncoded: (options?: {
|
|
|
76
75
|
}) => Effect.Effect<
|
|
77
76
|
MessageStorage.Encoded,
|
|
78
77
|
never,
|
|
79
|
-
SqlClient.SqlClient |
|
|
78
|
+
SqlClient.SqlClient | Digest.Digest
|
|
80
79
|
> = (options) => Effect.andThen(runMessageMigrations(options), makeEncodedStorage(options))
|
|
81
80
|
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
/**
|
|
82
|
+
* Creates a SQL-backed encoded message storage driver without running migrations
|
|
83
|
+
* or executing startup SQL.
|
|
84
|
+
*
|
|
85
|
+
* **When to use**
|
|
86
|
+
*
|
|
87
|
+
* Use when composing a custom encoded adapter with a runtime SQL connection
|
|
88
|
+
* that does not have schema-management privileges.
|
|
89
|
+
*
|
|
90
|
+
* **Details**
|
|
91
|
+
*
|
|
92
|
+
* The optional `prefix` controls the message and reply table names; when omitted,
|
|
93
|
+
* `cluster` is used.
|
|
94
|
+
*
|
|
95
|
+
* **Gotchas**
|
|
96
|
+
*
|
|
97
|
+
* Run `layerMigrations` separately with the same prefix before using the driver.
|
|
98
|
+
* This constructor does not create tables or check that the schema is up to date.
|
|
99
|
+
*
|
|
100
|
+
* @see {@link makeEncoded} for construction that runs migrations
|
|
101
|
+
* @see {@link layerMigrations} for running migrations separately
|
|
102
|
+
* @see {@link layerStorage} for providing decoded storage without migrations
|
|
103
|
+
*
|
|
104
|
+
* @stability unstable
|
|
105
|
+
* @category constructors
|
|
106
|
+
* @since 4.1.0
|
|
107
|
+
*/
|
|
108
|
+
export const makeEncodedStorage: (options?: {
|
|
109
|
+
readonly prefix?: string | undefined
|
|
110
|
+
}) => Effect.Effect<
|
|
111
|
+
MessageStorage.Encoded,
|
|
112
|
+
never,
|
|
113
|
+
SqlClient.SqlClient | Digest.Digest
|
|
114
|
+
> = Effect.fnUntraced(function*(
|
|
115
|
+
options?: {
|
|
84
116
|
readonly prefix?: string | undefined
|
|
85
|
-
}
|
|
117
|
+
}
|
|
86
118
|
) {
|
|
87
119
|
const sql = (yield* SqlClient.SqlClient).withoutTransforms()
|
|
88
|
-
const
|
|
120
|
+
const digest = yield* Digest.Digest
|
|
89
121
|
const prefix = options?.prefix ?? "cluster"
|
|
90
122
|
const table = (name: string) => `${prefix}_${name}`
|
|
91
123
|
|
|
@@ -108,10 +140,10 @@ const makeEncodedStorage = Effect.fnUntraced(function*(
|
|
|
108
140
|
// birthday bound). Digests never contain "/" while composed keys always do,
|
|
109
141
|
// so the two encodings cannot collide.
|
|
110
142
|
const encoder = new TextEncoder()
|
|
111
|
-
const messageIdForPrimaryKey = (primaryKey: string): Effect.Effect<string
|
|
143
|
+
const messageIdForPrimaryKey = (primaryKey: string): Effect.Effect<string> =>
|
|
112
144
|
primaryKey.length <= 255
|
|
113
145
|
? Effect.succeed(primaryKey)
|
|
114
|
-
:
|
|
146
|
+
: digest.digestHex(Digest.sha256, encoder.encode(primaryKey))
|
|
115
147
|
|
|
116
148
|
const messageIdEnforcesWidth = sql.onDialectOrElse({
|
|
117
149
|
mssql: () => true,
|
|
@@ -525,7 +557,7 @@ const makeEncodedStorage = Effect.fnUntraced(function*(
|
|
|
525
557
|
const encoded: MessageStorage.Encoded = {
|
|
526
558
|
saveEnvelope: ({ deliverAt, envelope, primaryKey }) =>
|
|
527
559
|
Effect.suspend(() => {
|
|
528
|
-
let insert: Effect.Effect<ReadonlyArray<Row>, SqlError
|
|
560
|
+
let insert: Effect.Effect<ReadonlyArray<Row>, SqlError>
|
|
529
561
|
if (primaryKey !== null) {
|
|
530
562
|
insert = Effect.flatMap(messageIdForPrimaryKey(primaryKey), (messageId) => {
|
|
531
563
|
const row = envelopeToRow(envelope, messageId, deliverAt)
|
|
@@ -811,7 +843,7 @@ export const make: (options?: {
|
|
|
811
843
|
}) => Effect.Effect<
|
|
812
844
|
MessageStorage.MessageStorage["Service"],
|
|
813
845
|
never,
|
|
814
|
-
SqlClient.SqlClient | Snowflake.Generator |
|
|
846
|
+
SqlClient.SqlClient | Snowflake.Generator | Digest.Digest
|
|
815
847
|
> = (options) => Effect.flatMap(makeEncoded(options), MessageStorage.makeEncoded)
|
|
816
848
|
|
|
817
849
|
/**
|
|
@@ -1165,7 +1197,7 @@ export const layerMigrations = (options: {
|
|
|
1165
1197
|
*/
|
|
1166
1198
|
export const layerStorage = (options: {
|
|
1167
1199
|
readonly prefix?: string | undefined
|
|
1168
|
-
}): Layer.Layer<MessageStorage.MessageStorage, never, SqlClient.SqlClient | ShardingConfig |
|
|
1200
|
+
}): Layer.Layer<MessageStorage.MessageStorage, never, SqlClient.SqlClient | ShardingConfig | Digest.Digest> =>
|
|
1169
1201
|
Layer.effect(
|
|
1170
1202
|
MessageStorage.MessageStorage,
|
|
1171
1203
|
Effect.flatMap(makeEncodedStorage(options), MessageStorage.makeEncoded)
|
|
@@ -1188,7 +1220,7 @@ export const layerStorage = (options: {
|
|
|
1188
1220
|
*/
|
|
1189
1221
|
export const layerWith = (options: {
|
|
1190
1222
|
readonly prefix?: string | undefined
|
|
1191
|
-
}): Layer.Layer<MessageStorage.MessageStorage, never, SqlClient.SqlClient | ShardingConfig |
|
|
1223
|
+
}): Layer.Layer<MessageStorage.MessageStorage, never, SqlClient.SqlClient | ShardingConfig | Digest.Digest> =>
|
|
1192
1224
|
layerStorage(options).pipe(
|
|
1193
1225
|
Layer.provide(layerMigrations(options))
|
|
1194
1226
|
)
|
|
@@ -1210,7 +1242,7 @@ export const layerWith = (options: {
|
|
|
1210
1242
|
export const layer: Layer.Layer<
|
|
1211
1243
|
MessageStorage.MessageStorage,
|
|
1212
1244
|
never,
|
|
1213
|
-
SqlClient.SqlClient | ShardingConfig |
|
|
1245
|
+
SqlClient.SqlClient | ShardingConfig | Digest.Digest
|
|
1214
1246
|
> = layerWith({})
|
|
1215
1247
|
|
|
1216
1248
|
// -------------------------------------------------------------------------------------------------
|
|
@@ -38,6 +38,14 @@ import * as ShardingConfig from "./ShardingConfig.ts"
|
|
|
38
38
|
|
|
39
39
|
const withTracerDisabled = Effect.withTracerEnabled(false)
|
|
40
40
|
|
|
41
|
+
// The session holding a storage's advisory locks, as reported to other
|
|
42
|
+
// sessions.
|
|
43
|
+
interface LockSession {
|
|
44
|
+
pid: number
|
|
45
|
+
// MySQL only: the lock that pins the session's lock connection
|
|
46
|
+
readonly pinLock: string | undefined
|
|
47
|
+
}
|
|
48
|
+
|
|
41
49
|
// This exact FNV-1a hash, including its tag and UTF-8 encoding, is a persistent
|
|
42
50
|
// advisory-lock wire format and must never change.
|
|
43
51
|
const postgresLockNamespace = (prefix: string): number => {
|
|
@@ -69,6 +77,31 @@ const makeStorage = Effect.fnUntraced(function*(options: {
|
|
|
69
77
|
// PostgreSQL exposes the signed int4 lock key through pg_locks as an unsigned oid.
|
|
70
78
|
const pgLockNamespaceOid = pgLockNamespace >>> 0
|
|
71
79
|
|
|
80
|
+
// MySQL identifies a lock holder by connection id. Behind Vitess that is the
|
|
81
|
+
// id of vtgate's lock connection for the session, which vtgate replaces
|
|
82
|
+
// once the session releases all of its locks. A lock of the session's own
|
|
83
|
+
// pins that connection and reads its id.
|
|
84
|
+
const pinLockSession = Effect.fnUntraced(function*(conn: Connection, pinLock?: string) {
|
|
85
|
+
while (true) {
|
|
86
|
+
const name = pinLock ?? `cluster:pid:${(Math.random() * Number.MAX_SAFE_INTEGER) | 0}`
|
|
87
|
+
const taken = (yield* conn.executeValues(
|
|
88
|
+
`SELECT GET_LOCK('${name}', 10), IS_USED_LOCK('${name}')`,
|
|
89
|
+
[]
|
|
90
|
+
))[0] as [1 | null, number]
|
|
91
|
+
if (taken[0] === null) continue
|
|
92
|
+
return { pid: Number(taken[1]), pinLock: name }
|
|
93
|
+
}
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
// In milliseconds, capped to the largest value PostgreSQL accepts.
|
|
97
|
+
const idleSessionTimeout = Math.min(
|
|
98
|
+
Math.ceil(Duration.toMillis(Duration.fromInputUnsafe(config.shardLockExpiration))),
|
|
99
|
+
2147483647
|
|
100
|
+
)
|
|
101
|
+
const shardLockExpirationSeconds = Math.ceil(Duration.toSeconds(config.shardLockExpiration))
|
|
102
|
+
// Between the smallest and largest values MySQL accepts.
|
|
103
|
+
const waitTimeout = Math.min(Math.max(1, shardLockExpirationSeconds), 31536000)
|
|
104
|
+
|
|
72
105
|
// Keep all PostgreSQL and MySQL shard-lock operations on a rebuildable
|
|
73
106
|
// reserved connection, including when advisory locks are disabled.
|
|
74
107
|
const acquireLockConn = singleSession ? undefined : sql.onDialectOrElse({
|
|
@@ -77,46 +110,57 @@ const makeStorage = Effect.fnUntraced(function*(options: {
|
|
|
77
110
|
const conn = yield* Effect.orDie(sql.reserve).pipe(
|
|
78
111
|
Scope.provide(scope)
|
|
79
112
|
)
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
)
|
|
90
|
-
|
|
91
|
-
|
|
113
|
+
if (disableAdvisoryLocks) return [conn, { pid: 0, pinLock: undefined }] as const
|
|
114
|
+
// The connection returns to the shared pool, so restore the session's
|
|
115
|
+
// idle_session_timeout along with releasing its locks. Registered
|
|
116
|
+
// before the timeout is set, so a failed setup restores it too.
|
|
117
|
+
yield* Scope.addFinalizerExit(scope, () =>
|
|
118
|
+
conn.executeRaw(
|
|
119
|
+
"SELECT pg_advisory_unlock_all(), (SELECT set_config(name, reset_val, false) FROM pg_settings WHERE name = 'idle_session_timeout')",
|
|
120
|
+
[]
|
|
121
|
+
).pipe(
|
|
122
|
+
Effect.timeout(lockOperationInterval),
|
|
123
|
+
Effect.interruptible,
|
|
124
|
+
Effect.ignoreCause
|
|
125
|
+
))
|
|
126
|
+
// Advisory locks belong to the session, so a frozen runner whose
|
|
127
|
+
// connection stays open would hold them indefinitely. End the session
|
|
128
|
+
// once it has been idle for shardLockExpiration, which releases them.
|
|
129
|
+
// Runners holding shards use it at least every shardLockExpiration / 3.
|
|
130
|
+
// Servers without idle_session_timeout (before PostgreSQL 14) keep the
|
|
131
|
+
// session open.
|
|
132
|
+
const pid = (yield* conn.executeValues(
|
|
133
|
+
`SELECT pg_backend_pid(), (SELECT set_config(name, '${idleSessionTimeout}', false) FROM pg_settings WHERE name = 'idle_session_timeout')`,
|
|
134
|
+
[]
|
|
135
|
+
))[0][0] as number
|
|
136
|
+
return [conn, { pid, pinLock: undefined }] as const
|
|
92
137
|
}, Effect.orDie),
|
|
93
138
|
mysql: () =>
|
|
94
139
|
Effect.fnUntraced(function*(scope: Scope.Scope) {
|
|
95
140
|
const conn = yield* Effect.orDie(sql.reserve).pipe(
|
|
96
141
|
Scope.provide(scope)
|
|
97
142
|
)
|
|
98
|
-
if (disableAdvisoryLocks) return [conn, 0] as const
|
|
143
|
+
if (disableAdvisoryLocks) return [conn, { pid: 0, pinLock: undefined }] as const
|
|
144
|
+
// The connection goes back to the shared pool, so leave it as it was
|
|
145
|
+
// borrowed, even if setup fails below.
|
|
146
|
+
const borrowedWaitTimeout = Number((yield* conn.executeValues("SELECT @@SESSION.wait_timeout", []))[0][0])
|
|
147
|
+
yield* Scope.addFinalizerExit(scope, () =>
|
|
148
|
+
conn.executeRaw("SELECT RELEASE_ALL_LOCKS()", []).pipe(
|
|
149
|
+
Effect.andThen(conn.executeRaw(`SET SESSION wait_timeout = ${borrowedWaitTimeout}`, [])),
|
|
150
|
+
Effect.timeout(lockOperationInterval),
|
|
151
|
+
Effect.interruptible,
|
|
152
|
+
Effect.ignoreCause
|
|
153
|
+
))
|
|
154
|
+
// Named locks belong to the connection, so a frozen runner whose
|
|
155
|
+
// connection stays open would hold them indefinitely. Have the server
|
|
156
|
+
// close the connection once it has been idle for shardLockExpiration,
|
|
157
|
+
// which releases them. vtgate accepts but ignores wait_timeout, so
|
|
158
|
+
// behind Vitess the locks stay held until the connection closes.
|
|
159
|
+
yield* conn.executeRaw(`SET SESSION wait_timeout = ${waitTimeout}`, [])
|
|
99
160
|
// we need to get the connection id using IS_USED_LOCK to properly
|
|
100
161
|
// support vitess
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
const address = `cluster:pid:${(Math.random() * Number.MAX_SAFE_INTEGER) | 0}`
|
|
104
|
-
const taken = (yield* conn.executeValues(
|
|
105
|
-
`SELECT GET_LOCK('${address}', 10), IS_USED_LOCK('${address}')`,
|
|
106
|
-
[]
|
|
107
|
-
))[0] as [1 | null, number]
|
|
108
|
-
if (taken[0] === null) continue
|
|
109
|
-
pid = taken[1]
|
|
110
|
-
}
|
|
111
|
-
if (!disableAdvisoryLocks) {
|
|
112
|
-
yield* Scope.addFinalizerExit(scope, () =>
|
|
113
|
-
conn.executeRaw("SELECT RELEASE_ALL_LOCKS()", []).pipe(
|
|
114
|
-
Effect.timeout(lockOperationInterval),
|
|
115
|
-
Effect.interruptible,
|
|
116
|
-
Effect.ignoreCause
|
|
117
|
-
))
|
|
118
|
-
}
|
|
119
|
-
return [conn, pid] as const
|
|
162
|
+
const session: LockSession = yield* pinLockSession(conn)
|
|
163
|
+
return [conn, session] as const
|
|
120
164
|
}, Effect.orDie),
|
|
121
165
|
orElse: () => undefined
|
|
122
166
|
})
|
|
@@ -140,7 +184,7 @@ const makeStorage = Effect.fnUntraced(function*(options: {
|
|
|
140
184
|
)
|
|
141
185
|
})
|
|
142
186
|
|
|
143
|
-
const rebuildLockConn = (from?: readonly [Connection,
|
|
187
|
+
const rebuildLockConn = (from?: readonly [Connection, LockSession]) => {
|
|
144
188
|
const rebuild = lockConn?.rebuildUnsafe({ from })
|
|
145
189
|
if (!rebuild) return Effect.void
|
|
146
190
|
// Bound release so a stalled connection cannot block subsequent rebuilds.
|
|
@@ -152,13 +196,13 @@ const makeStorage = Effect.fnUntraced(function*(options: {
|
|
|
152
196
|
}
|
|
153
197
|
// SQL failures replace the held connection; deadlines are handled by withLockOperationDeadline.
|
|
154
198
|
const useLockConn = <A, E, R>(
|
|
155
|
-
f: (conn: Connection, pid: number) => Effect.Effect<A, E, R>
|
|
199
|
+
f: (conn: Connection, pid: number, session: LockSession) => Effect.Effect<A, E, R>
|
|
156
200
|
): Effect.Effect<A, E, R> =>
|
|
157
201
|
Effect.flatMap(
|
|
158
202
|
lockConn!.await,
|
|
159
203
|
(held) =>
|
|
160
204
|
Effect.onError(
|
|
161
|
-
f(held[0], held[1]),
|
|
205
|
+
f(held[0], held[1].pid, held[1]),
|
|
162
206
|
(cause) => Cause.hasInterruptsOnly(cause) ? Effect.void : rebuildLockConn(held)
|
|
163
207
|
)
|
|
164
208
|
)
|
|
@@ -181,11 +225,7 @@ const makeStorage = Effect.fnUntraced(function*(options: {
|
|
|
181
225
|
// avoid deadlocks between acquisition, refresh and bulk release.
|
|
182
226
|
const pgLockOrder = sql.literal(`ORDER BY shard_id COLLATE "C"`)
|
|
183
227
|
|
|
184
|
-
const expiresSeconds = sql.literal(
|
|
185
|
-
Math.ceil(Duration.toSeconds(
|
|
186
|
-
Duration.fromInputUnsafe(config.shardLockExpiration)
|
|
187
|
-
)).toString()
|
|
188
|
-
)
|
|
228
|
+
const expiresSeconds = sql.literal(shardLockExpirationSeconds.toString())
|
|
189
229
|
const lockExpiresAt = sql.onDialectOrElse({
|
|
190
230
|
pg: () => sql`${sqlNow} - INTERVAL '${expiresSeconds} seconds'`,
|
|
191
231
|
mysql: () => sql`DATE_SUB(${sqlNow}, INTERVAL ${expiresSeconds} SECOND)`,
|
|
@@ -270,6 +310,40 @@ const makeStorage = Effect.fnUntraced(function*(options: {
|
|
|
270
310
|
return useLockConn((conn) => conn.executeValues(query, params))
|
|
271
311
|
}
|
|
272
312
|
|
|
313
|
+
// Splits shardIds into the advisory locks held by the lock session and the rest.
|
|
314
|
+
const pgHeldLocks = Effect.fnUntraced(function*(conn: Connection, pid: number, shardIds: ReadonlyArray<string>) {
|
|
315
|
+
const held: Array<string> = []
|
|
316
|
+
const notHeld = new Map(shardIds.map((shardId) => [lockNumbers.get(shardId)!, shardId]))
|
|
317
|
+
const takenLocks = yield* conn.executeValues(
|
|
318
|
+
`SELECT objid FROM pg_locks WHERE locktype = 'advisory' AND granted = true AND classid = ${pgLockNamespaceOid} AND objsubid = 2 AND pid = ${pid} ORDER BY objid`,
|
|
319
|
+
[]
|
|
320
|
+
)
|
|
321
|
+
for (let i = 0; i < takenLocks.length; i++) {
|
|
322
|
+
const lockNum = takenLocks[i][0] as number
|
|
323
|
+
const shardId = notHeld.get(lockNum)
|
|
324
|
+
if (shardId === undefined) continue
|
|
325
|
+
held.push(shardId)
|
|
326
|
+
notHeld.delete(lockNum)
|
|
327
|
+
}
|
|
328
|
+
return [held, notHeld] as const
|
|
329
|
+
})
|
|
330
|
+
|
|
331
|
+
const mysqlHeldLocks = Effect.fnUntraced(function*(conn: Connection, pid: number, shardIds: ReadonlyArray<string>) {
|
|
332
|
+
const takenLocks = (yield* conn.executeValues(`SELECT ${allMySqlTakenLocks}`, []))[0] as Array<number | null>
|
|
333
|
+
const held: Array<string> = []
|
|
334
|
+
const notHeld: Array<string> = []
|
|
335
|
+
for (let i = 0; i < shardIds.length; i++) {
|
|
336
|
+
const shardId = shardIds[i]
|
|
337
|
+
const lockTakenBy = takenLocks[shardIdsIndex.get(shardId)!]
|
|
338
|
+
if (lockTakenBy !== null && Number(lockTakenBy) === pid) {
|
|
339
|
+
held.push(shardId)
|
|
340
|
+
} else {
|
|
341
|
+
notHeld.push(shardId)
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return [held, notHeld] as const
|
|
345
|
+
})
|
|
346
|
+
|
|
273
347
|
const acquireLock = sql.onDialectOrElse({
|
|
274
348
|
pg: () => {
|
|
275
349
|
if (disableAdvisoryLocks) {
|
|
@@ -293,19 +367,7 @@ const makeStorage = Effect.fnUntraced(function*(options: {
|
|
|
293
367
|
}
|
|
294
368
|
return (_address: string, shardIds: ReadonlyArray<string>) =>
|
|
295
369
|
useLockConn(Effect.fnUntraced(function*(conn, pid) {
|
|
296
|
-
const acquiredShardIds
|
|
297
|
-
const toAcquire = new Map(shardIds.map((shardId) => [lockNumbers.get(shardId)!, shardId]))
|
|
298
|
-
const takenLocks = yield* conn.executeValues(
|
|
299
|
-
`SELECT objid FROM pg_locks WHERE locktype = 'advisory' AND granted = true AND classid = ${pgLockNamespaceOid} AND objsubid = 2 AND pid = ${pid} ORDER BY objid`,
|
|
300
|
-
[]
|
|
301
|
-
)
|
|
302
|
-
for (let i = 0; i < takenLocks.length; i++) {
|
|
303
|
-
const lockNum = takenLocks[i][0] as number
|
|
304
|
-
const shardId = toAcquire.get(lockNum)
|
|
305
|
-
if (shardId === undefined) continue
|
|
306
|
-
acquiredShardIds.push(shardId)
|
|
307
|
-
toAcquire.delete(lockNum)
|
|
308
|
-
}
|
|
370
|
+
const [acquiredShardIds, toAcquire] = yield* pgHeldLocks(conn, pid, shardIds)
|
|
309
371
|
if (toAcquire.size === 0) {
|
|
310
372
|
return acquiredShardIds
|
|
311
373
|
}
|
|
@@ -339,18 +401,7 @@ const makeStorage = Effect.fnUntraced(function*(options: {
|
|
|
339
401
|
}
|
|
340
402
|
return (_address: string, shardIds: ReadonlyArray<string>) =>
|
|
341
403
|
useLockConn(Effect.fnUntraced(function*(conn, pid) {
|
|
342
|
-
const
|
|
343
|
-
const acquiredShardIds: Array<string> = []
|
|
344
|
-
const toAcquire: Array<string> = []
|
|
345
|
-
for (let i = 0; i < shardIds.length; i++) {
|
|
346
|
-
const shardId = shardIds[i]
|
|
347
|
-
const lockTakenBy = takenLocks[shardIdsIndex.get(shardId)!]
|
|
348
|
-
if (lockTakenBy === pid) {
|
|
349
|
-
acquiredShardIds.push(shardId)
|
|
350
|
-
} else if (shardIds.includes(shardId)) {
|
|
351
|
-
toAcquire.push(shardId)
|
|
352
|
-
}
|
|
353
|
-
}
|
|
404
|
+
const [acquiredShardIds, toAcquire] = yield* mysqlHeldLocks(conn, pid, shardIds)
|
|
354
405
|
if (toAcquire.length === 0) {
|
|
355
406
|
return acquiredShardIds
|
|
356
407
|
}
|
|
@@ -463,9 +514,15 @@ const makeStorage = Effect.fnUntraced(function*(options: {
|
|
|
463
514
|
const stringLiteral = (s: string) => sql.literal(wrapString(s))
|
|
464
515
|
const stringLiteralArr = (arr: ReadonlyArray<string>) => sql.literal(`(${arr.map(wrapString).join(",")})`)
|
|
465
516
|
|
|
517
|
+
// An advisory lock refresh only confirms the locks the current lock session
|
|
518
|
+
// holds. A replaced session has lost its predecessor's locks, possibly to
|
|
519
|
+
// another runner in between, so reacquiring them here would hide the loss.
|
|
466
520
|
const refreshShards = sql.onDialectOrElse({
|
|
467
521
|
pg: () => {
|
|
468
|
-
if (!disableAdvisoryLocks)
|
|
522
|
+
if (!disableAdvisoryLocks) {
|
|
523
|
+
return (_address: string, shardIds: ReadonlyArray<string>) =>
|
|
524
|
+
useLockConn((conn, pid) => Effect.map(pgHeldLocks(conn, pid, shardIds), ([held]) => held))
|
|
525
|
+
}
|
|
469
526
|
return (address: string, shardIds: ReadonlyArray<string>) =>
|
|
470
527
|
sql`
|
|
471
528
|
WITH locked AS (
|
|
@@ -483,7 +540,10 @@ const makeStorage = Effect.fnUntraced(function*(options: {
|
|
|
483
540
|
)
|
|
484
541
|
},
|
|
485
542
|
mysql: () => {
|
|
486
|
-
if (!disableAdvisoryLocks)
|
|
543
|
+
if (!disableAdvisoryLocks) {
|
|
544
|
+
return (_address: string, shardIds: ReadonlyArray<string>) =>
|
|
545
|
+
useLockConn((conn, pid) => Effect.map(mysqlHeldLocks(conn, pid, shardIds), ([held]) => held))
|
|
546
|
+
}
|
|
487
547
|
return (address: string, shardIds: ReadonlyArray<string>) => {
|
|
488
548
|
const shardIdsStr = stringLiteralArr(shardIds)
|
|
489
549
|
return sql<Array<{ shard_id: string }>>`
|
|
@@ -558,7 +618,7 @@ const makeStorage = Effect.fnUntraced(function*(options: {
|
|
|
558
618
|
`SELECT IS_USED_LOCK('${lockName}')`,
|
|
559
619
|
[]
|
|
560
620
|
)
|
|
561
|
-
if (takenLocks.length === 0 || takenLocks[0][0] !== pid) return
|
|
621
|
+
if (takenLocks.length === 0 || Number(takenLocks[0][0]) !== pid) return
|
|
562
622
|
}
|
|
563
623
|
}))
|
|
564
624
|
},
|
|
@@ -579,7 +639,12 @@ const makeStorage = Effect.fnUntraced(function*(options: {
|
|
|
579
639
|
mysql: () => (address: string) =>
|
|
580
640
|
disableAdvisoryLocks
|
|
581
641
|
? sql`DELETE FROM ${locksTableSql} WHERE address = ${address}`.pipe(execWithLockConn)
|
|
582
|
-
:
|
|
642
|
+
: useLockConn(Effect.fnUntraced(function*(conn, _pid, session) {
|
|
643
|
+
yield* conn.executeRaw("SELECT RELEASE_ALL_LOCKS()", [])
|
|
644
|
+
// Releasing every lock also releases the pin, so take it again.
|
|
645
|
+
const pinned = yield* pinLockSession(conn, session.pinLock)
|
|
646
|
+
session.pid = pinned.pid
|
|
647
|
+
})),
|
|
583
648
|
orElse: () => (address: string) => sql`DELETE FROM ${locksTableSql} WHERE address = ${address}`
|
|
584
649
|
})
|
|
585
650
|
|
|
@@ -612,8 +677,16 @@ const makeStorage = Effect.fnUntraced(function*(options: {
|
|
|
612
677
|
withTracerDisabled
|
|
613
678
|
),
|
|
614
679
|
|
|
680
|
+
// A runner without shards leaves its lock connection idle, so the server
|
|
681
|
+
// may have ended the session, and the first operation on it fails and
|
|
682
|
+
// replaces it. Acquiring does not depend on the previous session, so retry
|
|
683
|
+
// once on the replacement.
|
|
615
684
|
acquire: (address, shardIds) =>
|
|
616
|
-
withLockOperationDeadline(
|
|
685
|
+
withLockOperationDeadline(
|
|
686
|
+
lockConn
|
|
687
|
+
? Effect.catch(acquireLock(address, shardIds), () => acquireLock(address, shardIds))
|
|
688
|
+
: acquireLock(address, shardIds)
|
|
689
|
+
).pipe(
|
|
617
690
|
PersistenceError.refail,
|
|
618
691
|
withTracerDisabled
|
|
619
692
|
),
|
|
@@ -20,6 +20,7 @@ import * as Schedule from "../../Schedule.ts"
|
|
|
20
20
|
import * as Schema from "../../Schema.ts"
|
|
21
21
|
import * as SchemaIssue from "../../SchemaIssue.ts"
|
|
22
22
|
import * as Scope from "../../Scope.ts"
|
|
23
|
+
import type { PersistenceError } from "../ClusterError.ts"
|
|
23
24
|
import { AlreadyProcessingMessage, EntityNotAssignedToRunner, MailboxFull, MalformedMessage } from "../ClusterError.ts"
|
|
24
25
|
import * as ClusterMetrics from "../ClusterMetrics.ts"
|
|
25
26
|
import { isUninterruptibleForServer, Persisted, WithTransaction } from "../ClusterSchema.ts"
|
|
@@ -37,6 +38,7 @@ import type { ShardId } from "../ShardId.ts"
|
|
|
37
38
|
import type { Sharding } from "../Sharding.ts"
|
|
38
39
|
import { ShardingConfig } from "../ShardingConfig.ts"
|
|
39
40
|
import * as Snowflake from "../Snowflake.ts"
|
|
41
|
+
import * as ClusterAbandon from "./clusterAbandon.ts"
|
|
40
42
|
import { CurrentActivationScope } from "./entityActivation.ts"
|
|
41
43
|
import { EntityReaper } from "./entityReaper.ts"
|
|
42
44
|
import { acquireEntity, releaseEntity } from "./interruptors.ts"
|
|
@@ -144,6 +146,19 @@ export const make = Effect.fnUntraced(function*<
|
|
|
144
146
|
readonly disableFatalDefects?: boolean | undefined
|
|
145
147
|
readonly defectRetryPolicy?: Schedule.Schedule<any, unknown, never, never> | undefined
|
|
146
148
|
readonly spanAttributes?: Record<string, string> | undefined
|
|
149
|
+
/**
|
|
150
|
+
* Called once a retiring entity stops accepting requests, so callers
|
|
151
|
+
* waiting on requests it has not started can be released.
|
|
152
|
+
*/
|
|
153
|
+
readonly abandonUndelivered: (
|
|
154
|
+
address: EntityAddress,
|
|
155
|
+
isDelivered: (requestId: Snowflake.Snowflake) => boolean
|
|
156
|
+
) => Effect.Effect<void>
|
|
157
|
+
/**
|
|
158
|
+
* Whether this runner still owns the shard, checked before storing the
|
|
159
|
+
* final reply of a persisted request.
|
|
160
|
+
*/
|
|
161
|
+
readonly isShardOwned: (shardId: ShardId) => Effect.Effect<boolean>
|
|
147
162
|
}
|
|
148
163
|
) {
|
|
149
164
|
const config = yield* ShardingConfig
|
|
@@ -248,6 +263,14 @@ export const make = Effect.fnUntraced(function*<
|
|
|
248
263
|
// Finalizers run in reverse, so the mailbox series and the resident
|
|
249
264
|
// mailbox are removed only after the drain finalizer below has finished.
|
|
250
265
|
const activeRequests: EntityState["activeRequests"] = new Map()
|
|
266
|
+
// Drops a request that has left this entity, starting the idle timer when
|
|
267
|
+
// it was the last one.
|
|
268
|
+
const removeActiveRequest = (requestId: Snowflake.Snowflake) => {
|
|
269
|
+
activeRequests.delete(requestId)
|
|
270
|
+
if (activeRequests.size === 0) {
|
|
271
|
+
state.lastActiveCheck = clock.currentTimeMillisUnsafe()
|
|
272
|
+
}
|
|
273
|
+
}
|
|
251
274
|
let mailboxSeries: Metric.Registration | undefined
|
|
252
275
|
yield* Scope.addFinalizer(
|
|
253
276
|
scope,
|
|
@@ -326,27 +349,27 @@ export const make = Effect.fnUntraced(function*<
|
|
|
326
349
|
return Effect.void
|
|
327
350
|
}
|
|
328
351
|
|
|
329
|
-
// For durable messages, ignore interrupts during shutdown.
|
|
330
|
-
// They will be retried when the entity is restarted.
|
|
331
|
-
// Also, if the request is uninterruptible, we ignore the
|
|
332
|
-
// interrupt.
|
|
333
352
|
const persisted = storageEnabled && Context.get(request.message.annotations, Persisted)
|
|
334
|
-
if (
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
353
|
+
if (persisted && Exit.isFailure(response.exit) && Cause.hasInterrupts(response.exit.cause)) {
|
|
354
|
+
// A durable request interrupted by shutdown, or abandoned
|
|
355
|
+
// because this owner can no longer serve it, is left for
|
|
356
|
+
// replay instead of being answered.
|
|
357
|
+
const abandoned = ClusterAbandon.isCause(response.exit.cause) &&
|
|
358
|
+
(!isActive() || !options.sharding.hasShardId(address.shardId))
|
|
359
|
+
if (isShuttingDown || request.terminating || abandoned) {
|
|
360
|
+
removeActiveRequest(Snowflake.Snowflake(response.requestId))
|
|
361
|
+
return options.storage.unregisterReplyHandler(request.message.envelope.requestId)
|
|
362
|
+
}
|
|
363
|
+
// An uninterruptible request ignores the interrupt and runs again.
|
|
364
|
+
if (isUninterruptibleForServer(request.message.annotations)) {
|
|
340
365
|
request.sentExit = false
|
|
341
366
|
return server.write(0, requestEnvelope(request), requestWriteOptions(request)).pipe(
|
|
342
367
|
Effect.setContext(handlerContext),
|
|
343
368
|
Effect.forkIn(handlerScope)
|
|
344
369
|
)
|
|
345
370
|
}
|
|
346
|
-
activeRequests.delete(Snowflake.Snowflake(response.requestId))
|
|
347
|
-
return options.storage.unregisterReplyHandler(request.message.envelope.requestId)
|
|
348
371
|
}
|
|
349
|
-
const
|
|
372
|
+
const write = retryRespond(
|
|
350
373
|
4,
|
|
351
374
|
Effect.suspend(() =>
|
|
352
375
|
request.message.respond(
|
|
@@ -358,18 +381,36 @@ export const make = Effect.fnUntraced(function*<
|
|
|
358
381
|
)
|
|
359
382
|
)
|
|
360
383
|
)
|
|
384
|
+
// A runner that lost the shard must not decide the stored
|
|
385
|
+
// result. A rejection is not retried.
|
|
386
|
+
let fenced = false
|
|
387
|
+
const save = !persisted ? write : Effect.flatMap(
|
|
388
|
+
options.isShardOwned(address.shardId),
|
|
389
|
+
(owned): Effect.Effect<void, MalformedMessage | PersistenceError | EntityNotAssignedToRunner> => {
|
|
390
|
+
if (owned) return write
|
|
391
|
+
fenced = true
|
|
392
|
+
return Effect.fail(new EntityNotAssignedToRunner({ address }))
|
|
393
|
+
}
|
|
394
|
+
)
|
|
395
|
+
// Leave the request for the shard's owner: release the claim
|
|
396
|
+
// so its next poll sees it, and let local callers re-route.
|
|
397
|
+
const abandonFenced = Effect.suspend(() => {
|
|
398
|
+
removeActiveRequest(Snowflake.Snowflake(response.requestId))
|
|
399
|
+
return Effect.logDebug("Abandoning a request whose shard this runner no longer owns").pipe(
|
|
400
|
+
Effect.andThen(options.storage.unregisterReplyHandler(request.message.envelope.requestId)),
|
|
401
|
+
Effect.andThen(Effect.ignore(options.storage.resetRequests([request.message.envelope.requestId])))
|
|
402
|
+
)
|
|
403
|
+
})
|
|
361
404
|
const complete = Effect.sync(() => {
|
|
362
405
|
if (storageEnabled) {
|
|
363
406
|
processedRequestIds.add(request.message.envelope.requestId)
|
|
364
407
|
}
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
// Start the idle timer when the last request completes.
|
|
368
|
-
if (activeRequests.size === 0) {
|
|
369
|
-
state.lastActiveCheck = clock.currentTimeMillisUnsafe()
|
|
370
|
-
}
|
|
408
|
+
removeActiveRequest(Snowflake.Snowflake(response.requestId))
|
|
371
409
|
})
|
|
372
|
-
const respond = Effect.
|
|
410
|
+
const respond = Effect.andThen(save, complete).pipe(
|
|
411
|
+
Effect.catchTag("EntityNotAssignedToRunner", () => abandonFenced),
|
|
412
|
+
Effect.orDie
|
|
413
|
+
)
|
|
373
414
|
const transaction = request.transaction
|
|
374
415
|
if (!transaction) return respond
|
|
375
416
|
const exit = response.exit
|
|
@@ -381,8 +422,12 @@ export const make = Effect.fnUntraced(function*<
|
|
|
381
422
|
}
|
|
382
423
|
|
|
383
424
|
if (Exit.isSuccess(exit)) {
|
|
384
|
-
transaction.settle = (outcome) =>
|
|
385
|
-
Exit.isSuccess(outcome)
|
|
425
|
+
transaction.settle = (outcome) => {
|
|
426
|
+
if (Exit.isSuccess(outcome)) return complete
|
|
427
|
+
// A rejected save failed the transaction, rolling back the
|
|
428
|
+
// handler's writes; the request is left for the owner.
|
|
429
|
+
if (fenced) return abandonFenced
|
|
430
|
+
return Effect.flatMap(
|
|
386
431
|
hasStoredExit(request.message.envelope.requestId),
|
|
387
432
|
(committed) => {
|
|
388
433
|
if (!committed) return restartFrom(outcome.cause)
|
|
@@ -393,6 +438,7 @@ export const make = Effect.fnUntraced(function*<
|
|
|
393
438
|
)
|
|
394
439
|
}
|
|
395
440
|
)
|
|
441
|
+
}
|
|
396
442
|
return Effect.orDie(save)
|
|
397
443
|
}
|
|
398
444
|
transaction.settle = (outcome) =>
|
|
@@ -539,6 +585,13 @@ export const make = Effect.fnUntraced(function*<
|
|
|
539
585
|
request.terminating = true
|
|
540
586
|
yield* state.write(0, { _tag: "Interrupt", requestId: requestId as any, interruptors: [] })
|
|
541
587
|
}
|
|
588
|
+
// A handler this drain waits for may be parked on a request the
|
|
589
|
+
// retired entity will never start, such as its own queued request.
|
|
590
|
+
// Release callers before `Eof`, which waits for handler acquisition.
|
|
591
|
+
yield* options.abandonUndelivered(
|
|
592
|
+
address,
|
|
593
|
+
(requestId) => activeRequests.get(requestId)?.delivered === true
|
|
594
|
+
)
|
|
542
595
|
yield* state.write(0, { _tag: "Eof" })
|
|
543
596
|
}).pipe(
|
|
544
597
|
Effect.andThen(endLatch.await),
|