AddressResolver
Resolves host and port endpoints to socket addresses.
The AddressResolver service turns a Host.HostPort or host:port string
into socket addresses. Numeric hosts are converted without a lookup. IPv6
literals with a named zone such as fe80::1%eth0 get their scope ID from the host's
network interfaces, and domain names are looked up with the Dns service.
Runtime layers look up network interfaces; this module's layer requires
only Dns and supports numeric zones only.
Constructors
Creates an AddressResolver that looks up domain names with a Dns
service.
Signature
declare function make(dns: { lookup<F extends IpFamily>(host: DomainNameInput, options: { readonly family: F; }): Effect<readonly [FamilyAddress<F>, FamilyAddress<F>], DnsError>; lookup(host: DomainNameInput, options?: LookupOptions): Effect<readonly [IpAddress, IpAddress], DnsError>; resolve<T extends RecordType>(name: DomainNameInput, type: T): Effect<readonly [RecordFor<T>, RecordFor<T>], DnsError>; reverse(address: IpAddressInput): Effect<readonly [DomainName, DomainName], DnsError>;}, options?: MakeOptions): { resolve<F extends IpFamily>(target: InetAddress | HostPortInput, options: ResolveOptions & { readonly family: F; }): Effect<readonly [Inet<FamilyAddress<F>>, Inet<FamilyAddress<F>>], DnsError | NetAddressError>; resolve(target: InetAddress | HostPortInput, options?: ResolveOptions): Effect<readonly [InetAddress, InetAddress], DnsError | NetAddressError>; resolve(target: SocketAddress | HostPortInput, options?: ResolveOptions): Effect<readonly [SocketAddress, SocketAddress], DnsError | NetAddressError>;}Example Resolving an endpoint with a static resolver
import { Effect, Result } from "effect"import { AddressResolver, Dns, NetAddress } from "effect/net"
const dns = Result.getOrThrow(Dns.makeStatic({ hosts: { "db.internal": ["10.0.0.5"] }}))const resolver = AddressResolver.make(dns)
const program = resolver.resolve("db.internal:5432").pipe( Effect.map((addresses) => addresses.map(NetAddress.formatInet)))
await Effect.runPromise(program) // => ["10.0.0.5:5432"]Layers
Models
MakeOptions
interfaceOptions for creating an AddressResolver.
Details
scopeId is called whenever an IPv6 literal with a named zone such as
fe80::1%eth0 is resolved, so interfaces added or recreated while the
program runs are found. Without it, only numeric zones such as fe80::1%2
are supported.
Signature
interface MakeOptions { readonly scopeId?: ScopeIdLookup;}ResolveOptions
interfaceOptions for resolving an endpoint. Without a family, addresses of both
families are returned.
Signature
interface ResolveOptions { readonly family?: IpFamily;}ScopeIdLookup
typeLooks up the IPv6 scope ID of a network interface by name.
Details
Returns None for interfaces that do not exist or have no IPv6 scope ID, and
fails when the interfaces cannot be listed.
Signature
type ScopeIdLookup = (name: string) => Effect.Effect<Option.Option<number>, NetAddress.NetAddressError>Services
Service that resolves endpoints to internet and socket addresses.
Details
Every operation either returns at least one address or fails. Lookups fail
with a Dns.DnsError, and hosts that cannot be converted, such as IPv6
literals with an unknown zone or numeric addresses outside the requested
family, fail with a NetAddress.NetAddressError.
Signature
declare class AddressResolver extends Shape<"effect/net/AddressResolver", { resolve<F extends IpFamily>(target: InetAddress | HostPortInput, options: ResolveOptions & { readonly family: F; }): Effect<readonly [Inet<FamilyAddress<F>>, Inet<FamilyAddress<F>>], DnsError | NetAddressError>; resolve(target: InetAddress | HostPortInput, options?: ResolveOptions): Effect<readonly [InetAddress, InetAddress], DnsError | NetAddressError>; resolve(target: SocketAddress | HostPortInput, options?: ResolveOptions): Effect<readonly [SocketAddress, SocketAddress], DnsError | NetAddressError>;}, this> { constructor(_: never);}