effect 4.0.5 → 4.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ai-docs/package.json +1 -1
- package/ai-docs/src/06_schedule/10_schedules.ts +5 -4
- package/ai-docs/tsconfig.json +3 -1
- package/dist/Arbitrary.d.ts +10 -2
- package/dist/Arbitrary.d.ts.map +1 -1
- package/dist/Arbitrary.js +2 -1
- package/dist/Arbitrary.js.map +1 -1
- package/dist/Array.d.ts +117 -52
- package/dist/Array.d.ts.map +1 -1
- package/dist/Array.js +41 -20
- package/dist/Array.js.map +1 -1
- package/dist/Bytes.d.ts +79 -0
- package/dist/Bytes.d.ts.map +1 -0
- package/dist/Bytes.js +109 -0
- package/dist/Bytes.js.map +1 -0
- package/dist/Channel.d.ts +181 -13
- package/dist/Channel.d.ts.map +1 -1
- package/dist/Channel.js +144 -34
- package/dist/Channel.js.map +1 -1
- package/dist/ChannelSchema.d.ts.map +1 -1
- package/dist/ChannelSchema.js.map +1 -1
- package/dist/Chunk.d.ts +39 -21
- package/dist/Chunk.d.ts.map +1 -1
- package/dist/Chunk.js +26 -17
- package/dist/Chunk.js.map +1 -1
- package/dist/Config.d.ts.map +1 -1
- package/dist/Config.js +8 -3
- package/dist/Config.js.map +1 -1
- package/dist/ConfigProvider.d.ts.map +1 -1
- package/dist/ConfigProvider.js +2 -1
- package/dist/ConfigProvider.js.map +1 -1
- package/dist/Cron.d.ts +2 -2
- package/dist/Cron.d.ts.map +1 -1
- package/dist/Cron.js +6 -3
- package/dist/Cron.js.map +1 -1
- package/dist/Data.d.ts +54 -235
- package/dist/Data.d.ts.map +1 -1
- package/dist/Data.js.map +1 -1
- package/dist/Duration.d.ts.map +1 -1
- package/dist/Duration.js +56 -16
- package/dist/Duration.js.map +1 -1
- package/dist/Effect.d.ts +488 -164
- package/dist/Effect.d.ts.map +1 -1
- package/dist/Effect.js +204 -38
- package/dist/Effect.js.map +1 -1
- package/dist/Equal.d.ts.map +1 -1
- package/dist/Equal.js +8 -1
- package/dist/Equal.js.map +1 -1
- package/dist/Equivalence.d.ts +2 -1
- package/dist/Equivalence.d.ts.map +1 -1
- package/dist/Equivalence.js +12 -8
- package/dist/Equivalence.js.map +1 -1
- package/dist/Exit.d.ts +27 -12
- package/dist/Exit.d.ts.map +1 -1
- package/dist/Exit.js +8 -3
- package/dist/Exit.js.map +1 -1
- package/dist/FiberHandle.d.ts +2 -0
- package/dist/FiberHandle.d.ts.map +1 -1
- package/dist/FiberHandle.js +9 -4
- package/dist/FiberHandle.js.map +1 -1
- package/dist/FiberMap.d.ts +2 -0
- package/dist/FiberMap.d.ts.map +1 -1
- package/dist/FiberMap.js +5 -2
- package/dist/FiberMap.js.map +1 -1
- package/dist/FileSystem.d.ts +5 -0
- package/dist/FileSystem.d.ts.map +1 -1
- package/dist/FileSystem.js +3 -0
- package/dist/FileSystem.js.map +1 -1
- package/dist/Formatter.d.ts.map +1 -1
- package/dist/Formatter.js +27 -13
- package/dist/Formatter.js.map +1 -1
- package/dist/Graph.d.ts.map +1 -1
- package/dist/Graph.js.map +1 -1
- package/dist/Hash.d.ts.map +1 -1
- package/dist/Hash.js +4 -1
- package/dist/Hash.js.map +1 -1
- package/dist/HashSet.d.ts.map +1 -1
- package/dist/HashSet.js.map +1 -1
- package/dist/Iterable.d.ts.map +1 -1
- package/dist/Iterable.js +18 -17
- package/dist/Iterable.js.map +1 -1
- package/dist/JsonPatch.js +4 -0
- package/dist/JsonPatch.js.map +1 -1
- package/dist/JsonSchema.d.ts +9 -3
- package/dist/JsonSchema.d.ts.map +1 -1
- package/dist/JsonSchema.js +32 -43
- package/dist/JsonSchema.js.map +1 -1
- package/dist/Layer.d.ts.map +1 -1
- package/dist/Layer.js +2 -2
- package/dist/Layer.js.map +1 -1
- package/dist/ManagedRuntime.d.ts +19 -1
- package/dist/ManagedRuntime.d.ts.map +1 -1
- package/dist/ManagedRuntime.js +62 -6
- package/dist/ManagedRuntime.js.map +1 -1
- package/dist/Metric.d.ts +135 -3
- package/dist/Metric.d.ts.map +1 -1
- package/dist/Metric.js +197 -25
- package/dist/Metric.js.map +1 -1
- package/dist/MutableHashMap.d.ts.map +1 -1
- package/dist/MutableHashMap.js.map +1 -1
- package/dist/MutableList.d.ts +5 -2
- package/dist/MutableList.d.ts.map +1 -1
- package/dist/MutableList.js +7 -5
- package/dist/MutableList.js.map +1 -1
- package/dist/MutableRef.d.ts.map +1 -1
- package/dist/MutableRef.js +7 -0
- package/dist/MutableRef.js.map +1 -1
- package/dist/Number.js +2 -2
- package/dist/Number.js.map +1 -1
- package/dist/Optic.d.ts.map +1 -1
- package/dist/Optic.js.map +1 -1
- package/dist/PartitionedSemaphore.d.ts +2 -1
- package/dist/PartitionedSemaphore.d.ts.map +1 -1
- package/dist/PartitionedSemaphore.js +22 -12
- package/dist/PartitionedSemaphore.js.map +1 -1
- package/dist/Path.d.ts.map +1 -1
- package/dist/Path.js +8 -1
- package/dist/Path.js.map +1 -1
- package/dist/Pool.d.ts.map +1 -1
- package/dist/Pool.js +77 -27
- package/dist/Pool.js.map +1 -1
- package/dist/PubSub.d.ts.map +1 -1
- package/dist/PubSub.js +17 -13
- package/dist/PubSub.js.map +1 -1
- package/dist/Queue.d.ts +4 -1
- package/dist/Queue.d.ts.map +1 -1
- package/dist/Queue.js +4 -1
- package/dist/Queue.js.map +1 -1
- package/dist/Random.d.ts.map +1 -1
- package/dist/Random.js +1 -1
- package/dist/Random.js.map +1 -1
- package/dist/RcMap.d.ts +12 -7
- package/dist/RcMap.d.ts.map +1 -1
- package/dist/RcMap.js +9 -6
- package/dist/RcMap.js.map +1 -1
- package/dist/Record.d.ts +51 -0
- package/dist/Record.d.ts.map +1 -1
- package/dist/Record.js +17 -0
- package/dist/Record.js.map +1 -1
- package/dist/Ref.d.ts.map +1 -1
- package/dist/Ref.js +8 -0
- package/dist/Ref.js.map +1 -1
- package/dist/References.d.ts +5 -4
- package/dist/References.d.ts.map +1 -1
- package/dist/References.js +5 -4
- package/dist/References.js.map +1 -1
- package/dist/RequestResolver.d.ts +31 -1
- package/dist/RequestResolver.d.ts.map +1 -1
- package/dist/RequestResolver.js +39 -4
- package/dist/RequestResolver.js.map +1 -1
- package/dist/Resource.js +1 -1
- package/dist/Resource.js.map +1 -1
- package/dist/Runtime.d.ts +3 -3
- package/dist/Runtime.d.ts.map +1 -1
- package/dist/Runtime.js +18 -15
- package/dist/Runtime.js.map +1 -1
- package/dist/Schedule.d.ts.map +1 -1
- package/dist/Schedule.js +1 -1
- package/dist/Schedule.js.map +1 -1
- package/dist/Schema.d.ts +408 -340
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +370 -47
- package/dist/Schema.js.map +1 -1
- package/dist/SchemaAST.d.ts +9 -7
- package/dist/SchemaAST.d.ts.map +1 -1
- package/dist/SchemaAST.js +38 -25
- package/dist/SchemaAST.js.map +1 -1
- package/dist/SchemaGetter.d.ts +8 -3
- package/dist/SchemaGetter.d.ts.map +1 -1
- package/dist/SchemaGetter.js +15 -5
- package/dist/SchemaGetter.js.map +1 -1
- package/dist/SchemaIssue.d.ts +4 -4
- package/dist/SchemaIssue.d.ts.map +1 -1
- package/dist/SchemaIssue.js +29 -51
- package/dist/SchemaIssue.js.map +1 -1
- package/dist/SchemaParser.d.ts.map +1 -1
- package/dist/SchemaParser.js +48 -22
- package/dist/SchemaParser.js.map +1 -1
- package/dist/SchemaRepresentation.d.ts +75 -11
- package/dist/SchemaRepresentation.d.ts.map +1 -1
- package/dist/SchemaRepresentation.js +41 -13
- package/dist/SchemaRepresentation.js.map +1 -1
- package/dist/SchemaTransformation.d.ts +5 -2
- package/dist/SchemaTransformation.d.ts.map +1 -1
- package/dist/SchemaTransformation.js +10 -3
- package/dist/SchemaTransformation.js.map +1 -1
- package/dist/Scope.d.ts +12 -2
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +5 -0
- package/dist/Scope.js.map +1 -1
- package/dist/ScopedCache.d.ts +10 -7
- package/dist/ScopedCache.d.ts.map +1 -1
- package/dist/ScopedCache.js +9 -5
- package/dist/ScopedCache.js.map +1 -1
- package/dist/SemVer.d.ts +1196 -0
- package/dist/SemVer.d.ts.map +1 -0
- package/dist/SemVer.js +756 -0
- package/dist/SemVer.js.map +1 -0
- package/dist/SemVerRange.d.ts +559 -0
- package/dist/SemVerRange.d.ts.map +1 -0
- package/dist/SemVerRange.js +551 -0
- package/dist/SemVerRange.js.map +1 -0
- package/dist/Semaphore.d.ts.map +1 -1
- package/dist/Semaphore.js +54 -35
- package/dist/Semaphore.js.map +1 -1
- package/dist/Sink.d.ts.map +1 -1
- package/dist/Sink.js +13 -4
- package/dist/Sink.js.map +1 -1
- package/dist/Stream.d.ts +235 -8
- package/dist/Stream.d.ts.map +1 -1
- package/dist/Stream.js +167 -70
- package/dist/Stream.js.map +1 -1
- package/dist/String.d.ts +7 -2
- package/dist/String.d.ts.map +1 -1
- package/dist/String.js +11 -6
- package/dist/String.js.map +1 -1
- package/dist/TextDiff.d.ts +399 -0
- package/dist/TextDiff.d.ts.map +1 -0
- package/dist/TextDiff.js +634 -0
- package/dist/TextDiff.js.map +1 -0
- package/dist/Tracer.d.ts +11 -1
- package/dist/Tracer.d.ts.map +1 -1
- package/dist/Tracer.js +6 -1
- package/dist/Tracer.js.map +1 -1
- package/dist/TxHashMap.d.ts.map +1 -1
- package/dist/TxHashMap.js.map +1 -1
- package/dist/TxHashSet.d.ts.map +1 -1
- package/dist/TxHashSet.js.map +1 -1
- package/dist/ai/AiError.d.ts +68 -4
- package/dist/ai/AiError.d.ts.map +1 -1
- package/dist/ai/AiError.js +50 -2
- package/dist/ai/AiError.js.map +1 -1
- package/dist/ai/Chat.d.ts +1 -2
- package/dist/ai/Chat.d.ts.map +1 -1
- package/dist/ai/Chat.js +6 -3
- package/dist/ai/Chat.js.map +1 -1
- package/dist/ai/Decision.d.ts +46 -1
- package/dist/ai/Decision.d.ts.map +1 -1
- package/dist/ai/Decision.js.map +1 -1
- package/dist/ai/DecisionModel.d.ts +129 -11
- package/dist/ai/DecisionModel.d.ts.map +1 -1
- package/dist/ai/DecisionModel.js +182 -94
- package/dist/ai/DecisionModel.js.map +1 -1
- package/dist/ai/EmbeddingModel.d.ts +10 -0
- package/dist/ai/EmbeddingModel.d.ts.map +1 -1
- package/dist/ai/EmbeddingModel.js +21 -7
- package/dist/ai/EmbeddingModel.js.map +1 -1
- package/dist/ai/LanguageModel.d.ts.map +1 -1
- package/dist/ai/LanguageModel.js +9 -0
- package/dist/ai/LanguageModel.js.map +1 -1
- package/dist/ai/McpClient.d.ts +289 -0
- package/dist/ai/McpClient.d.ts.map +1 -0
- package/dist/ai/McpClient.js +819 -0
- package/dist/ai/McpClient.js.map +1 -0
- package/dist/ai/McpClientError.d.ts +254 -0
- package/dist/ai/McpClientError.d.ts.map +1 -0
- package/dist/ai/McpClientError.js +260 -0
- package/dist/ai/McpClientError.js.map +1 -0
- package/dist/ai/McpProtocol.d.ts +2 -2
- package/dist/ai/McpProtocol.d.ts.map +1 -1
- package/dist/ai/McpSchema.d.ts +258 -125
- package/dist/ai/McpSchema.d.ts.map +1 -1
- package/dist/ai/McpSchema.js +94 -24
- package/dist/ai/McpSchema.js.map +1 -1
- package/dist/ai/McpServer.d.ts.map +1 -1
- package/dist/ai/McpServer.js +46 -37
- package/dist/ai/McpServer.js.map +1 -1
- package/dist/ai/Prompt.d.ts +74 -20
- package/dist/ai/Prompt.d.ts.map +1 -1
- package/dist/ai/Prompt.js +61 -1
- package/dist/ai/Prompt.js.map +1 -1
- package/dist/ai/Response.d.ts +160 -3
- package/dist/ai/Response.d.ts.map +1 -1
- package/dist/ai/Response.js +39 -37
- package/dist/ai/Response.js.map +1 -1
- package/dist/ai/Tool.d.ts +36 -4
- package/dist/ai/Tool.d.ts.map +1 -1
- package/dist/ai/Tool.js +5 -2
- package/dist/ai/Tool.js.map +1 -1
- package/dist/ai/Toolkit.d.ts +48 -1
- package/dist/ai/Toolkit.d.ts.map +1 -1
- package/dist/ai/Toolkit.js +73 -13
- package/dist/ai/Toolkit.js.map +1 -1
- package/dist/ai/index.d.ts +10 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +10 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/internal/mcpCore.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2024_11_05.js +1 -1
- package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_03_26.js +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_06_18.js +2 -2
- package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_11_25.js +2 -2
- package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js +4 -7
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
- package/dist/ai/internal/mcpProtocol.js +16 -2
- package/dist/ai/internal/mcpProtocol.js.map +1 -1
- package/dist/ai/internal/mcpRuntime.js +3 -4
- package/dist/ai/internal/mcpRuntime.js.map +1 -1
- package/dist/ai/internal/mcpSchema/v2024_11_05.js +19 -13
- package/dist/ai/internal/mcpSchema/v2024_11_05.js.map +1 -1
- package/dist/ai/internal/mcpSchema/v2025_03_26.js +3 -2
- package/dist/ai/internal/mcpSchema/v2025_03_26.js.map +1 -1
- package/dist/ai/internal/mcpSchema/v2025_06_18.js +7 -7
- package/dist/ai/internal/mcpSchema/v2025_06_18.js.map +1 -1
- package/dist/ai/internal/mcpSchema/v2025_11_25.js +8 -8
- package/dist/ai/internal/mcpSchema/v2025_11_25.js.map +1 -1
- package/dist/ai/internal/mcpSchema/v2026_07_28.js +43 -42
- package/dist/ai/internal/mcpSchema/v2026_07_28.js.map +1 -1
- package/dist/cli/Argument.d.ts +15 -0
- package/dist/cli/Argument.d.ts.map +1 -1
- package/dist/cli/Argument.js +5 -0
- package/dist/cli/Argument.js.map +1 -1
- package/dist/cli/CliError.d.ts +120 -2
- package/dist/cli/CliError.d.ts.map +1 -1
- package/dist/cli/CliError.js +106 -5
- package/dist/cli/CliError.js.map +1 -1
- package/dist/cli/CliOutput.d.ts +155 -6
- package/dist/cli/CliOutput.d.ts.map +1 -1
- package/dist/cli/CliOutput.js +62 -6
- package/dist/cli/CliOutput.js.map +1 -1
- package/dist/cli/Command.d.ts +310 -18
- package/dist/cli/Command.d.ts.map +1 -1
- package/dist/cli/Command.js +164 -33
- package/dist/cli/Command.js.map +1 -1
- package/dist/cli/Completions.d.ts +63 -0
- package/dist/cli/Completions.d.ts.map +1 -1
- package/dist/cli/Completions.js +49 -9
- package/dist/cli/Completions.js.map +1 -1
- package/dist/cli/Flag.d.ts +130 -0
- package/dist/cli/Flag.d.ts.map +1 -1
- package/dist/cli/Flag.js +61 -0
- package/dist/cli/Flag.js.map +1 -1
- package/dist/cli/GlobalFlag.d.ts.map +1 -1
- package/dist/cli/GlobalFlag.js +14 -6
- package/dist/cli/GlobalFlag.js.map +1 -1
- package/dist/cli/Param.d.ts +116 -0
- package/dist/cli/Param.d.ts.map +1 -1
- package/dist/cli/Param.js +77 -2
- package/dist/cli/Param.js.map +1 -1
- package/dist/cli/TerminalCapabilities.d.ts +85 -0
- package/dist/cli/TerminalCapabilities.d.ts.map +1 -0
- package/dist/cli/TerminalCapabilities.js +124 -0
- package/dist/cli/TerminalCapabilities.js.map +1 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +5 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/internal/command.d.ts +2 -1
- package/dist/cli/internal/command.d.ts.map +1 -1
- package/dist/cli/internal/command.js +5 -2
- package/dist/cli/internal/command.js.map +1 -1
- package/dist/cli/internal/completions/bash.js +77 -30
- package/dist/cli/internal/completions/bash.js.map +1 -1
- package/dist/cli/internal/completions/descriptor.js +9 -1
- package/dist/cli/internal/completions/descriptor.js.map +1 -1
- package/dist/cli/internal/completions/fish.js +10 -8
- package/dist/cli/internal/completions/fish.js.map +1 -1
- package/dist/cli/internal/completions/powershell.js +18 -9
- package/dist/cli/internal/completions/powershell.js.map +1 -1
- package/dist/cli/internal/completions/zsh.js +8 -5
- package/dist/cli/internal/completions/zsh.js.map +1 -1
- package/dist/cli/internal/formatter.d.ts +2 -0
- package/dist/cli/internal/formatter.d.ts.map +1 -0
- package/dist/cli/internal/formatter.js +15 -0
- package/dist/cli/internal/formatter.js.map +1 -0
- package/dist/cli/internal/lexer.js +24 -10
- package/dist/cli/internal/lexer.js.map +1 -1
- package/dist/cli/internal/parser.js +24 -12
- package/dist/cli/internal/parser.js.map +1 -1
- package/dist/cluster/ClusterCron.d.ts +29 -1
- package/dist/cluster/ClusterCron.d.ts.map +1 -1
- package/dist/cluster/ClusterCron.js +64 -32
- package/dist/cluster/ClusterCron.js.map +1 -1
- package/dist/cluster/ClusterMetrics.d.ts +143 -7
- package/dist/cluster/ClusterMetrics.d.ts.map +1 -1
- package/dist/cluster/ClusterMetrics.js +151 -7
- package/dist/cluster/ClusterMetrics.js.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.d.ts +1 -1
- package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.js +82 -21
- package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
- package/dist/cluster/Entity.d.ts +2 -0
- package/dist/cluster/Entity.d.ts.map +1 -1
- package/dist/cluster/Entity.js.map +1 -1
- package/dist/cluster/MessageStorage.d.ts +44 -45
- package/dist/cluster/MessageStorage.d.ts.map +1 -1
- package/dist/cluster/MessageStorage.js +6 -7
- package/dist/cluster/MessageStorage.js.map +1 -1
- package/dist/cluster/Runners.d.ts.map +1 -1
- package/dist/cluster/Runners.js +54 -15
- package/dist/cluster/Runners.js.map +1 -1
- package/dist/cluster/Sharding.d.ts +1 -0
- package/dist/cluster/Sharding.d.ts.map +1 -1
- package/dist/cluster/Sharding.js +155 -52
- package/dist/cluster/Sharding.js.map +1 -1
- package/dist/cluster/ShardingConfig.d.ts +30 -0
- package/dist/cluster/ShardingConfig.d.ts.map +1 -1
- package/dist/cluster/ShardingConfig.js +4 -0
- package/dist/cluster/ShardingConfig.js.map +1 -1
- package/dist/cluster/Snowflake.d.ts.map +1 -1
- package/dist/cluster/Snowflake.js +3 -7
- package/dist/cluster/Snowflake.js.map +1 -1
- package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
- package/dist/cluster/SqlMessageStorage.js +40 -50
- package/dist/cluster/SqlMessageStorage.js.map +1 -1
- package/dist/cluster/SqlRunnerStorage.d.ts +2 -2
- package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
- package/dist/cluster/SqlRunnerStorage.js +97 -43
- package/dist/cluster/SqlRunnerStorage.js.map +1 -1
- package/dist/cluster/internal/entityManager.js +119 -28
- package/dist/cluster/internal/entityManager.js.map +1 -1
- package/dist/devtools/DevTools.d.ts +3 -2
- package/dist/devtools/DevTools.d.ts.map +1 -1
- package/dist/devtools/DevTools.js +3 -2
- package/dist/devtools/DevTools.js.map +1 -1
- package/dist/devtools/DevToolsClient.d.ts +11 -0
- package/dist/devtools/DevToolsClient.d.ts.map +1 -1
- package/dist/devtools/DevToolsClient.js +33 -4
- package/dist/devtools/DevToolsClient.js.map +1 -1
- package/dist/encoding/Base64.js +36 -0
- package/dist/encoding/Base64.js.map +1 -1
- package/dist/encoding/Base64Url.d.ts +29 -0
- package/dist/encoding/Base64Url.d.ts.map +1 -1
- package/dist/encoding/Base64Url.js +29 -0
- package/dist/encoding/Base64Url.js.map +1 -1
- package/dist/encoding/Ini.d.ts.map +1 -1
- package/dist/encoding/Ini.js +3 -0
- package/dist/encoding/Ini.js.map +1 -1
- package/dist/encoding/JsonArray.d.ts +270 -0
- package/dist/encoding/JsonArray.d.ts.map +1 -0
- package/dist/encoding/JsonArray.js +691 -0
- package/dist/encoding/JsonArray.js.map +1 -0
- package/dist/encoding/Ndjson.d.ts +43 -4
- package/dist/encoding/Ndjson.d.ts.map +1 -1
- package/dist/encoding/Ndjson.js +169 -18
- package/dist/encoding/Ndjson.js.map +1 -1
- package/dist/encoding/SchemaBinary.d.ts +9 -1
- package/dist/encoding/SchemaBinary.d.ts.map +1 -1
- package/dist/encoding/SchemaBinary.js +12 -19
- package/dist/encoding/SchemaBinary.js.map +1 -1
- package/dist/encoding/Sse.d.ts.map +1 -1
- package/dist/encoding/Sse.js +3 -3
- package/dist/encoding/Sse.js.map +1 -1
- package/dist/encoding/Tar.d.ts +309 -0
- package/dist/encoding/Tar.d.ts.map +1 -0
- package/dist/encoding/Tar.js +1182 -0
- package/dist/encoding/Tar.js.map +1 -0
- package/dist/encoding/Toml.d.ts.map +1 -1
- package/dist/encoding/Toml.js +24 -19
- package/dist/encoding/Toml.js.map +1 -1
- package/dist/encoding/Xml.d.ts +464 -0
- package/dist/encoding/Xml.d.ts.map +1 -0
- package/dist/encoding/Xml.js +1619 -0
- package/dist/encoding/Xml.js.map +1 -0
- package/dist/encoding/Yaml.d.ts +6 -2
- package/dist/encoding/Yaml.d.ts.map +1 -1
- package/dist/encoding/Yaml.js +97 -34
- package/dist/encoding/Yaml.js.map +1 -1
- package/dist/encoding/Zip.d.ts +413 -0
- package/dist/encoding/Zip.d.ts.map +1 -0
- package/dist/encoding/Zip.js +1255 -0
- package/dist/encoding/Zip.js.map +1 -0
- package/dist/encoding/index.d.ts +20 -0
- package/dist/encoding/index.d.ts.map +1 -1
- package/dist/encoding/index.js +20 -0
- package/dist/encoding/index.js.map +1 -1
- package/dist/eventlog/EventJournal.d.ts +90 -5
- package/dist/eventlog/EventJournal.d.ts.map +1 -1
- package/dist/eventlog/EventJournal.js +488 -228
- package/dist/eventlog/EventJournal.js.map +1 -1
- package/dist/eventlog/EventLog.d.ts +180 -12
- package/dist/eventlog/EventLog.d.ts.map +1 -1
- package/dist/eventlog/EventLog.js +394 -146
- package/dist/eventlog/EventLog.js.map +1 -1
- package/dist/eventlog/EventLogEncryption.d.ts +36 -30
- package/dist/eventlog/EventLogEncryption.d.ts.map +1 -1
- package/dist/eventlog/EventLogEncryption.js +97 -38
- package/dist/eventlog/EventLogEncryption.js.map +1 -1
- package/dist/eventlog/EventLogMessage.d.ts +74 -34
- package/dist/eventlog/EventLogMessage.d.ts.map +1 -1
- package/dist/eventlog/EventLogMessage.js +45 -11
- package/dist/eventlog/EventLogMessage.js.map +1 -1
- package/dist/eventlog/EventLogRemote.d.ts +45 -8
- package/dist/eventlog/EventLogRemote.d.ts.map +1 -1
- package/dist/eventlog/EventLogRemote.js +51 -14
- package/dist/eventlog/EventLogRemote.js.map +1 -1
- package/dist/eventlog/EventLogServer.d.ts +46 -3
- package/dist/eventlog/EventLogServer.d.ts.map +1 -1
- package/dist/eventlog/EventLogServer.js +119 -19
- package/dist/eventlog/EventLogServer.js.map +1 -1
- package/dist/eventlog/EventLogServerEncrypted.d.ts +23 -33
- package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
- package/dist/eventlog/EventLogServerEncrypted.js +97 -70
- package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
- package/dist/eventlog/EventLogServerUnencrypted.d.ts +39 -5
- package/dist/eventlog/EventLogServerUnencrypted.d.ts.map +1 -1
- package/dist/eventlog/EventLogServerUnencrypted.js +151 -69
- package/dist/eventlog/EventLogServerUnencrypted.js.map +1 -1
- package/dist/eventlog/EventRow.d.ts +288 -0
- package/dist/eventlog/EventRow.d.ts.map +1 -0
- package/dist/eventlog/EventRow.js +435 -0
- package/dist/eventlog/EventRow.js.map +1 -0
- package/dist/eventlog/SqlEventJournal.d.ts +18 -18
- package/dist/eventlog/SqlEventJournal.d.ts.map +1 -1
- package/dist/eventlog/SqlEventJournal.js +417 -169
- package/dist/eventlog/SqlEventJournal.js.map +1 -1
- package/dist/eventlog/SqlEventLogServerEncrypted.d.ts +10 -18
- package/dist/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -1
- package/dist/eventlog/SqlEventLogServerEncrypted.js +179 -69
- package/dist/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
- package/dist/eventlog/SqlEventLogServerUnencrypted.d.ts +23 -3
- package/dist/eventlog/SqlEventLogServerUnencrypted.d.ts.map +1 -1
- package/dist/eventlog/SqlEventLogServerUnencrypted.js +102 -51
- package/dist/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
- package/dist/eventlog/index.d.ts +5 -0
- package/dist/eventlog/index.d.ts.map +1 -1
- package/dist/eventlog/index.js +5 -0
- package/dist/eventlog/index.js.map +1 -1
- package/dist/eventlog/internal/conflicts.d.ts +46 -0
- package/dist/eventlog/internal/conflicts.d.ts.map +1 -0
- package/dist/eventlog/internal/conflicts.js +89 -0
- package/dist/eventlog/internal/conflicts.js.map +1 -0
- package/dist/graphql/GraphQLClientError.d.ts +2 -2
- package/dist/graphql/GraphQLClientError.d.ts.map +1 -1
- package/dist/graphql/GraphQLClientError.js +4 -18
- package/dist/graphql/GraphQLClientError.js.map +1 -1
- package/dist/graphql/GraphQLProtocol.d.ts +12 -9
- package/dist/graphql/GraphQLProtocol.d.ts.map +1 -1
- package/dist/graphql/GraphQLProtocol.js +4 -3
- package/dist/graphql/GraphQLProtocol.js.map +1 -1
- package/dist/graphql/GraphQLResolver.d.ts +2 -0
- package/dist/graphql/GraphQLResolver.d.ts.map +1 -1
- package/dist/graphql/GraphQLResolver.js +74 -32
- package/dist/graphql/GraphQLResolver.js.map +1 -1
- package/dist/http/Cookies.d.ts.map +1 -1
- package/dist/http/Cookies.js +10 -9
- package/dist/http/Cookies.js.map +1 -1
- package/dist/http/FetchHttpClient.d.ts +8 -1
- package/dist/http/FetchHttpClient.d.ts.map +1 -1
- package/dist/http/FetchHttpClient.js +51 -4
- package/dist/http/FetchHttpClient.js.map +1 -1
- package/dist/http/FindMyWay/internal/router.js +10 -0
- package/dist/http/FindMyWay/internal/router.js.map +1 -1
- package/dist/http/Headers.d.ts +227 -0
- package/dist/http/Headers.d.ts.map +1 -1
- package/dist/http/Headers.js +261 -0
- package/dist/http/Headers.js.map +1 -1
- package/dist/http/HttpClient.d.ts +516 -0
- package/dist/http/HttpClient.d.ts.map +1 -1
- package/dist/http/HttpClient.js +286 -23
- package/dist/http/HttpClient.js.map +1 -1
- package/dist/http/HttpClientError.d.ts +8 -1
- package/dist/http/HttpClientError.d.ts.map +1 -1
- package/dist/http/HttpClientError.js +37 -1
- package/dist/http/HttpClientError.js.map +1 -1
- package/dist/http/HttpClientRequest.d.ts +127 -3
- package/dist/http/HttpClientRequest.d.ts.map +1 -1
- package/dist/http/HttpClientRequest.js +45 -3
- package/dist/http/HttpClientRequest.js.map +1 -1
- package/dist/http/HttpClientResponse.d.ts +53 -0
- package/dist/http/HttpClientResponse.d.ts.map +1 -1
- package/dist/http/HttpClientResponse.js +47 -0
- package/dist/http/HttpClientResponse.js.map +1 -1
- package/dist/http/HttpEffect.d.ts +6 -2
- package/dist/http/HttpEffect.d.ts.map +1 -1
- package/dist/http/HttpEffect.js +21 -17
- package/dist/http/HttpEffect.js.map +1 -1
- package/dist/http/HttpIncomingMessage.d.ts +2 -1
- package/dist/http/HttpIncomingMessage.d.ts.map +1 -1
- package/dist/http/HttpIncomingMessage.js +3 -23
- package/dist/http/HttpIncomingMessage.js.map +1 -1
- package/dist/http/HttpMiddleware.d.ts +119 -2
- package/dist/http/HttpMiddleware.d.ts.map +1 -1
- package/dist/http/HttpMiddleware.js +173 -29
- package/dist/http/HttpMiddleware.js.map +1 -1
- package/dist/http/HttpRouter.d.ts.map +1 -1
- package/dist/http/HttpRouter.js +9 -3
- package/dist/http/HttpRouter.js.map +1 -1
- package/dist/http/HttpServerError.d.ts +5 -2
- package/dist/http/HttpServerError.d.ts.map +1 -1
- package/dist/http/HttpServerError.js +7 -5
- package/dist/http/HttpServerError.js.map +1 -1
- package/dist/http/HttpServerRequest.d.ts +30 -5
- package/dist/http/HttpServerRequest.d.ts.map +1 -1
- package/dist/http/HttpServerRequest.js +109 -20
- package/dist/http/HttpServerRequest.js.map +1 -1
- package/dist/http/HttpServerResponse.d.ts +17 -8
- package/dist/http/HttpServerResponse.d.ts.map +1 -1
- package/dist/http/HttpServerResponse.js +37 -21
- package/dist/http/HttpServerResponse.js.map +1 -1
- package/dist/http/HttpStaticServer.d.ts +0 -12
- package/dist/http/HttpStaticServer.d.ts.map +1 -1
- package/dist/http/HttpStaticServer.js +65 -24
- package/dist/http/HttpStaticServer.js.map +1 -1
- package/dist/http/MultipartParser/internal/contentType.d.ts +15 -1
- package/dist/http/MultipartParser/internal/contentType.d.ts.map +1 -1
- package/dist/http/MultipartParser/internal/contentType.js +89 -7
- package/dist/http/MultipartParser/internal/contentType.js.map +1 -1
- package/dist/http/MultipartParser/internal/headers.d.ts.map +1 -1
- package/dist/http/MultipartParser/internal/headers.js +4 -12
- package/dist/http/MultipartParser/internal/headers.js.map +1 -1
- package/dist/http/MultipartParser/internal/multipart.d.ts.map +1 -1
- package/dist/http/MultipartParser/internal/multipart.js +6 -27
- package/dist/http/MultipartParser/internal/multipart.js.map +1 -1
- package/dist/http/Url.d.ts.map +1 -1
- package/dist/http/Url.js +6 -1
- package/dist/http/Url.js.map +1 -1
- package/dist/http/UrlParams.d.ts +3 -1
- package/dist/http/UrlParams.d.ts.map +1 -1
- package/dist/http/UrlParams.js +4 -2
- package/dist/http/UrlParams.js.map +1 -1
- package/dist/http/internal/compression.js +4 -5
- package/dist/http/internal/compression.js.map +1 -1
- package/dist/http/internal/decompression.js +20 -11
- package/dist/http/internal/decompression.js.map +1 -1
- package/dist/http/internal/httpBody.js +8 -1
- package/dist/http/internal/httpBody.js.map +1 -1
- package/dist/http/internal/lazyStream.d.ts +2 -0
- package/dist/http/internal/lazyStream.d.ts.map +1 -0
- package/dist/http/internal/lazyStream.js +18 -0
- package/dist/http/internal/lazyStream.js.map +1 -0
- package/dist/http/internal/requestState.d.ts +2 -0
- package/dist/http/internal/requestState.d.ts.map +1 -0
- package/dist/http/internal/requestState.js +28 -0
- package/dist/http/internal/requestState.js.map +1 -0
- package/dist/http/internal/urlParams.js +25 -0
- package/dist/http/internal/urlParams.js.map +1 -1
- package/dist/http/internal/webResponse.d.ts +2 -0
- package/dist/http/internal/webResponse.d.ts.map +1 -0
- package/dist/http/internal/webResponse.js +12 -0
- package/dist/http/internal/webResponse.js.map +1 -0
- package/dist/http-api/HttpApi.d.ts +3 -6
- package/dist/http-api/HttpApi.d.ts.map +1 -1
- package/dist/http-api/HttpApi.js +4 -7
- package/dist/http-api/HttpApi.js.map +1 -1
- package/dist/http-api/HttpApiBuilder.d.ts.map +1 -1
- package/dist/http-api/HttpApiBuilder.js +142 -23
- package/dist/http-api/HttpApiBuilder.js.map +1 -1
- package/dist/http-api/HttpApiClient.d.ts +99 -4
- package/dist/http-api/HttpApiClient.d.ts.map +1 -1
- package/dist/http-api/HttpApiClient.js +218 -60
- package/dist/http-api/HttpApiClient.js.map +1 -1
- package/dist/http-api/HttpApiEndpoint.d.ts +72 -29
- package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
- package/dist/http-api/HttpApiEndpoint.js +140 -14
- package/dist/http-api/HttpApiEndpoint.js.map +1 -1
- package/dist/http-api/HttpApiError.d.ts +58 -0
- package/dist/http-api/HttpApiError.d.ts.map +1 -1
- package/dist/http-api/HttpApiError.js +38 -12
- package/dist/http-api/HttpApiError.js.map +1 -1
- package/dist/http-api/HttpApiScalar.d.ts +2 -1
- package/dist/http-api/HttpApiScalar.d.ts.map +1 -1
- package/dist/http-api/HttpApiScalar.js +6 -3
- package/dist/http-api/HttpApiScalar.js.map +1 -1
- package/dist/http-api/HttpApiSchema.d.ts +242 -13
- package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
- package/dist/http-api/HttpApiSchema.js +149 -5
- package/dist/http-api/HttpApiSchema.js.map +1 -1
- package/dist/http-api/HttpApiSwagger.d.ts +5 -0
- package/dist/http-api/HttpApiSwagger.d.ts.map +1 -1
- package/dist/http-api/HttpApiSwagger.js +14 -4
- package/dist/http-api/HttpApiSwagger.js.map +1 -1
- package/dist/http-api/HttpApiTest.d.ts +13 -2
- package/dist/http-api/HttpApiTest.d.ts.map +1 -1
- package/dist/http-api/HttpApiTest.js +33 -11
- package/dist/http-api/HttpApiTest.js.map +1 -1
- package/dist/http-api/OpenApi.d.ts +17 -3
- package/dist/http-api/OpenApi.d.ts.map +1 -1
- package/dist/http-api/OpenApi.js +81 -47
- package/dist/http-api/OpenApi.js.map +1 -1
- package/dist/http-api/internal/path.js +35 -10
- package/dist/http-api/internal/path.js.map +1 -1
- package/dist/http-api/internal/toCodecHttpProperties.d.ts +2 -0
- package/dist/http-api/internal/toCodecHttpProperties.d.ts.map +1 -0
- package/dist/http-api/internal/toCodecHttpProperties.js +38 -0
- package/dist/http-api/internal/toCodecHttpProperties.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/arbitrary/runner.d.ts.map +1 -1
- package/dist/internal/arbitrary/runner.js +120 -44
- package/dist/internal/arbitrary/runner.js.map +1 -1
- package/dist/internal/core.js +3 -1
- package/dist/internal/core.js.map +1 -1
- package/dist/internal/dateTime.js +19 -7
- package/dist/internal/dateTime.js.map +1 -1
- package/dist/internal/effect.js +106 -87
- package/dist/internal/effect.js.map +1 -1
- package/dist/internal/equal.js +14 -0
- package/dist/internal/equal.js.map +1 -1
- package/dist/internal/hashMap.js +2 -2
- package/dist/internal/hashMap.js.map +1 -1
- package/dist/internal/hydration.d.ts +2 -0
- package/dist/internal/hydration.d.ts.map +1 -0
- package/dist/internal/hydration.js +15 -0
- package/dist/internal/hydration.js.map +1 -0
- package/dist/internal/inflate.d.ts +2 -0
- package/dist/internal/inflate.d.ts.map +1 -0
- package/dist/internal/inflate.js +680 -0
- package/dist/internal/inflate.js.map +1 -0
- package/dist/internal/jsonSchema.d.ts +2 -0
- package/dist/internal/jsonSchema.d.ts.map +1 -0
- package/dist/internal/jsonSchema.js +28 -0
- package/dist/internal/jsonSchema.js.map +1 -0
- package/dist/internal/matcher.js +1 -1
- package/dist/internal/matcher.js.map +1 -1
- package/dist/internal/record.js +6 -0
- package/dist/internal/record.js.map +1 -1
- package/dist/internal/request.js +20 -7
- package/dist/internal/request.js.map +1 -1
- package/dist/internal/schedule.js +17 -22
- package/dist/internal/schedule.js.map +1 -1
- package/dist/internal/schema/compilerRegistry.js +4 -1
- package/dist/internal/schema/compilerRegistry.js.map +1 -1
- package/dist/internal/schema/content.d.ts +2 -0
- package/dist/internal/schema/content.d.ts.map +1 -0
- package/dist/internal/schema/content.js +13 -0
- package/dist/internal/schema/content.js.map +1 -0
- package/dist/internal/schema/fromJsonSchemaDocument.js +253 -255
- package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
- package/dist/internal/schema/fromRepresentation.js +2 -1
- package/dist/internal/schema/fromRepresentation.js.map +1 -1
- package/dist/internal/schema/interpreter.js +51 -36
- package/dist/internal/schema/interpreter.js.map +1 -1
- package/dist/internal/schema/standardSchema.js +42 -35
- package/dist/internal/schema/standardSchema.js.map +1 -1
- package/dist/internal/schema/toCodeDocument.js +10 -5
- package/dist/internal/schema/toCodeDocument.js.map +1 -1
- package/dist/internal/schema/toCodec.js +99 -17
- package/dist/internal/schema/toCodec.js.map +1 -1
- package/dist/internal/schema/toFormatter.js +5 -5
- package/dist/internal/schema/toFormatter.js.map +1 -1
- package/dist/internal/schema/toJsonSchemaDocument.js +257 -170
- package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
- package/dist/internal/schema/toRepresentation.js +107 -129
- package/dist/internal/schema/toRepresentation.js.map +1 -1
- package/dist/internal/sql.d.ts +2 -0
- package/dist/internal/sql.d.ts.map +1 -0
- package/dist/internal/sql.js +13 -0
- package/dist/internal/sql.js.map +1 -0
- package/dist/internal/trie.js +1 -3
- package/dist/internal/trie.js.map +1 -1
- package/dist/internal/uuid.js +7 -3
- package/dist/internal/uuid.js.map +1 -1
- package/dist/internal/version.js +1 -1
- package/dist/net/NetAddress.d.ts.map +1 -1
- package/dist/net/NetAddress.js +2 -8
- package/dist/net/NetAddress.js.map +1 -1
- package/dist/observability/OtlpExporter.d.ts.map +1 -1
- package/dist/observability/OtlpExporter.js +5 -12
- package/dist/observability/OtlpExporter.js.map +1 -1
- package/dist/observability/OtlpMetrics.d.ts.map +1 -1
- package/dist/observability/OtlpMetrics.js +5 -3
- package/dist/observability/OtlpMetrics.js.map +1 -1
- package/dist/observability/OtlpProxy.d.ts +154 -0
- package/dist/observability/OtlpProxy.d.ts.map +1 -0
- package/dist/observability/OtlpProxy.js +235 -0
- package/dist/observability/OtlpProxy.js.map +1 -0
- package/dist/observability/OtlpResource.d.ts +3 -1
- package/dist/observability/OtlpResource.d.ts.map +1 -1
- package/dist/observability/OtlpResource.js +11 -4
- package/dist/observability/OtlpResource.js.map +1 -1
- package/dist/observability/OtlpSerialization.d.ts +5 -0
- package/dist/observability/OtlpSerialization.d.ts.map +1 -1
- package/dist/observability/OtlpSerialization.js +14 -3
- package/dist/observability/OtlpSerialization.js.map +1 -1
- package/dist/observability/OtlpTracer.d.ts.map +1 -1
- package/dist/observability/OtlpTracer.js +4 -0
- package/dist/observability/OtlpTracer.js.map +1 -1
- package/dist/observability/index.d.ts +5 -0
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +5 -0
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/internal/protobuf.d.ts +0 -9
- package/dist/observability/internal/protobuf.d.ts.map +1 -1
- package/dist/observability/internal/protobuf.js +2 -10
- package/dist/observability/internal/protobuf.js.map +1 -1
- package/dist/persistence/CircuitBreaker.d.ts +897 -0
- package/dist/persistence/CircuitBreaker.d.ts.map +1 -0
- package/dist/persistence/CircuitBreaker.js +1165 -0
- package/dist/persistence/CircuitBreaker.js.map +1 -0
- package/dist/persistence/PersistedCache.d.ts.map +1 -1
- package/dist/persistence/PersistedCache.js +1 -1
- package/dist/persistence/PersistedCache.js.map +1 -1
- package/dist/persistence/PersistedQueue.d.ts +6 -2
- package/dist/persistence/PersistedQueue.d.ts.map +1 -1
- package/dist/persistence/PersistedQueue.js +162 -84
- package/dist/persistence/PersistedQueue.js.map +1 -1
- package/dist/persistence/Persistence.d.ts +28 -0
- package/dist/persistence/Persistence.d.ts.map +1 -1
- package/dist/persistence/Persistence.js +36 -8
- package/dist/persistence/Persistence.js.map +1 -1
- package/dist/persistence/RateLimiter.d.ts.map +1 -1
- package/dist/persistence/RateLimiter.js +8 -12
- package/dist/persistence/RateLimiter.js.map +1 -1
- package/dist/persistence/Redis.d.ts +78 -2
- package/dist/persistence/Redis.d.ts.map +1 -1
- package/dist/persistence/Redis.js +62 -7
- package/dist/persistence/Redis.js.map +1 -1
- package/dist/persistence/UserDirectories.d.ts +129 -0
- package/dist/persistence/UserDirectories.d.ts.map +1 -0
- package/dist/persistence/UserDirectories.js +178 -0
- package/dist/persistence/UserDirectories.js.map +1 -0
- package/dist/persistence/index.d.ts +10 -0
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +10 -0
- package/dist/persistence/index.js.map +1 -1
- package/dist/process/ChildProcess.d.ts +32 -5
- package/dist/process/ChildProcess.d.ts.map +1 -1
- package/dist/process/ChildProcess.js.map +1 -1
- package/dist/process/ChildProcessSpawner.d.ts +30 -0
- package/dist/process/ChildProcessSpawner.d.ts.map +1 -1
- package/dist/process/ChildProcessSpawner.js +5 -2
- package/dist/process/ChildProcessSpawner.js.map +1 -1
- package/dist/reactivity/AsyncResult.d.ts +1 -1
- package/dist/reactivity/AsyncResult.d.ts.map +1 -1
- package/dist/reactivity/AsyncResult.js +1 -1
- package/dist/reactivity/AsyncResult.js.map +1 -1
- package/dist/reactivity/Atom.d.ts +69 -30
- package/dist/reactivity/Atom.d.ts.map +1 -1
- package/dist/reactivity/Atom.js +40 -15
- package/dist/reactivity/Atom.js.map +1 -1
- package/dist/reactivity/AtomHttpApi.d.ts +5 -5
- package/dist/reactivity/AtomHttpApi.d.ts.map +1 -1
- package/dist/reactivity/AtomHttpApi.js +1 -1
- package/dist/reactivity/AtomHttpApi.js.map +1 -1
- package/dist/reactivity/AtomRegistry.d.ts +2 -2
- package/dist/reactivity/AtomRegistry.d.ts.map +1 -1
- package/dist/reactivity/AtomRegistry.js +44 -9
- package/dist/reactivity/AtomRegistry.js.map +1 -1
- package/dist/reactivity/AtomRpc.d.ts +3 -3
- package/dist/reactivity/AtomRpc.d.ts.map +1 -1
- package/dist/reactivity/AtomRpc.js +1 -1
- package/dist/reactivity/AtomRpc.js.map +1 -1
- package/dist/reactivity/Hydration.d.ts.map +1 -1
- package/dist/reactivity/Hydration.js +46 -12
- package/dist/reactivity/Hydration.js.map +1 -1
- package/dist/reactivity/Reactivity.d.ts +71 -7
- package/dist/reactivity/Reactivity.d.ts.map +1 -1
- package/dist/reactivity/Reactivity.js +21 -12
- package/dist/reactivity/Reactivity.js.map +1 -1
- package/dist/rpc/Rpc.d.ts +18 -0
- package/dist/rpc/Rpc.d.ts.map +1 -1
- package/dist/rpc/Rpc.js +20 -0
- package/dist/rpc/Rpc.js.map +1 -1
- package/dist/rpc/RpcClient.d.ts +26 -2
- package/dist/rpc/RpcClient.d.ts.map +1 -1
- package/dist/rpc/RpcClient.js +198 -61
- package/dist/rpc/RpcClient.js.map +1 -1
- package/dist/rpc/RpcSerialization.d.ts +29 -0
- package/dist/rpc/RpcSerialization.d.ts.map +1 -1
- package/dist/rpc/RpcSerialization.js +41 -13
- package/dist/rpc/RpcSerialization.js.map +1 -1
- package/dist/rpc/RpcServer.d.ts.map +1 -1
- package/dist/rpc/RpcServer.js +20 -19
- package/dist/rpc/RpcServer.js.map +1 -1
- package/dist/rpc/RpcTest.d.ts +1 -0
- package/dist/rpc/RpcTest.d.ts.map +1 -1
- package/dist/rpc/RpcTest.js +1 -0
- package/dist/rpc/RpcTest.js.map +1 -1
- package/dist/schema/Model.d.ts +1 -1
- package/dist/schema/VariantSchema.d.ts +22 -3
- package/dist/schema/VariantSchema.d.ts.map +1 -1
- package/dist/schema/VariantSchema.js +32 -18
- package/dist/schema/VariantSchema.js.map +1 -1
- package/dist/socket/Socket.d.ts +23 -1
- package/dist/socket/Socket.d.ts.map +1 -1
- package/dist/socket/Socket.js +36 -3
- package/dist/socket/Socket.js.map +1 -1
- package/dist/sql/Migrator.d.ts +2 -1
- package/dist/sql/Migrator.d.ts.map +1 -1
- package/dist/sql/Migrator.js +21 -6
- package/dist/sql/Migrator.js.map +1 -1
- package/dist/sql/SqlClient.d.ts +148 -5
- package/dist/sql/SqlClient.d.ts.map +1 -1
- package/dist/sql/SqlClient.js +155 -27
- package/dist/sql/SqlClient.js.map +1 -1
- package/dist/sql/SqlResolver.d.ts +13 -0
- package/dist/sql/SqlResolver.d.ts.map +1 -1
- package/dist/sql/SqlResolver.js +27 -4
- package/dist/sql/SqlResolver.js.map +1 -1
- package/dist/sql/Statement.d.ts +10 -1
- package/dist/sql/Statement.d.ts.map +1 -1
- package/dist/sql/Statement.js +45 -7
- package/dist/sql/Statement.js.map +1 -1
- package/dist/testing/TestClock.d.ts.map +1 -1
- package/dist/testing/TestClock.js +4 -2
- package/dist/testing/TestClock.js.map +1 -1
- package/dist/testing/TestSchema.d.ts +7 -1
- package/dist/testing/TestSchema.d.ts.map +1 -1
- package/dist/testing/TestSchema.js +9 -3
- package/dist/testing/TestSchema.js.map +1 -1
- package/dist/workflow/DurableDeferred.d.ts.map +1 -1
- package/dist/workflow/DurableDeferred.js +21 -2
- package/dist/workflow/DurableDeferred.js.map +1 -1
- package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
- package/dist/workflow/WorkflowEngine.js +18 -4
- package/dist/workflow/WorkflowEngine.js.map +1 -1
- package/package.json +13 -3
- package/src/Arbitrary.ts +10 -2
- package/src/Array.ts +128 -55
- package/src/Bytes.ts +111 -0
- package/src/Channel.ts +308 -452
- package/src/ChannelSchema.ts +1 -49
- package/src/Chunk.ts +55 -61
- package/src/Config.ts +12 -86
- package/src/ConfigProvider.ts +2 -1
- package/src/Cron.ts +6 -3
- package/src/Data.ts +60 -265
- package/src/Duration.ts +66 -16
- package/src/Effect.ts +503 -168
- package/src/Equal.ts +8 -1
- package/src/Equivalence.ts +7 -4
- package/src/Exit.ts +27 -12
- package/src/FiberHandle.ts +10 -9
- package/src/FiberMap.ts +13 -66
- package/src/FileSystem.ts +10 -0
- package/src/Formatter.ts +28 -13
- package/src/Graph.ts +171 -1263
- package/src/Hash.ts +4 -1
- package/src/HashSet.ts +0 -60
- package/src/Iterable.ts +15 -14
- package/src/JsonPatch.ts +4 -0
- package/src/JsonSchema.ts +40 -43
- package/src/Layer.ts +2 -2
- package/src/ManagedRuntime.ts +72 -6
- package/src/Metric.ts +252 -510
- package/src/MutableHashMap.ts +4 -473
- package/src/MutableList.ts +7 -5
- package/src/MutableRef.ts +8 -1
- package/src/Number.ts +2 -2
- package/src/Optic.ts +17 -332
- package/src/PartitionedSemaphore.ts +24 -13
- package/src/Path.ts +9 -1
- package/src/Pool.ts +109 -37
- package/src/PubSub.ts +17 -13
- package/src/Queue.ts +5 -37
- package/src/Random.ts +1 -1
- package/src/RcMap.ts +14 -8
- package/src/Record.ts +51 -0
- package/src/Ref.ts +15 -104
- package/src/References.ts +5 -4
- package/src/RequestResolver.ts +46 -87
- package/src/Resource.ts +1 -1
- package/src/Runtime.ts +19 -18
- package/src/Schedule.ts +3 -95
- package/src/Schema.ts +639 -381
- package/src/SchemaAST.ts +40 -29
- package/src/SchemaGetter.ts +22 -5
- package/src/SchemaIssue.ts +44 -53
- package/src/SchemaParser.ts +51 -18
- package/src/SchemaRepresentation.ts +95 -35
- package/src/SchemaTransformation.ts +10 -3
- package/src/Scope.ts +12 -2
- package/src/ScopedCache.ts +17 -142
- package/src/SemVer.ts +1528 -0
- package/src/SemVerRange.ts +883 -0
- package/src/Semaphore.ts +67 -40
- package/src/Sink.ts +21 -4
- package/src/Stream.ts +367 -1027
- package/src/String.ts +11 -8
- package/src/TextDiff.ts +766 -0
- package/src/Tracer.ts +15 -1
- package/src/TxHashMap.ts +1 -103
- package/src/TxHashSet.ts +48 -753
- package/src/ai/AiError.ts +66 -4
- package/src/ai/Chat.ts +10 -5
- package/src/ai/Decision.ts +49 -1
- package/src/ai/DecisionModel.ts +264 -108
- package/src/ai/EmbeddingModel.ts +25 -13
- package/src/ai/LanguageModel.ts +9 -0
- package/src/ai/McpClient.ts +1211 -0
- package/src/ai/McpClientError.ts +329 -0
- package/src/ai/McpProtocol.ts +2 -2
- package/src/ai/McpSchema.ts +153 -35
- package/src/ai/McpServer.ts +231 -233
- package/src/ai/Prompt.ts +114 -35
- package/src/ai/Response.ts +220 -65
- package/src/ai/Tool.ts +50 -6
- package/src/ai/Toolkit.ts +82 -11
- package/src/ai/index.ts +12 -0
- package/src/ai/internal/mcpCore.ts +13 -14
- package/src/ai/internal/mcpProtocol/v2024_11_05.ts +1 -1
- package/src/ai/internal/mcpProtocol/v2025_03_26.ts +1 -1
- package/src/ai/internal/mcpProtocol/v2025_06_18.ts +3 -3
- package/src/ai/internal/mcpProtocol/v2025_11_25.ts +3 -3
- package/src/ai/internal/mcpProtocol/v2026_07_28.ts +12 -14
- package/src/ai/internal/mcpProtocol.ts +22 -2
- package/src/ai/internal/mcpRuntime.ts +3 -4
- package/src/ai/internal/mcpSchema/v2024_11_05.ts +20 -13
- package/src/ai/internal/mcpSchema/v2025_03_26.ts +4 -2
- package/src/ai/internal/mcpSchema/v2025_06_18.ts +7 -7
- package/src/ai/internal/mcpSchema/v2025_11_25.ts +8 -8
- package/src/ai/internal/mcpSchema/v2026_07_28.ts +44 -42
- package/src/cli/Argument.ts +15 -0
- package/src/cli/CliError.ts +136 -4
- package/src/cli/CliOutput.ts +183 -6
- package/src/cli/Command.ts +367 -48
- package/src/cli/Completions.ts +56 -0
- package/src/cli/Flag.ts +132 -0
- package/src/cli/GlobalFlag.ts +5 -6
- package/src/cli/Param.ts +151 -6
- package/src/cli/TerminalCapabilities.ts +159 -0
- package/src/cli/index.ts +6 -0
- package/src/cli/internal/command.ts +8 -3
- package/src/cli/internal/completions/bash.ts +83 -32
- package/src/cli/internal/completions/descriptor.ts +11 -1
- package/src/cli/internal/completions/fish.ts +10 -8
- package/src/cli/internal/completions/powershell.ts +23 -14
- package/src/cli/internal/completions/zsh.ts +8 -5
- package/src/cli/internal/formatter.ts +18 -0
- package/src/cli/internal/lexer.ts +12 -5
- package/src/cli/internal/parser.ts +31 -11
- package/src/cluster/ClusterCron.ts +94 -35
- package/src/cluster/ClusterMetrics.ts +149 -7
- package/src/cluster/ClusterWorkflowEngine.ts +130 -57
- package/src/cluster/Entity.ts +4 -0
- package/src/cluster/MessageStorage.ts +26 -14
- package/src/cluster/Runners.ts +76 -25
- package/src/cluster/Sharding.ts +200 -58
- package/src/cluster/ShardingConfig.ts +20 -0
- package/src/cluster/Snowflake.ts +3 -7
- package/src/cluster/SqlMessageStorage.ts +58 -55
- package/src/cluster/SqlRunnerStorage.ts +120 -51
- package/src/cluster/internal/entityManager.ts +155 -32
- package/src/devtools/DevTools.ts +3 -2
- package/src/devtools/DevToolsClient.ts +29 -10
- package/src/encoding/Base64.ts +38 -0
- package/src/encoding/Base64Url.ts +31 -0
- package/src/encoding/Ini.ts +3 -0
- package/src/encoding/JsonArray.ts +849 -0
- package/src/encoding/Ndjson.ts +211 -20
- package/src/encoding/SchemaBinary.ts +14 -48
- package/src/encoding/Sse.ts +4 -3
- package/src/encoding/Tar.ts +1417 -0
- package/src/encoding/Toml.ts +36 -19
- package/src/encoding/Xml.ts +2037 -0
- package/src/encoding/Yaml.ts +108 -36
- package/src/encoding/Zip.ts +1558 -0
- package/src/encoding/index.ts +24 -0
- package/src/eventlog/EventJournal.ts +611 -227
- package/src/eventlog/EventLog.ts +496 -196
- package/src/eventlog/EventLogEncryption.ts +128 -43
- package/src/eventlog/EventLogMessage.ts +62 -11
- package/src/eventlog/EventLogRemote.ts +77 -21
- package/src/eventlog/EventLogServer.ts +162 -20
- package/src/eventlog/EventLogServerEncrypted.ts +121 -80
- package/src/eventlog/EventLogServerUnencrypted.ts +180 -77
- package/src/eventlog/EventRow.ts +706 -0
- package/src/eventlog/SqlEventJournal.ts +496 -193
- package/src/eventlog/SqlEventLogServerEncrypted.ts +212 -83
- package/src/eventlog/SqlEventLogServerUnencrypted.ts +141 -62
- package/src/eventlog/index.ts +6 -0
- package/src/eventlog/internal/conflicts.ts +119 -0
- package/src/graphql/GraphQLClientError.ts +5 -12
- package/src/graphql/GraphQLProtocol.ts +12 -9
- package/src/graphql/GraphQLResolver.ts +90 -239
- package/src/http/Cookies.ts +10 -11
- package/src/http/FetchHttpClient.ts +56 -6
- package/src/http/FindMyWay/internal/router.ts +11 -0
- package/src/http/Headers.ts +337 -154
- package/src/http/HttpClient.ts +673 -142
- package/src/http/HttpClientError.ts +35 -1
- package/src/http/HttpClientRequest.ts +151 -5
- package/src/http/HttpClientResponse.ts +71 -0
- package/src/http/HttpEffect.ts +25 -33
- package/src/http/HttpIncomingMessage.ts +3 -23
- package/src/http/HttpMiddleware.ts +194 -40
- package/src/http/HttpRouter.ts +10 -3
- package/src/http/HttpServerError.ts +8 -5
- package/src/http/HttpServerRequest.ts +172 -27
- package/src/http/HttpServerResponse.ts +49 -23
- package/src/http/HttpStaticServer.ts +71 -26
- package/src/http/MultipartParser/internal/contentType.ts +109 -8
- package/src/http/MultipartParser/internal/headers.ts +4 -16
- package/src/http/MultipartParser/internal/multipart.ts +10 -32
- package/src/http/Url.ts +6 -1
- package/src/http/UrlParams.ts +6 -1
- package/src/http/internal/compression.ts +4 -5
- package/src/http/internal/decompression.ts +32 -17
- package/src/http/internal/httpBody.ts +10 -2
- package/src/http/internal/lazyStream.ts +25 -0
- package/src/http/internal/requestState.ts +33 -0
- package/src/http/internal/urlParams.ts +29 -0
- package/src/http/internal/webResponse.ts +20 -0
- package/src/http-api/HttpApi.ts +4 -7
- package/src/http-api/HttpApiBuilder.ts +190 -32
- package/src/http-api/HttpApiClient.ts +364 -90
- package/src/http-api/HttpApiEndpoint.ts +248 -46
- package/src/http-api/HttpApiError.ts +55 -0
- package/src/http-api/HttpApiScalar.ts +4 -3
- package/src/http-api/HttpApiSchema.ts +373 -18
- package/src/http-api/HttpApiSwagger.ts +11 -4
- package/src/http-api/HttpApiTest.ts +36 -11
- package/src/http-api/OpenApi.ts +103 -58
- package/src/http-api/internal/path.ts +40 -12
- package/src/http-api/internal/toCodecHttpProperties.ts +56 -0
- package/src/index.ts +24 -0
- package/src/internal/arbitrary/runner.ts +133 -36
- package/src/internal/core.ts +3 -1
- package/src/internal/dateTime.ts +20 -7
- package/src/internal/effect.ts +144 -100
- package/src/internal/equal.ts +17 -0
- package/src/internal/hashMap.ts +2 -2
- package/src/internal/hydration.ts +15 -0
- package/src/internal/inflate.ts +710 -0
- package/src/internal/jsonSchema.ts +27 -0
- package/src/internal/matcher.ts +1 -1
- package/src/internal/record.ts +6 -0
- package/src/internal/request.ts +21 -6
- package/src/internal/schedule.ts +20 -39
- package/src/internal/schema/compilerRegistry.ts +6 -1
- package/src/internal/schema/content.ts +18 -0
- package/src/internal/schema/fromJsonSchemaDocument.ts +458 -351
- package/src/internal/schema/fromRepresentation.ts +2 -1
- package/src/internal/schema/interpreter.ts +58 -45
- package/src/internal/schema/standardSchema.ts +34 -32
- package/src/internal/schema/toCodeDocument.ts +12 -7
- package/src/internal/schema/toCodec.ts +134 -15
- package/src/internal/schema/toFormatter.ts +6 -6
- package/src/internal/schema/toJsonSchemaDocument.ts +246 -194
- package/src/internal/schema/toRepresentation.ts +122 -140
- package/src/internal/sql.ts +14 -0
- package/src/internal/trie.ts +1 -3
- package/src/internal/uuid.ts +15 -10
- package/src/internal/version.ts +1 -1
- package/src/net/NetAddress.ts +2 -9
- package/src/observability/OtlpExporter.ts +5 -12
- package/src/observability/OtlpMetrics.ts +5 -3
- package/src/observability/OtlpProxy.ts +314 -0
- package/src/observability/OtlpResource.ts +16 -6
- package/src/observability/OtlpSerialization.ts +17 -3
- package/src/observability/OtlpTracer.ts +4 -0
- package/src/observability/index.ts +6 -0
- package/src/observability/internal/protobuf.ts +2 -10
- package/src/persistence/CircuitBreaker.ts +1678 -0
- package/src/persistence/PersistedCache.ts +3 -1
- package/src/persistence/PersistedQueue.ts +223 -153
- package/src/persistence/Persistence.ts +64 -30
- package/src/persistence/RateLimiter.ts +18 -21
- package/src/persistence/Redis.ts +129 -8
- package/src/persistence/UserDirectories.ts +273 -0
- package/src/persistence/index.ts +12 -0
- package/src/process/ChildProcess.ts +32 -5
- package/src/process/ChildProcessSpawner.ts +41 -2
- package/src/reactivity/AsyncResult.ts +5 -39
- package/src/reactivity/Atom.ts +134 -166
- package/src/reactivity/AtomHttpApi.ts +10 -16
- package/src/reactivity/AtomRegistry.ts +50 -29
- package/src/reactivity/AtomRpc.ts +6 -22
- package/src/reactivity/Hydration.ts +53 -12
- package/src/reactivity/Reactivity.ts +97 -39
- package/src/rpc/Rpc.ts +21 -0
- package/src/rpc/RpcClient.ts +283 -104
- package/src/rpc/RpcSerialization.ts +53 -14
- package/src/rpc/RpcServer.ts +27 -21
- package/src/rpc/RpcTest.ts +3 -0
- package/src/schema/VariantSchema.ts +86 -22
- package/src/socket/Socket.ts +45 -20
- package/src/sql/Migrator.ts +26 -11
- package/src/sql/SqlClient.ts +273 -29
- package/src/sql/SqlResolver.ts +32 -9
- package/src/sql/Statement.ts +65 -10
- package/src/testing/TestClock.ts +4 -1
- package/src/testing/TestSchema.ts +9 -3
- package/src/workflow/DurableDeferred.ts +23 -6
- package/src/workflow/WorkflowEngine.ts +34 -10
- package/dist/http/internal/preResponseHandler.d.ts +0 -2
- package/dist/http/internal/preResponseHandler.d.ts.map +0 -1
- package/dist/http/internal/preResponseHandler.js +0 -14
- package/dist/http/internal/preResponseHandler.js.map +0 -1
- package/src/http/internal/preResponseHandler.ts +0 -19
package/src/http/HttpClient.ts
CHANGED
|
@@ -25,6 +25,7 @@ import * as Inspectable from "../Inspectable.ts"
|
|
|
25
25
|
import { getStackTraceLimit, setStackTraceLimit } from "../internal/stackTraceLimit.ts"
|
|
26
26
|
import * as Layer from "../Layer.ts"
|
|
27
27
|
import * as Option from "../Option.ts"
|
|
28
|
+
import type * as CircuitBreaker from "../persistence/CircuitBreaker.ts"
|
|
28
29
|
import type * as RateLimiter from "../persistence/RateLimiter.ts"
|
|
29
30
|
import { type Pipeable, pipeArguments } from "../Pipeable.ts"
|
|
30
31
|
import * as Predicate from "../Predicate.ts"
|
|
@@ -46,6 +47,7 @@ import * as HttpIncomingMessage from "./HttpIncomingMessage.ts"
|
|
|
46
47
|
import * as HttpMethod from "./HttpMethod.ts"
|
|
47
48
|
import * as TraceContext from "./HttpTraceContext.ts"
|
|
48
49
|
import * as tracing from "./internal/tracing.ts"
|
|
50
|
+
import { getWebSource, WebSourceSymbol } from "./internal/webResponse.ts"
|
|
49
51
|
import * as Url from "./Url.ts"
|
|
50
52
|
import * as UrlParams from "./UrlParams.ts"
|
|
51
53
|
|
|
@@ -467,56 +469,7 @@ export const catchTag: {
|
|
|
467
469
|
transformResponse(
|
|
468
470
|
self,
|
|
469
471
|
(effect) =>
|
|
470
|
-
Effect.catchTag
|
|
471
|
-
* Handles client failures with one or more matching `_tag` values and returns a transformed client.
|
|
472
|
-
*
|
|
473
|
-
* @stability unstable
|
|
474
|
-
* @category error handling
|
|
475
|
-
* @since 4.0.0
|
|
476
|
-
*/
|
|
477
|
-
HttpClientResponse.HttpClientResponse, /**
|
|
478
|
-
* Handles client failures with one or more matching `_tag` values and returns a transformed client.
|
|
479
|
-
*
|
|
480
|
-
* @stability unstable
|
|
481
|
-
* @category error handling
|
|
482
|
-
* @since 4.0.0
|
|
483
|
-
*/
|
|
484
|
-
E, /**
|
|
485
|
-
* Handles client failures with one or more matching `_tag` values and returns a transformed client.
|
|
486
|
-
*
|
|
487
|
-
* @stability unstable
|
|
488
|
-
* @category error handling
|
|
489
|
-
* @since 4.0.0
|
|
490
|
-
*/
|
|
491
|
-
R, /**
|
|
492
|
-
* Handles client failures with one or more matching `_tag` values and returns a transformed client.
|
|
493
|
-
*
|
|
494
|
-
* @stability unstable
|
|
495
|
-
* @category error handling
|
|
496
|
-
* @since 4.0.0
|
|
497
|
-
*/
|
|
498
|
-
K, /**
|
|
499
|
-
* Handles client failures with one or more matching `_tag` values and returns a transformed client.
|
|
500
|
-
*
|
|
501
|
-
* @stability unstable
|
|
502
|
-
* @category error handling
|
|
503
|
-
* @since 4.0.0
|
|
504
|
-
*/
|
|
505
|
-
R1, /**
|
|
506
|
-
* Handles client failures with one or more matching `_tag` values and returns a transformed client.
|
|
507
|
-
*
|
|
508
|
-
* @stability unstable
|
|
509
|
-
* @category error handling
|
|
510
|
-
* @since 4.0.0
|
|
511
|
-
*/
|
|
512
|
-
E1, /**
|
|
513
|
-
* Handles client failures with one or more matching `_tag` values and returns a transformed client.
|
|
514
|
-
*
|
|
515
|
-
* @stability unstable
|
|
516
|
-
* @category error handling
|
|
517
|
-
* @since 4.0.0
|
|
518
|
-
*/
|
|
519
|
-
HttpClientResponse.HttpClientResponse>(
|
|
472
|
+
Effect.catchTag<HttpClientResponse.HttpClientResponse, E, R, K, R1, E1, HttpClientResponse.HttpClientResponse>(
|
|
520
473
|
effect,
|
|
521
474
|
tag,
|
|
522
475
|
f
|
|
@@ -884,12 +837,11 @@ export const make = (
|
|
|
884
837
|
fiber.getRef(TracerDisabledWhen)(request)
|
|
885
838
|
if (tracerDisabled) {
|
|
886
839
|
const effect = f(request, url, controller.signal, fiber as any)
|
|
887
|
-
if (scopedController) return effect
|
|
840
|
+
if (scopedController) return Effect.map(effect, (response) => trackResponse(response, controller, true))
|
|
888
841
|
return Effect.uninterruptibleMask((restore) =>
|
|
889
842
|
Effect.matchCauseEffect(restore(effect), {
|
|
890
843
|
onSuccess(response) {
|
|
891
|
-
|
|
892
|
-
return Effect.succeed(new InterruptibleResponse(response, controller))
|
|
844
|
+
return Effect.succeed(trackResponse(response, controller, false))
|
|
893
845
|
},
|
|
894
846
|
onFailure(cause) {
|
|
895
847
|
if (Cause.hasInterrupts(cause)) {
|
|
@@ -930,9 +882,7 @@ export const make = (
|
|
|
930
882
|
endSpanWithStatusError(fiber, span, request, response)
|
|
931
883
|
}
|
|
932
884
|
|
|
933
|
-
|
|
934
|
-
responseRegistry.register(response, controller)
|
|
935
|
-
return Effect.succeed(new InterruptibleResponse(response, controller))
|
|
885
|
+
return Effect.succeed(trackResponse(response, controller, scopedController !== undefined))
|
|
936
886
|
},
|
|
937
887
|
onFailure(cause) {
|
|
938
888
|
if (!scopedController && Cause.hasInterrupts(cause)) {
|
|
@@ -1641,81 +1591,18 @@ export const withRateLimiter: {
|
|
|
1641
1591
|
) => {
|
|
1642
1592
|
onResponse?.(clock, key, response.headers, tokens, sent)
|
|
1643
1593
|
if (options.disableResponseInspection || response.status !== 429) {
|
|
1644
|
-
return Effect.succeed
|
|
1645
|
-
* Applies request rate limiting using the `RateLimiter` service.
|
|
1646
|
-
*
|
|
1647
|
-
* **Details**
|
|
1648
|
-
*
|
|
1649
|
-
* It can update limits by inspecting common rate limit response headers and
|
|
1650
|
-
* automatically retries HTTP `429` responses (or `HttpClientError` values
|
|
1651
|
-
* wrapping a `429` response) by forcing the retry back through the limiter.
|
|
1652
|
-
* When a response reports the remaining budget, requests wait for the
|
|
1653
|
-
* reported reset once that budget is exhausted.
|
|
1654
|
-
*
|
|
1655
|
-
* **Gotchas**
|
|
1656
|
-
*
|
|
1657
|
-
* Automatic HTTP `429` retries are unlimited unless `times` is specified.
|
|
1658
|
-
* Disabling response inspection does not disable retries; set `times` to `0`
|
|
1659
|
-
* to return or fail with the first `429`.
|
|
1660
|
-
*
|
|
1661
|
-
* @stability unstable
|
|
1662
|
-
* @category rate limiting
|
|
1663
|
-
* @since 4.0.0
|
|
1664
|
-
*/
|
|
1665
|
-
Duration.Duration | undefined>(undefined);
|
|
1594
|
+
return Effect.succeed<Duration.Duration | undefined>(undefined)
|
|
1666
1595
|
}
|
|
1667
1596
|
const retryAfter = parseRetryAfter(
|
|
1668
1597
|
clock.currentTimeMillisUnsafe(),
|
|
1669
1598
|
getHeader(response.headers, ...headerNames.retryAfter)
|
|
1670
1599
|
)
|
|
1671
1600
|
if (retryAfter === undefined) {
|
|
1672
|
-
return Effect.succeed
|
|
1673
|
-
* Applies request rate limiting using the `RateLimiter` service.
|
|
1674
|
-
*
|
|
1675
|
-
* **Details**
|
|
1676
|
-
*
|
|
1677
|
-
* It can update limits by inspecting common rate limit response headers and
|
|
1678
|
-
* automatically retries HTTP `429` responses (or `HttpClientError` values
|
|
1679
|
-
* wrapping a `429` response) by forcing the retry back through the limiter.
|
|
1680
|
-
* When a response reports the remaining budget, requests wait for the
|
|
1681
|
-
* reported reset once that budget is exhausted.
|
|
1682
|
-
*
|
|
1683
|
-
* **Gotchas**
|
|
1684
|
-
*
|
|
1685
|
-
* Automatic HTTP `429` retries are unlimited unless `times` is specified.
|
|
1686
|
-
* Disabling response inspection does not disable retries; set `times` to `0`
|
|
1687
|
-
* to return or fail with the first `429`.
|
|
1688
|
-
*
|
|
1689
|
-
* @stability unstable
|
|
1690
|
-
* @category rate limiting
|
|
1691
|
-
* @since 4.0.0
|
|
1692
|
-
*/
|
|
1693
|
-
Duration.Duration | undefined>(undefined);
|
|
1601
|
+
return Effect.succeed<Duration.Duration | undefined>(undefined)
|
|
1694
1602
|
}
|
|
1695
1603
|
const delay = parseRateLimitWindow(clock, response.headers, headerNames) ?? retryAfter
|
|
1696
1604
|
if (adaptive === undefined) {
|
|
1697
|
-
return Effect.succeed
|
|
1698
|
-
* Applies request rate limiting using the `RateLimiter` service.
|
|
1699
|
-
*
|
|
1700
|
-
* **Details**
|
|
1701
|
-
*
|
|
1702
|
-
* It can update limits by inspecting common rate limit response headers and
|
|
1703
|
-
* automatically retries HTTP `429` responses (or `HttpClientError` values
|
|
1704
|
-
* wrapping a `429` response) by forcing the retry back through the limiter.
|
|
1705
|
-
* When a response reports the remaining budget, requests wait for the
|
|
1706
|
-
* reported reset once that budget is exhausted.
|
|
1707
|
-
*
|
|
1708
|
-
* **Gotchas**
|
|
1709
|
-
*
|
|
1710
|
-
* Automatic HTTP `429` retries are unlimited unless `times` is specified.
|
|
1711
|
-
* Disabling response inspection does not disable retries; set `times` to `0`
|
|
1712
|
-
* to return or fail with the first `429`.
|
|
1713
|
-
*
|
|
1714
|
-
* @stability unstable
|
|
1715
|
-
* @category rate limiting
|
|
1716
|
-
* @since 4.0.0
|
|
1717
|
-
*/
|
|
1718
|
-
Duration.Duration | undefined>(delay);
|
|
1605
|
+
return Effect.succeed<Duration.Duration | undefined>(delay)
|
|
1719
1606
|
}
|
|
1720
1607
|
return Effect.as(
|
|
1721
1608
|
options.limiter.adaptiveFeedback({
|
|
@@ -1786,9 +1673,518 @@ export const withRateLimiter: {
|
|
|
1786
1673
|
return Duration.isZero(delay) ? runAdaptive() : Effect.flatMap(Effect.sleep(delay), runAdaptive)
|
|
1787
1674
|
}
|
|
1788
1675
|
)
|
|
1789
|
-
})
|
|
1676
|
+
})
|
|
1790
1677
|
})
|
|
1791
1678
|
|
|
1679
|
+
/**
|
|
1680
|
+
* Namespace containing configuration types for `withCircuitBreaker`.
|
|
1681
|
+
*
|
|
1682
|
+
* @stability experimental
|
|
1683
|
+
* @since 4.0.6
|
|
1684
|
+
*/
|
|
1685
|
+
export declare namespace WithCircuitBreaker {
|
|
1686
|
+
/**
|
|
1687
|
+
* Options used to configure `withCircuitBreaker`.
|
|
1688
|
+
*
|
|
1689
|
+
* @stability experimental
|
|
1690
|
+
* @category circuit breaking
|
|
1691
|
+
* @since 4.0.6
|
|
1692
|
+
*/
|
|
1693
|
+
export interface Options<E, R2 = never> {
|
|
1694
|
+
/**
|
|
1695
|
+
* The `CircuitBreaker` service that guards each request.
|
|
1696
|
+
*/
|
|
1697
|
+
readonly breaker: CircuitBreaker.CircuitBreaker
|
|
1698
|
+
/**
|
|
1699
|
+
* The circuit key for a request. Requests with the same key share one
|
|
1700
|
+
* circuit. Defaults to the request origin, falling back to the raw request
|
|
1701
|
+
* URL when it cannot be parsed.
|
|
1702
|
+
*/
|
|
1703
|
+
readonly key?: string | ((request: HttpClientRequest.HttpClientRequest) => string) | undefined
|
|
1704
|
+
/**
|
|
1705
|
+
* Classifies the `Exit` of each request that the breaker admitted.
|
|
1706
|
+
* Defaults to `circuitBreakerClassifier`.
|
|
1707
|
+
*/
|
|
1708
|
+
readonly classify?:
|
|
1709
|
+
| ((
|
|
1710
|
+
exit: Exit.Exit<HttpClientResponse.HttpClientResponse, E>
|
|
1711
|
+
) => CircuitBreaker.Outcome | Effect.Effect<CircuitBreaker.Outcome, never, R2>)
|
|
1712
|
+
| undefined
|
|
1713
|
+
}
|
|
1714
|
+
}
|
|
1715
|
+
|
|
1716
|
+
/**
|
|
1717
|
+
* Guards requests with a `CircuitBreaker`.
|
|
1718
|
+
*
|
|
1719
|
+
* **Details**
|
|
1720
|
+
*
|
|
1721
|
+
* Requests are keyed by origin unless `key` is set, and classified with
|
|
1722
|
+
* `circuitBreakerClassifier` unless `classify` is set. A rejected request
|
|
1723
|
+
* fails with `CircuitBreakerError` without reaching the wrapped client.
|
|
1724
|
+
*
|
|
1725
|
+
* Apply it after `withRateLimiter` and `retryTransient`, so the breaker sees
|
|
1726
|
+
* one outcome per call and an open circuit skips the retry loop.
|
|
1727
|
+
* `retryTransient` never retries a `CircuitBreakerError`. A custom `classify`
|
|
1728
|
+
* can delegate the cases it doesn't handle to `circuitBreakerClassifier`.
|
|
1729
|
+
*
|
|
1730
|
+
* **Gotchas**
|
|
1731
|
+
*
|
|
1732
|
+
* - The breaker only sees the response headers. To count an error in the
|
|
1733
|
+
* body, lift it into the error channel below the breaker with
|
|
1734
|
+
* `transformResponse` and count it in `classify`.
|
|
1735
|
+
* - `withRateLimiter` retries `429` without limit by default, which can hold
|
|
1736
|
+
* the probe slot for minutes. Set its `times`.
|
|
1737
|
+
* - A rejected request has no client span. The rejection fails the caller's
|
|
1738
|
+
* span instead.
|
|
1739
|
+
*
|
|
1740
|
+
* **Example** (Guarding an API in the recommended order)
|
|
1741
|
+
*
|
|
1742
|
+
* ```ts import.meta.vitest
|
|
1743
|
+
* import { Effect, Layer, Ref, Schedule } from "effect"
|
|
1744
|
+
* import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/http"
|
|
1745
|
+
* import { CircuitBreaker, RateLimiter } from "effect/persistence"
|
|
1746
|
+
*
|
|
1747
|
+
* const program = Effect.gen(function*() {
|
|
1748
|
+
* const requests = yield* Ref.make(0)
|
|
1749
|
+
* // A dependency that always answers 503.
|
|
1750
|
+
* const unavailable = HttpClient.make((request) =>
|
|
1751
|
+
* Effect.as(Ref.update(requests, (n) => n + 1), HttpClientResponse.fromWeb(request, new Response(null, { status: 503 })))
|
|
1752
|
+
* )
|
|
1753
|
+
*
|
|
1754
|
+
* const breaker = yield* CircuitBreaker.make({
|
|
1755
|
+
* tripPolicy: CircuitBreaker.consecutive(1),
|
|
1756
|
+
* openDuration: "30 seconds"
|
|
1757
|
+
* })
|
|
1758
|
+
* const client = unavailable.pipe(
|
|
1759
|
+
* HttpClient.withRateLimiter({
|
|
1760
|
+
* limiter: yield* RateLimiter.RateLimiter,
|
|
1761
|
+
* key: "inventory",
|
|
1762
|
+
* limit: 100,
|
|
1763
|
+
* window: "1 second",
|
|
1764
|
+
* times: 3
|
|
1765
|
+
* }),
|
|
1766
|
+
* HttpClient.retryTransient({ times: 2, schedule: Schedule.exponential("1 millis") }),
|
|
1767
|
+
* HttpClient.withCircuitBreaker({ breaker })
|
|
1768
|
+
* )
|
|
1769
|
+
*
|
|
1770
|
+
* // Three attempts, then the breaker records one failure and opens.
|
|
1771
|
+
* yield* client.execute(HttpClientRequest.get("http://inventory.test/items"))
|
|
1772
|
+
* // Rejected before the retry loop starts, so no further request is sent.
|
|
1773
|
+
* const rejected = yield* Effect.flip(client.execute(HttpClientRequest.get("http://inventory.test/items")))
|
|
1774
|
+
*
|
|
1775
|
+
* return [yield* Ref.get(requests), rejected._tag]
|
|
1776
|
+
* }).pipe(
|
|
1777
|
+
* Effect.scoped,
|
|
1778
|
+
* Effect.provide(Layer.merge(
|
|
1779
|
+
* CircuitBreaker.layerStoreMemory(),
|
|
1780
|
+
* RateLimiter.layer.pipe(Layer.provide(RateLimiter.layerStoreMemory))
|
|
1781
|
+
* ))
|
|
1782
|
+
* )
|
|
1783
|
+
*
|
|
1784
|
+
* await Effect.runPromise(program) // => [3, "CircuitBreakerError"]
|
|
1785
|
+
* ```
|
|
1786
|
+
*
|
|
1787
|
+
* **Example** (Counting an error in the body as a failure)
|
|
1788
|
+
*
|
|
1789
|
+
* This API answers `200` with `{ "status": "degraded" }` when it is failing.
|
|
1790
|
+
*
|
|
1791
|
+
* ```ts import.meta.vitest
|
|
1792
|
+
* import { Data, Effect, Exit, Option } from "effect"
|
|
1793
|
+
* import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/http"
|
|
1794
|
+
* import { CircuitBreaker } from "effect/persistence"
|
|
1795
|
+
*
|
|
1796
|
+
* class Degraded extends Data.TaggedError("Degraded") {}
|
|
1797
|
+
*
|
|
1798
|
+
* const degraded = HttpClient.make((request) =>
|
|
1799
|
+
* Effect.succeed(HttpClientResponse.fromWeb(request, Response.json({ status: "degraded" })))
|
|
1800
|
+
* )
|
|
1801
|
+
*
|
|
1802
|
+
* const program = Effect.gen(function*() {
|
|
1803
|
+
* const breaker = yield* CircuitBreaker.make({
|
|
1804
|
+
* tripPolicy: CircuitBreaker.consecutive(1),
|
|
1805
|
+
* openDuration: "30 seconds"
|
|
1806
|
+
* })
|
|
1807
|
+
* const client = degraded.pipe(
|
|
1808
|
+
* HttpClient.transformResponse(Effect.flatMap((response) =>
|
|
1809
|
+
* Effect.flatMap(response.json, (body) =>
|
|
1810
|
+
* typeof body === "object" && body !== null && "status" in body && body.status === "degraded"
|
|
1811
|
+
* ? Effect.fail(new Degraded())
|
|
1812
|
+
* : Effect.succeed(response))
|
|
1813
|
+
* )),
|
|
1814
|
+
* HttpClient.withCircuitBreaker({
|
|
1815
|
+
* breaker,
|
|
1816
|
+
* classify: (exit) =>
|
|
1817
|
+
* Option.exists(Exit.findErrorOption(exit), (error) => error._tag === "Degraded")
|
|
1818
|
+
* ? CircuitBreaker.failure()
|
|
1819
|
+
* : HttpClient.circuitBreakerClassifier(exit)
|
|
1820
|
+
* })
|
|
1821
|
+
* )
|
|
1822
|
+
*
|
|
1823
|
+
* yield* Effect.flip(client.get("http://status.test/"))
|
|
1824
|
+
* const state = yield* breaker.state("http://status.test")
|
|
1825
|
+
* return state._tag
|
|
1826
|
+
* }).pipe(Effect.scoped, Effect.provide(CircuitBreaker.layerStoreMemory()))
|
|
1827
|
+
*
|
|
1828
|
+
* await Effect.runPromise(program) // => "Open"
|
|
1829
|
+
* ```
|
|
1830
|
+
*
|
|
1831
|
+
* @stability experimental
|
|
1832
|
+
* @category circuit breaking
|
|
1833
|
+
* @since 4.0.6
|
|
1834
|
+
*/
|
|
1835
|
+
export const withCircuitBreaker: {
|
|
1836
|
+
/**
|
|
1837
|
+
* Guards requests with a `CircuitBreaker`.
|
|
1838
|
+
*
|
|
1839
|
+
* **Details**
|
|
1840
|
+
*
|
|
1841
|
+
* Requests are keyed by origin unless `key` is set, and classified with
|
|
1842
|
+
* `circuitBreakerClassifier` unless `classify` is set. A rejected request
|
|
1843
|
+
* fails with `CircuitBreakerError` without reaching the wrapped client.
|
|
1844
|
+
*
|
|
1845
|
+
* Apply it after `withRateLimiter` and `retryTransient`, so the breaker sees
|
|
1846
|
+
* one outcome per call and an open circuit skips the retry loop.
|
|
1847
|
+
* `retryTransient` never retries a `CircuitBreakerError`. A custom `classify`
|
|
1848
|
+
* can delegate the cases it doesn't handle to `circuitBreakerClassifier`.
|
|
1849
|
+
*
|
|
1850
|
+
* **Gotchas**
|
|
1851
|
+
*
|
|
1852
|
+
* - The breaker only sees the response headers. To count an error in the
|
|
1853
|
+
* body, lift it into the error channel below the breaker with
|
|
1854
|
+
* `transformResponse` and count it in `classify`.
|
|
1855
|
+
* - `withRateLimiter` retries `429` without limit by default, which can hold
|
|
1856
|
+
* the probe slot for minutes. Set its `times`.
|
|
1857
|
+
* - A rejected request has no client span. The rejection fails the caller's
|
|
1858
|
+
* span instead.
|
|
1859
|
+
*
|
|
1860
|
+
* **Example** (Guarding an API in the recommended order)
|
|
1861
|
+
*
|
|
1862
|
+
* ```ts import.meta.vitest
|
|
1863
|
+
* import { Effect, Layer, Ref, Schedule } from "effect"
|
|
1864
|
+
* import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/http"
|
|
1865
|
+
* import { CircuitBreaker, RateLimiter } from "effect/persistence"
|
|
1866
|
+
*
|
|
1867
|
+
* const program = Effect.gen(function*() {
|
|
1868
|
+
* const requests = yield* Ref.make(0)
|
|
1869
|
+
* // A dependency that always answers 503.
|
|
1870
|
+
* const unavailable = HttpClient.make((request) =>
|
|
1871
|
+
* Effect.as(Ref.update(requests, (n) => n + 1), HttpClientResponse.fromWeb(request, new Response(null, { status: 503 })))
|
|
1872
|
+
* )
|
|
1873
|
+
*
|
|
1874
|
+
* const breaker = yield* CircuitBreaker.make({
|
|
1875
|
+
* tripPolicy: CircuitBreaker.consecutive(1),
|
|
1876
|
+
* openDuration: "30 seconds"
|
|
1877
|
+
* })
|
|
1878
|
+
* const client = unavailable.pipe(
|
|
1879
|
+
* HttpClient.withRateLimiter({
|
|
1880
|
+
* limiter: yield* RateLimiter.RateLimiter,
|
|
1881
|
+
* key: "inventory",
|
|
1882
|
+
* limit: 100,
|
|
1883
|
+
* window: "1 second",
|
|
1884
|
+
* times: 3
|
|
1885
|
+
* }),
|
|
1886
|
+
* HttpClient.retryTransient({ times: 2, schedule: Schedule.exponential("1 millis") }),
|
|
1887
|
+
* HttpClient.withCircuitBreaker({ breaker })
|
|
1888
|
+
* )
|
|
1889
|
+
*
|
|
1890
|
+
* // Three attempts, then the breaker records one failure and opens.
|
|
1891
|
+
* yield* client.execute(HttpClientRequest.get("http://inventory.test/items"))
|
|
1892
|
+
* // Rejected before the retry loop starts, so no further request is sent.
|
|
1893
|
+
* const rejected = yield* Effect.flip(client.execute(HttpClientRequest.get("http://inventory.test/items")))
|
|
1894
|
+
*
|
|
1895
|
+
* return [yield* Ref.get(requests), rejected._tag]
|
|
1896
|
+
* }).pipe(
|
|
1897
|
+
* Effect.scoped,
|
|
1898
|
+
* Effect.provide(Layer.merge(
|
|
1899
|
+
* CircuitBreaker.layerStoreMemory(),
|
|
1900
|
+
* RateLimiter.layer.pipe(Layer.provide(RateLimiter.layerStoreMemory))
|
|
1901
|
+
* ))
|
|
1902
|
+
* )
|
|
1903
|
+
*
|
|
1904
|
+
* await Effect.runPromise(program) // => [3, "CircuitBreakerError"]
|
|
1905
|
+
* ```
|
|
1906
|
+
*
|
|
1907
|
+
* **Example** (Counting an error in the body as a failure)
|
|
1908
|
+
*
|
|
1909
|
+
* This API answers `200` with `{ "status": "degraded" }` when it is failing.
|
|
1910
|
+
*
|
|
1911
|
+
* ```ts import.meta.vitest
|
|
1912
|
+
* import { Data, Effect, Exit, Option } from "effect"
|
|
1913
|
+
* import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/http"
|
|
1914
|
+
* import { CircuitBreaker } from "effect/persistence"
|
|
1915
|
+
*
|
|
1916
|
+
* class Degraded extends Data.TaggedError("Degraded") {}
|
|
1917
|
+
*
|
|
1918
|
+
* const degraded = HttpClient.make((request) =>
|
|
1919
|
+
* Effect.succeed(HttpClientResponse.fromWeb(request, Response.json({ status: "degraded" })))
|
|
1920
|
+
* )
|
|
1921
|
+
*
|
|
1922
|
+
* const program = Effect.gen(function*() {
|
|
1923
|
+
* const breaker = yield* CircuitBreaker.make({
|
|
1924
|
+
* tripPolicy: CircuitBreaker.consecutive(1),
|
|
1925
|
+
* openDuration: "30 seconds"
|
|
1926
|
+
* })
|
|
1927
|
+
* const client = degraded.pipe(
|
|
1928
|
+
* HttpClient.transformResponse(Effect.flatMap((response) =>
|
|
1929
|
+
* Effect.flatMap(response.json, (body) =>
|
|
1930
|
+
* typeof body === "object" && body !== null && "status" in body && body.status === "degraded"
|
|
1931
|
+
* ? Effect.fail(new Degraded())
|
|
1932
|
+
* : Effect.succeed(response))
|
|
1933
|
+
* )),
|
|
1934
|
+
* HttpClient.withCircuitBreaker({
|
|
1935
|
+
* breaker,
|
|
1936
|
+
* classify: (exit) =>
|
|
1937
|
+
* Option.exists(Exit.findErrorOption(exit), (error) => error._tag === "Degraded")
|
|
1938
|
+
* ? CircuitBreaker.failure()
|
|
1939
|
+
* : HttpClient.circuitBreakerClassifier(exit)
|
|
1940
|
+
* })
|
|
1941
|
+
* )
|
|
1942
|
+
*
|
|
1943
|
+
* yield* Effect.flip(client.get("http://status.test/"))
|
|
1944
|
+
* const state = yield* breaker.state("http://status.test")
|
|
1945
|
+
* return state._tag
|
|
1946
|
+
* }).pipe(Effect.scoped, Effect.provide(CircuitBreaker.layerStoreMemory()))
|
|
1947
|
+
*
|
|
1948
|
+
* await Effect.runPromise(program) // => "Open"
|
|
1949
|
+
* ```
|
|
1950
|
+
*
|
|
1951
|
+
* @stability experimental
|
|
1952
|
+
* @category circuit breaking
|
|
1953
|
+
* @since 4.0.6
|
|
1954
|
+
*/
|
|
1955
|
+
<E, R2 = never>(options: WithCircuitBreaker.Options<E, R2>): <R>(
|
|
1956
|
+
self: HttpClient.With<E, R>
|
|
1957
|
+
) => HttpClient.With<E | CircuitBreaker.CircuitBreakerError, R | R2>
|
|
1958
|
+
/**
|
|
1959
|
+
* Guards requests with a `CircuitBreaker`.
|
|
1960
|
+
*
|
|
1961
|
+
* **Details**
|
|
1962
|
+
*
|
|
1963
|
+
* Requests are keyed by origin unless `key` is set, and classified with
|
|
1964
|
+
* `circuitBreakerClassifier` unless `classify` is set. A rejected request
|
|
1965
|
+
* fails with `CircuitBreakerError` without reaching the wrapped client.
|
|
1966
|
+
*
|
|
1967
|
+
* Apply it after `withRateLimiter` and `retryTransient`, so the breaker sees
|
|
1968
|
+
* one outcome per call and an open circuit skips the retry loop.
|
|
1969
|
+
* `retryTransient` never retries a `CircuitBreakerError`. A custom `classify`
|
|
1970
|
+
* can delegate the cases it doesn't handle to `circuitBreakerClassifier`.
|
|
1971
|
+
*
|
|
1972
|
+
* **Gotchas**
|
|
1973
|
+
*
|
|
1974
|
+
* - The breaker only sees the response headers. To count an error in the
|
|
1975
|
+
* body, lift it into the error channel below the breaker with
|
|
1976
|
+
* `transformResponse` and count it in `classify`.
|
|
1977
|
+
* - `withRateLimiter` retries `429` without limit by default, which can hold
|
|
1978
|
+
* the probe slot for minutes. Set its `times`.
|
|
1979
|
+
* - A rejected request has no client span. The rejection fails the caller's
|
|
1980
|
+
* span instead.
|
|
1981
|
+
*
|
|
1982
|
+
* **Example** (Guarding an API in the recommended order)
|
|
1983
|
+
*
|
|
1984
|
+
* ```ts import.meta.vitest
|
|
1985
|
+
* import { Effect, Layer, Ref, Schedule } from "effect"
|
|
1986
|
+
* import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/http"
|
|
1987
|
+
* import { CircuitBreaker, RateLimiter } from "effect/persistence"
|
|
1988
|
+
*
|
|
1989
|
+
* const program = Effect.gen(function*() {
|
|
1990
|
+
* const requests = yield* Ref.make(0)
|
|
1991
|
+
* // A dependency that always answers 503.
|
|
1992
|
+
* const unavailable = HttpClient.make((request) =>
|
|
1993
|
+
* Effect.as(Ref.update(requests, (n) => n + 1), HttpClientResponse.fromWeb(request, new Response(null, { status: 503 })))
|
|
1994
|
+
* )
|
|
1995
|
+
*
|
|
1996
|
+
* const breaker = yield* CircuitBreaker.make({
|
|
1997
|
+
* tripPolicy: CircuitBreaker.consecutive(1),
|
|
1998
|
+
* openDuration: "30 seconds"
|
|
1999
|
+
* })
|
|
2000
|
+
* const client = unavailable.pipe(
|
|
2001
|
+
* HttpClient.withRateLimiter({
|
|
2002
|
+
* limiter: yield* RateLimiter.RateLimiter,
|
|
2003
|
+
* key: "inventory",
|
|
2004
|
+
* limit: 100,
|
|
2005
|
+
* window: "1 second",
|
|
2006
|
+
* times: 3
|
|
2007
|
+
* }),
|
|
2008
|
+
* HttpClient.retryTransient({ times: 2, schedule: Schedule.exponential("1 millis") }),
|
|
2009
|
+
* HttpClient.withCircuitBreaker({ breaker })
|
|
2010
|
+
* )
|
|
2011
|
+
*
|
|
2012
|
+
* // Three attempts, then the breaker records one failure and opens.
|
|
2013
|
+
* yield* client.execute(HttpClientRequest.get("http://inventory.test/items"))
|
|
2014
|
+
* // Rejected before the retry loop starts, so no further request is sent.
|
|
2015
|
+
* const rejected = yield* Effect.flip(client.execute(HttpClientRequest.get("http://inventory.test/items")))
|
|
2016
|
+
*
|
|
2017
|
+
* return [yield* Ref.get(requests), rejected._tag]
|
|
2018
|
+
* }).pipe(
|
|
2019
|
+
* Effect.scoped,
|
|
2020
|
+
* Effect.provide(Layer.merge(
|
|
2021
|
+
* CircuitBreaker.layerStoreMemory(),
|
|
2022
|
+
* RateLimiter.layer.pipe(Layer.provide(RateLimiter.layerStoreMemory))
|
|
2023
|
+
* ))
|
|
2024
|
+
* )
|
|
2025
|
+
*
|
|
2026
|
+
* await Effect.runPromise(program) // => [3, "CircuitBreakerError"]
|
|
2027
|
+
* ```
|
|
2028
|
+
*
|
|
2029
|
+
* **Example** (Counting an error in the body as a failure)
|
|
2030
|
+
*
|
|
2031
|
+
* This API answers `200` with `{ "status": "degraded" }` when it is failing.
|
|
2032
|
+
*
|
|
2033
|
+
* ```ts import.meta.vitest
|
|
2034
|
+
* import { Data, Effect, Exit, Option } from "effect"
|
|
2035
|
+
* import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/http"
|
|
2036
|
+
* import { CircuitBreaker } from "effect/persistence"
|
|
2037
|
+
*
|
|
2038
|
+
* class Degraded extends Data.TaggedError("Degraded") {}
|
|
2039
|
+
*
|
|
2040
|
+
* const degraded = HttpClient.make((request) =>
|
|
2041
|
+
* Effect.succeed(HttpClientResponse.fromWeb(request, Response.json({ status: "degraded" })))
|
|
2042
|
+
* )
|
|
2043
|
+
*
|
|
2044
|
+
* const program = Effect.gen(function*() {
|
|
2045
|
+
* const breaker = yield* CircuitBreaker.make({
|
|
2046
|
+
* tripPolicy: CircuitBreaker.consecutive(1),
|
|
2047
|
+
* openDuration: "30 seconds"
|
|
2048
|
+
* })
|
|
2049
|
+
* const client = degraded.pipe(
|
|
2050
|
+
* HttpClient.transformResponse(Effect.flatMap((response) =>
|
|
2051
|
+
* Effect.flatMap(response.json, (body) =>
|
|
2052
|
+
* typeof body === "object" && body !== null && "status" in body && body.status === "degraded"
|
|
2053
|
+
* ? Effect.fail(new Degraded())
|
|
2054
|
+
* : Effect.succeed(response))
|
|
2055
|
+
* )),
|
|
2056
|
+
* HttpClient.withCircuitBreaker({
|
|
2057
|
+
* breaker,
|
|
2058
|
+
* classify: (exit) =>
|
|
2059
|
+
* Option.exists(Exit.findErrorOption(exit), (error) => error._tag === "Degraded")
|
|
2060
|
+
* ? CircuitBreaker.failure()
|
|
2061
|
+
* : HttpClient.circuitBreakerClassifier(exit)
|
|
2062
|
+
* })
|
|
2063
|
+
* )
|
|
2064
|
+
*
|
|
2065
|
+
* yield* Effect.flip(client.get("http://status.test/"))
|
|
2066
|
+
* const state = yield* breaker.state("http://status.test")
|
|
2067
|
+
* return state._tag
|
|
2068
|
+
* }).pipe(Effect.scoped, Effect.provide(CircuitBreaker.layerStoreMemory()))
|
|
2069
|
+
*
|
|
2070
|
+
* await Effect.runPromise(program) // => "Open"
|
|
2071
|
+
* ```
|
|
2072
|
+
*
|
|
2073
|
+
* @stability experimental
|
|
2074
|
+
* @category circuit breaking
|
|
2075
|
+
* @since 4.0.6
|
|
2076
|
+
*/
|
|
2077
|
+
<E, R, R2 = never>(self: HttpClient.With<E, R>, options: WithCircuitBreaker.Options<E, R2>): HttpClient.With<E | CircuitBreaker.CircuitBreakerError, R | R2>
|
|
2078
|
+
} = dual(2, <E, R, R2>(
|
|
2079
|
+
self: HttpClient.With<E, R>,
|
|
2080
|
+
options: WithCircuitBreaker.Options<E, R2>
|
|
2081
|
+
): HttpClient.With<E | CircuitBreaker.CircuitBreakerError, R | R2> => {
|
|
2082
|
+
const keyOption = options.key
|
|
2083
|
+
const resolveKey: (request: HttpClientRequest.HttpClientRequest) => string = typeof keyOption === "function"
|
|
2084
|
+
? keyOption
|
|
2085
|
+
: keyOption === undefined
|
|
2086
|
+
? requestOrigin
|
|
2087
|
+
: constant(keyOption)
|
|
2088
|
+
const classify = options.classify ?? circuitBreakerClassifier
|
|
2089
|
+
return transform(self, (effect, request) => options.breaker.execute(effect, { key: resolveKey(request), classify }))
|
|
2090
|
+
})
|
|
2091
|
+
|
|
2092
|
+
const requestOrigin = (request: HttpClientRequest.HttpClientRequest): string =>
|
|
2093
|
+
Option.match(HttpClientRequest.toUrl(request), {
|
|
2094
|
+
onNone: () => request.url,
|
|
2095
|
+
onSome: (url) => url.origin
|
|
2096
|
+
})
|
|
2097
|
+
|
|
2098
|
+
/**
|
|
2099
|
+
* The default `withCircuitBreaker` classifier.
|
|
2100
|
+
*
|
|
2101
|
+
* **Details**
|
|
2102
|
+
*
|
|
2103
|
+
* - Failure: status 408, 500, 502, 503 or 504, returned or wrapped in a
|
|
2104
|
+
* `StatusCodeError`, and any `TransportError` or `Cause.TimeoutError`.
|
|
2105
|
+
* - Success: any other response, including other 4xx, since the dependency
|
|
2106
|
+
* answered.
|
|
2107
|
+
* - Ignored: status 429 (left to `withRateLimiter`), `EncodeError`,
|
|
2108
|
+
* `InvalidUrlError`, `DecodeError`, `EmptyBodyError`, unknown typed errors
|
|
2109
|
+
* and defects. HttpClient errors are typed, so a defect here is a bug in
|
|
2110
|
+
* the caller.
|
|
2111
|
+
*
|
|
2112
|
+
* When a cause holds several errors, a failure beats a success and a success
|
|
2113
|
+
* beats an ignored outcome. A failure carries the longest `Retry-After` it
|
|
2114
|
+
* saw. The result is an `Effect` only because parsing an HTTP-date
|
|
2115
|
+
* `Retry-After` reads `Clock`.
|
|
2116
|
+
*
|
|
2117
|
+
* **Gotchas**
|
|
2118
|
+
*
|
|
2119
|
+
* `TransportError` also covers client-side refusals, which count as failures.
|
|
2120
|
+
*
|
|
2121
|
+
* @stability experimental
|
|
2122
|
+
* @category circuit breaking
|
|
2123
|
+
* @since 4.0.6
|
|
2124
|
+
*/
|
|
2125
|
+
export const circuitBreakerClassifier = <E>(
|
|
2126
|
+
exit: Exit.Exit<HttpClientResponse.HttpClientResponse, E>
|
|
2127
|
+
): Effect.Effect<CircuitBreaker.Outcome> =>
|
|
2128
|
+
Effect.clockWith((clock) => Effect.succeed(classifyCircuitBreakerExit(exit, clock.currentTimeMillisUnsafe())))
|
|
2129
|
+
|
|
2130
|
+
const classifyCircuitBreakerExit = <E>(
|
|
2131
|
+
exit: Exit.Exit<HttpClientResponse.HttpClientResponse, E>,
|
|
2132
|
+
nowMillis: number
|
|
2133
|
+
): CircuitBreaker.Outcome => {
|
|
2134
|
+
if (Exit.isSuccess(exit)) {
|
|
2135
|
+
const outcome = circuitBreakerStatusOutcome(exit.value.status)
|
|
2136
|
+
return outcome === "Failure" ? circuitBreakerFailure(retryAfterOf(exit.value, nowMillis)) : { _tag: outcome }
|
|
2137
|
+
}
|
|
2138
|
+
let failed = false
|
|
2139
|
+
let succeeded = false
|
|
2140
|
+
let retryAfter: Duration.Duration | undefined
|
|
2141
|
+
for (const reason of exit.cause.reasons) {
|
|
2142
|
+
if (!Cause.isFailReason(reason)) {
|
|
2143
|
+
continue
|
|
2144
|
+
}
|
|
2145
|
+
const outcome = circuitBreakerErrorOutcome(reason.error)
|
|
2146
|
+
if (outcome === "Failure") {
|
|
2147
|
+
failed = true
|
|
2148
|
+
const hint = retryAfterOf(reason.error, nowMillis)
|
|
2149
|
+
if (hint !== undefined) {
|
|
2150
|
+
retryAfter = retryAfter === undefined ? hint : Duration.max(retryAfter, hint)
|
|
2151
|
+
}
|
|
2152
|
+
} else if (outcome === "Success") {
|
|
2153
|
+
succeeded = true
|
|
2154
|
+
}
|
|
2155
|
+
}
|
|
2156
|
+
return failed ? circuitBreakerFailure(retryAfter) : { _tag: succeeded ? "Success" : "Ignored" }
|
|
2157
|
+
}
|
|
2158
|
+
|
|
2159
|
+
const circuitBreakerFailure = (retryAfter: Duration.Duration | undefined): CircuitBreaker.Outcome => ({
|
|
2160
|
+
_tag: "Failure",
|
|
2161
|
+
retryAfter
|
|
2162
|
+
})
|
|
2163
|
+
|
|
2164
|
+
const circuitBreakerErrorOutcome = (error: unknown): CircuitBreaker.Outcome["_tag"] => {
|
|
2165
|
+
if (Cause.isTimeoutError(error)) {
|
|
2166
|
+
return "Failure"
|
|
2167
|
+
}
|
|
2168
|
+
if (!Error.isHttpClientError(error)) {
|
|
2169
|
+
return "Ignored"
|
|
2170
|
+
}
|
|
2171
|
+
switch (error.reason._tag) {
|
|
2172
|
+
case "TransportError":
|
|
2173
|
+
return "Failure"
|
|
2174
|
+
case "StatusCodeError":
|
|
2175
|
+
return circuitBreakerStatusOutcome(error.reason.response.status)
|
|
2176
|
+
default:
|
|
2177
|
+
return "Ignored"
|
|
2178
|
+
}
|
|
2179
|
+
}
|
|
2180
|
+
|
|
2181
|
+
const circuitBreakerStatusOutcome = (status: number): CircuitBreaker.Outcome["_tag"] =>
|
|
2182
|
+
status === 429
|
|
2183
|
+
? "Ignored"
|
|
2184
|
+
: status === 408 || status === 500 || status === 502 || status === 503 || status === 504
|
|
2185
|
+
? "Failure"
|
|
2186
|
+
: "Success"
|
|
2187
|
+
|
|
1792
2188
|
interface RateLimiterHeaderNames {
|
|
1793
2189
|
readonly limit: ReadonlyArray<string>
|
|
1794
2190
|
readonly remaining: ReadonlyArray<string>
|
|
@@ -1888,6 +2284,8 @@ const parseRateLimitWindow = (
|
|
|
1888
2284
|
return parseResetHeader(clock, getHeader(headers, ...headerNames.reset))
|
|
1889
2285
|
}
|
|
1890
2286
|
|
|
2287
|
+
// An invalid Retry-After is treated as absent (RFC 9110 §10.2.3); the
|
|
2288
|
+
// one millisecond floor keeps a past date or `0` from retrying immediately.
|
|
1891
2289
|
const parseRetryAfter = (
|
|
1892
2290
|
nowMillis: number,
|
|
1893
2291
|
value: string | undefined
|
|
@@ -1895,22 +2293,10 @@ const parseRetryAfter = (
|
|
|
1895
2293
|
if (value === undefined) {
|
|
1896
2294
|
return undefined
|
|
1897
2295
|
}
|
|
1898
|
-
const
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
? Duration.max(Duration.seconds(numeric), Duration.millis(1))
|
|
1903
|
-
: undefined
|
|
1904
|
-
}
|
|
1905
|
-
const parsedDate = Date.parse(trimmed)
|
|
1906
|
-
if (Number.isNaN(parsedDate)) {
|
|
1907
|
-
return undefined
|
|
1908
|
-
}
|
|
1909
|
-
const millis = parsedDate - nowMillis
|
|
1910
|
-
if (millis <= 0) {
|
|
1911
|
-
return Duration.millis(1)
|
|
1912
|
-
}
|
|
1913
|
-
return Duration.millis(millis)
|
|
2296
|
+
const retryAfter = Headers.parseRetryAfter(value)
|
|
2297
|
+
return Result.isSuccess(retryAfter)
|
|
2298
|
+
? Duration.max(Headers.retryAfterDelay(retryAfter.success, nowMillis), Duration.millis(1))
|
|
2299
|
+
: undefined
|
|
1914
2300
|
}
|
|
1915
2301
|
|
|
1916
2302
|
const parseResetAfter = (value: string | undefined): Duration.Duration | undefined => {
|
|
@@ -2157,6 +2543,37 @@ export const withScope = <E, R>(
|
|
|
2157
2543
|
/**
|
|
2158
2544
|
* Enables following HTTP redirects up to a specified number of times.
|
|
2159
2545
|
*
|
|
2546
|
+
* **Details**
|
|
2547
|
+
*
|
|
2548
|
+
* Follows `3xx` responses that include a `Location` header, up to
|
|
2549
|
+
* `maxRedirects` (default `10`) times. When the limit is reached or the
|
|
2550
|
+
* `Location` header is not a valid URL, the last redirect response is returned.
|
|
2551
|
+
*
|
|
2552
|
+
* **Gotchas**
|
|
2553
|
+
*
|
|
2554
|
+
* This only sees redirects that the underlying client returns. `fetch`
|
|
2555
|
+
* follows redirects itself by default, so with `FetchHttpClient` provide
|
|
2556
|
+
* `FetchHttpClient.RequestInit` with `{ redirect: "manual" }`. Browsers return
|
|
2557
|
+
* an opaque response without a `Location` header for manual redirects, so
|
|
2558
|
+
* this cannot follow them there.
|
|
2559
|
+
*
|
|
2560
|
+
* **Example** (Following redirects with FetchHttpClient)
|
|
2561
|
+
*
|
|
2562
|
+
* ```ts
|
|
2563
|
+
* import { Effect } from "effect"
|
|
2564
|
+
* import { FetchHttpClient, HttpClient } from "effect/http"
|
|
2565
|
+
*
|
|
2566
|
+
* const program = Effect.gen(function*() {
|
|
2567
|
+
* const client = (yield* HttpClient.HttpClient).pipe(
|
|
2568
|
+
* HttpClient.followRedirects(5)
|
|
2569
|
+
* )
|
|
2570
|
+
* return yield* client.get("https://example.com/redirect")
|
|
2571
|
+
* }).pipe(
|
|
2572
|
+
* Effect.provide(FetchHttpClient.layer),
|
|
2573
|
+
* Effect.provideService(FetchHttpClient.RequestInit, { redirect: "manual" })
|
|
2574
|
+
* )
|
|
2575
|
+
* ```
|
|
2576
|
+
*
|
|
2160
2577
|
* @stability unstable
|
|
2161
2578
|
* @category redirects
|
|
2162
2579
|
* @since 4.0.0
|
|
@@ -2165,6 +2582,37 @@ export const followRedirects: {
|
|
|
2165
2582
|
/**
|
|
2166
2583
|
* Enables following HTTP redirects up to a specified number of times.
|
|
2167
2584
|
*
|
|
2585
|
+
* **Details**
|
|
2586
|
+
*
|
|
2587
|
+
* Follows `3xx` responses that include a `Location` header, up to
|
|
2588
|
+
* `maxRedirects` (default `10`) times. When the limit is reached or the
|
|
2589
|
+
* `Location` header is not a valid URL, the last redirect response is returned.
|
|
2590
|
+
*
|
|
2591
|
+
* **Gotchas**
|
|
2592
|
+
*
|
|
2593
|
+
* This only sees redirects that the underlying client returns. `fetch`
|
|
2594
|
+
* follows redirects itself by default, so with `FetchHttpClient` provide
|
|
2595
|
+
* `FetchHttpClient.RequestInit` with `{ redirect: "manual" }`. Browsers return
|
|
2596
|
+
* an opaque response without a `Location` header for manual redirects, so
|
|
2597
|
+
* this cannot follow them there.
|
|
2598
|
+
*
|
|
2599
|
+
* **Example** (Following redirects with FetchHttpClient)
|
|
2600
|
+
*
|
|
2601
|
+
* ```ts
|
|
2602
|
+
* import { Effect } from "effect"
|
|
2603
|
+
* import { FetchHttpClient, HttpClient } from "effect/http"
|
|
2604
|
+
*
|
|
2605
|
+
* const program = Effect.gen(function*() {
|
|
2606
|
+
* const client = (yield* HttpClient.HttpClient).pipe(
|
|
2607
|
+
* HttpClient.followRedirects(5)
|
|
2608
|
+
* )
|
|
2609
|
+
* return yield* client.get("https://example.com/redirect")
|
|
2610
|
+
* }).pipe(
|
|
2611
|
+
* Effect.provide(FetchHttpClient.layer),
|
|
2612
|
+
* Effect.provideService(FetchHttpClient.RequestInit, { redirect: "manual" })
|
|
2613
|
+
* )
|
|
2614
|
+
* ```
|
|
2615
|
+
*
|
|
2168
2616
|
* @stability unstable
|
|
2169
2617
|
* @category redirects
|
|
2170
2618
|
* @since 4.0.0
|
|
@@ -2173,6 +2621,37 @@ export const followRedirects: {
|
|
|
2173
2621
|
/**
|
|
2174
2622
|
* Enables following HTTP redirects up to a specified number of times.
|
|
2175
2623
|
*
|
|
2624
|
+
* **Details**
|
|
2625
|
+
*
|
|
2626
|
+
* Follows `3xx` responses that include a `Location` header, up to
|
|
2627
|
+
* `maxRedirects` (default `10`) times. When the limit is reached or the
|
|
2628
|
+
* `Location` header is not a valid URL, the last redirect response is returned.
|
|
2629
|
+
*
|
|
2630
|
+
* **Gotchas**
|
|
2631
|
+
*
|
|
2632
|
+
* This only sees redirects that the underlying client returns. `fetch`
|
|
2633
|
+
* follows redirects itself by default, so with `FetchHttpClient` provide
|
|
2634
|
+
* `FetchHttpClient.RequestInit` with `{ redirect: "manual" }`. Browsers return
|
|
2635
|
+
* an opaque response without a `Location` header for manual redirects, so
|
|
2636
|
+
* this cannot follow them there.
|
|
2637
|
+
*
|
|
2638
|
+
* **Example** (Following redirects with FetchHttpClient)
|
|
2639
|
+
*
|
|
2640
|
+
* ```ts
|
|
2641
|
+
* import { Effect } from "effect"
|
|
2642
|
+
* import { FetchHttpClient, HttpClient } from "effect/http"
|
|
2643
|
+
*
|
|
2644
|
+
* const program = Effect.gen(function*() {
|
|
2645
|
+
* const client = (yield* HttpClient.HttpClient).pipe(
|
|
2646
|
+
* HttpClient.followRedirects(5)
|
|
2647
|
+
* )
|
|
2648
|
+
* return yield* client.get("https://example.com/redirect")
|
|
2649
|
+
* }).pipe(
|
|
2650
|
+
* Effect.provide(FetchHttpClient.layer),
|
|
2651
|
+
* Effect.provideService(FetchHttpClient.RequestInit, { redirect: "manual" })
|
|
2652
|
+
* )
|
|
2653
|
+
* ```
|
|
2654
|
+
*
|
|
2176
2655
|
* @stability unstable
|
|
2177
2656
|
* @category redirects
|
|
2178
2657
|
* @since 4.0.0
|
|
@@ -2202,7 +2681,11 @@ export const followRedirects: {
|
|
|
2202
2681
|
) {
|
|
2203
2682
|
return Effect.succeed(response)
|
|
2204
2683
|
}
|
|
2205
|
-
const
|
|
2684
|
+
const urlResult = Url.fromString(response.headers.location, response.request.url)
|
|
2685
|
+
if (Result.isFailure(urlResult)) {
|
|
2686
|
+
return Effect.succeed(response)
|
|
2687
|
+
}
|
|
2688
|
+
const url = urlResult.success
|
|
2206
2689
|
const request = currentRequest ?? response.request
|
|
2207
2690
|
let nextRequest = request
|
|
2208
2691
|
if (
|
|
@@ -2211,13 +2694,31 @@ export const followRedirects: {
|
|
|
2211
2694
|
) {
|
|
2212
2695
|
nextRequest = HttpClientRequest.setMethod(nextRequest, "GET")
|
|
2213
2696
|
nextRequest = HttpClientRequest.setBody(nextRequest, HttpBody.empty)
|
|
2697
|
+
nextRequest = HttpClientRequest.removeHeader(nextRequest, "content-encoding")
|
|
2698
|
+
nextRequest = HttpClientRequest.removeHeader(nextRequest, "content-language")
|
|
2699
|
+
nextRequest = HttpClientRequest.removeHeader(nextRequest, "content-location")
|
|
2214
2700
|
}
|
|
2215
2701
|
if (url.origin !== new URL(response.request.url).origin) {
|
|
2216
2702
|
nextRequest = HttpClientRequest.removeHeader(nextRequest, "authorization")
|
|
2217
2703
|
nextRequest = HttpClientRequest.removeHeader(nextRequest, "proxy-authorization")
|
|
2218
2704
|
nextRequest = HttpClientRequest.removeHeader(nextRequest, "cookie")
|
|
2219
2705
|
}
|
|
2220
|
-
|
|
2706
|
+
// Request the Location as sent: setUrl with a URL object would re-encode its query
|
|
2707
|
+
const hash = url.hash === "" ? Option.none() : Option.some(url.hash.slice(1))
|
|
2708
|
+
url.hash = ""
|
|
2709
|
+
nextRequest = HttpClientRequest.makeWith(
|
|
2710
|
+
nextRequest.method,
|
|
2711
|
+
url.href,
|
|
2712
|
+
UrlParams.empty,
|
|
2713
|
+
hash,
|
|
2714
|
+
nextRequest.headers,
|
|
2715
|
+
nextRequest.body
|
|
2716
|
+
)
|
|
2717
|
+
// Abort the discarded response to release its connection without reading the body
|
|
2718
|
+
return Effect.andThen(
|
|
2719
|
+
Effect.sync(() => responseControllers.get(response)?.abort()),
|
|
2720
|
+
loop(Effect.succeed(nextRequest), redirects + 1)
|
|
2721
|
+
)
|
|
2221
2722
|
}
|
|
2222
2723
|
)
|
|
2223
2724
|
})
|
|
@@ -2324,7 +2825,11 @@ export const layerMergedContext = <E, R>(
|
|
|
2324
2825
|
const responseRegistry = (() => {
|
|
2325
2826
|
if ("FinalizationRegistry" in globalThis && globalThis.FinalizationRegistry) {
|
|
2326
2827
|
const registry = new FinalizationRegistry((controller: AbortController) => {
|
|
2327
|
-
|
|
2828
|
+
try {
|
|
2829
|
+
controller.abort()
|
|
2830
|
+
} catch {
|
|
2831
|
+
// Runtimes such as workerd disallow aborting I/O outside its request context.
|
|
2832
|
+
}
|
|
2328
2833
|
})
|
|
2329
2834
|
return {
|
|
2330
2835
|
register(response: HttpClientResponse.HttpClientResponse, controller: AbortController) {
|
|
@@ -2352,6 +2857,21 @@ const responseRegistry = (() => {
|
|
|
2352
2857
|
|
|
2353
2858
|
const scopedRequests = new WeakMap<HttpClientRequest.HttpClientRequest, AbortController>()
|
|
2354
2859
|
|
|
2860
|
+
const responseControllers = new WeakMap<HttpClientResponse.HttpClientResponse, AbortController>()
|
|
2861
|
+
|
|
2862
|
+
const trackResponse = (
|
|
2863
|
+
response: HttpClientResponse.HttpClientResponse,
|
|
2864
|
+
controller: AbortController,
|
|
2865
|
+
scoped: boolean
|
|
2866
|
+
): HttpClientResponse.HttpClientResponse => {
|
|
2867
|
+
if (!scoped) {
|
|
2868
|
+
responseRegistry.register(response, controller)
|
|
2869
|
+
response = new InterruptibleResponse(response, controller)
|
|
2870
|
+
}
|
|
2871
|
+
responseControllers.set(response, controller)
|
|
2872
|
+
return response
|
|
2873
|
+
}
|
|
2874
|
+
|
|
2355
2875
|
class InterruptibleResponse implements HttpClientResponse.HttpClientResponse, Pipeable {
|
|
2356
2876
|
readonly original: HttpClientResponse.HttpClientResponse
|
|
2357
2877
|
readonly controller: AbortController
|
|
@@ -2424,6 +2944,17 @@ class InterruptibleResponse implements HttpClientResponse.HttpClientResponse, Pi
|
|
|
2424
2944
|
return this.applyInterrupt(this.original.arrayBuffer)
|
|
2425
2945
|
}
|
|
2426
2946
|
|
|
2947
|
+
get upgrade() {
|
|
2948
|
+
return this.applyInterrupt(this.original.upgrade)
|
|
2949
|
+
}
|
|
2950
|
+
|
|
2951
|
+
[WebSourceSymbol]() {
|
|
2952
|
+
const source = getWebSource(this.original)
|
|
2953
|
+
// A handed-over Web body outlives this wrapper, so collecting it must not abort the request.
|
|
2954
|
+
if (source !== undefined) responseRegistry.unregister(this.original)
|
|
2955
|
+
return source
|
|
2956
|
+
}
|
|
2957
|
+
|
|
2427
2958
|
get stream() {
|
|
2428
2959
|
return Stream.suspend(() => {
|
|
2429
2960
|
responseRegistry.unregister(this.original)
|