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
|
@@ -25,6 +25,7 @@ import * as Headers from "./Headers.ts"
|
|
|
25
25
|
import * as Error from "./HttpClientError.ts"
|
|
26
26
|
import * as HttpClientRequest from "./HttpClientRequest.ts"
|
|
27
27
|
import * as HttpIncomingMessage from "./HttpIncomingMessage.ts"
|
|
28
|
+
import * as internalUrlParams from "./internal/urlParams.ts"
|
|
28
29
|
import { getWebSource, WebSourceSymbol } from "./internal/webResponse.ts"
|
|
29
30
|
import * as UrlParams from "./UrlParams.ts"
|
|
30
31
|
|
|
@@ -454,9 +455,9 @@ class WebHttpClientResponse extends Inspectable.Class implements HttpClientRespo
|
|
|
454
455
|
}
|
|
455
456
|
|
|
456
457
|
get urlParamsBody(): Effect.Effect<UrlParams.UrlParams, Error.HttpClientError> {
|
|
457
|
-
return Effect.flatMap(this.
|
|
458
|
+
return Effect.flatMap(this.arrayBuffer, (bytes) =>
|
|
458
459
|
Effect.try({
|
|
459
|
-
try: () => UrlParams.fromInput(
|
|
460
|
+
try: () => UrlParams.fromInput(internalUrlParams.fromBody(bytes)),
|
|
460
461
|
catch: (cause) =>
|
|
461
462
|
new Error.HttpClientError({
|
|
462
463
|
reason: new Error.DecodeError({
|
package/src/http/HttpMethod.ts
CHANGED
|
@@ -57,12 +57,20 @@ export declare namespace HttpMethod {
|
|
|
57
57
|
/**
|
|
58
58
|
* Returns `true` when a method can carry a request body and narrows it to `HttpMethod.WithBody`.
|
|
59
59
|
*
|
|
60
|
+
* **Details**
|
|
61
|
+
*
|
|
62
|
+
* Methods outside the known `HttpMethod` literals, such as a received
|
|
63
|
+
* `"PROPFIND"`, are treated as capable of carrying a body but are not narrowed.
|
|
64
|
+
*
|
|
60
65
|
* @stability unstable
|
|
61
66
|
* @category guards
|
|
62
67
|
* @since 4.0.0
|
|
63
68
|
*/
|
|
64
|
-
export
|
|
65
|
-
|
|
69
|
+
export function hasBody(method: HttpMethod): method is HttpMethod.WithBody
|
|
70
|
+
export function hasBody(method: string): boolean
|
|
71
|
+
export function hasBody(method: string): boolean {
|
|
72
|
+
return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE"
|
|
73
|
+
}
|
|
66
74
|
|
|
67
75
|
/**
|
|
68
76
|
* Provides a readonly set containing every supported `HttpMethod` literal.
|
|
@@ -32,10 +32,11 @@ import * as Headers from "./Headers.ts"
|
|
|
32
32
|
import * as HttpBody from "./HttpBody.ts"
|
|
33
33
|
import * as HttpClientRequest from "./HttpClientRequest.ts"
|
|
34
34
|
import * as HttpIncomingMessage from "./HttpIncomingMessage.ts"
|
|
35
|
-
import { hasBody
|
|
35
|
+
import { hasBody } from "./HttpMethod.ts"
|
|
36
36
|
import { HttpServerError, type RequestError, RequestParseError } from "./HttpServerError.ts"
|
|
37
37
|
import * as bodyInternal from "./internal/httpBody.ts"
|
|
38
38
|
import * as lazyStream from "./internal/lazyStream.ts"
|
|
39
|
+
import * as internalUrlParams from "./internal/urlParams.ts"
|
|
39
40
|
import * as Multipart from "./Multipart.ts"
|
|
40
41
|
import * as UrlParams from "./UrlParams.ts"
|
|
41
42
|
|
|
@@ -90,7 +91,11 @@ export interface HttpServerRequest extends HttpIncomingMessage.HttpIncomingMessa
|
|
|
90
91
|
readonly source: object
|
|
91
92
|
readonly url: string
|
|
92
93
|
readonly originalUrl: string
|
|
93
|
-
|
|
94
|
+
/**
|
|
95
|
+
* The uppercase request method as received, which may be a method outside
|
|
96
|
+
* the known `HttpMethod` literals (for example `"PROPFIND"`).
|
|
97
|
+
*/
|
|
98
|
+
readonly method: string
|
|
94
99
|
readonly cookies: ReadonlyRecord<string, string>
|
|
95
100
|
|
|
96
101
|
readonly multipart: Effect.Effect<
|
|
@@ -563,8 +568,8 @@ class ServerRequestImpl extends Inspectable.Class implements HttpServerRequest {
|
|
|
563
568
|
options.protocol ?? this.protocol
|
|
564
569
|
)
|
|
565
570
|
}
|
|
566
|
-
get method():
|
|
567
|
-
return this.source.method.toUpperCase()
|
|
571
|
+
get method(): string {
|
|
572
|
+
return this.source.method.toUpperCase()
|
|
568
573
|
}
|
|
569
574
|
get originalUrl() {
|
|
570
575
|
return this.source.url
|
|
@@ -612,27 +617,7 @@ class ServerRequestImpl extends Inspectable.Class implements HttpServerRequest {
|
|
|
612
617
|
|
|
613
618
|
private textEffect: Effect.Effect<string, HttpServerError> | undefined
|
|
614
619
|
get text(): Effect.Effect<string, HttpServerError> {
|
|
615
|
-
|
|
616
|
-
return this.textEffect
|
|
617
|
-
}
|
|
618
|
-
this.textEffect = Effect.withFiber((fiber) =>
|
|
619
|
-
fiber.getRef(HttpIncomingMessage.MaxBodySize) === undefined
|
|
620
|
-
? Effect.tryPromise({
|
|
621
|
-
try: () => this.source.text(),
|
|
622
|
-
catch: (cause) =>
|
|
623
|
-
new HttpServerError({
|
|
624
|
-
reason: new RequestParseError({
|
|
625
|
-
request: this,
|
|
626
|
-
cause
|
|
627
|
-
})
|
|
628
|
-
})
|
|
629
|
-
})
|
|
630
|
-
: Effect.map(this.arrayBuffer, (buffer) => textDecoder.decode(buffer))
|
|
631
|
-
).pipe(
|
|
632
|
-
Effect.cached,
|
|
633
|
-
Effect.runSync
|
|
634
|
-
)
|
|
635
|
-
return this.textEffect
|
|
620
|
+
return this.textEffect ??= Effect.map(this.arrayBuffer, (buffer) => textDecoder.decode(buffer))
|
|
636
621
|
}
|
|
637
622
|
|
|
638
623
|
get json(): Effect.Effect<Schema.Json, HttpServerError> {
|
|
@@ -650,9 +635,9 @@ class ServerRequestImpl extends Inspectable.Class implements HttpServerRequest {
|
|
|
650
635
|
}
|
|
651
636
|
|
|
652
637
|
get urlParamsBody(): Effect.Effect<UrlParams.UrlParams, HttpServerError> {
|
|
653
|
-
return Effect.flatMap(this.
|
|
638
|
+
return Effect.flatMap(this.arrayBuffer, (bytes) =>
|
|
654
639
|
Effect.try({
|
|
655
|
-
try: () => UrlParams.fromInput(
|
|
640
|
+
try: () => UrlParams.fromInput(internalUrlParams.fromBody(bytes)),
|
|
656
641
|
catch: (cause) =>
|
|
657
642
|
new HttpServerError({
|
|
658
643
|
reason: new RequestParseError({
|
|
@@ -797,7 +782,7 @@ class ClientRequestImpl extends Inspectable.Class implements HttpServerRequest {
|
|
|
797
782
|
)
|
|
798
783
|
}
|
|
799
784
|
|
|
800
|
-
get method():
|
|
785
|
+
get method(): string {
|
|
801
786
|
return this.source.method
|
|
802
787
|
}
|
|
803
788
|
|
|
@@ -892,9 +877,9 @@ class ClientRequestImpl extends Inspectable.Class implements HttpServerRequest {
|
|
|
892
877
|
}
|
|
893
878
|
|
|
894
879
|
get urlParamsBody(): Effect.Effect<UrlParams.UrlParams, HttpServerError> {
|
|
895
|
-
return Effect.flatMap(this.
|
|
880
|
+
return Effect.flatMap(this.bytes, (bytes) =>
|
|
896
881
|
Effect.try({
|
|
897
|
-
try: () => UrlParams.fromInput(
|
|
882
|
+
try: () => UrlParams.fromInput(internalUrlParams.fromBody(bytes)),
|
|
898
883
|
catch: (cause) => requestParseError(this, undefined, cause)
|
|
899
884
|
}))
|
|
900
885
|
}
|
|
@@ -38,6 +38,7 @@ import * as HttpIncomingMessage from "./HttpIncomingMessage.ts"
|
|
|
38
38
|
import type { HttpPlatform } from "./HttpPlatform.ts"
|
|
39
39
|
import * as headersInternal from "./internal/headers.ts"
|
|
40
40
|
import * as bodyInternal from "./internal/httpBody.ts"
|
|
41
|
+
import * as internalUrlParams from "./internal/urlParams.ts"
|
|
41
42
|
import * as Template from "./Template.ts"
|
|
42
43
|
import * as UrlParams from "./UrlParams.ts"
|
|
43
44
|
|
|
@@ -1653,9 +1654,9 @@ class ServerHttpClientResponse extends Inspectable.Class implements HttpClientRe
|
|
|
1653
1654
|
}
|
|
1654
1655
|
|
|
1655
1656
|
get urlParamsBody(): Effect.Effect<UrlParams.UrlParams, HttpClientError.HttpClientError> {
|
|
1656
|
-
return Effect.flatMap(this.
|
|
1657
|
+
return Effect.flatMap(this.bytes, (bytes) =>
|
|
1657
1658
|
Effect.try({
|
|
1658
|
-
try: () => UrlParams.fromInput(
|
|
1659
|
+
try: () => UrlParams.fromInput(internalUrlParams.fromBody(bytes)),
|
|
1659
1660
|
catch: (cause) =>
|
|
1660
1661
|
new HttpClientError.HttpClientError({
|
|
1661
1662
|
reason: new HttpClientError.DecodeError({
|
|
@@ -130,10 +130,11 @@ export const xb3: FromHeaders = (headers) => {
|
|
|
130
130
|
}))
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
-
const w3cTraceId = /^[0-9a-f]{32}$/
|
|
134
|
-
const w3cSpanId = /^[0-9a-f]{16}$/
|
|
133
|
+
const w3cTraceId = /^[0-9a-f]{32}$/
|
|
134
|
+
const w3cSpanId = /^[0-9a-f]{16}$/
|
|
135
|
+
const w3cTraceFlags = /^[0-9a-f]{2}$/
|
|
135
136
|
|
|
136
|
-
const b3TraceId = /^(?:[0-9a-f]{16}|[0-9a-f]{32})$/
|
|
137
|
+
const b3TraceId = /^(?:[0-9a-f]{16}|[0-9a-f]{32})$/
|
|
137
138
|
const isB3Ids = (traceId: string, spanId: string): boolean => b3TraceId.test(traceId) && w3cSpanId.test(spanId)
|
|
138
139
|
|
|
139
140
|
/**
|
|
@@ -141,7 +142,8 @@ const isB3Ids = (traceId: string, spanId: string): boolean => b3TraceId.test(tra
|
|
|
141
142
|
*
|
|
142
143
|
* **Details**
|
|
143
144
|
*
|
|
144
|
-
* Only version `00` headers with valid trace and span identifiers
|
|
145
|
+
* Only version `00` headers with valid trace and span identifiers and trace
|
|
146
|
+
* flags are accepted.
|
|
145
147
|
*
|
|
146
148
|
* @stability unstable
|
|
147
149
|
* @category decoding
|
|
@@ -160,6 +162,7 @@ export const w3c: FromHeaders = (headers) => {
|
|
|
160
162
|
case "00": {
|
|
161
163
|
if (
|
|
162
164
|
w3cTraceId.test(traceId) === false || w3cSpanId.test(spanId) === false ||
|
|
165
|
+
w3cTraceFlags.test(flags) === false ||
|
|
163
166
|
traceId === "00000000000000000000000000000000" || spanId === "0000000000000000"
|
|
164
167
|
) {
|
|
165
168
|
return Option.none()
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RFC 9457 Problem Details values for HTTP responses.
|
|
3
|
+
*
|
|
4
|
+
* A problem details object is the `application/problem+json` body a server
|
|
5
|
+
* sends to describe an error. This module provides the reusable value shape,
|
|
6
|
+
* a lenient codec that follows the parsing rules of RFC 9457, and a response
|
|
7
|
+
* constructor. The `effect/http-api` modules build typed problem declarations,
|
|
8
|
+
* built-in error rendering and OpenAPI output on top of it.
|
|
9
|
+
*
|
|
10
|
+
* @stability unstable
|
|
11
|
+
* @since 4.0.6
|
|
12
|
+
*/
|
|
13
|
+
import * as Effect from "../Effect.ts"
|
|
14
|
+
import * as Schema_ from "../Schema.ts"
|
|
15
|
+
import * as HttpServerResponse from "./HttpServerResponse.ts"
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The media type of a problem details response body.
|
|
19
|
+
*
|
|
20
|
+
* @stability unstable
|
|
21
|
+
* @category constants
|
|
22
|
+
* @since 4.0.6
|
|
23
|
+
*/
|
|
24
|
+
export const contentType = "application/problem+json"
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The problem type URI RFC 9457 assigns to problems that only carry an HTTP
|
|
28
|
+
* status.
|
|
29
|
+
*
|
|
30
|
+
* @stability unstable
|
|
31
|
+
* @category constants
|
|
32
|
+
* @since 4.0.6
|
|
33
|
+
*/
|
|
34
|
+
export const blankType = "about:blank"
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* A decoded RFC 9457 problem details object.
|
|
38
|
+
*
|
|
39
|
+
* **Details**
|
|
40
|
+
*
|
|
41
|
+
* The standard members are `type`, `status`, `title`, `detail` and
|
|
42
|
+
* `instance`. Any other member is an extension and is kept as-is.
|
|
43
|
+
*
|
|
44
|
+
* @stability unstable
|
|
45
|
+
* @category models
|
|
46
|
+
* @since 4.0.6
|
|
47
|
+
*/
|
|
48
|
+
export interface ProblemDetails {
|
|
49
|
+
readonly type: string
|
|
50
|
+
readonly status?: number
|
|
51
|
+
readonly title?: string
|
|
52
|
+
readonly detail?: string
|
|
53
|
+
readonly instance?: string
|
|
54
|
+
readonly [extension: string]: unknown
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* The encoded form of a problem details object, where `type` may be omitted.
|
|
59
|
+
*
|
|
60
|
+
* @stability unstable
|
|
61
|
+
* @category models
|
|
62
|
+
* @since 4.0.6
|
|
63
|
+
*/
|
|
64
|
+
export interface ProblemDetailsEncoded {
|
|
65
|
+
readonly type?: string
|
|
66
|
+
readonly status?: number
|
|
67
|
+
readonly title?: string
|
|
68
|
+
readonly detail?: string
|
|
69
|
+
readonly instance?: string
|
|
70
|
+
readonly [extension: string]: unknown
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* A standard member that is dropped when it is missing or has the wrong JSON
|
|
75
|
+
* type, as RFC 9457 section 3.1 requires.
|
|
76
|
+
*
|
|
77
|
+
* @internal
|
|
78
|
+
*/
|
|
79
|
+
export const optionalMember = <S extends Schema_.Constraint>(schema: S) =>
|
|
80
|
+
Schema_.optionalKey(schema).pipe(Schema_.catchDecoding(() => Effect.succeedNone))
|
|
81
|
+
|
|
82
|
+
const withFallback = <S extends Schema_.Constraint>(
|
|
83
|
+
schema: S,
|
|
84
|
+
value: S["Encoded"] & S["Type"]
|
|
85
|
+
): Schema_.middlewareDecoding<Schema_.withDecodingDefaultKey<S>, S["DecodingServices"]> =>
|
|
86
|
+
Schema_.withDecodingDefaultKey<S>(Effect.succeed(value))(schema).pipe(
|
|
87
|
+
Schema_.catchDecoding(() => Effect.succeedSome(value))
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* A required member that decodes to a fixed value when it is missing or has
|
|
92
|
+
* the wrong JSON type. The value is also the constructor default.
|
|
93
|
+
*
|
|
94
|
+
* @internal
|
|
95
|
+
*/
|
|
96
|
+
export const fixedMember = <const L extends string | number>(value: L) => withFallback(Schema_.tag(value), value)
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* The lenient codec for problem details objects.
|
|
100
|
+
*
|
|
101
|
+
* **Details**
|
|
102
|
+
*
|
|
103
|
+
* Decoding follows RFC 9457: a missing `type` defaults to `about:blank`,
|
|
104
|
+
* standard members with the wrong JSON type are ignored, and unknown members
|
|
105
|
+
* are kept as extensions. Encoding always emits `type`.
|
|
106
|
+
*
|
|
107
|
+
* **Example** (Decoding a problem with an extension)
|
|
108
|
+
*
|
|
109
|
+
* ```ts import.meta.vitest
|
|
110
|
+
* import { Schema } from "effect"
|
|
111
|
+
* import { ProblemDetails } from "effect/http"
|
|
112
|
+
*
|
|
113
|
+
* const problem = Schema.decodeUnknownSync(ProblemDetails.Schema)({
|
|
114
|
+
* status: 404,
|
|
115
|
+
* detail: "No such user",
|
|
116
|
+
* traceId: "abc-123"
|
|
117
|
+
* })
|
|
118
|
+
* problem // => { type: "about:blank", status: 404, detail: "No such user", traceId: "abc-123" }
|
|
119
|
+
* ```
|
|
120
|
+
*
|
|
121
|
+
* @stability unstable
|
|
122
|
+
* @category schemas
|
|
123
|
+
* @since 4.0.6
|
|
124
|
+
*/
|
|
125
|
+
export const Schema: Schema_.Codec<ProblemDetails, ProblemDetailsEncoded> = Schema_.StructWithRest(
|
|
126
|
+
Schema_.Struct({
|
|
127
|
+
type: withFallback(Schema_.String, blankType),
|
|
128
|
+
status: optionalMember(Schema_.Number),
|
|
129
|
+
title: optionalMember(Schema_.String),
|
|
130
|
+
detail: optionalMember(Schema_.String),
|
|
131
|
+
instance: optionalMember(Schema_.String)
|
|
132
|
+
}),
|
|
133
|
+
[Schema_.Record(Schema_.String, Schema_.Unknown)]
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Renders a problem details object as an `application/problem+json` response.
|
|
138
|
+
*
|
|
139
|
+
* **Details**
|
|
140
|
+
*
|
|
141
|
+
* The response status is the problem's `status` member, or `500` when it is
|
|
142
|
+
* absent.
|
|
143
|
+
*
|
|
144
|
+
* @stability unstable
|
|
145
|
+
* @category constructors
|
|
146
|
+
* @since 4.0.6
|
|
147
|
+
*/
|
|
148
|
+
export const toResponse = (problem: ProblemDetails): HttpServerResponse.HttpServerResponse =>
|
|
149
|
+
HttpServerResponse.jsonUnsafe(problem, { status: problem.status ?? 500, contentType })
|
package/src/http/index.ts
CHANGED
|
@@ -167,6 +167,12 @@ export * as Multipart from "./Multipart.ts"
|
|
|
167
167
|
*/
|
|
168
168
|
export * as MultipartParser from "./MultipartParser.ts"
|
|
169
169
|
|
|
170
|
+
/**
|
|
171
|
+
* @stability unstable
|
|
172
|
+
* @since 4.0.6
|
|
173
|
+
*/
|
|
174
|
+
export * as ProblemDetails from "./ProblemDetails.ts"
|
|
175
|
+
|
|
170
176
|
/**
|
|
171
177
|
* @stability unstable
|
|
172
178
|
* @since 4.0.0
|
|
@@ -8,12 +8,12 @@ import type * as Socket from "../../socket/Socket.ts"
|
|
|
8
8
|
import * as Stream from "../../Stream.ts"
|
|
9
9
|
import * as Headers from "../Headers.ts"
|
|
10
10
|
import * as HttpIncomingMessage from "../HttpIncomingMessage.ts"
|
|
11
|
-
import type { HttpMethod } from "../HttpMethod.ts"
|
|
12
11
|
import { HttpServerError, RequestParseError } from "../HttpServerError.ts"
|
|
13
12
|
import * as HttpServerRequest from "../HttpServerRequest.ts"
|
|
14
13
|
import * as Multipart from "../Multipart.ts"
|
|
15
14
|
import * as UrlParams from "../UrlParams.ts"
|
|
16
15
|
import * as lazyStream from "./lazyStream.ts"
|
|
16
|
+
import * as internalUrlParams from "./urlParams.ts"
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* @internal
|
|
@@ -100,7 +100,7 @@ export class DecompressedRequest extends Inspectable.Class implements HttpServer
|
|
|
100
100
|
return this.inner.originalUrl
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
get method():
|
|
103
|
+
get method(): string {
|
|
104
104
|
return this.inner.method
|
|
105
105
|
}
|
|
106
106
|
|
|
@@ -188,9 +188,9 @@ export class DecompressedRequest extends Inspectable.Class implements HttpServer
|
|
|
188
188
|
}
|
|
189
189
|
|
|
190
190
|
get urlParamsBody(): Effect.Effect<UrlParams.UrlParams, HttpServerError> {
|
|
191
|
-
return Effect.flatMap(this.
|
|
191
|
+
return Effect.flatMap(this.bytes, (bytes) =>
|
|
192
192
|
Effect.try({
|
|
193
|
-
try: () => UrlParams.fromInput(
|
|
193
|
+
try: () => UrlParams.fromInput(internalUrlParams.fromBody(bytes)),
|
|
194
194
|
catch: (cause) => this.parseError(cause)
|
|
195
195
|
}))
|
|
196
196
|
}
|
|
@@ -18,6 +18,14 @@ export const stripSearchAndHash = (url: string): string => {
|
|
|
18
18
|
return url.slice(0, Math.min(queryIndex, hashIndex))
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
// URL-encoded bodies keep a leading U+FEFF as form data
|
|
22
|
+
const bodyDecoder = new TextDecoder("utf-8", { ignoreBOM: true })
|
|
23
|
+
|
|
24
|
+
/** @internal */
|
|
25
|
+
export const fromBody = (bytes: ArrayBuffer | Uint8Array): URLSearchParams =>
|
|
26
|
+
// A leading "?" is form data; URLSearchParams would drop it as a query prefix.
|
|
27
|
+
new URLSearchParams(bodyDecoder.decode(bytes).replace(/^\?/, "%3F"))
|
|
28
|
+
|
|
21
29
|
const originForm = /^\/(?![/\\])/
|
|
22
30
|
|
|
23
31
|
/** @internal */
|
|
@@ -957,6 +957,8 @@ function handlerToHttpEffect(
|
|
|
957
957
|
const encodeStream = makeStreamEncoder(endpoint, options.success)
|
|
958
958
|
const encodeWithHeaders = makeWithHeadersEncoder(endpoint, options.success, options.headers)
|
|
959
959
|
const upgrade = getUpgradeSuccessSchema(endpoint)
|
|
960
|
+
// The handler of a mixed endpoint may decline the upgrade and return one of the other successes.
|
|
961
|
+
const upgradeOnly = upgrade !== undefined && endpoint.success.size === 1
|
|
960
962
|
const encodeUpgradeHeaders = UndefinedOr.map(
|
|
961
963
|
upgrade?.headers,
|
|
962
964
|
(schema) => Schema.encodeUnknownEffect(schema, options.headers)
|
|
@@ -989,19 +991,23 @@ function handlerToHttpEffect(
|
|
|
989
991
|
if (decodeQuery) {
|
|
990
992
|
request.query = yield* HttpApiSchemaError.wrap("Query", decodeQuery(query))
|
|
991
993
|
}
|
|
994
|
+
let upgraded = false
|
|
992
995
|
if (upgrade !== undefined) {
|
|
993
996
|
if (!isUpgradeRequest(httpRequest, upgrade.protocol)) {
|
|
994
997
|
return upgradeRequired(upgrade.protocol)
|
|
995
998
|
}
|
|
996
999
|
request.upgrade = (options?: { readonly headers?: unknown }) =>
|
|
997
|
-
Effect.
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1000
|
+
Effect.suspend(() => {
|
|
1001
|
+
upgraded = true
|
|
1002
|
+
return Effect.orDie(
|
|
1003
|
+
encodeUpgradeHeaders === undefined
|
|
1004
|
+
? httpRequest.upgrade
|
|
1005
|
+
: Effect.flatMap(
|
|
1006
|
+
HttpApiSchemaError.wrap("ResponseHeaders", encodeUpgradeHeaders(options?.headers)),
|
|
1007
|
+
(headers) => httpRequest.upgradeWith({ headers: headers as Record<string, string> })
|
|
1008
|
+
)
|
|
1009
|
+
)
|
|
1010
|
+
})
|
|
1005
1011
|
}
|
|
1006
1012
|
if (payloadBy) {
|
|
1007
1013
|
const result = decodePayload(payloadBy, httpRequest, query)
|
|
@@ -1016,7 +1022,10 @@ function handlerToHttpEffect(
|
|
|
1016
1022
|
if (Response.isHttpServerResponse(response)) {
|
|
1017
1023
|
return response
|
|
1018
1024
|
}
|
|
1019
|
-
if (
|
|
1025
|
+
if (upgradeOnly || upgraded) {
|
|
1026
|
+
if (response !== undefined && !upgradeOnly) {
|
|
1027
|
+
return yield* Effect.die(new Error("Cannot return a success value after calling upgrade()"))
|
|
1028
|
+
}
|
|
1020
1029
|
// The server replaces this with the 101 once the connection is upgraded.
|
|
1021
1030
|
return Response.empty()
|
|
1022
1031
|
}
|
|
@@ -1367,9 +1376,12 @@ function makeSuccessSchema(
|
|
|
1367
1376
|
endpoint: HttpApiEndpoint.Top,
|
|
1368
1377
|
headersOptions: SchemaAST.ParseOptions | undefined
|
|
1369
1378
|
): Schema.ConstraintEncoder<HttpServerResponse, unknown> {
|
|
1370
|
-
const schemas =
|
|
1371
|
-
|
|
1372
|
-
|
|
1379
|
+
const schemas: Array<Schema.ConstraintEncoder<HttpServerResponse, unknown>> = []
|
|
1380
|
+
for (const schema of HttpApiEndpoint.getSuccessSchemas(endpoint)) {
|
|
1381
|
+
// The 101 is written by the transport, so the upgrade has no response encoder.
|
|
1382
|
+
if (HttpApiSchema.isUpgrade(schema)) continue
|
|
1383
|
+
schemas.push(toResponseSuccessSchema(schema, headersOptions))
|
|
1384
|
+
}
|
|
1373
1385
|
return schemas.length === 1 ? schemas[0] : Schema.Union(schemas)
|
|
1374
1386
|
}
|
|
1375
1387
|
|
|
@@ -106,6 +106,24 @@ export type SuccessType<S> = S extends HttpApiSchema.WithHeaders<
|
|
|
106
106
|
: S extends Schema.Constraint ? S["Type"]
|
|
107
107
|
: never
|
|
108
108
|
|
|
109
|
+
/**
|
|
110
|
+
* Runtime brand key used to mark `Upgraded` values.
|
|
111
|
+
*
|
|
112
|
+
* @stability unstable
|
|
113
|
+
* @category type IDs
|
|
114
|
+
* @since 4.1.0
|
|
115
|
+
*/
|
|
116
|
+
export const UpgradedTypeId = "~effect/http-api/HttpApiClient/Upgraded"
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Type-level brand identifier used by `Upgraded` values.
|
|
120
|
+
*
|
|
121
|
+
* @stability unstable
|
|
122
|
+
* @category type IDs
|
|
123
|
+
* @since 4.1.0
|
|
124
|
+
*/
|
|
125
|
+
export type UpgradedTypeId = typeof UpgradedTypeId
|
|
126
|
+
|
|
109
127
|
/**
|
|
110
128
|
* The value a client method returns for an endpoint declared with
|
|
111
129
|
* `HttpApiSchema.Upgrade`: the headers of the `101 Switching Protocols`
|
|
@@ -117,15 +135,63 @@ export type SuccessType<S> = S extends HttpApiSchema.WithHeaders<
|
|
|
117
135
|
* one. See `HttpClientResponse.upgrade` for how the connection behaves and
|
|
118
136
|
* when it closes.
|
|
119
137
|
*
|
|
138
|
+
* When the endpoint also declares ordinary success responses, the method
|
|
139
|
+
* returns either an `Upgraded` value or the decoded ordinary success. Use
|
|
140
|
+
* {@link isUpgraded} to tell them apart.
|
|
141
|
+
*
|
|
120
142
|
* @stability unstable
|
|
121
143
|
* @category models
|
|
122
144
|
* @since 4.0.6
|
|
123
145
|
*/
|
|
124
146
|
export interface Upgraded<Headers = Headers.Headers> {
|
|
147
|
+
readonly [UpgradedTypeId]: UpgradedTypeId
|
|
125
148
|
readonly headers: Headers
|
|
126
149
|
readonly socket: Socket.Socket
|
|
127
150
|
}
|
|
128
151
|
|
|
152
|
+
/**
|
|
153
|
+
* Returns `true` when a client method result is an upgraded connection.
|
|
154
|
+
*
|
|
155
|
+
* **Details**
|
|
156
|
+
*
|
|
157
|
+
* An endpoint may declare `HttpApiSchema.Upgrade` alongside ordinary success
|
|
158
|
+
* responses, because a server can decline an upgrade (RFC 9110 §7.8). The
|
|
159
|
+
* client method then returns either an `Upgraded` value or the decoded
|
|
160
|
+
* ordinary success, depending on the response status. This predicate narrows
|
|
161
|
+
* that union.
|
|
162
|
+
*
|
|
163
|
+
* **Example** (Handling a declined upgrade)
|
|
164
|
+
*
|
|
165
|
+
* ```ts
|
|
166
|
+
* import { Effect, Schema } from "effect"
|
|
167
|
+
* import { HttpApi, HttpApiClient, HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from "effect/http-api"
|
|
168
|
+
*
|
|
169
|
+
* const Api = HttpApi.make("docker").add(
|
|
170
|
+
* HttpApiGroup.make("exec").add(
|
|
171
|
+
* HttpApiEndpoint.post("start", "/exec/:id/start", {
|
|
172
|
+
* params: { id: Schema.String },
|
|
173
|
+
* payload: Schema.Struct({ Detach: Schema.Boolean }),
|
|
174
|
+
* success: [HttpApiSchema.Upgrade({ protocol: "tcp" }), HttpApiSchema.Empty(200)]
|
|
175
|
+
* })
|
|
176
|
+
* )
|
|
177
|
+
* )
|
|
178
|
+
*
|
|
179
|
+
* const program = Effect.gen(function*() {
|
|
180
|
+
* const client = yield* HttpApiClient.make(Api)
|
|
181
|
+
* const result = yield* client.exec.start({ params: { id: "abc" }, payload: { Detach: false } })
|
|
182
|
+
* if (HttpApiClient.isUpgraded(result)) {
|
|
183
|
+
* const writer = yield* result.socket.writer
|
|
184
|
+
* yield* writer.write("ls\n")
|
|
185
|
+
* }
|
|
186
|
+
* })
|
|
187
|
+
* ```
|
|
188
|
+
*
|
|
189
|
+
* @stability unstable
|
|
190
|
+
* @category guards
|
|
191
|
+
* @since 4.1.0
|
|
192
|
+
*/
|
|
193
|
+
export const isUpgraded = (u: unknown): u is Upgraded<unknown> => Predicate.hasProperty(u, UpgradedTypeId)
|
|
194
|
+
|
|
129
195
|
type SuccessDecodingServices<S> = S extends HttpApiSchema.StreamSse<
|
|
130
196
|
infer _Events,
|
|
131
197
|
infer _Error,
|
|
@@ -1041,7 +1107,7 @@ const makeEndpointDecoder = (options: {
|
|
|
1041
1107
|
Effect.uninterruptibleMask((restore) =>
|
|
1042
1108
|
Effect.flatMap(response.upgrade, (socket) =>
|
|
1043
1109
|
restore(decodeHeaders(response.headers)).pipe(
|
|
1044
|
-
Effect.map((headers): Upgraded<unknown> => ({ headers, socket })),
|
|
1110
|
+
Effect.map((headers): Upgraded<unknown> => ({ [UpgradedTypeId]: UpgradedTypeId, headers, socket })),
|
|
1045
1111
|
// nothing takes the connection on failure, so close it: releasing
|
|
1046
1112
|
// the reader's scope closes the connection
|
|
1047
1113
|
Effect.onError(() => Effect.ignore(Effect.scoped(socket.reader)))
|
|
@@ -1440,10 +1440,12 @@ function getErrorResponse(
|
|
|
1440
1440
|
}
|
|
1441
1441
|
|
|
1442
1442
|
function validateSuccessResponse(schemas: ReadonlyArray<Schema.Constraint>, method: HttpMethod, payload: PayloadMap) {
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1443
|
+
const upgrades = schemas.filter(HttpApiSchema.isUpgrade)
|
|
1444
|
+
if (upgrades.length > 1) {
|
|
1445
|
+
throw new Error("Cannot declare more than one upgrade")
|
|
1446
|
+
}
|
|
1447
|
+
const hasUpgrade = upgrades.length === 1
|
|
1448
|
+
if (hasUpgrade) {
|
|
1447
1449
|
if (method === "HEAD") {
|
|
1448
1450
|
throw new Error("HEAD endpoints cannot declare an upgrade")
|
|
1449
1451
|
}
|
|
@@ -1453,7 +1455,6 @@ function validateSuccessResponse(schemas: ReadonlyArray<Schema.Constraint>, meth
|
|
|
1453
1455
|
throw new Error("Upgrade endpoints cannot declare a streaming payload")
|
|
1454
1456
|
}
|
|
1455
1457
|
}
|
|
1456
|
-
return
|
|
1457
1458
|
}
|
|
1458
1459
|
let hasStream = false
|
|
1459
1460
|
const statuses = new Map<number, {
|
|
@@ -1463,9 +1464,17 @@ function validateSuccessResponse(schemas: ReadonlyArray<Schema.Constraint>, meth
|
|
|
1463
1464
|
}>()
|
|
1464
1465
|
|
|
1465
1466
|
for (const schema of schemas) {
|
|
1467
|
+
// The server may decline the upgrade (RFC 9110 §7.8) and answer with one of the other successes.
|
|
1468
|
+
if (HttpApiSchema.isUpgrade(schema)) continue
|
|
1466
1469
|
const inner = HttpApiSchema.isWithHeaders(schema) ? schema.schema : schema
|
|
1467
1470
|
const status = HttpApiSchema.getStatusSuccessSchema(schema)
|
|
1471
|
+
if (hasUpgrade && status === 101) {
|
|
1472
|
+
throw new Error("Cannot combine an upgrade with another success response for status: 101")
|
|
1473
|
+
}
|
|
1468
1474
|
if (HttpApiSchema.isStreamSchema(inner)) {
|
|
1475
|
+
if (hasUpgrade) {
|
|
1476
|
+
throw new Error("Cannot combine an upgrade with a streaming success response")
|
|
1477
|
+
}
|
|
1469
1478
|
validateStreamSuccess(inner, method)
|
|
1470
1479
|
if (hasStream) {
|
|
1471
1480
|
throw new Error("Multiple streaming success responses are not supported")
|