Supervised endpoints and network profiles

View Source

An IrohBeam.Endpoint is one OTP child and one native Iroh endpoint. It is not a VM-global singleton. Every concurrently live endpoint needs a distinct private identity.

{:ok, endpoint} =
  IrohBeam.Endpoint.start_link(
    identity: {:file, "data/iroh.identity"},
    alpns: ["my-app/1"],
    network: :direct,
    bind: ["127.0.0.1:0"]
  )

{:ok, endpoint_id} = IrohBeam.Endpoint.id(endpoint)
{:ok, endpoint_addr} = IrohBeam.Endpoint.addr(endpoint)
:ok = IrohBeam.Endpoint.close(endpoint)

Use the child specification under a supervisor. Normal explicit close does not restart the child; abnormal owner death does. Persistent identity is retained only when identity: {:file, path} or an explicit SecretKey is configured.

Profiles

ProfileIP transportsRelayAddress lookup/publication
:n0yesn0 public defaultsn0 DNS/Pkarr defaults
:direct / :minimalyesdisableddisabled
:no_relayyesdisabledn0 DNS/Pkarr defaults
{:custom, relays}yessupplied records onlydisabled

:direct is the infrastructure-free profile. It does not silently contact a public relay or address-lookup service. Peers will need an explicit endpoint address or ticket. :no_relay is different: it retains n0 lookup/publication and therefore can contact public infrastructure.

A custom relay record validates its HTTP(S) URL and optional bearer token before native bind. Tokens cannot be placed in URL credentials or query strings and are redacted from inspection, status, errors, logs, and native info.

{:ok, relay} = IrohBeam.Relay.new("https://relay.internal.example./", token: token)

{:ok, endpoint} =
  IrohBeam.Endpoint.start_link(
    identity: :ephemeral,
    alpns: ["my-app/1"],
    network: {:custom, [relay]},
    bind: ["0.0.0.0:0"]
  )

bind accepts at most one socket per IP family. Port 0 asks the OS for an available port. Startup and shutdown timeouts are positive milliseconds. limits currently validates :max_pending_accepts and :max_connections; the connection layer consumes these bounds.