Skip to content
Effect 4.0 is here. One ecosystem. Zero dependencies.

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.

6 exports Since v4.0.0 Source

Constructors

Since v4.0.0

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

Since v4.0.0

Creates a layer that provides an AddressResolver using the Dns service.

Signature

declare function layer(options?: MakeOptions): Layer<AddressResolver, never, Dns>

Models

MakeOptions

interface
Since v4.0.0

Options 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;
}
Since v4.0.0

Options for resolving an endpoint. Without a family, addresses of both families are returned.

Signature

interface ResolveOptions {
readonly family?: IpFamily;
}
Since v4.0.0

Looks 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);
}