effect 4.0.6 → 4.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Arbitrary.d.ts +10 -2
- package/dist/Arbitrary.d.ts.map +1 -1
- package/dist/Arbitrary.js +2 -1
- package/dist/Arbitrary.js.map +1 -1
- package/dist/Channel.d.ts.map +1 -1
- package/dist/Channel.js +21 -6
- package/dist/Channel.js.map +1 -1
- package/dist/Data.d.ts +54 -235
- package/dist/Data.d.ts.map +1 -1
- package/dist/Data.js.map +1 -1
- package/dist/Effect.d.ts +1 -1
- package/dist/Effect.js +1 -1
- package/dist/Equal.d.ts.map +1 -1
- package/dist/Equal.js +8 -1
- package/dist/Equal.js.map +1 -1
- package/dist/Exit.d.ts +3 -3
- package/dist/Exit.d.ts.map +1 -1
- package/dist/Exit.js.map +1 -1
- package/dist/Formatter.d.ts.map +1 -1
- package/dist/Formatter.js +27 -13
- package/dist/Formatter.js.map +1 -1
- package/dist/Hash.d.ts.map +1 -1
- package/dist/Hash.js +4 -1
- package/dist/Hash.js.map +1 -1
- package/dist/JsonPatch.js +4 -0
- package/dist/JsonPatch.js.map +1 -1
- package/dist/JsonSchema.d.ts.map +1 -1
- package/dist/JsonSchema.js +13 -40
- package/dist/JsonSchema.js.map +1 -1
- package/dist/Metric.d.ts +3 -3
- package/dist/MutableList.d.ts +5 -2
- package/dist/MutableList.d.ts.map +1 -1
- package/dist/MutableList.js +7 -5
- package/dist/MutableList.js.map +1 -1
- package/dist/MutableRef.d.ts.map +1 -1
- package/dist/MutableRef.js +7 -0
- package/dist/MutableRef.js.map +1 -1
- package/dist/PartitionedSemaphore.d.ts +2 -1
- package/dist/PartitionedSemaphore.d.ts.map +1 -1
- package/dist/PartitionedSemaphore.js +22 -12
- package/dist/PartitionedSemaphore.js.map +1 -1
- package/dist/Pool.d.ts.map +1 -1
- package/dist/Pool.js +77 -27
- package/dist/Pool.js.map +1 -1
- package/dist/PubSub.d.ts.map +1 -1
- package/dist/PubSub.js +5 -6
- package/dist/PubSub.js.map +1 -1
- package/dist/Ref.d.ts.map +1 -1
- package/dist/Ref.js +8 -0
- package/dist/Ref.js.map +1 -1
- package/dist/Schedule.js +1 -1
- package/dist/Schedule.js.map +1 -1
- package/dist/Schema.d.ts +24 -8
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +37 -28
- package/dist/Schema.js.map +1 -1
- package/dist/SchemaAST.d.ts +4 -2
- package/dist/SchemaAST.d.ts.map +1 -1
- package/dist/SchemaAST.js +14 -17
- package/dist/SchemaAST.js.map +1 -1
- package/dist/SchemaParser.d.ts.map +1 -1
- package/dist/SchemaParser.js +48 -22
- package/dist/SchemaParser.js.map +1 -1
- package/dist/SchemaRepresentation.d.ts +19 -10
- package/dist/SchemaRepresentation.d.ts.map +1 -1
- package/dist/SchemaRepresentation.js +23 -13
- package/dist/SchemaRepresentation.js.map +1 -1
- package/dist/SchemaTransformation.d.ts +4 -1
- package/dist/SchemaTransformation.d.ts.map +1 -1
- package/dist/SchemaTransformation.js +9 -2
- package/dist/SchemaTransformation.js.map +1 -1
- package/dist/Semaphore.d.ts.map +1 -1
- package/dist/Semaphore.js +54 -35
- package/dist/Semaphore.js.map +1 -1
- package/dist/Sink.d.ts.map +1 -1
- package/dist/Sink.js +7 -2
- package/dist/Sink.js.map +1 -1
- package/dist/Stream.d.ts.map +1 -1
- package/dist/Stream.js +22 -10
- package/dist/Stream.js.map +1 -1
- package/dist/String.d.ts +3 -0
- package/dist/String.d.ts.map +1 -1
- package/dist/String.js +3 -0
- package/dist/String.js.map +1 -1
- package/dist/Tracer.d.ts +11 -1
- package/dist/Tracer.d.ts.map +1 -1
- package/dist/Tracer.js +6 -1
- package/dist/Tracer.js.map +1 -1
- package/dist/ai/LanguageModel.d.ts.map +1 -1
- package/dist/ai/LanguageModel.js +9 -0
- package/dist/ai/LanguageModel.js.map +1 -1
- package/dist/ai/McpSchema.d.ts +110 -110
- package/dist/ai/McpSchema.d.ts.map +1 -1
- package/dist/ai/McpServer.d.ts.map +1 -1
- package/dist/ai/McpServer.js +21 -15
- package/dist/ai/McpServer.js.map +1 -1
- package/dist/ai/Prompt.d.ts +52 -0
- package/dist/ai/Prompt.d.ts.map +1 -1
- package/dist/ai/Prompt.js +38 -0
- package/dist/ai/Prompt.js.map +1 -1
- package/dist/ai/Response.d.ts +16 -3
- package/dist/ai/Response.d.ts.map +1 -1
- package/dist/ai/Response.js +4 -0
- package/dist/ai/Response.js.map +1 -1
- package/dist/ai/Tool.d.ts +24 -0
- package/dist/ai/Tool.d.ts.map +1 -1
- package/dist/ai/Tool.js +5 -2
- package/dist/ai/Tool.js.map +1 -1
- package/dist/ai/Toolkit.d.ts.map +1 -1
- package/dist/ai/Toolkit.js +8 -1
- package/dist/ai/Toolkit.js.map +1 -1
- package/dist/cli/Argument.d.ts +15 -0
- package/dist/cli/Argument.d.ts.map +1 -1
- package/dist/cli/Argument.js +5 -0
- package/dist/cli/Argument.js.map +1 -1
- package/dist/cli/CliError.d.ts +78 -0
- package/dist/cli/CliError.d.ts.map +1 -1
- package/dist/cli/CliError.js +65 -3
- package/dist/cli/CliError.js.map +1 -1
- package/dist/cli/CliOutput.d.ts +155 -6
- package/dist/cli/CliOutput.d.ts.map +1 -1
- package/dist/cli/CliOutput.js +62 -6
- package/dist/cli/CliOutput.js.map +1 -1
- package/dist/cli/Command.d.ts +24 -16
- package/dist/cli/Command.d.ts.map +1 -1
- package/dist/cli/Command.js +59 -29
- package/dist/cli/Command.js.map +1 -1
- package/dist/cli/Completions.d.ts +58 -0
- package/dist/cli/Completions.d.ts.map +1 -1
- package/dist/cli/Completions.js +49 -9
- package/dist/cli/Completions.js.map +1 -1
- package/dist/cli/Flag.d.ts +15 -0
- package/dist/cli/Flag.d.ts.map +1 -1
- package/dist/cli/Flag.js +5 -0
- package/dist/cli/Flag.js.map +1 -1
- package/dist/cli/GlobalFlag.d.ts.map +1 -1
- package/dist/cli/GlobalFlag.js +15 -7
- package/dist/cli/GlobalFlag.js.map +1 -1
- package/dist/cli/Param.d.ts +9 -0
- package/dist/cli/Param.d.ts.map +1 -1
- package/dist/cli/Param.js +21 -2
- package/dist/cli/Param.js.map +1 -1
- package/dist/cli/TerminalCapabilities.d.ts +3 -2
- package/dist/cli/TerminalCapabilities.d.ts.map +1 -1
- package/dist/cli/TerminalCapabilities.js +3 -1
- package/dist/cli/TerminalCapabilities.js.map +1 -1
- package/dist/cli/internal/completions/bash.js +73 -27
- package/dist/cli/internal/completions/bash.js.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.js +45 -10
- package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
- package/dist/cluster/MessageStorage.d.ts +23 -45
- package/dist/cluster/MessageStorage.d.ts.map +1 -1
- package/dist/cluster/MessageStorage.js +6 -7
- package/dist/cluster/MessageStorage.js.map +1 -1
- package/dist/cluster/Sharding.d.ts.map +1 -1
- package/dist/cluster/Sharding.js +61 -21
- package/dist/cluster/Sharding.js.map +1 -1
- package/dist/cluster/ShardingConfig.d.ts +10 -0
- package/dist/cluster/ShardingConfig.d.ts.map +1 -1
- package/dist/cluster/ShardingConfig.js.map +1 -1
- package/dist/cluster/Snowflake.d.ts.map +1 -1
- package/dist/cluster/Snowflake.js +3 -7
- package/dist/cluster/Snowflake.js.map +1 -1
- package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
- package/dist/cluster/SqlRunnerStorage.js +87 -39
- package/dist/cluster/SqlRunnerStorage.js.map +1 -1
- package/dist/cluster/internal/entityManager.js +54 -20
- package/dist/cluster/internal/entityManager.js.map +1 -1
- package/dist/devtools/DevToolsClient.d.ts.map +1 -1
- package/dist/devtools/DevToolsClient.js +2 -0
- package/dist/devtools/DevToolsClient.js.map +1 -1
- package/dist/encoding/Base64.js +36 -0
- package/dist/encoding/Base64.js.map +1 -1
- package/dist/encoding/Sse.d.ts.map +1 -1
- package/dist/encoding/Sse.js +3 -3
- package/dist/encoding/Sse.js.map +1 -1
- package/dist/encoding/Toml.d.ts.map +1 -1
- package/dist/encoding/Toml.js +21 -16
- package/dist/encoding/Toml.js.map +1 -1
- package/dist/eventlog/SqlEventJournal.d.ts.map +1 -1
- package/dist/eventlog/SqlEventJournal.js +47 -27
- package/dist/eventlog/SqlEventJournal.js.map +1 -1
- package/dist/eventlog/internal/conflicts.d.ts +0 -1
- package/dist/eventlog/internal/conflicts.d.ts.map +1 -1
- package/dist/eventlog/internal/conflicts.js +0 -3
- package/dist/eventlog/internal/conflicts.js.map +1 -1
- package/dist/http/Cookies.d.ts.map +1 -1
- package/dist/http/Cookies.js +10 -9
- package/dist/http/Cookies.js.map +1 -1
- package/dist/http/HttpClient.d.ts +423 -0
- package/dist/http/HttpClient.d.ts.map +1 -1
- package/dist/http/HttpClient.js +231 -7
- package/dist/http/HttpClient.js.map +1 -1
- package/dist/http/HttpClientError.d.ts +8 -1
- package/dist/http/HttpClientError.d.ts.map +1 -1
- package/dist/http/HttpClientError.js +37 -1
- package/dist/http/HttpClientError.js.map +1 -1
- package/dist/http/HttpClientRequest.d.ts.map +1 -1
- package/dist/http/HttpClientRequest.js +1 -1
- package/dist/http/HttpClientRequest.js.map +1 -1
- package/dist/http/HttpMiddleware.d.ts +1 -1
- package/dist/http/HttpMiddleware.d.ts.map +1 -1
- package/dist/http/HttpMiddleware.js +14 -16
- package/dist/http/HttpMiddleware.js.map +1 -1
- package/dist/http/HttpRouter.d.ts.map +1 -1
- package/dist/http/HttpRouter.js +2 -1
- package/dist/http/HttpRouter.js.map +1 -1
- package/dist/http/HttpServerError.js +2 -2
- package/dist/http/HttpServerError.js.map +1 -1
- package/dist/http/HttpServerRequest.d.ts +6 -1
- package/dist/http/HttpServerRequest.d.ts.map +1 -1
- package/dist/http/HttpServerRequest.js +73 -10
- package/dist/http/HttpServerRequest.js.map +1 -1
- package/dist/http/HttpStaticServer.d.ts.map +1 -1
- package/dist/http/HttpStaticServer.js +48 -21
- package/dist/http/HttpStaticServer.js.map +1 -1
- package/dist/http/MultipartParser/internal/contentType.js +3 -3
- package/dist/http/UrlParams.d.ts +3 -1
- package/dist/http/UrlParams.d.ts.map +1 -1
- package/dist/http/UrlParams.js +4 -2
- package/dist/http/UrlParams.js.map +1 -1
- package/dist/http/internal/compression.js +4 -5
- package/dist/http/internal/compression.js.map +1 -1
- package/dist/http/internal/decompression.js +3 -0
- package/dist/http/internal/decompression.js.map +1 -1
- package/dist/http/internal/httpBody.js +8 -1
- package/dist/http/internal/httpBody.js.map +1 -1
- package/dist/http/internal/urlParams.js +25 -0
- package/dist/http/internal/urlParams.js.map +1 -1
- package/dist/http-api/HttpApi.d.ts +3 -6
- package/dist/http-api/HttpApi.d.ts.map +1 -1
- package/dist/http-api/HttpApi.js +3 -6
- package/dist/http-api/HttpApi.js.map +1 -1
- package/dist/http-api/HttpApiBuilder.d.ts.map +1 -1
- package/dist/http-api/HttpApiBuilder.js +27 -11
- package/dist/http-api/HttpApiBuilder.js.map +1 -1
- package/dist/http-api/HttpApiClient.d.ts +77 -7
- package/dist/http-api/HttpApiClient.d.ts.map +1 -1
- package/dist/http-api/HttpApiClient.js +142 -44
- package/dist/http-api/HttpApiClient.js.map +1 -1
- package/dist/http-api/HttpApiEndpoint.d.ts +24 -7
- package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
- package/dist/http-api/HttpApiEndpoint.js +109 -27
- package/dist/http-api/HttpApiEndpoint.js.map +1 -1
- package/dist/http-api/HttpApiSchema.d.ts +76 -29
- package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
- package/dist/http-api/HttpApiSchema.js +70 -59
- package/dist/http-api/HttpApiSchema.js.map +1 -1
- package/dist/http-api/HttpApiTest.d.ts.map +1 -1
- package/dist/http-api/HttpApiTest.js +3 -2
- package/dist/http-api/HttpApiTest.js.map +1 -1
- package/dist/http-api/OpenApi.d.ts.map +1 -1
- package/dist/http-api/OpenApi.js +25 -16
- package/dist/http-api/OpenApi.js.map +1 -1
- package/dist/http-api/internal/toCodecHttpProperties.d.ts +2 -0
- package/dist/http-api/internal/toCodecHttpProperties.d.ts.map +1 -0
- package/dist/http-api/internal/toCodecHttpProperties.js +38 -0
- package/dist/http-api/internal/toCodecHttpProperties.js.map +1 -0
- package/dist/internal/arbitrary/runner.d.ts.map +1 -1
- package/dist/internal/arbitrary/runner.js +120 -44
- package/dist/internal/arbitrary/runner.js.map +1 -1
- package/dist/internal/core.js +2 -0
- package/dist/internal/core.js.map +1 -1
- package/dist/internal/effect.js +21 -13
- package/dist/internal/effect.js.map +1 -1
- package/dist/internal/equal.js +14 -0
- package/dist/internal/equal.js.map +1 -1
- package/dist/internal/jsonSchema.d.ts +2 -0
- package/dist/internal/jsonSchema.d.ts.map +1 -0
- package/dist/internal/jsonSchema.js +28 -0
- package/dist/internal/jsonSchema.js.map +1 -0
- package/dist/internal/matcher.js +1 -1
- package/dist/internal/matcher.js.map +1 -1
- package/dist/internal/schema/compilerRegistry.js +4 -1
- package/dist/internal/schema/compilerRegistry.js.map +1 -1
- package/dist/internal/schema/content.d.ts +2 -0
- package/dist/internal/schema/content.d.ts.map +1 -0
- package/dist/internal/schema/content.js +13 -0
- package/dist/internal/schema/content.js.map +1 -0
- package/dist/internal/schema/fromJsonSchemaDocument.js +173 -185
- package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
- package/dist/internal/schema/fromRepresentation.js +2 -1
- package/dist/internal/schema/fromRepresentation.js.map +1 -1
- package/dist/internal/schema/standardSchema.js +8 -2
- package/dist/internal/schema/standardSchema.js.map +1 -1
- package/dist/internal/schema/toCodeDocument.js +3 -3
- package/dist/internal/schema/toCodeDocument.js.map +1 -1
- package/dist/internal/schema/toCodec.js +21 -24
- package/dist/internal/schema/toCodec.js.map +1 -1
- package/dist/internal/schema/toJsonSchemaDocument.js +205 -140
- package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
- package/dist/internal/schema/toRepresentation.js +107 -129
- package/dist/internal/schema/toRepresentation.js.map +1 -1
- package/dist/internal/sql.d.ts +2 -0
- package/dist/internal/sql.d.ts.map +1 -0
- package/dist/internal/sql.js +13 -0
- package/dist/internal/sql.js.map +1 -0
- package/dist/internal/version.js +1 -1
- package/dist/observability/OtlpProxy.d.ts +154 -0
- package/dist/observability/OtlpProxy.d.ts.map +1 -0
- package/dist/observability/OtlpProxy.js +235 -0
- package/dist/observability/OtlpProxy.js.map +1 -0
- package/dist/observability/OtlpTracer.d.ts.map +1 -1
- package/dist/observability/OtlpTracer.js +4 -0
- package/dist/observability/OtlpTracer.js.map +1 -1
- package/dist/observability/index.d.ts +5 -0
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +5 -0
- package/dist/observability/index.js.map +1 -1
- package/dist/persistence/CircuitBreaker.d.ts +897 -0
- package/dist/persistence/CircuitBreaker.d.ts.map +1 -0
- package/dist/persistence/CircuitBreaker.js +1165 -0
- package/dist/persistence/CircuitBreaker.js.map +1 -0
- package/dist/persistence/Redis.d.ts +78 -2
- package/dist/persistence/Redis.d.ts.map +1 -1
- package/dist/persistence/Redis.js +62 -7
- package/dist/persistence/Redis.js.map +1 -1
- package/dist/persistence/index.d.ts +5 -0
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +5 -0
- package/dist/persistence/index.js.map +1 -1
- package/dist/process/ChildProcess.d.ts +30 -4
- package/dist/process/ChildProcess.d.ts.map +1 -1
- package/dist/process/ChildProcess.js.map +1 -1
- package/dist/process/ChildProcessSpawner.d.ts +30 -0
- package/dist/process/ChildProcessSpawner.d.ts.map +1 -1
- package/dist/process/ChildProcessSpawner.js +5 -2
- package/dist/process/ChildProcessSpawner.js.map +1 -1
- package/dist/reactivity/AsyncResult.d.ts +1 -1
- package/dist/reactivity/AsyncResult.d.ts.map +1 -1
- package/dist/rpc/RpcClient.d.ts.map +1 -1
- package/dist/rpc/RpcClient.js +9 -8
- package/dist/rpc/RpcClient.js.map +1 -1
- package/dist/rpc/RpcSerialization.d.ts +14 -0
- package/dist/rpc/RpcSerialization.d.ts.map +1 -1
- package/dist/rpc/RpcSerialization.js +20 -8
- package/dist/rpc/RpcSerialization.js.map +1 -1
- package/dist/rpc/RpcServer.d.ts.map +1 -1
- package/dist/rpc/RpcServer.js +11 -1
- package/dist/rpc/RpcServer.js.map +1 -1
- package/dist/rpc/RpcTest.d.ts +1 -0
- package/dist/rpc/RpcTest.d.ts.map +1 -1
- package/dist/rpc/RpcTest.js +1 -0
- package/dist/rpc/RpcTest.js.map +1 -1
- package/dist/sql/Migrator.d.ts +2 -1
- package/dist/sql/Migrator.d.ts.map +1 -1
- package/dist/sql/Migrator.js +11 -8
- package/dist/sql/Migrator.js.map +1 -1
- package/dist/sql/SqlClient.d.ts +9 -4
- package/dist/sql/SqlClient.d.ts.map +1 -1
- package/dist/sql/SqlClient.js +8 -1
- package/dist/sql/SqlClient.js.map +1 -1
- package/dist/sql/SqlResolver.d.ts +4 -0
- package/dist/sql/SqlResolver.d.ts.map +1 -1
- package/dist/sql/SqlResolver.js +18 -4
- package/dist/sql/SqlResolver.js.map +1 -1
- package/dist/sql/Statement.d.ts +7 -0
- package/dist/sql/Statement.d.ts.map +1 -1
- package/dist/sql/Statement.js +21 -2
- package/dist/sql/Statement.js.map +1 -1
- package/dist/workflow/DurableDeferred.d.ts.map +1 -1
- package/dist/workflow/DurableDeferred.js +21 -2
- package/dist/workflow/DurableDeferred.js.map +1 -1
- package/package.json +1 -1
- package/src/Arbitrary.ts +10 -2
- package/src/Channel.ts +47 -18
- package/src/Data.ts +60 -265
- package/src/Effect.ts +1 -1
- package/src/Equal.ts +8 -1
- package/src/Exit.ts +3 -3
- package/src/Formatter.ts +28 -13
- package/src/Hash.ts +4 -1
- package/src/JsonPatch.ts +4 -0
- package/src/JsonSchema.ts +12 -40
- package/src/Metric.ts +3 -3
- package/src/MutableList.ts +7 -5
- package/src/MutableRef.ts +8 -1
- package/src/PartitionedSemaphore.ts +24 -13
- package/src/Pool.ts +109 -37
- package/src/PubSub.ts +5 -6
- package/src/Ref.ts +8 -0
- package/src/Schedule.ts +1 -1
- package/src/Schema.ts +48 -25
- package/src/SchemaAST.ts +20 -20
- package/src/SchemaParser.ts +51 -18
- package/src/SchemaRepresentation.ts +31 -34
- package/src/SchemaTransformation.ts +9 -2
- package/src/Semaphore.ts +67 -40
- package/src/Sink.ts +15 -2
- package/src/Stream.ts +33 -16
- package/src/String.ts +3 -0
- package/src/Tracer.ts +15 -1
- package/src/ai/LanguageModel.ts +9 -0
- package/src/ai/McpServer.ts +14 -13
- package/src/ai/Prompt.ts +65 -0
- package/src/ai/Response.ts +34 -9
- package/src/ai/Tool.ts +38 -2
- package/src/ai/Toolkit.ts +4 -1
- package/src/cli/Argument.ts +15 -0
- package/src/cli/CliError.ts +90 -3
- package/src/cli/CliOutput.ts +183 -6
- package/src/cli/Command.ts +53 -41
- package/src/cli/Completions.ts +51 -0
- package/src/cli/Flag.ts +15 -0
- package/src/cli/GlobalFlag.ts +6 -7
- package/src/cli/Param.ts +29 -6
- package/src/cli/TerminalCapabilities.ts +6 -3
- package/src/cli/internal/completions/bash.ts +79 -29
- package/src/cluster/ClusterWorkflowEngine.ts +46 -16
- package/src/cluster/MessageStorage.ts +19 -14
- package/src/cluster/Sharding.ts +83 -21
- package/src/cluster/ShardingConfig.ts +5 -0
- package/src/cluster/Snowflake.ts +3 -7
- package/src/cluster/SqlRunnerStorage.ts +110 -47
- package/src/cluster/internal/entityManager.ts +75 -22
- package/src/devtools/DevToolsClient.ts +2 -0
- package/src/encoding/Base64.ts +38 -0
- package/src/encoding/Sse.ts +4 -3
- package/src/encoding/Toml.ts +33 -16
- package/src/eventlog/SqlEventJournal.ts +68 -45
- package/src/eventlog/internal/conflicts.ts +0 -4
- package/src/http/Cookies.ts +10 -11
- package/src/http/HttpClient.ts +547 -7
- package/src/http/HttpClientError.ts +35 -1
- package/src/http/HttpClientRequest.ts +9 -1
- package/src/http/HttpMiddleware.ts +15 -18
- package/src/http/HttpRouter.ts +2 -1
- package/src/http/HttpServerError.ts +2 -2
- package/src/http/HttpServerRequest.ts +102 -16
- package/src/http/HttpStaticServer.ts +51 -22
- package/src/http/MultipartParser/internal/contentType.ts +3 -3
- package/src/http/UrlParams.ts +6 -1
- package/src/http/internal/compression.ts +4 -5
- package/src/http/internal/decompression.ts +6 -0
- package/src/http/internal/httpBody.ts +10 -2
- package/src/http/internal/urlParams.ts +29 -0
- package/src/http-api/HttpApi.ts +3 -6
- package/src/http-api/HttpApiBuilder.ts +45 -15
- package/src/http-api/HttpApiClient.ts +218 -72
- package/src/http-api/HttpApiEndpoint.ts +121 -30
- package/src/http-api/HttpApiSchema.ts +141 -48
- package/src/http-api/HttpApiTest.ts +3 -2
- package/src/http-api/OpenApi.ts +20 -17
- package/src/http-api/internal/toCodecHttpProperties.ts +56 -0
- package/src/internal/arbitrary/runner.ts +133 -36
- package/src/internal/core.ts +2 -0
- package/src/internal/effect.ts +24 -16
- package/src/internal/equal.ts +17 -0
- package/src/internal/jsonSchema.ts +27 -0
- package/src/internal/matcher.ts +1 -1
- package/src/internal/schema/compilerRegistry.ts +6 -1
- package/src/internal/schema/content.ts +18 -0
- package/src/internal/schema/fromJsonSchemaDocument.ts +228 -190
- package/src/internal/schema/fromRepresentation.ts +2 -1
- package/src/internal/schema/standardSchema.ts +2 -2
- package/src/internal/schema/toCodeDocument.ts +4 -4
- package/src/internal/schema/toCodec.ts +26 -22
- package/src/internal/schema/toJsonSchemaDocument.ts +189 -167
- package/src/internal/schema/toRepresentation.ts +122 -140
- package/src/internal/sql.ts +14 -0
- package/src/internal/version.ts +1 -1
- package/src/observability/OtlpProxy.ts +314 -0
- package/src/observability/OtlpTracer.ts +4 -0
- package/src/observability/index.ts +6 -0
- package/src/persistence/CircuitBreaker.ts +1678 -0
- package/src/persistence/Redis.ts +129 -8
- package/src/persistence/index.ts +6 -0
- package/src/process/ChildProcess.ts +30 -4
- package/src/process/ChildProcessSpawner.ts +41 -2
- package/src/reactivity/AsyncResult.ts +1 -1
- package/src/rpc/RpcClient.ts +13 -10
- package/src/rpc/RpcSerialization.ts +32 -9
- package/src/rpc/RpcServer.ts +16 -1
- package/src/rpc/RpcTest.ts +3 -0
- package/src/sql/Migrator.ts +12 -7
- package/src/sql/SqlClient.ts +11 -4
- package/src/sql/SqlResolver.ts +23 -9
- package/src/sql/Statement.ts +30 -2
- package/src/workflow/DurableDeferred.ts +23 -6
|
@@ -90,19 +90,33 @@ export const layer = <Id extends string, Groups extends HttpApiGroup.Constraint>
|
|
|
90
90
|
| Path
|
|
91
91
|
>()
|
|
92
92
|
const routes: Array<HttpRouter.Route<any, any>> = []
|
|
93
|
+
const routeOwners = new Map<string, string>()
|
|
93
94
|
const availableGroups = Array.from(services.mapUnsafe.keys()).filter((key) =>
|
|
94
95
|
key.startsWith("effect/http-api/HttpApiGroup/")
|
|
95
96
|
)
|
|
96
97
|
const groups = Object.values(api.groups) as ReadonlyArray<HttpApiGroup.Top>
|
|
97
98
|
for (const group of groups) {
|
|
98
|
-
const
|
|
99
|
-
if (
|
|
99
|
+
const service = services.mapUnsafe.get(group.key) as GroupService | undefined
|
|
100
|
+
if (service === undefined) {
|
|
100
101
|
const available = availableGroups.length === 0 ? "none" : availableGroups.join(", ")
|
|
101
102
|
return yield* Effect.die(
|
|
102
103
|
`HttpApiGroup "${group.identifier}" not found (key: "${group.key}"). Did you forget to provide HttpApiBuilder.group(api, "${group.identifier}", ...)? Available groups: ${available}`
|
|
103
104
|
)
|
|
104
105
|
}
|
|
105
|
-
|
|
106
|
+
for (const { endpoint } of service.handlers.values()) {
|
|
107
|
+
const owner = `${group.identifier}.${endpoint.identifier}`
|
|
108
|
+
const key = `${endpoint.method} ${HttpApiPath.toRouterPath(endpoint.path, endpoint.params)}`
|
|
109
|
+
const existing = routeOwners.get(key)
|
|
110
|
+
if (existing !== undefined) {
|
|
111
|
+
return yield* Effect.die(
|
|
112
|
+
new Error(
|
|
113
|
+
`HttpApiEndpoint "${owner}" (${endpoint.method} ${endpoint.path}) has the same method and path as "${existing}". Declare one endpoint whose query, headers, payload or success schemas cover each variant instead.`
|
|
114
|
+
)
|
|
115
|
+
)
|
|
116
|
+
}
|
|
117
|
+
routeOwners.set(key, owner)
|
|
118
|
+
}
|
|
119
|
+
routes.push(...service.routes)
|
|
106
120
|
}
|
|
107
121
|
yield* (router.addAll(routes) as Effect.Effect<void>)
|
|
108
122
|
if (options?.openapiPath) {
|
|
@@ -159,12 +173,8 @@ export const group = <
|
|
|
159
173
|
for (const item of handlers.handlers.values()) {
|
|
160
174
|
routes.push(handlerToRoute(api, group as any, item, services))
|
|
161
175
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
routes,
|
|
165
|
-
handlers: handlers.handlers
|
|
166
|
-
}]])
|
|
167
|
-
)
|
|
176
|
+
const service: GroupService = { routes, handlers: handlers.handlers }
|
|
177
|
+
return Context.makeUnsafe(new Map([[group.key, service]]))
|
|
168
178
|
})) as any
|
|
169
179
|
|
|
170
180
|
/**
|
|
@@ -245,6 +255,14 @@ export interface HandlerRuntime {
|
|
|
245
255
|
readonly uninterruptible: boolean
|
|
246
256
|
}
|
|
247
257
|
|
|
258
|
+
/**
|
|
259
|
+
* @internal
|
|
260
|
+
*/
|
|
261
|
+
export interface GroupService {
|
|
262
|
+
readonly routes: Array<HttpRouter.Route<any, any>>
|
|
263
|
+
readonly handlers: Map<string, HandlerRuntime>
|
|
264
|
+
}
|
|
265
|
+
|
|
248
266
|
type HandleAllEntry<Endpoint extends HttpApiEndpoint.Constraint> =
|
|
249
267
|
| HttpApiEndpoint.Handler<
|
|
250
268
|
Endpoint,
|
|
@@ -939,6 +957,10 @@ function handlerToHttpEffect(
|
|
|
939
957
|
const encodeStream = makeStreamEncoder(endpoint, options.success)
|
|
940
958
|
const encodeWithHeaders = makeWithHeadersEncoder(endpoint, options.success, options.headers)
|
|
941
959
|
const upgrade = getUpgradeSuccessSchema(endpoint)
|
|
960
|
+
const encodeUpgradeHeaders = UndefinedOr.map(
|
|
961
|
+
upgrade?.headers,
|
|
962
|
+
(schema) => Schema.encodeUnknownEffect(schema, options.headers)
|
|
963
|
+
)
|
|
942
964
|
|
|
943
965
|
const shouldParsePayload = endpoint.payload.size > 0 && !isRaw
|
|
944
966
|
const payloadBy = shouldParsePayload ? buildPayloadDecoders(endpoint.payload, options.payload) : undefined
|
|
@@ -967,6 +989,20 @@ function handlerToHttpEffect(
|
|
|
967
989
|
if (decodeQuery) {
|
|
968
990
|
request.query = yield* HttpApiSchemaError.wrap("Query", decodeQuery(query))
|
|
969
991
|
}
|
|
992
|
+
if (upgrade !== undefined) {
|
|
993
|
+
if (!isUpgradeRequest(httpRequest, upgrade.protocol)) {
|
|
994
|
+
return upgradeRequired(upgrade.protocol)
|
|
995
|
+
}
|
|
996
|
+
request.upgrade = (options?: { readonly headers?: unknown }) =>
|
|
997
|
+
Effect.orDie(
|
|
998
|
+
encodeUpgradeHeaders === undefined
|
|
999
|
+
? httpRequest.upgrade
|
|
1000
|
+
: Effect.flatMap(
|
|
1001
|
+
HttpApiSchemaError.wrap("ResponseHeaders", encodeUpgradeHeaders(options?.headers)),
|
|
1002
|
+
(headers) => httpRequest.upgradeWith({ headers: headers as Record<string, string> })
|
|
1003
|
+
)
|
|
1004
|
+
)
|
|
1005
|
+
}
|
|
970
1006
|
if (payloadBy) {
|
|
971
1007
|
const result = decodePayload(payloadBy, httpRequest, query)
|
|
972
1008
|
if (Response.isHttpServerResponse(result)) {
|
|
@@ -976,12 +1012,6 @@ function handlerToHttpEffect(
|
|
|
976
1012
|
request.payload = yield* HttpApiSchemaError.wrap("Payload", result)
|
|
977
1013
|
}
|
|
978
1014
|
}
|
|
979
|
-
if (upgrade !== undefined) {
|
|
980
|
-
if (!isUpgradeRequest(httpRequest, upgrade.protocol)) {
|
|
981
|
-
return upgradeRequired(upgrade.protocol)
|
|
982
|
-
}
|
|
983
|
-
request.socket = yield* Effect.orDie(httpRequest.upgrade)
|
|
984
|
-
}
|
|
985
1015
|
let response = yield* handler(request)
|
|
986
1016
|
if (Response.isHttpServerResponse(response)) {
|
|
987
1017
|
return response
|
|
@@ -102,7 +102,7 @@ export type SuccessType<S> = S extends HttpApiSchema.WithHeaders<
|
|
|
102
102
|
: S extends HttpApiSchema.StreamUint8Array ? Stream.Stream<Uint8Array, HttpClientError.HttpClientError, never>
|
|
103
103
|
: S extends HttpApiSchema.StreamNdjson<infer _S> ?
|
|
104
104
|
Stream.Stream<_S["Type"], HttpClientError.HttpClientError | Schema.SchemaError, never>
|
|
105
|
-
: S extends HttpApiSchema.Upgrade ? Upgraded
|
|
105
|
+
: S extends HttpApiSchema.Upgrade<infer _Headers> ? [_Headers] extends [never] ? Upgraded : Upgraded<_Headers["Type"]>
|
|
106
106
|
: S extends Schema.Constraint ? S["Type"]
|
|
107
107
|
: never
|
|
108
108
|
|
|
@@ -113,15 +113,16 @@ export type SuccessType<S> = S extends HttpApiSchema.WithHeaders<
|
|
|
113
113
|
*
|
|
114
114
|
* **Details**
|
|
115
115
|
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
116
|
+
* `headers` is decoded with the upgrade's `headers` schema when it declares
|
|
117
|
+
* one. See `HttpClientResponse.upgrade` for how the connection behaves and
|
|
118
|
+
* when it closes.
|
|
118
119
|
*
|
|
119
120
|
* @stability unstable
|
|
120
121
|
* @category models
|
|
121
122
|
* @since 4.0.6
|
|
122
123
|
*/
|
|
123
|
-
export interface Upgraded {
|
|
124
|
-
readonly headers: Headers
|
|
124
|
+
export interface Upgraded<Headers = Headers.Headers> {
|
|
125
|
+
readonly headers: Headers
|
|
125
126
|
readonly socket: Socket.Socket
|
|
126
127
|
}
|
|
127
128
|
|
|
@@ -134,9 +135,16 @@ type SuccessDecodingServices<S> = S extends HttpApiSchema.StreamSse<
|
|
|
134
135
|
| _Error["DecodingServices"]
|
|
135
136
|
: S extends HttpApiSchema.StreamUint8Array ? never
|
|
136
137
|
: S extends HttpApiSchema.StreamNdjson<infer _S> ? _S["DecodingServices"]
|
|
138
|
+
: S extends HttpApiSchema.Upgrade<infer _Headers> ? _Headers["DecodingServices"]
|
|
137
139
|
: S extends Schema.Constraint ? S["DecodingServices"]
|
|
138
140
|
: never
|
|
139
141
|
|
|
142
|
+
// An uninferred type parameter is instantiated with its constraint, so methods
|
|
143
|
+
// without a streaming payload must constrain `PayloadR` to `never`. `StreamNdjson<any>`
|
|
144
|
+
// also matches item schemas that are only a `Schema.Constraint` (`disableCodecs`)
|
|
145
|
+
type PayloadServicesConstraint<Payload> =
|
|
146
|
+
[Extract<Payload, HttpApiSchema.StreamUint8Array | HttpApiSchema.StreamNdjson<any>>] extends [never] ? never : unknown
|
|
147
|
+
|
|
140
148
|
/**
|
|
141
149
|
* Helper types used to describe generated HTTP API clients, including endpoint
|
|
142
150
|
* methods, response modes, and grouped client shapes.
|
|
@@ -228,7 +236,10 @@ export declare namespace Client {
|
|
|
228
236
|
Endpoint extends HttpApiEndpoint.ConstraintRequest,
|
|
229
237
|
E,
|
|
230
238
|
R
|
|
231
|
-
> = <
|
|
239
|
+
> = <
|
|
240
|
+
Mode extends ResponseMode = "decoded-only",
|
|
241
|
+
PayloadR extends PayloadServicesConstraint<Endpoint["~Payload"]> = never
|
|
242
|
+
>(
|
|
232
243
|
request: Simplify<
|
|
233
244
|
HttpApiEndpoint.ClientRequest<
|
|
234
245
|
Endpoint["~Params"],
|
|
@@ -239,7 +250,7 @@ export declare namespace Client {
|
|
|
239
250
|
PayloadR
|
|
240
251
|
>
|
|
241
252
|
>
|
|
242
|
-
) => MethodReturn<Endpoint, E, R, Mode, PayloadR
|
|
253
|
+
) => MethodReturn<Endpoint, E, R, Mode, NoInfer<PayloadR>>
|
|
243
254
|
|
|
244
255
|
/**
|
|
245
256
|
* Extracts client methods for endpoints in top-level groups so they can be exposed
|
|
@@ -387,71 +398,11 @@ export const makeClient = <ApiId extends string, Groups extends HttpApiGroup.Con
|
|
|
387
398
|
options.onGroup?.(onGroupOptions)
|
|
388
399
|
},
|
|
389
400
|
onEndpoint(onEndpointOptions) {
|
|
390
|
-
const { group, endpoint,
|
|
401
|
+
const { group, endpoint, mergedAnnotations } = onEndpointOptions
|
|
391
402
|
const parseOptions = HttpApi.getSlotParseOptions(mergedAnnotations)
|
|
392
403
|
const makeUrl = compilePath(endpoint.path, endpoint.params)
|
|
393
|
-
const decodeMap: Record<number | "orElse", ResponseDecoder> = { orElse: statusOrElse }
|
|
394
|
-
const errorAlternatives = new Map<number, Array<ResponseAlternative>>()
|
|
395
|
-
for (const [status, schemas] of errors.entries()) {
|
|
396
|
-
const grouped = groupSchemasByContentType(schemas)
|
|
397
|
-
for (const [contentType, schemas] of grouped.entries()) {
|
|
398
|
-
addResponseAlternative(
|
|
399
|
-
errorAlternatives,
|
|
400
|
-
status,
|
|
401
|
-
contentType,
|
|
402
|
-
schemasToResponse(schemas, parseOptions.error, parseOptions.headers)
|
|
403
|
-
)
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
for (const [status, alternatives] of errorAlternatives.entries()) {
|
|
407
|
-
const decode = makeResponseDecoder(alternatives)
|
|
408
|
-
decodeMap[status] = (response) =>
|
|
409
|
-
Effect.flatMap(
|
|
410
|
-
Effect.catchCause(decode(response), (cause) =>
|
|
411
|
-
Effect.failCause(Cause.combine(
|
|
412
|
-
Cause.fail(
|
|
413
|
-
new HttpClientError.HttpClientError({
|
|
414
|
-
reason: new HttpClientError.StatusCodeError({
|
|
415
|
-
request: response.request,
|
|
416
|
-
response
|
|
417
|
-
})
|
|
418
|
-
})
|
|
419
|
-
),
|
|
420
|
-
cause
|
|
421
|
-
))),
|
|
422
|
-
Effect.fail
|
|
423
|
-
)
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
const successAlternatives = new Map<number, Array<ResponseAlternative>>()
|
|
427
|
-
for (const [status, schemas] of successes.entries()) {
|
|
428
|
-
const grouped = groupSchemasByContentType(schemas)
|
|
429
|
-
for (const [contentType, schemas] of grouped.entries()) {
|
|
430
|
-
addResponseAlternative(
|
|
431
|
-
successAlternatives,
|
|
432
|
-
status,
|
|
433
|
-
contentType,
|
|
434
|
-
schemasToResponse(schemas, parseOptions.success, parseOptions.headers)
|
|
435
|
-
)
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
for (const streamSuccess of getStreamSuccessSchemas(endpoint)) {
|
|
439
|
-
const streamSchema = isWithHeadersStreamSuccess(streamSuccess) ? streamSuccess.schema : streamSuccess
|
|
440
|
-
addResponseAlternative(
|
|
441
|
-
successAlternatives,
|
|
442
|
-
HttpApiSchema.getStatusSuccessSchema(streamSuccess),
|
|
443
|
-
streamSchema.contentType,
|
|
444
|
-
streamToResponse(streamSuccess, parseOptions.success, parseOptions.headers)
|
|
445
|
-
)
|
|
446
|
-
}
|
|
447
|
-
for (const [status, alternatives] of successAlternatives.entries()) {
|
|
448
|
-
decodeMap[status] = makeResponseDecoder(alternatives)
|
|
449
|
-
}
|
|
450
404
|
const upgrade = getUpgradeSuccessSchema(endpoint)
|
|
451
|
-
|
|
452
|
-
decodeMap[101] = (response) =>
|
|
453
|
-
Effect.map(response.upgrade, (socket): Upgraded => ({ headers: response.headers, socket }))
|
|
454
|
-
}
|
|
405
|
+
const decodeEndpointResponse = makeEndpointDecoder(onEndpointOptions)
|
|
455
406
|
|
|
456
407
|
const encodeParams = UndefinedOr.map(
|
|
457
408
|
endpoint.params,
|
|
@@ -570,7 +521,7 @@ export const makeClient = <ApiId extends string, Groups extends HttpApiGroup.Con
|
|
|
570
521
|
return response
|
|
571
522
|
}
|
|
572
523
|
|
|
573
|
-
const decoded = (
|
|
524
|
+
const decoded = decodeEndpointResponse(response, request?.sseOptions)
|
|
574
525
|
const value = yield* (options.transformResponse === undefined
|
|
575
526
|
? decoded
|
|
576
527
|
: options.transformResponse(decoded))
|
|
@@ -748,6 +699,111 @@ export const endpoint = <
|
|
|
748
699
|
}).pipe(Effect.map(() => client)) as any
|
|
749
700
|
}
|
|
750
701
|
|
|
702
|
+
type DecodeResponse<
|
|
703
|
+
Groups extends HttpApiGroup.Constraint,
|
|
704
|
+
GroupIdentifier extends HttpApiGroup.Identifier<Groups>,
|
|
705
|
+
EndpointIdentifier extends HttpApiGroup.EndpointsWithIdentifier<Groups, GroupIdentifier>["identifier"],
|
|
706
|
+
Endpoint extends HttpApiEndpoint.ConstraintRequest = Extract<
|
|
707
|
+
HttpApiEndpoint.WithIdentifier<HttpApiGroup.EndpointsWithIdentifier<Groups, GroupIdentifier>, EndpointIdentifier>,
|
|
708
|
+
HttpApiEndpoint.ConstraintRequest
|
|
709
|
+
>
|
|
710
|
+
> = (
|
|
711
|
+
response: HttpClientResponse.HttpClientResponse,
|
|
712
|
+
options?: {
|
|
713
|
+
readonly sseOptions?: Sse.DecodeOptions | undefined
|
|
714
|
+
}
|
|
715
|
+
) => Effect.Effect<
|
|
716
|
+
SuccessType<Endpoint["~Success"]>,
|
|
717
|
+
HttpApiEndpoint.Errors<Endpoint> | HttpClientError.HttpClientError | Schema.SchemaError,
|
|
718
|
+
SuccessDecodingServices<Endpoint["~Success"]> | HttpApiEndpoint.ErrorServicesDecode<Endpoint>
|
|
719
|
+
>
|
|
720
|
+
|
|
721
|
+
/**
|
|
722
|
+
* Builds a decoder for raw responses of one endpoint in one API group, using
|
|
723
|
+
* the same success and error decoding as a generated client method in
|
|
724
|
+
* `"decoded-only"` mode.
|
|
725
|
+
*
|
|
726
|
+
* **When to use**
|
|
727
|
+
*
|
|
728
|
+
* Use with `responseMode: "response-only"` when the response head and body
|
|
729
|
+
* arrive at different times, such as long polling, and the body should be
|
|
730
|
+
* decoded later.
|
|
731
|
+
*
|
|
732
|
+
* **Details**
|
|
733
|
+
*
|
|
734
|
+
* The response does not need to come from a generated client. Declared error
|
|
735
|
+
* responses fail with the decoded error, and undeclared statuses fail with an
|
|
736
|
+
* `HttpClientError` whose reason is a `DecodeError`. Parse options are resolved
|
|
737
|
+
* from the API, group and endpoint annotations. The body is only read when the
|
|
738
|
+
* returned effect runs, so it must run inside the scope that owns the response.
|
|
739
|
+
* Middleware and `transformResponse` are not applied.
|
|
740
|
+
*
|
|
741
|
+
* Building the decoder walks the API declaration, so build it once per
|
|
742
|
+
* endpoint and reuse it.
|
|
743
|
+
*
|
|
744
|
+
* **Example** (Decoding a response body after the head arrives)
|
|
745
|
+
*
|
|
746
|
+
* ```ts import.meta.vitest
|
|
747
|
+
* import { Effect, Schema } from "effect"
|
|
748
|
+
* import { HttpApi, HttpApiClient, HttpApiEndpoint, HttpApiGroup } from "effect/http-api"
|
|
749
|
+
*
|
|
750
|
+
* const Api = HttpApi.make("Api").add(
|
|
751
|
+
* HttpApiGroup.make("containers").add(
|
|
752
|
+
* HttpApiEndpoint.post("wait", "/containers/:id/wait", {
|
|
753
|
+
* params: { id: Schema.String },
|
|
754
|
+
* success: Schema.Struct({ StatusCode: Schema.Number })
|
|
755
|
+
* })
|
|
756
|
+
* )
|
|
757
|
+
* )
|
|
758
|
+
*
|
|
759
|
+
* const decodeWait = HttpApiClient.decodeResponse(Api, {
|
|
760
|
+
* group: "containers",
|
|
761
|
+
* endpoint: "wait"
|
|
762
|
+
* })
|
|
763
|
+
*
|
|
764
|
+
* const program = Effect.gen(function*() {
|
|
765
|
+
* const client = yield* HttpApiClient.make(Api)
|
|
766
|
+
* // Succeeds as soon as the response head arrives
|
|
767
|
+
* const response = yield* client.containers.wait({
|
|
768
|
+
* params: { id: "my-container" },
|
|
769
|
+
* responseMode: "response-only"
|
|
770
|
+
* })
|
|
771
|
+
* // Waits for the body, then decodes it with the endpoint schemas
|
|
772
|
+
* return yield* decodeWait(response)
|
|
773
|
+
* })
|
|
774
|
+
* ```
|
|
775
|
+
*
|
|
776
|
+
* @stability unstable
|
|
777
|
+
* @category constructors
|
|
778
|
+
* @since 4.0.7
|
|
779
|
+
*/
|
|
780
|
+
export const decodeResponse = <
|
|
781
|
+
ApiId extends string,
|
|
782
|
+
Groups extends HttpApiGroup.Constraint,
|
|
783
|
+
const GroupIdentifier extends HttpApiGroup.Identifier<Groups>,
|
|
784
|
+
const EndpointIdentifier extends HttpApiGroup.EndpointsWithIdentifier<Groups, GroupIdentifier>["identifier"]
|
|
785
|
+
>(
|
|
786
|
+
api: HttpApi.HttpApi<ApiId, Groups>,
|
|
787
|
+
options: {
|
|
788
|
+
readonly group: GroupIdentifier
|
|
789
|
+
readonly endpoint: EndpointIdentifier
|
|
790
|
+
}
|
|
791
|
+
): DecodeResponse<Groups, GroupIdentifier, EndpointIdentifier> => {
|
|
792
|
+
let decode: ResponseDecoder | undefined
|
|
793
|
+
HttpApi.reflect(api, {
|
|
794
|
+
predicate: ({ endpoint, group }) => group.identifier === options.group && endpoint.identifier === options.endpoint,
|
|
795
|
+
onGroup() {},
|
|
796
|
+
onEndpoint(endpointOptions) {
|
|
797
|
+
decode = makeEndpointDecoder(endpointOptions)
|
|
798
|
+
}
|
|
799
|
+
})
|
|
800
|
+
return ((response, decodeOptions) => decode!(response, decodeOptions?.sseOptions)) as DecodeResponse<
|
|
801
|
+
Groups,
|
|
802
|
+
GroupIdentifier,
|
|
803
|
+
EndpointIdentifier
|
|
804
|
+
>
|
|
805
|
+
}
|
|
806
|
+
|
|
751
807
|
/**
|
|
752
808
|
* Creates a type-safe URL builder that mirrors `HttpApiClient.make`.
|
|
753
809
|
*
|
|
@@ -845,6 +901,10 @@ const compilePath = (path: string, schema: Schema.Top | undefined) => {
|
|
|
845
901
|
return (params: Record<string, string | undefined>) =>
|
|
846
902
|
HttpApiPath.replaceParams(path, paramNames, (key, optional) => {
|
|
847
903
|
const value = params[key]
|
|
904
|
+
if (value === "." || value === "..") {
|
|
905
|
+
// dot segments survive encoding and would be resolved by URL normalization
|
|
906
|
+
throw new Error(`Invalid path parameter: ${key}`)
|
|
907
|
+
}
|
|
848
908
|
if (value !== undefined) return encodeURIComponent(value)
|
|
849
909
|
if (optional) return undefined
|
|
850
910
|
throw new Error(`Missing path parameter: ${key}`)
|
|
@@ -907,6 +967,91 @@ function toCodecArrayBufferWithHeaders(
|
|
|
907
967
|
))
|
|
908
968
|
}
|
|
909
969
|
|
|
970
|
+
const makeEndpointDecoder = (options: {
|
|
971
|
+
readonly endpoint: HttpApiEndpoint.Top
|
|
972
|
+
readonly mergedAnnotations: Context.Context<never>
|
|
973
|
+
readonly successes: ReadonlyMap<number, readonly [Schema.Top, ...Array<Schema.Top>]>
|
|
974
|
+
readonly errors: ReadonlyMap<number, readonly [Schema.Top, ...Array<Schema.Top>]>
|
|
975
|
+
}): ResponseDecoder => {
|
|
976
|
+
const { endpoint, errors, successes, mergedAnnotations } = options
|
|
977
|
+
const parseOptions = HttpApi.getSlotParseOptions(mergedAnnotations)
|
|
978
|
+
const decodeMap: Record<number | "orElse", ResponseDecoder> = { orElse: statusOrElse }
|
|
979
|
+
const errorAlternatives = new Map<number, Array<ResponseAlternative>>()
|
|
980
|
+
for (const [status, schemas] of errors.entries()) {
|
|
981
|
+
const grouped = groupSchemasByContentType(schemas)
|
|
982
|
+
for (const [contentType, schemas] of grouped.entries()) {
|
|
983
|
+
addResponseAlternative(
|
|
984
|
+
errorAlternatives,
|
|
985
|
+
status,
|
|
986
|
+
contentType,
|
|
987
|
+
schemasToResponse(schemas, parseOptions.error, parseOptions.headers)
|
|
988
|
+
)
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
for (const [status, alternatives] of errorAlternatives.entries()) {
|
|
992
|
+
const decode = makeResponseDecoder(alternatives)
|
|
993
|
+
decodeMap[status] = (response) =>
|
|
994
|
+
Effect.flatMap(
|
|
995
|
+
Effect.catchCause(decode(response), (cause) =>
|
|
996
|
+
Effect.failCause(Cause.combine(
|
|
997
|
+
Cause.fail(
|
|
998
|
+
new HttpClientError.HttpClientError({
|
|
999
|
+
reason: new HttpClientError.StatusCodeError({
|
|
1000
|
+
request: response.request,
|
|
1001
|
+
response
|
|
1002
|
+
})
|
|
1003
|
+
})
|
|
1004
|
+
),
|
|
1005
|
+
cause
|
|
1006
|
+
))),
|
|
1007
|
+
Effect.fail
|
|
1008
|
+
)
|
|
1009
|
+
}
|
|
1010
|
+
|
|
1011
|
+
const successAlternatives = new Map<number, Array<ResponseAlternative>>()
|
|
1012
|
+
for (const [status, schemas] of successes.entries()) {
|
|
1013
|
+
const grouped = groupSchemasByContentType(schemas)
|
|
1014
|
+
for (const [contentType, schemas] of grouped.entries()) {
|
|
1015
|
+
addResponseAlternative(
|
|
1016
|
+
successAlternatives,
|
|
1017
|
+
status,
|
|
1018
|
+
contentType,
|
|
1019
|
+
schemasToResponse(schemas, parseOptions.success, parseOptions.headers)
|
|
1020
|
+
)
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
for (const streamSuccess of getStreamSuccessSchemas(endpoint)) {
|
|
1024
|
+
const streamSchema = isWithHeadersStreamSuccess(streamSuccess) ? streamSuccess.schema : streamSuccess
|
|
1025
|
+
const status = HttpApiSchema.getStatusSuccessSchema(streamSuccess)
|
|
1026
|
+
const decode = streamToResponse(streamSuccess, parseOptions.success, parseOptions.headers)
|
|
1027
|
+
for (const contentType of streamSchema.contentTypes) {
|
|
1028
|
+
addResponseAlternative(successAlternatives, status, contentType, decode)
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
for (const [status, alternatives] of successAlternatives.entries()) {
|
|
1032
|
+
decodeMap[status] = makeResponseDecoder(alternatives)
|
|
1033
|
+
}
|
|
1034
|
+
const upgrade = getUpgradeSuccessSchema(endpoint)
|
|
1035
|
+
if (upgrade !== undefined) {
|
|
1036
|
+
const decodeHeaders = upgrade.headers === undefined
|
|
1037
|
+
? Effect.succeed
|
|
1038
|
+
: Schema.decodeUnknownEffect(upgrade.headers, parseOptions.headers)
|
|
1039
|
+
decodeMap[101] = (response) =>
|
|
1040
|
+
// the cleanup must be in place before an interruption can be observed
|
|
1041
|
+
Effect.uninterruptibleMask((restore) =>
|
|
1042
|
+
Effect.flatMap(response.upgrade, (socket) =>
|
|
1043
|
+
restore(decodeHeaders(response.headers)).pipe(
|
|
1044
|
+
Effect.map((headers): Upgraded<unknown> => ({ headers, socket })),
|
|
1045
|
+
// nothing takes the connection on failure, so close it: releasing
|
|
1046
|
+
// the reader's scope closes the connection
|
|
1047
|
+
Effect.onError(() => Effect.ignore(Effect.scoped(socket.reader)))
|
|
1048
|
+
))
|
|
1049
|
+
)
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
return (response, sseOptions) => (decodeMap[response.status] ?? decodeMap.orElse)(response, sseOptions)
|
|
1053
|
+
}
|
|
1054
|
+
|
|
910
1055
|
type ResponseDecoder = (
|
|
911
1056
|
response: HttpClientResponse.HttpClientResponse,
|
|
912
1057
|
sseOptions?: Sse.DecodeOptions
|
|
@@ -934,7 +1079,7 @@ function addResponseAlternative(
|
|
|
934
1079
|
|
|
935
1080
|
function makeResponseDecoder(alternatives: ReadonlyArray<ResponseAlternative>): ResponseDecoder {
|
|
936
1081
|
const first = alternatives[0]
|
|
937
|
-
if (alternatives.
|
|
1082
|
+
if (first !== undefined && alternatives.every((alternative) => alternative.decode === first.decode)) {
|
|
938
1083
|
return first.decode
|
|
939
1084
|
}
|
|
940
1085
|
return (response, sseOptions) => {
|
|
@@ -1241,7 +1386,8 @@ const statusOrElse = (response: HttpClientResponse.HttpClientResponse) =>
|
|
|
1241
1386
|
new HttpClientError.HttpClientError({
|
|
1242
1387
|
reason: new HttpClientError.DecodeError({
|
|
1243
1388
|
request: response.request,
|
|
1244
|
-
response
|
|
1389
|
+
response,
|
|
1390
|
+
description: "undeclared status code"
|
|
1245
1391
|
})
|
|
1246
1392
|
})
|
|
1247
1393
|
)
|