Builder

Struct Builder 

Source
pub struct Builder { /* private fields */ }
Expand description

Builder for Endpoint.

By default the endpoint will generate a new random SecretKey, which will result in a new EndpointId.

To create the Endpoint call Builder::bind.

Implementations§

Source§

impl Builder

Source

pub fn new<P: Preset>(preset: P) -> Self

Creates a new Builder using the given Preset.

See presets for more.

Source

pub fn preset<P: Preset>(self, preset: P) -> Self

Applies the given Preset.

Source

pub fn empty(relay_mode: RelayMode) -> Self

Creates an empty builder with no address lookup services.

Source

pub async fn bind(self) -> Result<Endpoint, BindError>

Binds the endpoint.

Source

pub fn bind_addr<A>(self, addr: A) -> Result<Self, InvalidSocketAddr>

Available on non-wasm_browser only.

Binds an IP socket at the provided socket address.

This is an advanced API to tightly control the sockets used by the endpoint. Most uses do not need to explicitly bind sockets.

§Warning
  • The builder always comes pre-configured with an IPv4 socket to be bound on the unspecified address: 0.0.0.0. This is the equivalent of using INADDR_ANY special bind address and results in a socket listening on all interfaces available.

  • Likewise the builder always comes pre-configured with an IPv6 socket to be bound on the unspecified address: [::]. This bind is allowed to fail however.

  • Adding a bind address removes the pre-configured unspecified bind address for this address family. Use Self::bind_addr_with_opts to bind additional addresses without replacing the default bind address.

  • This should be called at most once for each address family: once for IPv4 and/or once for IPv6. Calling it multiple times for the same address family will result in undefined routing behaviour. To bind multiple sockets of the same address family, use Self::bind_addr_with_opts.

§Description

Requests a socket to be bound on a specific address, with an implied netmask of /0. This allows restricting binding to only one network interface for a given address family.

If the port specified is already in use, binding the endpoint will fail. Using port 0 in the socket address assigns a random free port.

§Example
let endpoint = Endpoint::builder()
    .clear_ip_transports()
    .bind_addr("127.0.0.1:0")?
    .bind_addr("[::1]:0")?
    .bind()
    .await?;
Source

pub fn bind_addr_with_opts<A>( self, addr: A, opts: BindOpts, ) -> Result<Self, InvalidSocketAddr>

Available on non-wasm_browser only.

Binds an IP socket at the provided socket address.

This is an advanced API to tightly control the sockets used by the endpoint. Most uses do not need to explicitly bind sockets.

§Warning
  • The builder always comes pre-configured with an IPv4 socket to be bound on the unspecified address: 0.0.0.0. This is the equivalent of using INADDR_ANY special bind address and results in a socket listening on all interfaces available.

  • Likewise the builder always comes pre-configured with an IPv6 socket to be bound on the unspecified address: [::]. This bind is allowed to fail however.

§Description

Requests a socket to be bound on a specific address. This allows restricting binding to only one network interface for a given address family.

BindOpts::set_prefix_len should be used to configure the netmask of the network interface. This allows outgoing datagrams that start a new network flow to be sent over the socket which is attached to the subnet of the destination address. If multiple sockets are bound the standard routing-table semantics are used: the socket attached to the subnet with the longest prefix matching the destination is used. Practically this means the smallest subnets are at the top of the routing table, and the first subnet containing the destination address is chosen.

If no socket is bound to a subnet that contains the destination address, the notion of “default route” is used. At most one socket per address family may be marked as the default route using BindOpts::set_is_default_route, and this will be used for destinations not contained by the subnets of the bound sockets. This network is expected to have a default gateway configured. A socket with a prefix length of /0 will be set as a “default route” implicitly, unless BindOpts::set_is_default_route is set to false explicitly.

Be aware that using a subnet with a prefix length of /0 will always contain all destination addresses. It is valid to configure this, but no more than one such socket should be bound or the routing will be non-deterministic.

