effect 4.0.2 → 4.0.4
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/AGENTS.md +24 -0
- package/CLAUDE.md +24 -0
- package/ai-docs/package.json +2 -2
- package/ai-docs/src/52_graphql/10_basics.ts +111 -0
- package/ai-docs/src/52_graphql/20_testing.ts +45 -0
- package/ai-docs/src/52_graphql/30_batching.ts +116 -0
- package/ai-docs/src/52_graphql/40_aliased-batching.ts +122 -0
- package/ai-docs/src/52_graphql/50_errors-and-retries.ts +74 -0
- package/ai-docs/src/52_graphql/index.md +6 -0
- package/dist/Context.d.ts.map +1 -1
- package/dist/Context.js +12 -3
- package/dist/Context.js.map +1 -1
- package/dist/Crypto.d.ts +33 -5
- package/dist/Crypto.d.ts.map +1 -1
- package/dist/Crypto.js +8 -2
- package/dist/Crypto.js.map +1 -1
- package/dist/DateTime.d.ts +9 -6
- package/dist/DateTime.d.ts.map +1 -1
- package/dist/DateTime.js +9 -6
- package/dist/DateTime.js.map +1 -1
- package/dist/Duration.d.ts +6 -6
- package/dist/Duration.d.ts.map +1 -1
- package/dist/Duration.js +27 -8
- package/dist/Duration.js.map +1 -1
- package/dist/FileSystem.d.ts +44 -2
- package/dist/FileSystem.d.ts.map +1 -1
- package/dist/FileSystem.js.map +1 -1
- package/dist/RequestResolver.d.ts.map +1 -1
- package/dist/RequestResolver.js +4 -10
- package/dist/RequestResolver.js.map +1 -1
- package/dist/Scheduler.d.ts +9 -0
- package/dist/Scheduler.d.ts.map +1 -1
- package/dist/Scheduler.js +9 -0
- package/dist/Scheduler.js.map +1 -1
- package/dist/Schema.d.ts +481 -1
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +362 -4
- package/dist/Schema.js.map +1 -1
- package/dist/SchemaGetter.d.ts +4 -0
- package/dist/SchemaGetter.d.ts.map +1 -1
- package/dist/SchemaGetter.js +52 -33
- package/dist/SchemaGetter.js.map +1 -1
- package/dist/Sink.d.ts.map +1 -1
- package/dist/Sink.js +38 -17
- package/dist/Sink.js.map +1 -1
- package/dist/Stdio.d.ts +7 -1
- package/dist/Stdio.d.ts.map +1 -1
- package/dist/Stdio.js +1 -0
- package/dist/Stdio.js.map +1 -1
- package/dist/Stream.d.ts +22 -11
- package/dist/Stream.d.ts.map +1 -1
- package/dist/Stream.js +21 -6
- package/dist/Stream.js.map +1 -1
- package/dist/Utils.js +8 -3
- package/dist/Utils.js.map +1 -1
- package/dist/ai/AnthropicStructuredOutput.js +0 -2
- package/dist/ai/AnthropicStructuredOutput.js.map +1 -1
- package/dist/ai/Chat.d.ts +2 -2
- package/dist/ai/Chat.d.ts.map +1 -1
- package/dist/ai/LanguageModel.d.ts +38 -7
- package/dist/ai/LanguageModel.d.ts.map +1 -1
- package/dist/ai/LanguageModel.js +25 -7
- package/dist/ai/LanguageModel.js.map +1 -1
- package/dist/ai/McpServer.d.ts +61 -0
- package/dist/ai/McpServer.d.ts.map +1 -1
- package/dist/ai/McpServer.js +196 -44
- package/dist/ai/McpServer.js.map +1 -1
- package/dist/ai/Prompt.d.ts.map +1 -1
- package/dist/ai/Prompt.js +28 -5
- package/dist/ai/Prompt.js.map +1 -1
- package/dist/ai/Response.d.ts +4 -3
- package/dist/ai/Response.d.ts.map +1 -1
- package/dist/ai/Response.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js +5 -0
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
- package/dist/ai/internal/mcpProtocol.js.map +1 -1
- package/dist/ai/internal/mcpRuntime.js +1 -0
- package/dist/ai/internal/mcpRuntime.js.map +1 -1
- package/dist/cli/CliOutput.d.ts +27 -0
- package/dist/cli/CliOutput.d.ts.map +1 -1
- package/dist/cli/CliOutput.js +33 -10
- package/dist/cli/CliOutput.js.map +1 -1
- package/dist/cli/Command.d.ts.map +1 -1
- package/dist/cli/Command.js +6 -3
- package/dist/cli/Command.js.map +1 -1
- package/dist/cli/Completions.d.ts +3 -3
- package/dist/cli/Completions.d.ts.map +1 -1
- package/dist/cli/Completions.js +8 -5
- package/dist/cli/Completions.js.map +1 -1
- package/dist/cli/GlobalFlag.d.ts +5 -4
- package/dist/cli/GlobalFlag.d.ts.map +1 -1
- package/dist/cli/GlobalFlag.js +3 -3
- package/dist/cli/GlobalFlag.js.map +1 -1
- package/dist/cli/Prompt.d.ts +17 -1
- package/dist/cli/Prompt.d.ts.map +1 -1
- package/dist/cli/Prompt.js +119 -114
- package/dist/cli/Prompt.js.map +1 -1
- package/dist/cli/internal/ansi.d.ts +0 -1
- package/dist/cli/internal/ansi.d.ts.map +1 -1
- package/dist/cli/internal/ansi.js +20 -3
- package/dist/cli/internal/ansi.js.map +1 -1
- package/dist/cli/internal/completions/powershell.d.ts +2 -0
- package/dist/cli/internal/completions/powershell.d.ts.map +1 -0
- package/dist/cli/internal/completions/powershell.js +273 -0
- package/dist/cli/internal/completions/powershell.js.map +1 -0
- package/dist/cli/internal/completions/zsh.js +3 -2
- package/dist/cli/internal/completions/zsh.js.map +1 -1
- package/dist/cli/internal/wizard.d.ts +3 -3
- package/dist/cli/internal/wizard.d.ts.map +1 -1
- package/dist/cli/internal/wizard.js +21 -18
- package/dist/cli/internal/wizard.js.map +1 -1
- package/dist/cluster/ClusterSchema.d.ts +28 -0
- package/dist/cluster/ClusterSchema.d.ts.map +1 -1
- package/dist/cluster/ClusterSchema.js +30 -0
- package/dist/cluster/ClusterSchema.js.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.js +56 -26
- package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
- package/dist/cluster/MessageStorage.d.ts +18 -3
- package/dist/cluster/MessageStorage.d.ts.map +1 -1
- package/dist/cluster/MessageStorage.js +31 -11
- package/dist/cluster/MessageStorage.js.map +1 -1
- package/dist/cluster/Runners.d.ts.map +1 -1
- package/dist/cluster/Runners.js +8 -2
- package/dist/cluster/Runners.js.map +1 -1
- package/dist/cluster/Sharding.d.ts.map +1 -1
- package/dist/cluster/Sharding.js +187 -66
- package/dist/cluster/Sharding.js.map +1 -1
- package/dist/cluster/SqlMessageStorage.d.ts +59 -19
- package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
- package/dist/cluster/SqlMessageStorage.js +84 -55
- package/dist/cluster/SqlMessageStorage.js.map +1 -1
- package/dist/cluster/SqlRunnerStorage.d.ts +68 -19
- package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
- package/dist/cluster/SqlRunnerStorage.js +191 -113
- package/dist/cluster/SqlRunnerStorage.js.map +1 -1
- package/dist/cluster/internal/entityManager.js +104 -37
- package/dist/cluster/internal/entityManager.js.map +1 -1
- package/dist/encoding/Sse.d.ts +6 -0
- package/dist/encoding/Sse.d.ts.map +1 -1
- package/dist/encoding/Sse.js +62 -70
- package/dist/encoding/Sse.js.map +1 -1
- package/dist/graphql/GraphQL.d.ts +349 -0
- package/dist/graphql/GraphQL.d.ts.map +1 -0
- package/dist/graphql/GraphQL.js +207 -0
- package/dist/graphql/GraphQL.js.map +1 -0
- package/dist/graphql/GraphQLClient.d.ts +562 -0
- package/dist/graphql/GraphQLClient.d.ts.map +1 -0
- package/dist/graphql/GraphQLClient.js +498 -0
- package/dist/graphql/GraphQLClient.js.map +1 -0
- package/dist/graphql/GraphQLClientError.d.ts +445 -0
- package/dist/graphql/GraphQLClientError.d.ts.map +1 -0
- package/dist/graphql/GraphQLClientError.js +479 -0
- package/dist/graphql/GraphQLClientError.js.map +1 -0
- package/dist/graphql/GraphQLGroup.d.ts +118 -0
- package/dist/graphql/GraphQLGroup.d.ts.map +1 -0
- package/dist/graphql/GraphQLGroup.js +109 -0
- package/dist/graphql/GraphQLGroup.js.map +1 -0
- package/dist/graphql/GraphQLMiddleware.d.ts +249 -0
- package/dist/graphql/GraphQLMiddleware.d.ts.map +1 -0
- package/dist/graphql/GraphQLMiddleware.js +130 -0
- package/dist/graphql/GraphQLMiddleware.js.map +1 -0
- package/dist/graphql/GraphQLProtocol.d.ts +731 -0
- package/dist/graphql/GraphQLProtocol.d.ts.map +1 -0
- package/dist/graphql/GraphQLProtocol.js +719 -0
- package/dist/graphql/GraphQLProtocol.js.map +1 -0
- package/dist/graphql/GraphQLResolver.d.ts +453 -0
- package/dist/graphql/GraphQLResolver.d.ts.map +1 -0
- package/dist/graphql/GraphQLResolver.js +552 -0
- package/dist/graphql/GraphQLResolver.js.map +1 -0
- package/dist/graphql/index.d.ts +40 -0
- package/dist/graphql/index.d.ts.map +1 -0
- package/dist/graphql/index.js +41 -0
- package/dist/graphql/index.js.map +1 -0
- package/dist/http/FindMyWay/internal/router.js +3 -6
- package/dist/http/FindMyWay/internal/router.js.map +1 -1
- package/dist/http/HttpClient.d.ts +21 -0
- package/dist/http/HttpClient.d.ts.map +1 -1
- package/dist/http/HttpClient.js +63 -12
- package/dist/http/HttpClient.js.map +1 -1
- package/dist/http/HttpEffect.d.ts.map +1 -1
- package/dist/http/HttpEffect.js +14 -7
- package/dist/http/HttpEffect.js.map +1 -1
- package/dist/http/HttpMiddleware.d.ts.map +1 -1
- package/dist/http/HttpMiddleware.js +31 -32
- package/dist/http/HttpMiddleware.js.map +1 -1
- package/dist/http/HttpRouter.d.ts +35 -0
- package/dist/http/HttpRouter.d.ts.map +1 -1
- package/dist/http/HttpRouter.js +35 -0
- package/dist/http/HttpRouter.js.map +1 -1
- package/dist/http/HttpServerResponse.d.ts +8 -6
- package/dist/http/HttpServerResponse.d.ts.map +1 -1
- package/dist/http/HttpServerResponse.js +27 -16
- package/dist/http/HttpServerResponse.js.map +1 -1
- package/dist/http/HttpTraceContext.d.ts.map +1 -1
- package/dist/http/HttpTraceContext.js +4 -2
- package/dist/http/HttpTraceContext.js.map +1 -1
- package/dist/http/Multipart.d.ts.map +1 -1
- package/dist/http/Multipart.js +15 -1
- package/dist/http/Multipart.js.map +1 -1
- package/dist/http-api/HttpApiScalar.d.ts +5 -0
- package/dist/http-api/HttpApiScalar.d.ts.map +1 -1
- package/dist/http-api/HttpApiScalar.js.map +1 -1
- package/dist/internal/dateTime.js +40 -35
- package/dist/internal/dateTime.js.map +1 -1
- package/dist/internal/effect.js +19 -9
- package/dist/internal/effect.js.map +1 -1
- package/dist/internal/graphql.d.ts +2 -0
- package/dist/internal/graphql.d.ts.map +1 -0
- package/dist/internal/graphql.js +195 -0
- package/dist/internal/graphql.js.map +1 -0
- package/dist/internal/graphqlHeaders.d.ts +4 -0
- package/dist/internal/graphqlHeaders.d.ts.map +1 -0
- package/dist/internal/graphqlHeaders.js +11 -0
- package/dist/internal/graphqlHeaders.js.map +1 -0
- package/dist/internal/request.js +20 -1
- package/dist/internal/request.js.map +1 -1
- package/dist/internal/schema/toCodeDocument.js +4 -1
- package/dist/internal/schema/toCodeDocument.js.map +1 -1
- package/dist/internal/schema/toJsonSchemaDocument.js +29 -5
- package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
- package/dist/internal/version.js +1 -1
- package/dist/net/AddressResolver.d.ts +145 -0
- package/dist/net/AddressResolver.d.ts.map +1 -0
- package/dist/net/AddressResolver.js +114 -0
- package/dist/net/AddressResolver.js.map +1 -0
- package/dist/net/Dns.d.ts +596 -0
- package/dist/net/Dns.d.ts.map +1 -0
- package/dist/net/Dns.js +549 -0
- package/dist/net/Dns.js.map +1 -0
- package/dist/net/Host.d.ts +369 -0
- package/dist/net/Host.d.ts.map +1 -0
- package/dist/net/Host.js +397 -0
- package/dist/net/Host.js.map +1 -0
- package/dist/net/IpInterface.d.ts +76 -3
- package/dist/net/IpInterface.d.ts.map +1 -1
- package/dist/net/IpInterface.js +53 -4
- package/dist/net/IpInterface.js.map +1 -1
- package/dist/net/IpNetwork.d.ts +82 -8
- package/dist/net/IpNetwork.d.ts.map +1 -1
- package/dist/net/IpNetwork.js +60 -4
- package/dist/net/IpNetwork.js.map +1 -1
- package/dist/net/NetAddress.d.ts +396 -35
- package/dist/net/NetAddress.d.ts.map +1 -1
- package/dist/net/NetAddress.js +358 -34
- package/dist/net/NetAddress.js.map +1 -1
- package/dist/net/index.d.ts +15 -0
- package/dist/net/index.d.ts.map +1 -1
- package/dist/net/index.js +15 -0
- package/dist/net/index.js.map +1 -1
- package/dist/observability/OtlpMetrics.d.ts.map +1 -1
- package/dist/observability/OtlpMetrics.js +15 -21
- package/dist/observability/OtlpMetrics.js.map +1 -1
- package/dist/observability/PrometheusMetrics.js +1 -0
- package/dist/observability/PrometheusMetrics.js.map +1 -1
- package/dist/persistence/PersistedQueue.d.ts +32 -3
- package/dist/persistence/PersistedQueue.d.ts.map +1 -1
- package/dist/persistence/PersistedQueue.js +75 -16
- package/dist/persistence/PersistedQueue.js.map +1 -1
- package/dist/rpc/RpcClient.d.ts +22 -6
- package/dist/rpc/RpcClient.d.ts.map +1 -1
- package/dist/rpc/RpcClient.js +12 -5
- package/dist/rpc/RpcClient.js.map +1 -1
- package/dist/rpc/RpcServer.d.ts +6 -0
- package/dist/rpc/RpcServer.d.ts.map +1 -1
- package/dist/rpc/RpcServer.js +78 -29
- package/dist/rpc/RpcServer.js.map +1 -1
- package/dist/socket/DatagramSocket.d.ts +456 -0
- package/dist/socket/DatagramSocket.d.ts.map +1 -0
- package/dist/socket/DatagramSocket.js +535 -0
- package/dist/socket/DatagramSocket.js.map +1 -0
- package/dist/socket/Socket.d.ts +20 -1
- package/dist/socket/Socket.d.ts.map +1 -1
- package/dist/socket/Socket.js +9 -1
- package/dist/socket/Socket.js.map +1 -1
- package/dist/socket/index.d.ts +5 -0
- package/dist/socket/index.d.ts.map +1 -1
- package/dist/socket/index.js +5 -0
- package/dist/socket/index.js.map +1 -1
- package/dist/sql/Migrator.d.ts.map +1 -1
- package/dist/sql/Migrator.js +7 -2
- package/dist/sql/Migrator.js.map +1 -1
- package/dist/sql/SqlClient.d.ts +7 -1
- package/dist/sql/SqlClient.d.ts.map +1 -1
- package/dist/sql/SqlClient.js +31 -6
- package/dist/sql/SqlClient.js.map +1 -1
- package/dist/testing/TestCrypto.d.ts +73 -0
- package/dist/testing/TestCrypto.d.ts.map +1 -0
- package/dist/testing/TestCrypto.js +87 -0
- package/dist/testing/TestCrypto.js.map +1 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/workflow/DurableDeferred.d.ts +54 -0
- package/dist/workflow/DurableDeferred.d.ts.map +1 -1
- package/dist/workflow/DurableDeferred.js +108 -50
- package/dist/workflow/DurableDeferred.js.map +1 -1
- package/dist/workflow/WorkflowEngine.d.ts +24 -2
- package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
- package/dist/workflow/WorkflowEngine.js +13 -3
- package/dist/workflow/WorkflowEngine.js.map +1 -1
- package/package.json +6 -3
- package/src/Context.ts +12 -3
- package/src/Crypto.ts +43 -9
- package/src/DateTime.ts +9 -6
- package/src/Duration.ts +36 -16
- package/src/FileSystem.ts +48 -2
- package/src/RequestResolver.ts +4 -10
- package/src/Scheduler.ts +9 -0
- package/src/Schema.ts +677 -5
- package/src/SchemaGetter.ts +47 -35
- package/src/Sink.ts +45 -18
- package/src/Stdio.ts +9 -2
- package/src/Stream.ts +44 -15
- package/src/Utils.ts +8 -5
- package/src/ai/AnthropicStructuredOutput.ts +2 -2
- package/src/ai/Chat.ts +2 -2
- package/src/ai/LanguageModel.ts +96 -24
- package/src/ai/McpServer.ts +288 -94
- package/src/ai/Prompt.ts +24 -10
- package/src/ai/Response.ts +6 -3
- package/src/ai/internal/mcpProtocol/v2026_07_28.ts +5 -0
- package/src/ai/internal/mcpProtocol.ts +3 -0
- package/src/ai/internal/mcpRuntime.ts +2 -0
- package/src/cli/CliOutput.ts +33 -16
- package/src/cli/Command.ts +4 -3
- package/src/cli/Completions.ts +9 -6
- package/src/cli/GlobalFlag.ts +19 -11
- package/src/cli/Prompt.ts +159 -149
- package/src/cli/internal/ansi.ts +26 -3
- package/src/cli/internal/completions/powershell.ts +322 -0
- package/src/cli/internal/completions/zsh.ts +4 -2
- package/src/cli/internal/wizard.ts +34 -26
- package/src/cluster/ClusterSchema.ts +32 -0
- package/src/cluster/ClusterWorkflowEngine.ts +64 -36
- package/src/cluster/MessageStorage.ts +45 -14
- package/src/cluster/Runners.ts +8 -2
- package/src/cluster/Sharding.ts +219 -58
- package/src/cluster/SqlMessageStorage.ts +118 -84
- package/src/cluster/SqlRunnerStorage.ts +224 -128
- package/src/cluster/internal/entityManager.ts +151 -55
- package/src/encoding/Sse.ts +69 -79
- package/src/graphql/GraphQL.ts +494 -0
- package/src/graphql/GraphQLClient.ts +912 -0
- package/src/graphql/GraphQLClientError.ts +542 -0
- package/src/graphql/GraphQLGroup.ts +167 -0
- package/src/graphql/GraphQLMiddleware.ts +253 -0
- package/src/graphql/GraphQLProtocol.ts +1286 -0
- package/src/graphql/GraphQLResolver.ts +1010 -0
- package/src/graphql/index.ts +48 -0
- package/src/http/FindMyWay/internal/router.ts +4 -7
- package/src/http/HttpClient.ts +110 -12
- package/src/http/HttpEffect.ts +11 -5
- package/src/http/HttpMiddleware.ts +33 -34
- package/src/http/HttpRouter.ts +35 -0
- package/src/http/HttpServerResponse.ts +28 -16
- package/src/http/HttpTraceContext.ts +8 -2
- package/src/http/Multipart.ts +17 -1
- package/src/http-api/HttpApiScalar.ts +5 -0
- package/src/internal/dateTime.ts +13 -10
- package/src/internal/effect.ts +22 -15
- package/src/internal/graphql.ts +263 -0
- package/src/internal/graphqlHeaders.ts +11 -0
- package/src/internal/request.ts +31 -3
- package/src/internal/schema/toCodeDocument.ts +7 -1
- package/src/internal/schema/toJsonSchemaDocument.ts +34 -2
- package/src/internal/version.ts +1 -1
- package/src/net/AddressResolver.ts +222 -0
- package/src/net/Dns.ts +1035 -0
- package/src/net/Host.ts +544 -0
- package/src/net/IpInterface.ts +117 -7
- package/src/net/IpNetwork.ts +116 -17
- package/src/net/NetAddress.ts +620 -76
- package/src/net/index.ts +18 -0
- package/src/observability/OtlpMetrics.ts +12 -23
- package/src/observability/PrometheusMetrics.ts +1 -0
- package/src/persistence/PersistedQueue.ts +146 -53
- package/src/rpc/RpcClient.ts +41 -19
- package/src/rpc/RpcServer.ts +115 -40
- package/src/socket/DatagramSocket.ts +919 -0
- package/src/socket/Socket.ts +28 -2
- package/src/socket/index.ts +6 -0
- package/src/sql/Migrator.ts +21 -5
- package/src/sql/SqlClient.ts +39 -15
- package/src/testing/TestCrypto.ts +94 -0
- package/src/testing/index.ts +6 -0
- package/src/workflow/DurableDeferred.ts +160 -47
- package/src/workflow/WorkflowEngine.ts +50 -5
package/dist/net/Dns.js
ADDED
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host name resolution, DNS queries, and DNS record values.
|
|
3
|
+
*
|
|
4
|
+
* `lookup` resolves a host name to the addresses used to connect to it,
|
|
5
|
+
* `resolve` queries DNS records of one type, and `reverse` looks up the names
|
|
6
|
+
* of an address. Runtime packages provide the `Dns` service from the host
|
|
7
|
+
* platform's resolver, whose `lookup` uses the operating system resolver
|
|
8
|
+
* (`getaddrinfo`) and therefore also reads the hosts file and other system
|
|
9
|
+
* sources, not only DNS. `AddressResolver` builds on `lookup` to resolve
|
|
10
|
+
* `host:port` endpoints.
|
|
11
|
+
*
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 4.0.0
|
|
14
|
+
*/
|
|
15
|
+
import * as Arr from "../Array.js";
|
|
16
|
+
import * as Context from "../Context.js";
|
|
17
|
+
import * as Data from "../Data.js";
|
|
18
|
+
import * as Duration from "../Duration.js";
|
|
19
|
+
import * as Effect from "../Effect.js";
|
|
20
|
+
import * as Hex from "../encoding/Hex.js";
|
|
21
|
+
import * as Equal from "../Equal.js";
|
|
22
|
+
import * as Hash from "../Hash.js";
|
|
23
|
+
import * as Inspectable from "../Inspectable.js";
|
|
24
|
+
import * as Layer from "../Layer.js";
|
|
25
|
+
import { hasProperty } from "../Predicate.js";
|
|
26
|
+
import * as Result from "../Result.js";
|
|
27
|
+
import * as Host from "./Host.js";
|
|
28
|
+
import * as NetAddress from "./NetAddress.js";
|
|
29
|
+
const RecordTypeId = "~effect/net/Dns/DnsRecord";
|
|
30
|
+
const isUint8 = u => Number.isInteger(u) && u >= 0 && u <= 0xff;
|
|
31
|
+
const isUint16 = u => Number.isInteger(u) && u >= 0 && u <= 0xffff;
|
|
32
|
+
const isUint32 = u => Number.isInteger(u) && u >= 0 && u <= 0xffffffff;
|
|
33
|
+
const isString = u => typeof u === "string";
|
|
34
|
+
// SOA timers are 32-bit unsigned counts of seconds on the wire.
|
|
35
|
+
const isTimer = u => Duration.isDuration(u) && Duration.isFinite(u) && isUint32(Duration.toSeconds(u));
|
|
36
|
+
const recordFields = {
|
|
37
|
+
A: {
|
|
38
|
+
address: NetAddress.isIpv4Address
|
|
39
|
+
},
|
|
40
|
+
AAAA: {
|
|
41
|
+
address: NetAddress.isIpv6Address
|
|
42
|
+
},
|
|
43
|
+
CAA: {
|
|
44
|
+
critical: u => typeof u === "boolean",
|
|
45
|
+
tag: u => isString(u) && /^[a-z0-9]+$/i.test(u),
|
|
46
|
+
value: isString
|
|
47
|
+
},
|
|
48
|
+
CNAME: {
|
|
49
|
+
target: Host.isDomainName
|
|
50
|
+
},
|
|
51
|
+
MX: {
|
|
52
|
+
exchange: Host.isDomainName,
|
|
53
|
+
priority: isUint16
|
|
54
|
+
},
|
|
55
|
+
NAPTR: {
|
|
56
|
+
order: isUint16,
|
|
57
|
+
preference: isUint16,
|
|
58
|
+
flags: isString,
|
|
59
|
+
service: isString,
|
|
60
|
+
regexp: isString,
|
|
61
|
+
replacement: Host.isDomainName
|
|
62
|
+
},
|
|
63
|
+
NS: {
|
|
64
|
+
host: Host.isDomainName
|
|
65
|
+
},
|
|
66
|
+
PTR: {
|
|
67
|
+
host: u => isString(u) && u.length > 0
|
|
68
|
+
},
|
|
69
|
+
SOA: {
|
|
70
|
+
primary: Host.isDomainName,
|
|
71
|
+
admin: u => isString(u) && u.length > 0,
|
|
72
|
+
serial: isUint32,
|
|
73
|
+
refresh: isTimer,
|
|
74
|
+
retry: isTimer,
|
|
75
|
+
expire: isTimer,
|
|
76
|
+
minimum: isTimer
|
|
77
|
+
},
|
|
78
|
+
SRV: {
|
|
79
|
+
target: Host.isDomainName,
|
|
80
|
+
port: isUint16,
|
|
81
|
+
priority: isUint16,
|
|
82
|
+
weight: isUint16
|
|
83
|
+
},
|
|
84
|
+
TLSA: {
|
|
85
|
+
certUsage: isUint8,
|
|
86
|
+
selector: isUint8,
|
|
87
|
+
matchingType: isUint8,
|
|
88
|
+
data: u => u instanceof Uint8Array && u.length > 0
|
|
89
|
+
},
|
|
90
|
+
TXT: {
|
|
91
|
+
chunks: u => Array.isArray(u) && u.length > 0 && u.every(isString)
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Every supported record type.
|
|
96
|
+
*
|
|
97
|
+
* @stability experimental
|
|
98
|
+
* @category constants
|
|
99
|
+
* @since 4.0.0
|
|
100
|
+
*/
|
|
101
|
+
export const recordTypes = /*#__PURE__*/Object.keys(recordFields);
|
|
102
|
+
/**
|
|
103
|
+
* Returns `true` when a value is a supported record type.
|
|
104
|
+
*
|
|
105
|
+
* @stability experimental
|
|
106
|
+
* @category guards
|
|
107
|
+
* @since 4.0.0
|
|
108
|
+
*/
|
|
109
|
+
export const isRecordType = u => recordTypes.includes(u);
|
|
110
|
+
/**
|
|
111
|
+
* Returns `true` when a value is a DNS record.
|
|
112
|
+
*
|
|
113
|
+
* @stability experimental
|
|
114
|
+
* @category guards
|
|
115
|
+
* @since 4.0.0
|
|
116
|
+
*/
|
|
117
|
+
export const isDnsRecord = u => hasProperty(u, RecordTypeId);
|
|
118
|
+
const RecordPrototype = {
|
|
119
|
+
...Inspectable.BaseProto,
|
|
120
|
+
[RecordTypeId]: RecordTypeId,
|
|
121
|
+
[Equal.symbol](that) {
|
|
122
|
+
return isDnsRecord(that) && that._tag === this._tag && Object.keys(this).every(key => Equal.equals(this[key], that[key]));
|
|
123
|
+
},
|
|
124
|
+
[Hash.symbol]() {
|
|
125
|
+
return Hash.structureKeys(this, Object.keys(this));
|
|
126
|
+
},
|
|
127
|
+
toString() {
|
|
128
|
+
return formatRecord(this);
|
|
129
|
+
},
|
|
130
|
+
toJSON() {
|
|
131
|
+
return {
|
|
132
|
+
...this
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Creates a checked DNS record of a record type from its fields.
|
|
138
|
+
*
|
|
139
|
+
* **Details**
|
|
140
|
+
*
|
|
141
|
+
* Every field is checked at runtime: addresses must belong to the record's
|
|
142
|
+
* address family, names must be normalized domain names, priorities, weights,
|
|
143
|
+
* and ports must be 16-bit unsigned integers, the SOA serial and timers must be
|
|
144
|
+
* 32-bit unsigned integers (the timers in whole seconds), the TLSA fields must
|
|
145
|
+
* be 8-bit unsigned integers with non-empty `data`, which is copied, TXT
|
|
146
|
+
* records need at least one chunk, and CAA property tags must be alphanumeric.
|
|
147
|
+
* Fields that do not belong to the record type are ignored.
|
|
148
|
+
*
|
|
149
|
+
* **Example** (Creating a service record)
|
|
150
|
+
*
|
|
151
|
+
* ```ts import.meta.vitest
|
|
152
|
+
* import { Result } from "effect"
|
|
153
|
+
* import { Dns, Host } from "effect/net"
|
|
154
|
+
*
|
|
155
|
+
* const record = Result.getOrThrow(Dns.makeRecord("SRV", {
|
|
156
|
+
* target: Host.domainNameFromStringUnsafe("db.internal"),
|
|
157
|
+
* port: 5432,
|
|
158
|
+
* priority: 10,
|
|
159
|
+
* weight: 5
|
|
160
|
+
* }))
|
|
161
|
+
* Dns.formatRecord(record) // => "SRV 10 5 5432 db.internal"
|
|
162
|
+
* ```
|
|
163
|
+
*
|
|
164
|
+
* @stability experimental
|
|
165
|
+
* @category constructors
|
|
166
|
+
* @since 4.0.0
|
|
167
|
+
*/
|
|
168
|
+
export const makeRecord = (type, fields) => {
|
|
169
|
+
if (!isRecordType(type)) {
|
|
170
|
+
return Result.fail(new NetAddress.NetAddressError({
|
|
171
|
+
input: type,
|
|
172
|
+
message: "unknown DNS record type"
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
const input = typeof fields === "object" && fields !== null ? fields : {};
|
|
176
|
+
const self = Object.create(RecordPrototype);
|
|
177
|
+
self._tag = type;
|
|
178
|
+
for (const [key, check] of Object.entries(recordFields[type])) {
|
|
179
|
+
const value = input[key];
|
|
180
|
+
if (!check(value)) {
|
|
181
|
+
return Result.fail(new NetAddress.NetAddressError({
|
|
182
|
+
input: fields,
|
|
183
|
+
message: `invalid ${type} record ${key}`
|
|
184
|
+
}));
|
|
185
|
+
}
|
|
186
|
+
self[key] = Array.isArray(value) ? Object.freeze([...value]) : value instanceof Uint8Array ? new Uint8Array(value) : value;
|
|
187
|
+
}
|
|
188
|
+
return Result.succeed(Object.freeze(self));
|
|
189
|
+
};
|
|
190
|
+
/**
|
|
191
|
+
* Creates a trusted DNS record of a record type from its fields, throwing on
|
|
192
|
+
* failure.
|
|
193
|
+
*
|
|
194
|
+
* @stability experimental
|
|
195
|
+
* @category unsafe
|
|
196
|
+
* @since 4.0.0
|
|
197
|
+
*/
|
|
198
|
+
export const makeRecordUnsafe = (type, fields) => Result.getOrThrow(makeRecord(type, fields));
|
|
199
|
+
const encoder = /*#__PURE__*/new TextEncoder();
|
|
200
|
+
const decimalEscape = byte => `\\${byte.toString().padStart(3, "0")}`;
|
|
201
|
+
// Quotes a character string in DNS presentation format (RFC 1035, section 5.1):
|
|
202
|
+
// `"` and `\` are escaped, and bytes outside printable ASCII are written as `\DDD`.
|
|
203
|
+
const quote = value => {
|
|
204
|
+
let out = "\"";
|
|
205
|
+
for (const byte of encoder.encode(value)) {
|
|
206
|
+
out += byte === 0x22 || byte === 0x5c ? `\\${String.fromCharCode(byte)}` : byte < 0x20 || byte > 0x7e ? decimalEscape(byte) : String.fromCharCode(byte);
|
|
207
|
+
}
|
|
208
|
+
return out + "\"";
|
|
209
|
+
};
|
|
210
|
+
const nameSpecials = [0x22, 0x24, 0x28, 0x29, 0x3b, 0x40];
|
|
211
|
+
// Writes a name held as text, such as `Ptr.host`, in DNS presentation format:
|
|
212
|
+
// its `\.` and `\\` escapes are kept, other special characters are escaped, and
|
|
213
|
+
// spaces and bytes outside printable ASCII are written as `\DDD`.
|
|
214
|
+
const formatName = text => {
|
|
215
|
+
const bytes = encoder.encode(text);
|
|
216
|
+
let out = "";
|
|
217
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
218
|
+
const byte = bytes[i];
|
|
219
|
+
if (byte === 0x5c) {
|
|
220
|
+
const next = bytes[i + 1];
|
|
221
|
+
if (next === 0x2e || next === 0x5c) {
|
|
222
|
+
out += `\\${String.fromCharCode(next)}`;
|
|
223
|
+
i++;
|
|
224
|
+
} else {
|
|
225
|
+
out += "\\\\";
|
|
226
|
+
}
|
|
227
|
+
} else if (byte <= 0x20 || byte > 0x7e) {
|
|
228
|
+
out += decimalEscape(byte);
|
|
229
|
+
} else {
|
|
230
|
+
out += nameSpecials.includes(byte) ? `\\${String.fromCharCode(byte)}` : String.fromCharCode(byte);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return out;
|
|
234
|
+
};
|
|
235
|
+
/**
|
|
236
|
+
* Formats a record in DNS presentation format, prefixed by its type.
|
|
237
|
+
*
|
|
238
|
+
* @stability experimental
|
|
239
|
+
* @category encoding
|
|
240
|
+
* @since 4.0.0
|
|
241
|
+
*/
|
|
242
|
+
export const formatRecord = self => {
|
|
243
|
+
switch (self._tag) {
|
|
244
|
+
case "A":
|
|
245
|
+
case "AAAA":
|
|
246
|
+
return `${self._tag} ${NetAddress.formatIp(self.address)}`;
|
|
247
|
+
case "CAA":
|
|
248
|
+
return `CAA ${self.critical ? 128 : 0} ${self.tag} ${quote(self.value)}`;
|
|
249
|
+
case "CNAME":
|
|
250
|
+
return `CNAME ${self.target}`;
|
|
251
|
+
case "MX":
|
|
252
|
+
return `MX ${self.priority} ${self.exchange}`;
|
|
253
|
+
case "NAPTR":
|
|
254
|
+
return `NAPTR ${self.order} ${self.preference} ${quote(self.flags)} ${quote(self.service)} ${quote(self.regexp)} ${self.replacement}`;
|
|
255
|
+
case "NS":
|
|
256
|
+
return `NS ${self.host}`;
|
|
257
|
+
case "PTR":
|
|
258
|
+
return `PTR ${formatName(self.host)}`;
|
|
259
|
+
case "SOA":
|
|
260
|
+
return `SOA ${self.primary} ${formatName(self.admin)} ${self.serial} ${Duration.toSeconds(self.refresh)} ${Duration.toSeconds(self.retry)} ${Duration.toSeconds(self.expire)} ${Duration.toSeconds(self.minimum)}`;
|
|
261
|
+
case "SRV":
|
|
262
|
+
return `SRV ${self.priority} ${self.weight} ${self.port} ${self.target}`;
|
|
263
|
+
case "TLSA":
|
|
264
|
+
return `TLSA ${self.certUsage} ${self.selector} ${self.matchingType} ${Hex.encode(self.data).toUpperCase()}`;
|
|
265
|
+
case "TXT":
|
|
266
|
+
return `TXT ${self.chunks.map(quote).join(" ")}`;
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
/**
|
|
270
|
+
* Returns the reverse-lookup domain name for an IP address, in `in-addr.arpa`
|
|
271
|
+
* for IPv4 or `ip6.arpa` for IPv6.
|
|
272
|
+
*
|
|
273
|
+
* **Example** (Building reverse-lookup names)
|
|
274
|
+
*
|
|
275
|
+
* ```ts import.meta.vitest
|
|
276
|
+
* import { Dns, NetAddress } from "effect/net"
|
|
277
|
+
*
|
|
278
|
+
* Dns.reverseName(NetAddress.ipFromStringUnsafe("192.0.2.1")) // => "1.2.0.192.in-addr.arpa"
|
|
279
|
+
* ```
|
|
280
|
+
*
|
|
281
|
+
* @stability experimental
|
|
282
|
+
* @category converting
|
|
283
|
+
* @since 4.0.0
|
|
284
|
+
*/
|
|
285
|
+
export const reverseName = address => {
|
|
286
|
+
if (NetAddress.isIpv4Address(address)) {
|
|
287
|
+
return `${[...NetAddress.ipv4ToOctets(address)].reverse().join(".")}.in-addr.arpa`;
|
|
288
|
+
}
|
|
289
|
+
const nibbles = [];
|
|
290
|
+
for (const octet of NetAddress.ipv6ToOctets(address)) {
|
|
291
|
+
nibbles.push((octet >> 4).toString(16), (octet & 0xf).toString(16));
|
|
292
|
+
}
|
|
293
|
+
return `${nibbles.reverse().join(".")}.ip6.arpa`;
|
|
294
|
+
};
|
|
295
|
+
// =============================================================================
|
|
296
|
+
// Name servers
|
|
297
|
+
// =============================================================================
|
|
298
|
+
/**
|
|
299
|
+
* Parses the address of a name server: an IP address, which uses port 53, or
|
|
300
|
+
* an IP address and port.
|
|
301
|
+
*
|
|
302
|
+
* **Details**
|
|
303
|
+
*
|
|
304
|
+
* IPv6 addresses with a port are written in brackets, and IPv6 addresses
|
|
305
|
+
* without one are not.
|
|
306
|
+
*
|
|
307
|
+
* **Example** (Parsing name server addresses)
|
|
308
|
+
*
|
|
309
|
+
* ```ts import.meta.vitest
|
|
310
|
+
* import { Result } from "effect"
|
|
311
|
+
* import { Dns, NetAddress } from "effect/net"
|
|
312
|
+
*
|
|
313
|
+
* const format = (input: string) => Result.map(Dns.nameServerFromString(input), NetAddress.formatInet)
|
|
314
|
+
*
|
|
315
|
+
* format("192.0.2.53") // => Result.succeed("192.0.2.53:53")
|
|
316
|
+
* format("2001:db8::53") // => Result.succeed("[2001:db8::53]:53")
|
|
317
|
+
* format("[2001:db8::53]:5353") // => Result.succeed("[2001:db8::53]:5353")
|
|
318
|
+
* Result.isFailure(format("ns.example")) // => true
|
|
319
|
+
* ```
|
|
320
|
+
*
|
|
321
|
+
* @stability experimental
|
|
322
|
+
* @category decoding
|
|
323
|
+
* @since 4.0.0
|
|
324
|
+
*/
|
|
325
|
+
export const nameServerFromString = input => NetAddress.inetAddressFromString(input.startsWith("[") || /^[^:]*:\d+$/.test(input) ? input : input.includes(":") ? `[${input}]:53` : `${input}:53`);
|
|
326
|
+
/**
|
|
327
|
+
* Converts a name server to the internet address to query. Strings are parsed
|
|
328
|
+
* like `nameServerFromString`, internet addresses and address parts with a
|
|
329
|
+
* port are converted like `NetAddress.inetAddressFromInput`, and other IP
|
|
330
|
+
* address inputs are converted like `NetAddress.ipFromInput` and use port 53.
|
|
331
|
+
*
|
|
332
|
+
* @stability experimental
|
|
333
|
+
* @category constructors
|
|
334
|
+
* @since 4.0.0
|
|
335
|
+
*/
|
|
336
|
+
export const nameServerFromInput = input => typeof input === "string" ? nameServerFromString(input) : "port" in input ? NetAddress.inetAddressFromInput(input) : Result.map(NetAddress.ipFromInput(input), address => NetAddress.inetAddressUnsafe(address, 53));
|
|
337
|
+
/**
|
|
338
|
+
* A failed lookup, query, or reverse lookup.
|
|
339
|
+
*
|
|
340
|
+
* @stability experimental
|
|
341
|
+
* @category errors
|
|
342
|
+
* @since 4.0.0
|
|
343
|
+
*/
|
|
344
|
+
export class DnsError extends /*#__PURE__*/Data.TaggedError("DnsError") {
|
|
345
|
+
/**
|
|
346
|
+
* Formats the reason, operation, and name of the failed resolution.
|
|
347
|
+
*
|
|
348
|
+
* @since 4.0.0
|
|
349
|
+
*/
|
|
350
|
+
get message() {
|
|
351
|
+
return `${this.reason}: Dns.${this.method} (${this.hostname}${this.recordType === undefined ? "" : ` ${this.recordType}`})`;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Whether the failure is transient and the operation may succeed if retried.
|
|
355
|
+
*
|
|
356
|
+
* @since 4.0.0
|
|
357
|
+
*/
|
|
358
|
+
get isTemporary() {
|
|
359
|
+
return this.reason === "Timeout" || this.reason === "Temporary" || this.reason === "ServerFailure";
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Service that resolves names to addresses, queries DNS records, and looks up
|
|
364
|
+
* the names of addresses.
|
|
365
|
+
*
|
|
366
|
+
* **Details**
|
|
367
|
+
*
|
|
368
|
+
* Every operation either returns at least one result or fails with a
|
|
369
|
+
* {@link DnsError}.
|
|
370
|
+
*
|
|
371
|
+
* @stability experimental
|
|
372
|
+
* @category services
|
|
373
|
+
* @since 4.0.0
|
|
374
|
+
*/
|
|
375
|
+
export class Dns extends /*#__PURE__*/Context.Service()("effect/net/Dns") {}
|
|
376
|
+
const notFound = (method, hostname, recordType) => Effect.fail(new DnsError({
|
|
377
|
+
reason: "NotFound",
|
|
378
|
+
method,
|
|
379
|
+
hostname,
|
|
380
|
+
recordType
|
|
381
|
+
}));
|
|
382
|
+
const badName = (method, hostname, cause, recordType) => Effect.fail(new DnsError({
|
|
383
|
+
reason: "BadName",
|
|
384
|
+
method,
|
|
385
|
+
hostname,
|
|
386
|
+
recordType,
|
|
387
|
+
cause
|
|
388
|
+
}));
|
|
389
|
+
const asciiName = /^[\w.-]+$/;
|
|
390
|
+
/**
|
|
391
|
+
* Creates a `Dns` service from platform resolver operations.
|
|
392
|
+
*
|
|
393
|
+
* **Details**
|
|
394
|
+
*
|
|
395
|
+
* Lookup and query names are parsed and normalized, and reverse lookup
|
|
396
|
+
* addresses are parsed, before platform callbacks receive them. Invalid names
|
|
397
|
+
* and addresses fail with `BadName`.
|
|
398
|
+
*
|
|
399
|
+
* The constructor filters lookups by the requested address family, keeps only
|
|
400
|
+
* records of the requested type, removes duplicates, and turns empty results
|
|
401
|
+
* into `NotFound` failures. `reverse` receives the names of an address and
|
|
402
|
+
* keeps those that are valid host names, failing with `InvalidResponse` when
|
|
403
|
+
* there are names but none is valid. Without a `reverse` operation, the names
|
|
404
|
+
* are those of the PTR records at the address's `reverseName`, and failures of
|
|
405
|
+
* that query are reported as failures of `reverse`.
|
|
406
|
+
*
|
|
407
|
+
* Only `lookup` is required. Platforms that can resolve addresses but cannot
|
|
408
|
+
* query records, such as browsers, omit `resolve`; record queries, and reverse
|
|
409
|
+
* lookups without a `reverse` operation, then fail with `Unsupported`.
|
|
410
|
+
*
|
|
411
|
+
* @stability experimental
|
|
412
|
+
* @category constructors
|
|
413
|
+
* @since 4.0.0
|
|
414
|
+
*/
|
|
415
|
+
export const make = impl => {
|
|
416
|
+
const inFamily = family => address => family === undefined || NetAddress.isFamily(address, family);
|
|
417
|
+
const resolveRecords = impl.resolve ?? ((name, type) => Effect.fail(new DnsError({
|
|
418
|
+
reason: "Unsupported",
|
|
419
|
+
method: "resolve",
|
|
420
|
+
hostname: name,
|
|
421
|
+
recordType: type
|
|
422
|
+
})));
|
|
423
|
+
const reverseNames = impl.reverse ?? (address => resolveRecords(reverseName(address), "PTR").pipe(Effect.map(Arr.flatMap(record => record._tag === "PTR" ? [record.host] : [])), Effect.mapError(error => new DnsError({
|
|
424
|
+
reason: error.reason,
|
|
425
|
+
method: "reverse",
|
|
426
|
+
hostname: NetAddress.formatIp(address),
|
|
427
|
+
cause: error.cause
|
|
428
|
+
}))));
|
|
429
|
+
const lookup = (input, options) => Result.match(Host.domainNameFromInput(input), {
|
|
430
|
+
onFailure: cause => badName("lookup", input, cause),
|
|
431
|
+
onSuccess: host => impl.lookup(host, options?.family).pipe(Effect.flatMap(addresses => Arr.match(Arr.dedupe(addresses.filter(inFamily(options?.family))), {
|
|
432
|
+
onEmpty: () => notFound("lookup", host),
|
|
433
|
+
onNonEmpty: Effect.succeed
|
|
434
|
+
})))
|
|
435
|
+
});
|
|
436
|
+
return Dns.of({
|
|
437
|
+
lookup,
|
|
438
|
+
resolve: (input, type) => Result.match(Host.domainNameFromInput(input), {
|
|
439
|
+
onFailure: cause => badName("resolve", input, cause, type),
|
|
440
|
+
onSuccess: name => resolveRecords(name, type).pipe(Effect.flatMap(records => Arr.match(Arr.dedupe(records.filter(record => record._tag === type)), {
|
|
441
|
+
onEmpty: () => notFound("resolve", name, type),
|
|
442
|
+
onNonEmpty: Effect.succeed
|
|
443
|
+
})))
|
|
444
|
+
}),
|
|
445
|
+
reverse: input => Result.match(NetAddress.ipFromInput(input), {
|
|
446
|
+
onFailure: cause => badName("reverse", String(input), cause),
|
|
447
|
+
onSuccess: address => reverseNames(address).pipe(Effect.flatMap(names => {
|
|
448
|
+
const hostname = NetAddress.formatIp(address);
|
|
449
|
+
// Only ASCII names: `domainNameFromString` would convert UTF-8 labels
|
|
450
|
+
// to a different, `xn--` name.
|
|
451
|
+
const hosts = Arr.dedupe(Arr.filterMap(names.filter(name => asciiName.test(name)), Host.domainNameFromString));
|
|
452
|
+
return Arr.isReadonlyArrayNonEmpty(hosts) ? Effect.succeed(hosts) : names.length > 0 ? Effect.fail(new DnsError({
|
|
453
|
+
reason: "InvalidResponse",
|
|
454
|
+
method: "reverse",
|
|
455
|
+
hostname
|
|
456
|
+
})) : notFound("reverse", hostname);
|
|
457
|
+
}))
|
|
458
|
+
})
|
|
459
|
+
});
|
|
460
|
+
};
|
|
461
|
+
const zoneKey = name => name.length > 1 && name.endsWith(".") ? name.slice(0, -1) : name;
|
|
462
|
+
/**
|
|
463
|
+
* Creates a `Dns` service that answers from fixed data.
|
|
464
|
+
*
|
|
465
|
+
* **When to use**
|
|
466
|
+
*
|
|
467
|
+
* Use to test code that depends on `Dns`, or to provide fixed names on
|
|
468
|
+
* platforms without a resolver.
|
|
469
|
+
*
|
|
470
|
+
* **Details**
|
|
471
|
+
*
|
|
472
|
+
* Names without matching addresses or records fail with `NotFound`. CNAME
|
|
473
|
+
* records are returned by `CNAME` queries but are not followed.
|
|
474
|
+
*
|
|
475
|
+
* **Example** (Looking up a name with a static resolver)
|
|
476
|
+
*
|
|
477
|
+
* ```ts import.meta.vitest
|
|
478
|
+
* import { Effect, Result } from "effect"
|
|
479
|
+
* import { Dns, NetAddress } from "effect/net"
|
|
480
|
+
*
|
|
481
|
+
* const dns = Result.getOrThrow(Dns.makeStatic({
|
|
482
|
+
* hosts: { "db.internal": ["10.0.0.5"] }
|
|
483
|
+
* }))
|
|
484
|
+
*
|
|
485
|
+
* const program = dns.lookup("db.internal").pipe(
|
|
486
|
+
* Effect.map((addresses) => addresses.map(NetAddress.formatIp))
|
|
487
|
+
* )
|
|
488
|
+
*
|
|
489
|
+
* await Effect.runPromise(program) // => ["10.0.0.5"]
|
|
490
|
+
* ```
|
|
491
|
+
*
|
|
492
|
+
* @see {@link layerStatic}
|
|
493
|
+
* @stability experimental
|
|
494
|
+
* @category constructors
|
|
495
|
+
* @since 4.0.0
|
|
496
|
+
*/
|
|
497
|
+
export const makeStatic = zone => {
|
|
498
|
+
const entries = new Map();
|
|
499
|
+
const entry = name => Result.map(Host.domainNameFromString(name), domain => {
|
|
500
|
+
const key = zoneKey(domain);
|
|
501
|
+
let current = entries.get(key);
|
|
502
|
+
if (current === undefined) {
|
|
503
|
+
current = {
|
|
504
|
+
addresses: [],
|
|
505
|
+
records: []
|
|
506
|
+
};
|
|
507
|
+
entries.set(key, current);
|
|
508
|
+
}
|
|
509
|
+
return current;
|
|
510
|
+
});
|
|
511
|
+
for (const [name, addresses] of Object.entries(zone.hosts ?? {})) {
|
|
512
|
+
const result = entry(name);
|
|
513
|
+
if (Result.isFailure(result)) return Result.fail(result.failure);
|
|
514
|
+
for (const input of addresses) {
|
|
515
|
+
const address = NetAddress.ipFromInput(input);
|
|
516
|
+
if (Result.isFailure(address)) return Result.fail(address.failure);
|
|
517
|
+
result.success.addresses.push(address.success);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
for (const [name, records] of Object.entries(zone.records ?? {})) {
|
|
521
|
+
const result = entry(name);
|
|
522
|
+
if (Result.isFailure(result)) return Result.fail(result.failure);
|
|
523
|
+
for (const record of records) {
|
|
524
|
+
if (!isDnsRecord(record)) {
|
|
525
|
+
return Result.fail(new NetAddress.NetAddressError({
|
|
526
|
+
input: record,
|
|
527
|
+
message: "expected a DNS record"
|
|
528
|
+
}));
|
|
529
|
+
}
|
|
530
|
+
result.success.records.push(record);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
const recordsAt = name => entries.get(zoneKey(name))?.records ?? [];
|
|
534
|
+
return Result.succeed(make({
|
|
535
|
+
lookup: host => Effect.sync(() => [...(entries.get(zoneKey(host))?.addresses ?? []), ...recordsAt(host).flatMap(record => record._tag === "A" || record._tag === "AAAA" ? [record.address] : [])]),
|
|
536
|
+
resolve: name => Effect.sync(() => recordsAt(name)),
|
|
537
|
+
reverse: address => Effect.sync(() => [...[...entries].flatMap(([name, current]) => current.addresses.some(candidate => Equal.equals(candidate, address)) ? [name] : []), ...recordsAt(reverseName(address)).flatMap(record => record._tag === "PTR" ? [record.host] : [])])
|
|
538
|
+
}));
|
|
539
|
+
};
|
|
540
|
+
/**
|
|
541
|
+
* Creates a layer that provides a `Dns` service answering from fixed data.
|
|
542
|
+
*
|
|
543
|
+
* @see {@link makeStatic} for the resolution rules
|
|
544
|
+
* @stability experimental
|
|
545
|
+
* @category layers
|
|
546
|
+
* @since 4.0.0
|
|
547
|
+
*/
|
|
548
|
+
export const layerStatic = zone => Layer.effect(Dns, Effect.fromResult(makeStatic(zone)));
|
|
549
|
+
//# sourceMappingURL=Dns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dns.js","names":[],"sources":["../../src/net/Dns.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|