effect 4.0.7 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/BigDecimal.d.ts.map +1 -1
- package/dist/BigDecimal.js +3 -0
- package/dist/BigDecimal.js.map +1 -1
- package/dist/Channel.d.ts +12 -6
- package/dist/Channel.d.ts.map +1 -1
- package/dist/Channel.js +9 -3
- package/dist/Channel.js.map +1 -1
- package/dist/Config.d.ts +7 -1
- package/dist/Config.d.ts.map +1 -1
- package/dist/Config.js.map +1 -1
- package/dist/Context.d.ts +18 -1
- package/dist/Context.d.ts.map +1 -1
- package/dist/Context.js +27 -8
- package/dist/Context.js.map +1 -1
- package/dist/Cron.d.ts +81 -11
- package/dist/Cron.d.ts.map +1 -1
- package/dist/Cron.js +101 -26
- package/dist/Cron.js.map +1 -1
- package/dist/Duration.d.ts +78 -0
- package/dist/Duration.d.ts.map +1 -1
- package/dist/Duration.js +123 -0
- package/dist/Duration.js.map +1 -1
- package/dist/Effect.d.ts +164 -7
- package/dist/Effect.d.ts.map +1 -1
- package/dist/Effect.js +11 -1
- package/dist/Effect.js.map +1 -1
- package/dist/FileSystem.d.ts +59 -4
- package/dist/FileSystem.d.ts.map +1 -1
- package/dist/FileSystem.js +9 -2
- package/dist/FileSystem.js.map +1 -1
- package/dist/Glob.d.ts +165 -0
- package/dist/Glob.d.ts.map +1 -0
- package/dist/Glob.js +127 -0
- package/dist/Glob.js.map +1 -0
- package/dist/Match.d.ts +86 -0
- package/dist/Match.d.ts.map +1 -1
- package/dist/Match.js +72 -0
- package/dist/Match.js.map +1 -1
- package/dist/Pool.d.ts +51 -0
- package/dist/Pool.d.ts.map +1 -1
- package/dist/Pool.js +59 -9
- package/dist/Pool.js.map +1 -1
- package/dist/Random.d.ts.map +1 -1
- package/dist/Random.js +3 -3
- package/dist/Random.js.map +1 -1
- package/dist/RcMap.d.ts.map +1 -1
- package/dist/RcMap.js +8 -2
- package/dist/RcMap.js.map +1 -1
- package/dist/Schedule.d.ts +18 -1
- package/dist/Schedule.d.ts.map +1 -1
- package/dist/Schedule.js +7 -2
- package/dist/Schedule.js.map +1 -1
- package/dist/Schema.d.ts +666 -41
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +650 -0
- package/dist/Schema.js.map +1 -1
- package/dist/SchemaGetter.d.ts +6 -1
- package/dist/SchemaGetter.d.ts.map +1 -1
- package/dist/SchemaGetter.js +22 -11
- package/dist/SchemaGetter.js.map +1 -1
- package/dist/SchemaRepresentation.d.ts +14 -0
- package/dist/SchemaRepresentation.d.ts.map +1 -1
- package/dist/SchemaRepresentation.js +16 -0
- package/dist/SchemaRepresentation.js.map +1 -1
- package/dist/SchemaTransformation.d.ts +8 -3
- package/dist/SchemaTransformation.d.ts.map +1 -1
- package/dist/SchemaTransformation.js +6 -3
- package/dist/SchemaTransformation.js.map +1 -1
- package/dist/ScopedCache.d.ts.map +1 -1
- package/dist/ScopedCache.js +5 -7
- package/dist/ScopedCache.js.map +1 -1
- package/dist/Semaphore.d.ts +130 -0
- package/dist/Semaphore.d.ts.map +1 -1
- package/dist/Semaphore.js +40 -0
- package/dist/Semaphore.js.map +1 -1
- package/dist/Stream.d.ts +13 -4
- package/dist/Stream.d.ts.map +1 -1
- package/dist/Stream.js +9 -0
- package/dist/Stream.js.map +1 -1
- package/dist/Terminal.d.ts +18 -1
- package/dist/Terminal.d.ts.map +1 -1
- package/dist/Terminal.js +1 -1
- package/dist/Terminal.js.map +1 -1
- package/dist/ai/AiError.d.ts +43 -116
- package/dist/ai/AiError.d.ts.map +1 -1
- package/dist/ai/AiError.js +53 -72
- package/dist/ai/AiError.js.map +1 -1
- package/dist/ai/Decision.d.ts +196 -15
- package/dist/ai/Decision.d.ts.map +1 -1
- package/dist/ai/Decision.js +130 -0
- package/dist/ai/Decision.js.map +1 -1
- package/dist/ai/DecisionModel.d.ts +54 -13
- package/dist/ai/DecisionModel.d.ts.map +1 -1
- package/dist/ai/DecisionModel.js +123 -12
- package/dist/ai/DecisionModel.js.map +1 -1
- package/dist/ai/McpServer.d.ts +630 -29
- package/dist/ai/McpServer.d.ts.map +1 -1
- package/dist/ai/McpServer.js +562 -116
- package/dist/ai/McpServer.js.map +1 -1
- package/dist/ai/McpTest.d.ts +130 -0
- package/dist/ai/McpTest.d.ts.map +1 -0
- package/dist/ai/McpTest.js +237 -0
- package/dist/ai/McpTest.js.map +1 -0
- package/dist/ai/Response.d.ts +1 -25
- package/dist/ai/Response.d.ts.map +1 -1
- package/dist/ai/Response.js +1 -10
- package/dist/ai/Response.js.map +1 -1
- package/dist/ai/Tool.d.ts +19 -1
- package/dist/ai/Tool.d.ts.map +1 -1
- package/dist/ai/Tool.js.map +1 -1
- package/dist/ai/index.d.ts +5 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +5 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/internal/mcpCore.js +17 -12
- package/dist/ai/internal/mcpCore.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2024_11_05.js +4 -5
- package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_03_26.js +4 -5
- package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_06_18.js +4 -5
- package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_11_25.js +4 -5
- package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js +18 -10
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
- package/dist/ai/internal/mcpProtocol.js +13 -0
- package/dist/ai/internal/mcpProtocol.js.map +1 -1
- package/dist/ai/internal/mcpRuntime.js +5 -3
- package/dist/ai/internal/mcpRuntime.js.map +1 -1
- package/dist/ai/internal/mcpStatefulRuntime.js +6 -1
- package/dist/ai/internal/mcpStatefulRuntime.js.map +1 -1
- package/dist/cli/Argument.d.ts +6 -0
- package/dist/cli/Argument.d.ts.map +1 -1
- package/dist/cli/Argument.js +2 -0
- package/dist/cli/Argument.js.map +1 -1
- package/dist/cli/CliOutput.d.ts +65 -1
- package/dist/cli/CliOutput.d.ts.map +1 -1
- package/dist/cli/CliOutput.js +94 -37
- package/dist/cli/CliOutput.js.map +1 -1
- package/dist/cli/Command.d.ts +23 -0
- package/dist/cli/Command.d.ts.map +1 -1
- package/dist/cli/Command.js +8 -0
- package/dist/cli/Command.js.map +1 -1
- package/dist/cli/Flag.d.ts +107 -0
- package/dist/cli/Flag.d.ts.map +1 -1
- package/dist/cli/Flag.js +37 -0
- package/dist/cli/Flag.js.map +1 -1
- package/dist/cli/HelpDoc.d.ts +15 -1
- package/dist/cli/HelpDoc.d.ts.map +1 -1
- package/dist/cli/Param.d.ts +6 -0
- package/dist/cli/Param.d.ts.map +1 -1
- package/dist/cli/Param.js +2 -0
- package/dist/cli/Param.js.map +1 -1
- package/dist/cli/Primitive.d.ts +14 -0
- package/dist/cli/Primitive.d.ts.map +1 -1
- package/dist/cli/Primitive.js +15 -1
- package/dist/cli/Primitive.js.map +1 -1
- package/dist/cli/Prompt.d.ts +1 -0
- package/dist/cli/Prompt.d.ts.map +1 -1
- package/dist/cli/Prompt.js +1 -0
- package/dist/cli/Prompt.js.map +1 -1
- package/dist/cli/internal/help.d.ts.map +1 -1
- package/dist/cli/internal/help.js +17 -10
- package/dist/cli/internal/help.js.map +1 -1
- package/dist/cluster/Sharding.d.ts.map +1 -1
- package/dist/cluster/Sharding.js +90 -28
- package/dist/cluster/Sharding.js.map +1 -1
- package/dist/cluster/ShardingConfig.d.ts +72 -6
- package/dist/cluster/ShardingConfig.d.ts.map +1 -1
- package/dist/cluster/ShardingConfig.js +4 -0
- package/dist/cluster/ShardingConfig.js.map +1 -1
- package/dist/cluster/SingleRunner.d.ts +3 -3
- package/dist/cluster/SingleRunner.d.ts.map +1 -1
- package/dist/cluster/SingleRunner.js +1 -1
- package/dist/cluster/SqlMessageStorage.d.ts +37 -6
- package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
- package/dist/cluster/SqlMessageStorage.js +34 -7
- package/dist/cluster/SqlMessageStorage.js.map +1 -1
- package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
- package/dist/cluster/SqlRunnerStorage.js +23 -8
- package/dist/cluster/SqlRunnerStorage.js.map +1 -1
- package/dist/crypto/Aead.d.ts +322 -0
- package/dist/crypto/Aead.d.ts.map +1 -0
- package/dist/crypto/Aead.js +331 -0
- package/dist/crypto/Aead.js.map +1 -0
- package/dist/crypto/Cipher.d.ts +235 -0
- package/dist/crypto/Cipher.d.ts.map +1 -0
- package/dist/crypto/Cipher.js +233 -0
- package/dist/crypto/Cipher.js.map +1 -0
- package/dist/crypto/CryptoError.d.ts +212 -0
- package/dist/crypto/CryptoError.d.ts.map +1 -0
- package/dist/crypto/CryptoError.js +202 -0
- package/dist/crypto/CryptoError.js.map +1 -0
- package/dist/crypto/Digest.d.ts +143 -0
- package/dist/crypto/Digest.d.ts.map +1 -0
- package/dist/crypto/Digest.js +146 -0
- package/dist/crypto/Digest.js.map +1 -0
- package/dist/crypto/Kdf.d.ts +220 -0
- package/dist/crypto/Kdf.d.ts.map +1 -0
- package/dist/crypto/Kdf.js +212 -0
- package/dist/crypto/Kdf.js.map +1 -0
- package/dist/crypto/KeyAgreement.d.ts +323 -0
- package/dist/crypto/KeyAgreement.d.ts.map +1 -0
- package/dist/crypto/KeyAgreement.js +303 -0
- package/dist/crypto/KeyAgreement.js.map +1 -0
- package/dist/crypto/KeyFormat.d.ts +309 -0
- package/dist/crypto/KeyFormat.d.ts.map +1 -0
- package/dist/crypto/KeyFormat.js +556 -0
- package/dist/crypto/KeyFormat.js.map +1 -0
- package/dist/crypto/KeyWrap.d.ts +389 -0
- package/dist/crypto/KeyWrap.d.ts.map +1 -0
- package/dist/crypto/KeyWrap.js +381 -0
- package/dist/crypto/KeyWrap.js.map +1 -0
- package/dist/crypto/Mac.d.ts +277 -0
- package/dist/crypto/Mac.d.ts.map +1 -0
- package/dist/crypto/Mac.js +288 -0
- package/dist/crypto/Mac.js.map +1 -0
- package/dist/crypto/SecureRandom.d.ts +340 -0
- package/dist/crypto/SecureRandom.d.ts.map +1 -0
- package/dist/crypto/SecureRandom.js +257 -0
- package/dist/crypto/SecureRandom.js.map +1 -0
- package/dist/crypto/Signature.d.ts +448 -0
- package/dist/crypto/Signature.d.ts.map +1 -0
- package/dist/crypto/Signature.js +484 -0
- package/dist/crypto/Signature.js.map +1 -0
- package/dist/crypto/WebCrypto.d.ts +61 -0
- package/dist/crypto/WebCrypto.d.ts.map +1 -0
- package/dist/crypto/WebCrypto.js +63 -0
- package/dist/crypto/WebCrypto.js.map +1 -0
- package/dist/crypto/index.d.ts +65 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +66 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/internal/asymmetric.d.ts +2 -0
- package/dist/crypto/internal/asymmetric.d.ts.map +1 -0
- package/dist/crypto/internal/asymmetric.js +210 -0
- package/dist/crypto/internal/asymmetric.js.map +1 -0
- package/dist/crypto/internal/chacha.d.ts +46 -0
- package/dist/crypto/internal/chacha.d.ts.map +1 -0
- package/dist/crypto/internal/chacha.js +885 -0
- package/dist/crypto/internal/chacha.js.map +1 -0
- package/dist/crypto/internal/der.d.ts +6 -0
- package/dist/crypto/internal/der.d.ts.map +1 -0
- package/dist/crypto/internal/der.js +86 -0
- package/dist/crypto/internal/der.js.map +1 -0
- package/dist/crypto/internal/digest.d.ts +2 -0
- package/dist/crypto/internal/digest.d.ts.map +1 -0
- package/dist/crypto/internal/digest.js +15 -0
- package/dist/crypto/internal/digest.js.map +1 -0
- package/dist/crypto/internal/key.d.ts +2 -0
- package/dist/crypto/internal/key.d.ts.map +1 -0
- package/dist/crypto/internal/key.js +170 -0
- package/dist/crypto/internal/key.js.map +1 -0
- package/dist/crypto/internal/md5.d.ts +39 -0
- package/dist/crypto/internal/md5.d.ts.map +1 -0
- package/dist/crypto/internal/md5.js +179 -0
- package/dist/crypto/internal/md5.js.map +1 -0
- package/dist/crypto/internal/webCrypto.d.ts +2 -0
- package/dist/crypto/internal/webCrypto.d.ts.map +1 -0
- package/dist/crypto/internal/webCrypto.js +111 -0
- package/dist/crypto/internal/webCrypto.js.map +1 -0
- package/dist/encoding/Base64Url.d.ts.map +1 -1
- package/dist/encoding/Base64Url.js +3 -2
- package/dist/encoding/Base64Url.js.map +1 -1
- package/dist/encoding/Csv.d.ts +608 -0
- package/dist/encoding/Csv.d.ts.map +1 -0
- package/dist/encoding/Csv.js +718 -0
- package/dist/encoding/Csv.js.map +1 -0
- package/dist/encoding/Hex.d.ts +3 -2
- package/dist/encoding/Hex.d.ts.map +1 -1
- package/dist/encoding/Hex.js +3 -2
- package/dist/encoding/Hex.js.map +1 -1
- package/dist/encoding/SchemaBinary.d.ts.map +1 -1
- package/dist/encoding/SchemaBinary.js +42 -4
- package/dist/encoding/SchemaBinary.js.map +1 -1
- package/dist/encoding/Toml.d.ts +17 -3
- package/dist/encoding/Toml.d.ts.map +1 -1
- package/dist/encoding/Toml.js +104 -16
- package/dist/encoding/Toml.js.map +1 -1
- package/dist/encoding/Yaml.d.ts +8 -1
- package/dist/encoding/Yaml.d.ts.map +1 -1
- package/dist/encoding/Yaml.js +54 -18
- package/dist/encoding/Yaml.js.map +1 -1
- package/dist/encoding/index.d.ts +5 -0
- package/dist/encoding/index.d.ts.map +1 -1
- package/dist/encoding/index.js +5 -0
- package/dist/encoding/index.js.map +1 -1
- package/dist/eventlog/EventJournal.d.ts.map +1 -1
- package/dist/eventlog/EventJournal.js +6 -3
- package/dist/eventlog/EventJournal.js.map +1 -1
- package/dist/eventlog/EventLog.d.ts +119 -4
- package/dist/eventlog/EventLog.d.ts.map +1 -1
- package/dist/eventlog/EventLog.js +200 -12
- package/dist/eventlog/EventLog.js.map +1 -1
- package/dist/eventlog/EventLogEncryption.d.ts +41 -4
- package/dist/eventlog/EventLogEncryption.d.ts.map +1 -1
- package/dist/eventlog/EventLogEncryption.js +83 -64
- package/dist/eventlog/EventLogEncryption.js.map +1 -1
- package/dist/eventlog/EventLogMessage.d.ts +279 -0
- package/dist/eventlog/EventLogMessage.d.ts.map +1 -1
- package/dist/eventlog/EventLogMessage.js +217 -1
- package/dist/eventlog/EventLogMessage.js.map +1 -1
- package/dist/eventlog/EventLogRemote.d.ts +200 -28
- package/dist/eventlog/EventLogRemote.d.ts.map +1 -1
- package/dist/eventlog/EventLogRemote.js +186 -16
- package/dist/eventlog/EventLogRemote.js.map +1 -1
- package/dist/eventlog/EventLogServer.d.ts +3 -0
- package/dist/eventlog/EventLogServer.d.ts.map +1 -1
- package/dist/eventlog/EventLogServer.js +18 -10
- package/dist/eventlog/EventLogServer.js.map +1 -1
- package/dist/eventlog/EventLogServerEncrypted.d.ts +326 -5
- package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
- package/dist/eventlog/EventLogServerEncrypted.js +769 -14
- package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
- package/dist/eventlog/EventLogSessionAuth.d.ts +5 -3
- package/dist/eventlog/EventLogSessionAuth.d.ts.map +1 -1
- package/dist/eventlog/EventLogSessionAuth.js +41 -64
- package/dist/eventlog/EventLogSessionAuth.js.map +1 -1
- package/dist/eventlog/EventRow.d.ts +4 -0
- package/dist/eventlog/EventRow.d.ts.map +1 -1
- package/dist/eventlog/EventRow.js +12 -2
- package/dist/eventlog/EventRow.js.map +1 -1
- package/dist/eventlog/SqlEventJournal.js +2 -2
- package/dist/eventlog/SqlEventJournal.js.map +1 -1
- package/dist/eventlog/SqlEventLogServerEncrypted.d.ts +21 -5
- package/dist/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -1
- package/dist/eventlog/SqlEventLogServerEncrypted.js +1048 -113
- package/dist/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
- package/dist/eventlog/SqlEventLogServerUnencrypted.js +2 -2
- package/dist/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
- package/dist/eventlog/internal/batches.d.ts +12 -0
- package/dist/eventlog/internal/batches.d.ts.map +1 -0
- package/dist/eventlog/internal/batches.js +26 -0
- package/dist/eventlog/internal/batches.js.map +1 -0
- package/dist/eventlog/internal/compaction.d.ts +38 -0
- package/dist/eventlog/internal/compaction.d.ts.map +1 -0
- package/dist/eventlog/internal/compaction.js +33 -0
- package/dist/eventlog/internal/compaction.js.map +1 -0
- package/dist/eventlog/internal/identityRootSecretDerivation.js +66 -67
- package/dist/eventlog/internal/identityRootSecretDerivation.js.map +1 -1
- package/dist/eventlog/internal/remoteCompaction.d.ts +31 -0
- package/dist/eventlog/internal/remoteCompaction.d.ts.map +1 -0
- package/dist/eventlog/internal/remoteCompaction.js +76 -0
- package/dist/eventlog/internal/remoteCompaction.js.map +1 -0
- package/dist/http/Cookies.d.ts +172 -0
- package/dist/http/Cookies.d.ts.map +1 -1
- package/dist/http/Cookies.js +143 -1
- package/dist/http/Cookies.js.map +1 -1
- package/dist/http/FetchHttpClient.d.ts +26 -2
- package/dist/http/FetchHttpClient.d.ts.map +1 -1
- package/dist/http/FetchHttpClient.js +78 -15
- package/dist/http/FetchHttpClient.js.map +1 -1
- package/dist/http/HttpClient.d.ts +79 -8
- package/dist/http/HttpClient.d.ts.map +1 -1
- package/dist/http/HttpClient.js +65 -5
- package/dist/http/HttpClient.js.map +1 -1
- package/dist/http/HttpClientRequest.d.ts +9 -5
- package/dist/http/HttpClientRequest.d.ts.map +1 -1
- package/dist/http/HttpClientRequest.js +2 -3
- package/dist/http/HttpClientRequest.js.map +1 -1
- package/dist/http/HttpClientResponse.d.ts.map +1 -1
- package/dist/http/HttpClientResponse.js +3 -2
- package/dist/http/HttpClientResponse.js.map +1 -1
- package/dist/http/HttpMethod.d.ts +7 -1
- package/dist/http/HttpMethod.d.ts.map +1 -1
- package/dist/http/HttpMethod.js +3 -8
- package/dist/http/HttpMethod.js.map +1 -1
- package/dist/http/HttpServerRequest.d.ts +5 -2
- package/dist/http/HttpServerRequest.d.ts.map +1 -1
- package/dist/http/HttpServerRequest.js +6 -17
- package/dist/http/HttpServerRequest.js.map +1 -1
- package/dist/http/HttpServerResponse.d.ts.map +1 -1
- package/dist/http/HttpServerResponse.js +3 -2
- package/dist/http/HttpServerResponse.js.map +1 -1
- package/dist/http/HttpTraceContext.d.ts +2 -1
- package/dist/http/HttpTraceContext.d.ts.map +1 -1
- package/dist/http/HttpTraceContext.js +7 -5
- package/dist/http/HttpTraceContext.js.map +1 -1
- package/dist/http/ProblemDetails.d.ts +96 -0
- package/dist/http/ProblemDetails.d.ts.map +1 -0
- package/dist/http/ProblemDetails.js +98 -0
- package/dist/http/ProblemDetails.js.map +1 -0
- package/dist/http/index.d.ts +5 -0
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +5 -0
- package/dist/http/index.js.map +1 -1
- package/dist/http/internal/decompression.js +3 -2
- package/dist/http/internal/decompression.js.map +1 -1
- package/dist/http/internal/urlParams.js +8 -0
- package/dist/http/internal/urlParams.js.map +1 -1
- package/dist/http-api/HttpApiBuilder.js +19 -5
- package/dist/http-api/HttpApiBuilder.js.map +1 -1
- package/dist/http-api/HttpApiClient.d.ts +63 -0
- package/dist/http-api/HttpApiClient.d.ts.map +1 -1
- package/dist/http-api/HttpApiClient.js +51 -0
- package/dist/http-api/HttpApiClient.js.map +1 -1
- package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
- package/dist/http-api/HttpApiEndpoint.js +14 -5
- package/dist/http-api/HttpApiEndpoint.js.map +1 -1
- package/dist/http-api/HttpApiError.d.ts +185 -13
- package/dist/http-api/HttpApiError.d.ts.map +1 -1
- package/dist/http-api/HttpApiError.js +128 -0
- package/dist/http-api/HttpApiError.js.map +1 -1
- package/dist/http-api/HttpApiMiddleware.d.ts +64 -17
- package/dist/http-api/HttpApiMiddleware.d.ts.map +1 -1
- package/dist/http-api/HttpApiMiddleware.js +85 -1
- package/dist/http-api/HttpApiMiddleware.js.map +1 -1
- package/dist/http-api/HttpApiSchema.d.ts +76 -14
- package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
- package/dist/http-api/HttpApiSchema.js +53 -0
- package/dist/http-api/HttpApiSchema.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/internal/effect.js +25 -14
- package/dist/internal/effect.js.map +1 -1
- package/dist/internal/glob.d.ts +2 -0
- package/dist/internal/glob.d.ts.map +1 -0
- package/dist/internal/glob.js +630 -0
- package/dist/internal/glob.js.map +1 -0
- package/dist/internal/matcher.js +10 -0
- package/dist/internal/matcher.js.map +1 -1
- package/dist/internal/persistence.js +9 -0
- package/dist/internal/persistence.js.map +1 -1
- package/dist/internal/rcRef.js +4 -1
- package/dist/internal/rcRef.js.map +1 -1
- package/dist/internal/schema/toCodeDocument.js +6 -3
- package/dist/internal/schema/toCodeDocument.js.map +1 -1
- package/dist/internal/trie.js +42 -13
- package/dist/internal/trie.js.map +1 -1
- package/dist/internal/ulid.js +41 -0
- package/dist/internal/ulid.js.map +1 -1
- package/dist/internal/uuid.js +52 -8
- package/dist/internal/uuid.js.map +1 -1
- package/dist/internal/version.js +1 -1
- package/dist/observability/Otlp.d.ts +15 -4
- package/dist/observability/Otlp.d.ts.map +1 -1
- package/dist/observability/Otlp.js +10 -0
- package/dist/observability/Otlp.js.map +1 -1
- package/dist/observability/OtlpResource.d.ts +7 -0
- package/dist/observability/OtlpResource.d.ts.map +1 -1
- package/dist/observability/OtlpResource.js +11 -1
- package/dist/observability/OtlpResource.js.map +1 -1
- package/dist/persistence/KeyValueStore.d.ts +47 -2
- package/dist/persistence/KeyValueStore.d.ts.map +1 -1
- package/dist/persistence/KeyValueStore.js +129 -18
- package/dist/persistence/KeyValueStore.js.map +1 -1
- package/dist/persistence/PersistedQueue.d.ts +9 -0
- package/dist/persistence/PersistedQueue.d.ts.map +1 -1
- package/dist/persistence/PersistedQueue.js +94 -52
- package/dist/persistence/PersistedQueue.js.map +1 -1
- package/dist/persistence/Persistence.d.ts +10 -4
- package/dist/persistence/Persistence.d.ts.map +1 -1
- package/dist/persistence/Persistence.js +18 -11
- package/dist/persistence/Persistence.js.map +1 -1
- package/dist/process/ChildProcess.d.ts +207 -67
- package/dist/process/ChildProcess.d.ts.map +1 -1
- package/dist/process/ChildProcess.js +56 -158
- package/dist/process/ChildProcess.js.map +1 -1
- package/dist/process/ChildProcessSpawner.d.ts +5 -0
- package/dist/process/ChildProcessSpawner.d.ts.map +1 -1
- package/dist/process/ChildProcessSpawner.js.map +1 -1
- package/dist/process/CommandLine.d.ts +294 -0
- package/dist/process/CommandLine.d.ts.map +1 -0
- package/dist/process/CommandLine.js +481 -0
- package/dist/process/CommandLine.js.map +1 -0
- package/dist/process/index.d.ts +5 -0
- package/dist/process/index.d.ts.map +1 -1
- package/dist/process/index.js +5 -0
- package/dist/process/index.js.map +1 -1
- package/dist/reactivity/Atom.d.ts +2 -1
- package/dist/reactivity/Atom.d.ts.map +1 -1
- package/dist/reactivity/Atom.js +3 -4
- package/dist/reactivity/Atom.js.map +1 -1
- package/dist/reactivity/AtomRegistry.js.map +1 -1
- package/dist/rpc/RpcClient.d.ts +16 -1
- package/dist/rpc/RpcClient.d.ts.map +1 -1
- package/dist/rpc/RpcClient.js +50 -16
- package/dist/rpc/RpcClient.js.map +1 -1
- package/dist/rpc/RpcMessage.d.ts +10 -1
- package/dist/rpc/RpcMessage.d.ts.map +1 -1
- package/dist/rpc/RpcMessage.js +1 -0
- package/dist/rpc/RpcMessage.js.map +1 -1
- package/dist/rpc/RpcSerialization.d.ts.map +1 -1
- package/dist/rpc/RpcSerialization.js +6 -0
- package/dist/rpc/RpcSerialization.js.map +1 -1
- package/dist/rpc/RpcServer.d.ts +31 -0
- package/dist/rpc/RpcServer.d.ts.map +1 -1
- package/dist/rpc/RpcServer.js +139 -66
- package/dist/rpc/RpcServer.js.map +1 -1
- package/dist/schema/Model.d.ts +14 -0
- package/dist/schema/Model.d.ts.map +1 -1
- package/dist/schema/Model.js +18 -3
- package/dist/schema/Model.js.map +1 -1
- package/dist/sql/Migrator.d.ts +0 -19
- package/dist/sql/Migrator.d.ts.map +1 -1
- package/dist/sql/Migrator.js +3 -48
- package/dist/sql/Migrator.js.map +1 -1
- package/dist/sql/MigratorFileSystem.d.ts +21 -0
- package/dist/sql/MigratorFileSystem.d.ts.map +1 -0
- package/dist/sql/MigratorFileSystem.js +57 -0
- package/dist/sql/MigratorFileSystem.js.map +1 -0
- package/dist/sql/SqlClient.d.ts.map +1 -1
- package/dist/sql/SqlClient.js +5 -9
- package/dist/sql/SqlClient.js.map +1 -1
- package/dist/sql/Statement.d.ts +20 -6
- package/dist/sql/Statement.d.ts.map +1 -1
- package/dist/sql/Statement.js +0 -13
- package/dist/sql/Statement.js.map +1 -1
- package/dist/sql/index.js +1 -1
- package/dist/testing/index.d.ts +0 -5
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +0 -5
- package/dist/testing/index.js.map +1 -1
- package/dist/workflow/internal/crypto.js +9 -8
- package/dist/workflow/internal/crypto.js.map +1 -1
- package/package.json +3 -1
- package/src/BigDecimal.ts +3 -0
- package/src/Channel.ts +17 -11
- package/src/Config.ts +7 -1
- package/src/Context.ts +34 -10
- package/src/Cron.ts +178 -29
- package/src/Duration.ts +140 -0
- package/src/Effect.ts +914 -85
- package/src/FileSystem.ts +65 -4
- package/src/Glob.ts +205 -0
- package/src/Match.ts +127 -0
- package/src/Pool.ts +73 -15
- package/src/Random.ts +3 -3
- package/src/RcMap.ts +5 -1
- package/src/Schedule.ts +26 -3
- package/src/Schema.ts +1189 -62
- package/src/SchemaGetter.ts +27 -11
- package/src/SchemaRepresentation.ts +19 -0
- package/src/SchemaTransformation.ts +8 -3
- package/src/ScopedCache.ts +5 -9
- package/src/Semaphore.ts +141 -0
- package/src/Stream.ts +15 -6
- package/src/Terminal.ts +19 -1
- package/src/ai/AiError.ts +56 -80
- package/src/ai/Decision.ts +257 -6
- package/src/ai/DecisionModel.ts +171 -28
- package/src/ai/McpServer.ts +1269 -286
- package/src/ai/McpTest.ts +380 -0
- package/src/ai/Response.ts +2 -22
- package/src/ai/Tool.ts +27 -8
- package/src/ai/index.ts +6 -0
- package/src/ai/internal/mcpCore.ts +78 -44
- package/src/ai/internal/mcpProtocol/v2024_11_05.ts +4 -7
- package/src/ai/internal/mcpProtocol/v2025_03_26.ts +4 -7
- package/src/ai/internal/mcpProtocol/v2025_06_18.ts +4 -7
- package/src/ai/internal/mcpProtocol/v2025_11_25.ts +4 -7
- package/src/ai/internal/mcpProtocol/v2026_07_28.ts +15 -10
- package/src/ai/internal/mcpProtocol.ts +29 -0
- package/src/ai/internal/mcpRuntime.ts +9 -5
- package/src/ai/internal/mcpStatefulRuntime.ts +14 -2
- package/src/cli/Argument.ts +6 -0
- package/src/cli/CliOutput.ts +117 -49
- package/src/cli/Command.ts +23 -0
- package/src/cli/Flag.ts +107 -0
- package/src/cli/HelpDoc.ts +18 -1
- package/src/cli/Param.ts +6 -0
- package/src/cli/Primitive.ts +16 -1
- package/src/cli/Prompt.ts +1 -0
- package/src/cli/internal/help.ts +21 -9
- package/src/cluster/Sharding.ts +93 -26
- package/src/cluster/ShardingConfig.ts +41 -3
- package/src/cluster/SingleRunner.ts +3 -3
- package/src/cluster/SqlMessageStorage.ts +49 -17
- package/src/cluster/SqlRunnerStorage.ts +37 -27
- package/src/crypto/Aead.ts +517 -0
- package/src/crypto/Cipher.ts +326 -0
- package/src/crypto/CryptoError.ts +242 -0
- package/src/crypto/Digest.ts +167 -0
- package/src/crypto/Kdf.ts +315 -0
- package/src/crypto/KeyAgreement.ts +489 -0
- package/src/crypto/KeyFormat.ts +712 -0
- package/src/crypto/KeyWrap.ts +639 -0
- package/src/crypto/Mac.ts +386 -0
- package/src/crypto/SecureRandom.ts +459 -0
- package/src/crypto/Signature.ts +673 -0
- package/src/crypto/WebCrypto.ts +64 -0
- package/src/crypto/index.ts +78 -0
- package/src/crypto/internal/asymmetric.ts +329 -0
- package/src/crypto/internal/chacha.ts +1088 -0
- package/src/crypto/internal/der.ts +110 -0
- package/src/crypto/internal/digest.ts +16 -0
- package/src/crypto/internal/key.ts +235 -0
- package/src/crypto/internal/md5.ts +170 -0
- package/src/crypto/internal/webCrypto.ts +150 -0
- package/src/encoding/Base64Url.ts +5 -2
- package/src/encoding/Csv.ts +1298 -0
- package/src/encoding/Hex.ts +3 -2
- package/src/encoding/SchemaBinary.ts +40 -4
- package/src/encoding/Toml.ts +85 -20
- package/src/encoding/Yaml.ts +61 -18
- package/src/encoding/index.ts +6 -0
- package/src/eventlog/EventJournal.ts +4 -3
- package/src/eventlog/EventLog.ts +340 -15
- package/src/eventlog/EventLogEncryption.ts +118 -110
- package/src/eventlog/EventLogMessage.ts +273 -1
- package/src/eventlog/EventLogRemote.ts +367 -23
- package/src/eventlog/EventLogServer.ts +23 -8
- package/src/eventlog/EventLogServerEncrypted.ts +1130 -67
- package/src/eventlog/EventLogSessionAuth.ts +56 -70
- package/src/eventlog/EventRow.ts +12 -3
- package/src/eventlog/SqlEventJournal.ts +2 -2
- package/src/eventlog/SqlEventLogServerEncrypted.ts +1244 -136
- package/src/eventlog/SqlEventLogServerUnencrypted.ts +2 -2
- package/src/eventlog/internal/batches.ts +30 -0
- package/src/eventlog/internal/compaction.ts +64 -0
- package/src/eventlog/internal/identityRootSecretDerivation.ts +93 -123
- package/src/eventlog/internal/remoteCompaction.ts +92 -0
- package/src/http/Cookies.ts +281 -1
- package/src/http/FetchHttpClient.ts +88 -16
- package/src/http/HttpClient.ts +89 -22
- package/src/http/HttpClientRequest.ts +12 -9
- package/src/http/HttpClientResponse.ts +3 -2
- package/src/http/HttpMethod.ts +10 -2
- package/src/http/HttpServerRequest.ts +15 -30
- package/src/http/HttpServerResponse.ts +3 -2
- package/src/http/HttpTraceContext.ts +7 -4
- package/src/http/ProblemDetails.ts +149 -0
- package/src/http/index.ts +6 -0
- package/src/http/internal/decompression.ts +4 -4
- package/src/http/internal/urlParams.ts +8 -0
- package/src/http-api/HttpApiBuilder.ts +24 -12
- package/src/http-api/HttpApiClient.ts +67 -1
- package/src/http-api/HttpApiEndpoint.ts +14 -5
- package/src/http-api/HttpApiError.ts +250 -0
- package/src/http-api/HttpApiMiddleware.ts +95 -1
- package/src/http-api/HttpApiSchema.ts +105 -14
- package/src/index.ts +6 -6
- package/src/internal/effect.ts +34 -18
- package/src/internal/glob.ts +736 -0
- package/src/internal/matcher.ts +17 -0
- package/src/internal/persistence.ts +11 -0
- package/src/internal/rcRef.ts +4 -1
- package/src/internal/schema/toCodeDocument.ts +7 -3
- package/src/internal/trie.ts +43 -14
- package/src/internal/ulid.ts +44 -0
- package/src/internal/uuid.ts +57 -16
- package/src/internal/version.ts +1 -1
- package/src/observability/Otlp.ts +21 -4
- package/src/observability/OtlpResource.ts +9 -1
- package/src/persistence/KeyValueStore.ts +219 -22
- package/src/persistence/PersistedQueue.ts +128 -59
- package/src/persistence/Persistence.ts +20 -13
- package/src/process/ChildProcess.ts +255 -260
- package/src/process/ChildProcessSpawner.ts +5 -0
- package/src/process/CommandLine.ts +630 -0
- package/src/process/index.ts +6 -0
- package/src/reactivity/Atom.ts +5 -5
- package/src/reactivity/AtomRegistry.ts +1 -1
- package/src/rpc/RpcClient.ts +62 -26
- package/src/rpc/RpcMessage.ts +10 -1
- package/src/rpc/RpcSerialization.ts +3 -0
- package/src/rpc/RpcServer.ts +176 -78
- package/src/schema/Model.ts +26 -3
- package/src/sql/Migrator.ts +4 -63
- package/src/sql/MigratorFileSystem.ts +71 -0
- package/src/sql/SqlClient.ts +2 -16
- package/src/sql/Statement.ts +8 -7
- package/src/sql/index.ts +1 -1
- package/src/testing/index.ts +0 -6
- package/src/workflow/internal/crypto.ts +15 -11
- package/dist/Crypto.d.ts +0 -244
- package/dist/Crypto.d.ts.map +0 -1
- package/dist/Crypto.js +0 -139
- package/dist/Crypto.js.map +0 -1
- package/dist/testing/TestCrypto.d.ts +0 -73
- package/dist/testing/TestCrypto.d.ts.map +0 -1
- package/dist/testing/TestCrypto.js +0 -87
- package/dist/testing/TestCrypto.js.map +0 -1
- package/src/Crypto.ts +0 -347
- package/src/testing/TestCrypto.ts +0 -94
package/src/http/Cookies.ts
CHANGED
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
* `Set-Cookie` headers, and provides helpers for adding, removing, merging, and
|
|
8
8
|
* expiring cookies.
|
|
9
9
|
*
|
|
10
|
+
* For client-side storage, `mergeIntoArray` and `toRequestCookieHeader`
|
|
11
|
+
* work on a plain array of cookies scoped by domain, path and scheme, following
|
|
12
|
+
* RFC 6265.
|
|
13
|
+
*
|
|
10
14
|
* @stability unstable
|
|
11
15
|
* @since 4.0.0
|
|
12
16
|
*/
|
|
@@ -51,6 +55,12 @@ const CookieTypeId = "~effect/http/Cookies/Cookie"
|
|
|
51
55
|
* HTTP cookie value with its decoded value, encoded value, and optional cookie
|
|
52
56
|
* attributes such as domain, path, expiration, security, and same-site settings.
|
|
53
57
|
*
|
|
58
|
+
* **Details**
|
|
59
|
+
*
|
|
60
|
+
* `hostOnly` marks a stored client cookie that is sent only to the exact
|
|
61
|
+
* `domain`, not its subdomains. It is not serialized, and `serializeCookie`
|
|
62
|
+
* omits `Domain` when it is set.
|
|
63
|
+
*
|
|
54
64
|
* @stability unstable
|
|
55
65
|
* @category cookies
|
|
56
66
|
* @since 4.0.0
|
|
@@ -70,6 +80,7 @@ export interface Cookie extends Inspectable.Inspectable {
|
|
|
70
80
|
readonly secure?: boolean | undefined
|
|
71
81
|
readonly partitioned?: boolean | undefined
|
|
72
82
|
readonly sameSite?: "lax" | "strict" | "none" | undefined
|
|
83
|
+
readonly hostOnly?: boolean | undefined
|
|
73
84
|
} | undefined
|
|
74
85
|
}
|
|
75
86
|
|
|
@@ -948,7 +959,7 @@ export function serializeCookie(self: Cookie): string {
|
|
|
948
959
|
str += "; Max-Age=" + Math.trunc(maxAge)
|
|
949
960
|
}
|
|
950
961
|
|
|
951
|
-
if (options.domain !== undefined) {
|
|
962
|
+
if (options.domain !== undefined && !options.hostOnly) {
|
|
952
963
|
str += "; Domain=" + options.domain
|
|
953
964
|
}
|
|
954
965
|
|
|
@@ -1041,6 +1052,275 @@ export const toRecord = (self: Cookies): Record<string, string> => {
|
|
|
1041
1052
|
*/
|
|
1042
1053
|
export const toSetCookieHeaders = (self: Cookies): Array<string> => Object.values(self.cookies).map(serializeCookie)
|
|
1043
1054
|
|
|
1055
|
+
/**
|
|
1056
|
+
* Merges cookies set by `url` into an array of client cookies, returning a new
|
|
1057
|
+
* array.
|
|
1058
|
+
*
|
|
1059
|
+
* **When to use**
|
|
1060
|
+
*
|
|
1061
|
+
* Use to record the cookies of a response, or to seed an array of client
|
|
1062
|
+
* cookies from `Set-Cookie` values for a base URL.
|
|
1063
|
+
*
|
|
1064
|
+
* **Details**
|
|
1065
|
+
*
|
|
1066
|
+
* A cookie without a `Domain` attribute is scoped as `hostOnly` to the exact
|
|
1067
|
+
* host of `url`. A `Domain` attribute is accepted only when the host of `url`
|
|
1068
|
+
* domain-matches it. Without a `Path` attribute the cookie uses the default
|
|
1069
|
+
* path of `url`. `Max-Age` takes precedence over `Expires`, and both are
|
|
1070
|
+
* converted to an absolute `expires` computed from `now` (epoch milliseconds).
|
|
1071
|
+
*
|
|
1072
|
+
* A cookie replaces the existing cookie with the same name, domain and path,
|
|
1073
|
+
* keeping its position. A cookie that is already expired removes that existing
|
|
1074
|
+
* cookie instead. The array is returned unchanged when `url` is not a valid
|
|
1075
|
+
* absolute URL.
|
|
1076
|
+
*
|
|
1077
|
+
* **Gotchas**
|
|
1078
|
+
*
|
|
1079
|
+
* - There is no public suffix list. A `Domain` attribute is accepted whenever
|
|
1080
|
+
* the request host domain-matches it, unless the host is an IP address or the
|
|
1081
|
+
* domain is a single label such as `com`, so `foo.co.uk` can set
|
|
1082
|
+
* `Domain=co.uk`.
|
|
1083
|
+
*
|
|
1084
|
+
* @stability unstable
|
|
1085
|
+
* @category client storage
|
|
1086
|
+
* @since 4.0.0
|
|
1087
|
+
*/
|
|
1088
|
+
export const mergeIntoArray: {
|
|
1089
|
+
/**
|
|
1090
|
+
* Merges cookies set by `url` into an array of client cookies, returning a new
|
|
1091
|
+
* array.
|
|
1092
|
+
*
|
|
1093
|
+
* **When to use**
|
|
1094
|
+
*
|
|
1095
|
+
* Use to record the cookies of a response, or to seed an array of client
|
|
1096
|
+
* cookies from `Set-Cookie` values for a base URL.
|
|
1097
|
+
*
|
|
1098
|
+
* **Details**
|
|
1099
|
+
*
|
|
1100
|
+
* A cookie without a `Domain` attribute is scoped as `hostOnly` to the exact
|
|
1101
|
+
* host of `url`. A `Domain` attribute is accepted only when the host of `url`
|
|
1102
|
+
* domain-matches it. Without a `Path` attribute the cookie uses the default
|
|
1103
|
+
* path of `url`. `Max-Age` takes precedence over `Expires`, and both are
|
|
1104
|
+
* converted to an absolute `expires` computed from `now` (epoch milliseconds).
|
|
1105
|
+
*
|
|
1106
|
+
* A cookie replaces the existing cookie with the same name, domain and path,
|
|
1107
|
+
* keeping its position. A cookie that is already expired removes that existing
|
|
1108
|
+
* cookie instead. The array is returned unchanged when `url` is not a valid
|
|
1109
|
+
* absolute URL.
|
|
1110
|
+
*
|
|
1111
|
+
* **Gotchas**
|
|
1112
|
+
*
|
|
1113
|
+
* - There is no public suffix list. A `Domain` attribute is accepted whenever
|
|
1114
|
+
* the request host domain-matches it, unless the host is an IP address or the
|
|
1115
|
+
* domain is a single label such as `com`, so `foo.co.uk` can set
|
|
1116
|
+
* `Domain=co.uk`.
|
|
1117
|
+
*
|
|
1118
|
+
* @stability unstable
|
|
1119
|
+
* @category client storage
|
|
1120
|
+
* @since 4.0.0
|
|
1121
|
+
*/
|
|
1122
|
+
(url: string, cookies: Cookies, now: number): (self: ReadonlyArray<Cookie>) => ReadonlyArray<Cookie>
|
|
1123
|
+
/**
|
|
1124
|
+
* Merges cookies set by `url` into an array of client cookies, returning a new
|
|
1125
|
+
* array.
|
|
1126
|
+
*
|
|
1127
|
+
* **When to use**
|
|
1128
|
+
*
|
|
1129
|
+
* Use to record the cookies of a response, or to seed an array of client
|
|
1130
|
+
* cookies from `Set-Cookie` values for a base URL.
|
|
1131
|
+
*
|
|
1132
|
+
* **Details**
|
|
1133
|
+
*
|
|
1134
|
+
* A cookie without a `Domain` attribute is scoped as `hostOnly` to the exact
|
|
1135
|
+
* host of `url`. A `Domain` attribute is accepted only when the host of `url`
|
|
1136
|
+
* domain-matches it. Without a `Path` attribute the cookie uses the default
|
|
1137
|
+
* path of `url`. `Max-Age` takes precedence over `Expires`, and both are
|
|
1138
|
+
* converted to an absolute `expires` computed from `now` (epoch milliseconds).
|
|
1139
|
+
*
|
|
1140
|
+
* A cookie replaces the existing cookie with the same name, domain and path,
|
|
1141
|
+
* keeping its position. A cookie that is already expired removes that existing
|
|
1142
|
+
* cookie instead. The array is returned unchanged when `url` is not a valid
|
|
1143
|
+
* absolute URL.
|
|
1144
|
+
*
|
|
1145
|
+
* **Gotchas**
|
|
1146
|
+
*
|
|
1147
|
+
* - There is no public suffix list. A `Domain` attribute is accepted whenever
|
|
1148
|
+
* the request host domain-matches it, unless the host is an IP address or the
|
|
1149
|
+
* domain is a single label such as `com`, so `foo.co.uk` can set
|
|
1150
|
+
* `Domain=co.uk`.
|
|
1151
|
+
*
|
|
1152
|
+
* @stability unstable
|
|
1153
|
+
* @category client storage
|
|
1154
|
+
* @since 4.0.0
|
|
1155
|
+
*/
|
|
1156
|
+
(self: ReadonlyArray<Cookie>, url: string, cookies: Cookies, now: number): ReadonlyArray<Cookie>
|
|
1157
|
+
} = dual(4, (self: ReadonlyArray<Cookie>, url: string, cookies: Cookies, now: number): ReadonlyArray<Cookie> => {
|
|
1158
|
+
const parsed = parseUrl(url)
|
|
1159
|
+
if (parsed === undefined) {
|
|
1160
|
+
return self
|
|
1161
|
+
}
|
|
1162
|
+
const stored = self.slice()
|
|
1163
|
+
for (const cookie of Object.values(cookies.cookies)) {
|
|
1164
|
+
const scoped = scopeCookie(parsed, cookie, now)
|
|
1165
|
+
if (scoped === undefined) {
|
|
1166
|
+
continue
|
|
1167
|
+
}
|
|
1168
|
+
const domain = cookieDomain(scoped)
|
|
1169
|
+
const path = cookiePath(scoped)
|
|
1170
|
+
const index = stored.findIndex((existing) =>
|
|
1171
|
+
existing.name === scoped.name && cookieDomain(existing) === domain && cookiePath(existing) === path
|
|
1172
|
+
)
|
|
1173
|
+
if (scoped.options!.expires !== undefined && scoped.options!.expires.getTime() <= now) {
|
|
1174
|
+
if (index !== -1) stored.splice(index, 1)
|
|
1175
|
+
} else if (index === -1) {
|
|
1176
|
+
stored.push(scoped)
|
|
1177
|
+
} else {
|
|
1178
|
+
stored[index] = scoped
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
return stored
|
|
1182
|
+
})
|
|
1183
|
+
|
|
1184
|
+
/**
|
|
1185
|
+
* Serializes the client cookies to send with a request to `url` into a
|
|
1186
|
+
* `Cookie` header value.
|
|
1187
|
+
*
|
|
1188
|
+
* **Details**
|
|
1189
|
+
*
|
|
1190
|
+
* Selects cookies that have not expired at `now` (epoch milliseconds) and whose
|
|
1191
|
+
* domain and path match `url`, skipping `Secure` cookies unless `url` uses
|
|
1192
|
+
* `https`. Every matching cookie is kept, including cookies with the same name,
|
|
1193
|
+
* ordered by longest path first. Returns `undefined` when no cookie matches.
|
|
1194
|
+
*
|
|
1195
|
+
* A leading dot and letter case in `domain` are ignored. A cookie without a
|
|
1196
|
+
* `domain` is never sent, and a cookie without a `path` matches every path.
|
|
1197
|
+
*
|
|
1198
|
+
* @stability unstable
|
|
1199
|
+
* @category client storage
|
|
1200
|
+
* @since 4.0.0
|
|
1201
|
+
*/
|
|
1202
|
+
export const toRequestCookieHeader: {
|
|
1203
|
+
/**
|
|
1204
|
+
* Serializes the client cookies to send with a request to `url` into a
|
|
1205
|
+
* `Cookie` header value.
|
|
1206
|
+
*
|
|
1207
|
+
* **Details**
|
|
1208
|
+
*
|
|
1209
|
+
* Selects cookies that have not expired at `now` (epoch milliseconds) and whose
|
|
1210
|
+
* domain and path match `url`, skipping `Secure` cookies unless `url` uses
|
|
1211
|
+
* `https`. Every matching cookie is kept, including cookies with the same name,
|
|
1212
|
+
* ordered by longest path first. Returns `undefined` when no cookie matches.
|
|
1213
|
+
*
|
|
1214
|
+
* A leading dot and letter case in `domain` are ignored. A cookie without a
|
|
1215
|
+
* `domain` is never sent, and a cookie without a `path` matches every path.
|
|
1216
|
+
*
|
|
1217
|
+
* @stability unstable
|
|
1218
|
+
* @category client storage
|
|
1219
|
+
* @since 4.0.0
|
|
1220
|
+
*/
|
|
1221
|
+
(url: string, now: number): (self: ReadonlyArray<Cookie>) => string | undefined
|
|
1222
|
+
/**
|
|
1223
|
+
* Serializes the client cookies to send with a request to `url` into a
|
|
1224
|
+
* `Cookie` header value.
|
|
1225
|
+
*
|
|
1226
|
+
* **Details**
|
|
1227
|
+
*
|
|
1228
|
+
* Selects cookies that have not expired at `now` (epoch milliseconds) and whose
|
|
1229
|
+
* domain and path match `url`, skipping `Secure` cookies unless `url` uses
|
|
1230
|
+
* `https`. Every matching cookie is kept, including cookies with the same name,
|
|
1231
|
+
* ordered by longest path first. Returns `undefined` when no cookie matches.
|
|
1232
|
+
*
|
|
1233
|
+
* A leading dot and letter case in `domain` are ignored. A cookie without a
|
|
1234
|
+
* `domain` is never sent, and a cookie without a `path` matches every path.
|
|
1235
|
+
*
|
|
1236
|
+
* @stability unstable
|
|
1237
|
+
* @category client storage
|
|
1238
|
+
* @since 4.0.0
|
|
1239
|
+
*/
|
|
1240
|
+
(self: ReadonlyArray<Cookie>, url: string, now: number): string | undefined
|
|
1241
|
+
} = dual(3, (self: ReadonlyArray<Cookie>, url: string, now: number): string | undefined => {
|
|
1242
|
+
const parsed = parseUrl(url)
|
|
1243
|
+
if (parsed === undefined) {
|
|
1244
|
+
return undefined
|
|
1245
|
+
}
|
|
1246
|
+
const host = parsed.hostname
|
|
1247
|
+
const secure = parsed.protocol === "https:"
|
|
1248
|
+
const matching = self.filter((cookie) => {
|
|
1249
|
+
const domain = cookieDomain(cookie)
|
|
1250
|
+
return domain !== undefined &&
|
|
1251
|
+
(cookie.options?.hostOnly ? host === domain : domainMatches(host, domain)) &&
|
|
1252
|
+
pathMatches(parsed.pathname, cookiePath(cookie)) &&
|
|
1253
|
+
(cookie.options?.expires === undefined || cookie.options.expires.getTime() > now) &&
|
|
1254
|
+
(secure || !cookie.options?.secure)
|
|
1255
|
+
})
|
|
1256
|
+
return matching.length === 0
|
|
1257
|
+
? undefined
|
|
1258
|
+
: matching
|
|
1259
|
+
.sort((a, b) => cookiePath(b).length - cookiePath(a).length)
|
|
1260
|
+
.map((cookie) => `${cookie.name}=${cookie.valueEncoded}`)
|
|
1261
|
+
.join("; ")
|
|
1262
|
+
})
|
|
1263
|
+
|
|
1264
|
+
const parseUrl = (url: string): URL | undefined => {
|
|
1265
|
+
try {
|
|
1266
|
+
return new URL(url)
|
|
1267
|
+
} catch {
|
|
1268
|
+
return undefined
|
|
1269
|
+
}
|
|
1270
|
+
}
|
|
1271
|
+
|
|
1272
|
+
const cookieDomain = (cookie: Cookie): string | undefined =>
|
|
1273
|
+
cookie.options?.domain?.replace(/^\./, "").toLowerCase() || undefined
|
|
1274
|
+
|
|
1275
|
+
const cookiePath = (cookie: Cookie): string => cookie.options?.path?.startsWith("/") ? cookie.options.path : "/"
|
|
1276
|
+
|
|
1277
|
+
const isIpAddress = (host: string): boolean => host.startsWith("[") || /^\d+\.\d+\.\d+\.\d+$/.test(host)
|
|
1278
|
+
|
|
1279
|
+
const domainMatches = (host: string, domain: string): boolean =>
|
|
1280
|
+
host === domain || (host.endsWith("." + domain) && !isIpAddress(host))
|
|
1281
|
+
|
|
1282
|
+
const pathMatches = (requestPath: string, cookiePath: string): boolean =>
|
|
1283
|
+
requestPath === cookiePath ||
|
|
1284
|
+
(requestPath.startsWith(cookiePath) &&
|
|
1285
|
+
(cookiePath.endsWith("/") || requestPath[cookiePath.length] === "/"))
|
|
1286
|
+
|
|
1287
|
+
const defaultPath = (pathname: string): string => {
|
|
1288
|
+
const index = pathname.lastIndexOf("/")
|
|
1289
|
+
return index <= 0 ? "/" : pathname.slice(0, index)
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
const scopeCookie = (url: URL, cookie: Cookie, now: number): Cookie | undefined => {
|
|
1293
|
+
const host = url.hostname
|
|
1294
|
+
let domain = host
|
|
1295
|
+
let hostOnly = true
|
|
1296
|
+
const attribute = cookieDomain(cookie)
|
|
1297
|
+
if (attribute !== undefined) {
|
|
1298
|
+
if (isIpAddress(host) || !domainMatches(host, attribute)) {
|
|
1299
|
+
return undefined
|
|
1300
|
+
}
|
|
1301
|
+
if (attribute.includes(".")) {
|
|
1302
|
+
domain = attribute
|
|
1303
|
+
hostOnly = false
|
|
1304
|
+
} else if (attribute !== host) {
|
|
1305
|
+
// a single-label domain such as "com" is treated like a public suffix
|
|
1306
|
+
return undefined
|
|
1307
|
+
}
|
|
1308
|
+
}
|
|
1309
|
+
const { maxAge, ...options } = cookie.options ?? {}
|
|
1310
|
+
return Object.assign(Object.create(CookieProto), {
|
|
1311
|
+
name: cookie.name,
|
|
1312
|
+
value: cookie.value,
|
|
1313
|
+
valueEncoded: cookie.valueEncoded,
|
|
1314
|
+
options: {
|
|
1315
|
+
...options,
|
|
1316
|
+
domain,
|
|
1317
|
+
hostOnly: hostOnly || undefined,
|
|
1318
|
+
path: options.path?.startsWith("/") ? options.path : defaultPath(url.pathname),
|
|
1319
|
+
expires: maxAge !== undefined ? new Date(now + Duration.toMillis(maxAge)) : options.expires
|
|
1320
|
+
}
|
|
1321
|
+
})
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1044
1324
|
/**
|
|
1045
1325
|
* Parses a cookie header into a record of key-value pairs
|
|
1046
1326
|
*
|
|
@@ -36,6 +36,32 @@ export const Fetch = Context.Reference<typeof globalThis.fetch>("effect/http/Fet
|
|
|
36
36
|
defaultValue: () => globalThis.fetch
|
|
37
37
|
})
|
|
38
38
|
|
|
39
|
+
/**
|
|
40
|
+
* Context reference controlling stream bodies when the runtime does not support streaming requests.
|
|
41
|
+
*
|
|
42
|
+
* **Details**
|
|
43
|
+
*
|
|
44
|
+
* Defaults to `"error"`, which fails with an `EncodeError` without sending the
|
|
45
|
+
* request. Set to `"buffer"` to collect the entire stream in memory and send it
|
|
46
|
+
* as a single body instead. Runtimes with streaming support always send the stream.
|
|
47
|
+
*
|
|
48
|
+
* **Gotchas**
|
|
49
|
+
*
|
|
50
|
+
* Buffering keeps the entire upload in memory and can exhaust memory for large
|
|
51
|
+
* or unbounded uploads. Support is detected once, on the first stream body sent,
|
|
52
|
+
* using the global `Request` implementation even when a custom `Fetch` is provided.
|
|
53
|
+
*
|
|
54
|
+
* @stability unstable
|
|
55
|
+
* @category services
|
|
56
|
+
* @since 4.0.0
|
|
57
|
+
*/
|
|
58
|
+
export const StreamBodyFallback = Context.Reference<"error" | "buffer">(
|
|
59
|
+
"effect/http/FetchHttpClient/StreamBodyFallback",
|
|
60
|
+
{
|
|
61
|
+
defaultValue: () => "error"
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
|
|
39
65
|
/**
|
|
40
66
|
* Service that contains default fetch options for the fetch-based HTTP client.
|
|
41
67
|
*
|
|
@@ -58,6 +84,27 @@ export class RequestInit extends Context.Service<RequestInit, globalThis.Request
|
|
|
58
84
|
"effect/http/FetchHttpClient/RequestInit"
|
|
59
85
|
) {}
|
|
60
86
|
|
|
87
|
+
// https://developer.chrome.com/docs/capabilities/web-apis/fetch-streaming-requests
|
|
88
|
+
let supportsStreamBody: boolean | undefined
|
|
89
|
+
const detectStreamBodySupport = () => {
|
|
90
|
+
try {
|
|
91
|
+
let duplexAccessed = false
|
|
92
|
+
const body = new ReadableStream()
|
|
93
|
+
const request = new Request("https://example.com", {
|
|
94
|
+
method: "POST",
|
|
95
|
+
body,
|
|
96
|
+
get duplex() {
|
|
97
|
+
duplexAccessed = true
|
|
98
|
+
return "half"
|
|
99
|
+
}
|
|
100
|
+
} as globalThis.RequestInit)
|
|
101
|
+
// Bun and Deno preserve the stream without reading the duplex option.
|
|
102
|
+
return (duplexAccessed || request.body === body) && !request.headers.has("Content-Type")
|
|
103
|
+
} catch {
|
|
104
|
+
return false
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
61
108
|
const fetch: HttpClient.HttpClient = HttpClient.make((request, url, signal, fiber) => {
|
|
62
109
|
if (request.headers.upgrade !== undefined) {
|
|
63
110
|
return Effect.fail(
|
|
@@ -124,20 +171,41 @@ const fetch: HttpClient.HttpClient = HttpClient.make((request, url, signal, fibe
|
|
|
124
171
|
case "FormData":
|
|
125
172
|
return send(request.body.formData)
|
|
126
173
|
case "Stream": {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
onAbort()
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
174
|
+
supportsStreamBody ??= detectStreamBodySupport()
|
|
175
|
+
if (supportsStreamBody) {
|
|
176
|
+
uploadController = new AbortController()
|
|
177
|
+
const uploadSignal = AbortSignal.any([signal, uploadController.signal])
|
|
178
|
+
const stopped = Effect.callback<void>((resume) => {
|
|
179
|
+
const onAbort = () => resume(Effect.interrupt)
|
|
180
|
+
if (uploadSignal.aborted) {
|
|
181
|
+
onAbort()
|
|
182
|
+
return
|
|
183
|
+
}
|
|
184
|
+
uploadSignal.addEventListener("abort", onAbort, { once: true })
|
|
185
|
+
return Effect.sync(() => uploadSignal.removeEventListener("abort", onAbort))
|
|
186
|
+
})
|
|
187
|
+
return Effect.flatMap(
|
|
188
|
+
Stream.toReadableStreamEffect(Stream.interruptWhen(request.body.stream, stopped)),
|
|
189
|
+
send
|
|
190
|
+
)
|
|
191
|
+
}
|
|
192
|
+
if (fiber.getRef(StreamBodyFallback) === "error") {
|
|
193
|
+
return Effect.fail(
|
|
194
|
+
new HttpClientError.HttpClientError({
|
|
195
|
+
reason: new HttpClientError.EncodeError({
|
|
196
|
+
request,
|
|
197
|
+
description: "Streaming request bodies are not supported in this runtime"
|
|
198
|
+
})
|
|
199
|
+
})
|
|
200
|
+
)
|
|
201
|
+
}
|
|
202
|
+
return Stream.mkArrayBuffer(request.body.stream).pipe(
|
|
203
|
+
Effect.mapError((cause) =>
|
|
204
|
+
new HttpClientError.HttpClientError({
|
|
205
|
+
reason: new HttpClientError.EncodeError({ request, cause })
|
|
206
|
+
})
|
|
207
|
+
),
|
|
208
|
+
Effect.flatMap(send)
|
|
141
209
|
)
|
|
142
210
|
}
|
|
143
211
|
}
|
|
@@ -168,11 +236,15 @@ const fetch: HttpClient.HttpClient = HttpClient.make((request, url, signal, fibe
|
|
|
168
236
|
* has no effect unless `RequestInit` sets `redirect: "manual"`. Trace
|
|
169
237
|
* propagation is on by default, and a browser preflight fails unless the
|
|
170
238
|
* target allows `b3` and `traceparent`. Stream request bodies are sent as Web
|
|
171
|
-
* streams with `duplex: "half"
|
|
172
|
-
*
|
|
239
|
+
* streams with `duplex: "half"` when the runtime supports it; see
|
|
240
|
+
* `StreamBodyFallback` for the unsupported case. Any `content-length` header is
|
|
241
|
+
* removed before calling `fetch`. Chrome passes the support check but rejects
|
|
242
|
+
* streaming uploads over HTTP/1.1, which surfaces as a `TransportError`, and
|
|
243
|
+
* browsers only deliver the response after the entire request body has been sent.
|
|
173
244
|
*
|
|
174
245
|
* @see {@link Fetch} for supplying the fetch implementation used by this layer
|
|
175
246
|
* @see {@link RequestInit} for default `RequestInit` options applied before request-specific fields
|
|
247
|
+
* @see {@link StreamBodyFallback} for opting into buffering on unsupported runtimes
|
|
176
248
|
* @see {@link HttpClient.TracerPropagationEnabled} for leaving `b3` and `traceparent` off a browser request
|
|
177
249
|
*
|
|
178
250
|
* @stability unstable
|
package/src/http/HttpClient.ts
CHANGED
|
@@ -2456,12 +2456,20 @@ export const tapRequest: {
|
|
|
2456
2456
|
)
|
|
2457
2457
|
|
|
2458
2458
|
/**
|
|
2459
|
-
* Adds a `Ref` of cookies to the client for handling cookies across
|
|
2459
|
+
* Adds a `Ref` of stored cookies to the client for handling cookies across
|
|
2460
|
+
* requests.
|
|
2460
2461
|
*
|
|
2461
2462
|
* **When to use**
|
|
2462
2463
|
*
|
|
2463
2464
|
* Use to add shared cookie storage to a client so response cookies are retained
|
|
2464
|
-
* and sent by later requests.
|
|
2465
|
+
* and sent by later requests to a matching host, path, and scheme.
|
|
2466
|
+
*
|
|
2467
|
+
* **Details**
|
|
2468
|
+
*
|
|
2469
|
+
* Response cookies are merged into the ref with `Cookies.mergeIntoArray` for
|
|
2470
|
+
* the response URL. Before each request, `Cookies.toRequestCookieHeader` selects
|
|
2471
|
+
* the cookies for the request URL and sets them as the `cookie` header. Expiry
|
|
2472
|
+
* uses the current `Clock`.
|
|
2465
2473
|
*
|
|
2466
2474
|
* @stability unstable
|
|
2467
2475
|
* @category cookies
|
|
@@ -2469,52 +2477,66 @@ export const tapRequest: {
|
|
|
2469
2477
|
*/
|
|
2470
2478
|
export const withCookiesRef: {
|
|
2471
2479
|
/**
|
|
2472
|
-
* Adds a `Ref` of cookies to the client for handling cookies across
|
|
2480
|
+
* Adds a `Ref` of stored cookies to the client for handling cookies across
|
|
2481
|
+
* requests.
|
|
2473
2482
|
*
|
|
2474
2483
|
* **When to use**
|
|
2475
2484
|
*
|
|
2476
2485
|
* Use to add shared cookie storage to a client so response cookies are retained
|
|
2477
|
-
* and sent by later requests.
|
|
2486
|
+
* and sent by later requests to a matching host, path, and scheme.
|
|
2487
|
+
*
|
|
2488
|
+
* **Details**
|
|
2489
|
+
*
|
|
2490
|
+
* Response cookies are merged into the ref with `Cookies.mergeIntoArray` for
|
|
2491
|
+
* the response URL. Before each request, `Cookies.toRequestCookieHeader` selects
|
|
2492
|
+
* the cookies for the request URL and sets them as the `cookie` header. Expiry
|
|
2493
|
+
* uses the current `Clock`.
|
|
2478
2494
|
*
|
|
2479
2495
|
* @stability unstable
|
|
2480
2496
|
* @category cookies
|
|
2481
2497
|
* @since 4.0.0
|
|
2482
2498
|
*/
|
|
2483
|
-
(ref: Ref.Ref<Cookies.
|
|
2499
|
+
(ref: Ref.Ref<ReadonlyArray<Cookies.Cookie>>): <E, R>(self: HttpClient.With<E, R>) => HttpClient.With<E, R>
|
|
2484
2500
|
/**
|
|
2485
|
-
* Adds a `Ref` of cookies to the client for handling cookies across
|
|
2501
|
+
* Adds a `Ref` of stored cookies to the client for handling cookies across
|
|
2502
|
+
* requests.
|
|
2486
2503
|
*
|
|
2487
2504
|
* **When to use**
|
|
2488
2505
|
*
|
|
2489
2506
|
* Use to add shared cookie storage to a client so response cookies are retained
|
|
2490
|
-
* and sent by later requests.
|
|
2507
|
+
* and sent by later requests to a matching host, path, and scheme.
|
|
2508
|
+
*
|
|
2509
|
+
* **Details**
|
|
2510
|
+
*
|
|
2511
|
+
* Response cookies are merged into the ref with `Cookies.mergeIntoArray` for
|
|
2512
|
+
* the response URL. Before each request, `Cookies.toRequestCookieHeader` selects
|
|
2513
|
+
* the cookies for the request URL and sets them as the `cookie` header. Expiry
|
|
2514
|
+
* uses the current `Clock`.
|
|
2491
2515
|
*
|
|
2492
2516
|
* @stability unstable
|
|
2493
2517
|
* @category cookies
|
|
2494
2518
|
* @since 4.0.0
|
|
2495
2519
|
*/
|
|
2496
|
-
<E, R>(self: HttpClient.With<E, R>, ref: Ref.Ref<Cookies.
|
|
2520
|
+
<E, R>(self: HttpClient.With<E, R>, ref: Ref.Ref<ReadonlyArray<Cookies.Cookie>>): HttpClient.With<E, R>
|
|
2497
2521
|
} = dual(
|
|
2498
2522
|
2,
|
|
2499
2523
|
<E, R>(
|
|
2500
2524
|
self: HttpClient.With<E, R>,
|
|
2501
|
-
ref: Ref.Ref<Cookies.
|
|
2525
|
+
ref: Ref.Ref<ReadonlyArray<Cookies.Cookie>>
|
|
2502
2526
|
): HttpClient.With<E, R> =>
|
|
2503
2527
|
makeWith(
|
|
2504
2528
|
(request: Effect.Effect<HttpClientRequest.HttpClientRequest, E, R>) =>
|
|
2505
|
-
Effect.tap(
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
),
|
|
2529
|
+
Effect.tap(self.postprocess(request), (response) => {
|
|
2530
|
+
const now = Fiber.getCurrent()!.getRef(Clock).currentTimeMillisUnsafe()
|
|
2531
|
+
return Ref.update(ref, Cookies.mergeIntoArray(response.url, response.cookies, now))
|
|
2532
|
+
}),
|
|
2509
2533
|
(request) =>
|
|
2510
2534
|
Effect.flatMap(self.preprocess(request), (request) =>
|
|
2511
|
-
Effect.map(
|
|
2512
|
-
|
|
2513
|
-
(cookies)
|
|
2514
|
-
|
|
2515
|
-
|
|
2516
|
-
: HttpClientRequest.setHeader(request, "cookie", Cookies.toCookieHeader(cookies))
|
|
2517
|
-
))
|
|
2535
|
+
Effect.map(Ref.get(ref), (cookies) => {
|
|
2536
|
+
const now = Fiber.getCurrent()!.getRef(Clock).currentTimeMillisUnsafe()
|
|
2537
|
+
const header = Cookies.toRequestCookieHeader(cookies, request.url, now)
|
|
2538
|
+
return header === undefined ? request : HttpClientRequest.setHeader(request, "cookie", header)
|
|
2539
|
+
}))
|
|
2518
2540
|
)
|
|
2519
2541
|
)
|
|
2520
2542
|
|
|
@@ -2980,7 +3002,38 @@ class InterruptibleResponse implements HttpClientResponse.HttpClientResponse, Pi
|
|
|
2980
3002
|
}
|
|
2981
3003
|
}
|
|
2982
3004
|
|
|
2983
|
-
|
|
3005
|
+
/**
|
|
3006
|
+
* Returns `true` for an error that `retryTransient` retries by default: a
|
|
3007
|
+
* timeout, a transport error, or a status code error with a transient response.
|
|
3008
|
+
*
|
|
3009
|
+
* **When to use**
|
|
3010
|
+
*
|
|
3011
|
+
* Use to classify failures the same way `retryTransient` does, for example in a
|
|
3012
|
+
* custom retry policy or a circuit breaker.
|
|
3013
|
+
*
|
|
3014
|
+
* **Example** (Classifying client errors)
|
|
3015
|
+
*
|
|
3016
|
+
* ```ts import.meta.vitest
|
|
3017
|
+
* import { Cause } from "effect"
|
|
3018
|
+
* import { HttpClient, HttpClientError, HttpClientRequest } from "effect/http"
|
|
3019
|
+
*
|
|
3020
|
+
* const request = HttpClientRequest.get("https://example.com")
|
|
3021
|
+
* const transportError = new HttpClientError.HttpClientError({
|
|
3022
|
+
* reason: new HttpClientError.TransportError({ request })
|
|
3023
|
+
* })
|
|
3024
|
+
*
|
|
3025
|
+
* HttpClient.isTransientError(transportError) // => true
|
|
3026
|
+
* HttpClient.isTransientError(new Cause.TimeoutError()) // => true
|
|
3027
|
+
* HttpClient.isTransientError(new Error("boom")) // => false
|
|
3028
|
+
* ```
|
|
3029
|
+
*
|
|
3030
|
+
* @see {@link isTransientResponse} for the response statuses it accepts
|
|
3031
|
+
* @see {@link retryTransient} for the retry policy that uses it
|
|
3032
|
+
* @stability unstable
|
|
3033
|
+
* @category predicates
|
|
3034
|
+
* @since 4.1.0
|
|
3035
|
+
*/
|
|
3036
|
+
export const isTransientError = (error: unknown): boolean => Cause.isTimeoutError(error) || isTransientHttpError(error)
|
|
2984
3037
|
|
|
2985
3038
|
const isTransientHttpError = (error: unknown) =>
|
|
2986
3039
|
Error.isHttpClientError(error) &&
|
|
@@ -3014,7 +3067,21 @@ const isTooManyRequestsHttpClientError = (
|
|
|
3014
3067
|
): error is Error.HttpClientError & { readonly reason: Error.StatusCodeError } =>
|
|
3015
3068
|
Error.isHttpClientError(error) && error.reason._tag === "StatusCodeError" && error.reason.response.status === 429
|
|
3016
3069
|
|
|
3017
|
-
|
|
3070
|
+
/**
|
|
3071
|
+
* Returns `true` for a response whose status `retryTransient` retries by
|
|
3072
|
+
* default: 408, 429, 500, 502, 503 or 504.
|
|
3073
|
+
*
|
|
3074
|
+
* **When to use**
|
|
3075
|
+
*
|
|
3076
|
+
* Use to retry the same responses as `retryTransient` in a custom retry policy.
|
|
3077
|
+
*
|
|
3078
|
+
* @see {@link isTransientError} for the matching error predicate
|
|
3079
|
+
* @see {@link retryTransient} for the retry policy that uses it
|
|
3080
|
+
* @stability unstable
|
|
3081
|
+
* @category predicates
|
|
3082
|
+
* @since 4.1.0
|
|
3083
|
+
*/
|
|
3084
|
+
export const isTransientResponse = (response: HttpClientResponse.HttpClientResponse): boolean =>
|
|
3018
3085
|
response.status === 408 ||
|
|
3019
3086
|
response.status === 429 ||
|
|
3020
3087
|
response.status === 500 ||
|
|
@@ -56,7 +56,11 @@ export const isHttpClientRequest = (u: unknown): u is HttpClientRequest => hasPr
|
|
|
56
56
|
*/
|
|
57
57
|
export interface HttpClientRequest extends Inspectable.Inspectable, Pipeable {
|
|
58
58
|
readonly [TypeId]: typeof TypeId
|
|
59
|
-
|
|
59
|
+
/**
|
|
60
|
+
* The request method, which may be a method outside the known `HttpMethod`
|
|
61
|
+
* literals when the request was converted from a Web or server request.
|
|
62
|
+
*/
|
|
63
|
+
readonly method: string
|
|
60
64
|
readonly url: string
|
|
61
65
|
readonly urlParams: UrlParams.UrlParams
|
|
62
66
|
readonly hash: Option.Option<string>
|
|
@@ -126,7 +130,7 @@ const Proto = {
|
|
|
126
130
|
* @since 4.0.0
|
|
127
131
|
*/
|
|
128
132
|
export function makeWith(
|
|
129
|
-
method:
|
|
133
|
+
method: string,
|
|
130
134
|
url: string,
|
|
131
135
|
urlParams: UrlParams.Input,
|
|
132
136
|
hash: Option.Option<string>,
|
|
@@ -1171,7 +1175,7 @@ export interface CompressionOptions {
|
|
|
1171
1175
|
* `Content-Length`. The compressed body does not retain the original lazy text.
|
|
1172
1176
|
* Stream bodies are compressed lazily and have their content length removed.
|
|
1173
1177
|
* They still require a client runtime that supports streaming request bodies
|
|
1174
|
-
* (
|
|
1178
|
+
* (stable Safari and Firefox do not; see `FetchHttpClient.StreamBodyFallback`).
|
|
1175
1179
|
*
|
|
1176
1180
|
* Returns the original request unchanged for empty, FormData, and raw bodies,
|
|
1177
1181
|
* bodies with a known length below `options.minSize`, or requests with any
|
|
@@ -1203,7 +1207,7 @@ export const compressBody: {
|
|
|
1203
1207
|
* `Content-Length`. The compressed body does not retain the original lazy text.
|
|
1204
1208
|
* Stream bodies are compressed lazily and have their content length removed.
|
|
1205
1209
|
* They still require a client runtime that supports streaming request bodies
|
|
1206
|
-
* (
|
|
1210
|
+
* (stable Safari and Firefox do not; see `FetchHttpClient.StreamBodyFallback`).
|
|
1207
1211
|
*
|
|
1208
1212
|
* Returns the original request unchanged for empty, FormData, and raw bodies,
|
|
1209
1213
|
* bodies with a known length below `options.minSize`, or requests with any
|
|
@@ -1235,7 +1239,7 @@ export const compressBody: {
|
|
|
1235
1239
|
* `Content-Length`. The compressed body does not retain the original lazy text.
|
|
1236
1240
|
* Stream bodies are compressed lazily and have their content length removed.
|
|
1237
1241
|
* They still require a client runtime that supports streaming request bodies
|
|
1238
|
-
* (
|
|
1242
|
+
* (stable Safari and Firefox do not; see `FetchHttpClient.StreamBodyFallback`).
|
|
1239
1243
|
*
|
|
1240
1244
|
* Returns the original request unchanged for empty, FormData, and raw bodies,
|
|
1241
1245
|
* bodies with a known length below `options.minSize`, or requests with any
|
|
@@ -1694,16 +1698,15 @@ export function toUrl(self: HttpClientRequest): Option.Option<URL> {
|
|
|
1694
1698
|
* @since 4.0.0
|
|
1695
1699
|
*/
|
|
1696
1700
|
export const fromWeb = (request: globalThis.Request): HttpClientRequest => {
|
|
1697
|
-
const method = request.method.toUpperCase()
|
|
1698
|
-
return modify(empty, {
|
|
1699
|
-
method,
|
|
1701
|
+
const method = request.method.toUpperCase()
|
|
1702
|
+
return modify(makeWith(method, "", UrlParams.empty, Option.none(), Headers.empty, HttpBody.empty), {
|
|
1700
1703
|
url: new URL(request.url),
|
|
1701
1704
|
headers: request.headers,
|
|
1702
1705
|
body: fromWebBody(request, method)
|
|
1703
1706
|
})
|
|
1704
1707
|
}
|
|
1705
1708
|
|
|
1706
|
-
const fromWebBody = (request: globalThis.Request, method:
|
|
1709
|
+
const fromWebBody = (request: globalThis.Request, method: string): HttpBody.HttpBody => {
|
|
1707
1710
|
if (!hasBody(method) || request.body === null) {
|
|
1708
1711
|
return HttpBody.empty
|
|
1709
1712
|
}
|