To use a subnet with a non-zero prefix length as the default route in addition to being routed when its prefix matches, use `BindOpts::set_is_default_route. Subnets with a prefix length of zero are always marked as default routes.

Finally note that most outgoing datagrams are part of an existing network flow. That is, they are in response to an incoming datagram. In this case the outgoing datagram will be sent over the same socket as the incoming datagram was received on, and the routing with the prefix length and default route as described above does not apply.

Using port 0 in the socket address assigns a random free port.

If the port specified is already in use, binding the endpoint will fail, unless BindOpts::set_is_required is set to false

§Example
let endpoint = Endpoint::builder()
    .clear_ip_transports()
    .bind_addr_with_opts("127.0.0.1:0", BindOpts::default().set_prefix_len(24))?
    .bind_addr_with_opts("[::1]:0", BindOpts::default().set_prefix_len(48))?
    .bind()
    .await?;
Source

pub fn clear_ip_transports(self) -> Self

Available on non-wasm_browser only.

Removes all IP based transports.

Source

pub fn clear_relay_transports(self) -> Self

Removes all relay based transports.

Source

pub fn secret_key(self, secret_key: SecretKey) -> Self

Sets a secret key to authenticate with other peers.

This secret key’s public key will be the PublicKey of this endpoint and thus also its EndpointId

If not set, a new secret key will be generated.

Source

pub fn alpns(self, alpn_protocols: Vec<Vec<u8>>) -> Self

Sets the ALPN protocols that this endpoint will accept on incoming connections.

Not setting this will still allow creating connections, but to accept incoming connections at least one ALPN must be set.

Source

pub fn relay_mode(self, relay_mode: RelayMode) -> Self

Sets the relay servers to assist in establishing connectivity.

Relay servers are used to establish initial connection with another iroh endpoint. They also perform various functions related to hole punching, see the crate docs for more details.

By default the number 0 relay servers are used, see RelayMode::Default.

When using RelayMode::Custom, the provided relay_map must contain at least one configured relay endpoint. If an invalid RelayMap is provided bind will result in an error.

Source

pub fn clear_address_lookup(self) -> Self

Removes all Address Lookup services from the builder.

If no Address Lookup is set, connecting to an endpoint without providing its direct addresses or relay URLs will fail.

See the documentation of the crate::address_lookup::AddressLookup trait for details.

Source

pub fn address_lookup(self, address_lookup: impl IntoAddressLookup) -> Self

Adds an additional Address Lookup for this endpoint.

Once the endpoint is created the provided IntoAddressLookup::into_address_lookup will be called. This allows Address Lookup’s to finalize their configuration by e.g. using the secret key from the endpoint which can be needed to sign published information.

This method can be called multiple times and all the Address Lookup’s passed in will be combined using an internal instance of the crate::address_lookup::ConcurrentAddressLookup. To clear all Address Lookup’s, use Self::clear_address_lookup.

If no Address Lookup is set, connecting to an endpoint without providing its direct addresses or relay URLs will fail.

See the documentation of the crate::address_lookup::AddressLookup trait for details.

Source

pub fn user_data_for_address_lookup(self, user_data: UserData) -> Self

Sets the initial user-defined data to be published in Address Lookup’s for this node.

When using Address Lookup’s, this string of UserData will be published together with the endpoint’s addresses and relay URL. When other endpoints discover this endpoint, they retrieve the UserData in addition to the addressing info.

Iroh itself does not interpret the user-defined data in any way, it is purely left for applications to parse and use.

Source

pub fn transport_config(self, transport_config: QuicTransportConfig) -> Self

Sets a custom QuicTransportConfig for this endpoint.

The transport config contains parameters governing the QUIC state machine.

If unset, the default config is used. Default values should be suitable for most internet applications. Applications protocols which forbid remotely-initiated streams should set max_concurrent_bidi_streams and max_concurrent_uni_streams to zero.

Please be aware that changing some settings may have adverse effects on establishing and maintaining direct connections.

Source

pub fn dns_resolver(self, dns_resolver: DnsResolver) -> Self

Available on non-wasm_browser only.

Optionally sets a custom DNS resolver to use for this endpoint.

The DNS resolver is used to resolve relay hostnames, and endpoint addresses if crate::address_lookup::DnsAddressLookup is configured.

By default, a new DNS resolver is created which is configured to use the host system’s DNS configuration. You can pass a custom instance of DnsResolver here to use a differently configured DNS resolver for this endpoint, or to share a DnsResolver between multiple endpoints.

Source

pub fn proxy_url(self, url: Url) -> Self

Sets an explicit proxy url to proxy all HTTP(S) traffic through.

Source

pub fn proxy_from_env(self) -> Self

Sets the proxy url from the environment, in this order:

  • HTTP_PROXY
  • http_proxy
  • HTTPS_PROXY
  • https_proxy
Source

pub fn keylog(self, keylog: bool) -> Self

Enables saving the TLS pre-master key for connections.

This key should normally remain secret but can be useful to debug networking issues by decrypting captured traffic.

If keylog is true then setting the SSLKEYLOGFILE environment variable to a filename will result in this file being used to log the TLS pre-master keys.

Source

pub fn insecure_skip_relay_cert_verify(self, skip_verify: bool) -> Self

Available on crate features test-utils only.

Skip verification of SSL certificates from relay servers

May only be used in tests.

Source

pub fn max_tls_tickets(self, n: usize) -> Self

Set the maximum number of TLS tickets to cache.

Set this to a larger value if you want to do 0rtt connections to a large number of clients.

The default is 256, taking about 150 KiB in memory.

Source

pub fn hooks(self, hooks: impl EndpointHooks + 'static) -> Self

Install hooks onto the endpoint.

Endpoint hooks intercept the connection establishment process of an Endpoint.

You can install multiple EndpointHooks by calling this function multiple times. Order matters: hooks are invoked in the order they were installed onto the endpoint builder. Once a hook returns reject, further processing is aborted and other hooks won’t be invoked.

See EndpointHooks for details on the possible interception points in the connection lifecycle.

Trait Implementations§

Source§

impl Debug for Builder

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CompatExt for T

§

fn compat(self) -> Compat<T>

Applies the [Compat] adapter by value. Read more
§

fn compat_ref(&self) -> Compat<&T>

Applies the [Compat] adapter by shared reference. Read more
§

fn compat_mut(&mut self) -> Compat<&mut T>

Applies the [Compat] adapter by mutable reference. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more