Manages a resilient Chronicle gRPC channel with automatic reconnection.
Connection is a GenServer that maintains a gRPC channel to a Chronicle
kernel. It handles connection failures with exponential backoff and notifies
callers waiting for the connection to become ready.
On every connect/reconnect attempt it re-resolves the connection string's
addresses — a static multi-host list, or a fresh DNS SRV lookup for
chronicle+srv:// (see Chronicle.Connections.DnsResolver) — and picks one
via the configured load-balancer strategy (see Chronicle.Connections.LoadBalancer)
before dialing. Re-resolving on every attempt means a chronicle+srv://
record change, or a host coming back up, is picked up automatically without
a separate background refresh loop.
Usage
Start it as part of your supervision tree, typically via Chronicle.Client:
{Chronicle.Client,
connection_string: "chronicle://localhost:35000",
...}Or start it directly for lower-level use:
{:ok, conn} = Chronicle.Connections.Connection.start_link(
connection_string: "chronicle://localhost:35000",
name: :my_conn
)
:ok = Chronicle.Connections.Connection.connect(:my_conn)
{:ok, channel} = Chronicle.Connections.Connection.channel(:my_conn)Options
:connection_string— aChronicle.Connections.ConnectionStringstruct or a connection string binary. Defaults toConnectionString.default/0.:server_address— alternative to:connection_string; a"host:port"string.:skip_tls_validation— overrides the connection string'sskipTlsValidationquery option. Whentrue, the gRPC channel and the OAuth2 token fetch skip TLS certificate chain validation instead of validating against the system trust store.:load_balancer— overrides the connection string'sloadBalancerquery option (:least_connections,:round_robin, or:random).:grpc_options— additional options passed toGRPC.Stub.connect/2.:retry_attempts— maximum reconnect attempts before giving up (default: 5).:reconnect_base_delay— base reconnect delay in milliseconds (default: 1000).:reconnect_max_delay— maximum reconnect delay in milliseconds (default: 10000).:auto_connect— whether to connect immediately on start (default:true).:resolve_fun— resolves achronicle+srv://host to candidate addresses. Defaults toChronicle.Connections.DnsResolver.resolve/2. Test-only seam, mirroring:connect_fun/:disconnect_funbelow.:probe_fun— performs the:least_connectionsHTTP probe. Defaults toChronicle.Connections.LoadBalancer.default_probe/3. Test-only seam.:connect_fun— test-only seam replacingGRPC.Stub.connect/2.:disconnect_fun— test-only seam replacingGRPC.Stub.disconnect/1.:name— registered name for the GenServer process.
Summary
Functions
Returns {:ok, channel} when connected, or {:error, :not_connected}.
Returns a specification to start this module under a supervisor.
Waits until the connection is ready, or returns {:error, :timeout}.
Returns true if the channel is currently connected.
Disconnects the active channel and stops reconnect attempts.
Starts a Chronicle connection process linked to the current process.
Types
@type option() :: {:connection_string, String.t() | Chronicle.Connections.ConnectionString.t()} | {:server_address, String.t()} | {:skip_tls_validation, boolean()} | {:load_balancer, Chronicle.Connections.ConnectionString.load_balancer_strategy()} | {:grpc_options, keyword()} | {:retry_attempts, non_neg_integer()} | {:reconnect_base_delay, non_neg_integer()} | {:reconnect_max_delay, non_neg_integer()} | {:resolve_fun, (String.t(), String.t() | nil -> {:ok, [Chronicle.Connections.ConnectionString.ServerAddress.t()]} | {:error, term()})} | {:probe_fun, Chronicle.Connections.LoadBalancer.probe_fun()} | {:connect_fun, (String.t(), keyword() -> {:ok, term()} | {:error, term()})} | {:disconnect_fun, (term() -> any())} | {:name, GenServer.name()} | {:auto_connect, boolean()}
Functions
@spec channel(GenServer.server()) :: {:ok, term()} | {:error, :not_connected}
Returns {:ok, channel} when connected, or {:error, :not_connected}.
Returns a specification to start this module under a supervisor.
See Supervisor.
@spec connect(GenServer.server(), timeout()) :: :ok | {:error, :timeout}
Waits until the connection is ready, or returns {:error, :timeout}.
Blocks the caller until the gRPC channel is established or timeout
milliseconds elapse.
@spec connected?(GenServer.server()) :: boolean()
Returns true if the channel is currently connected.
@spec disconnect(GenServer.server()) :: :ok
Disconnects the active channel and stops reconnect attempts.
The process exits normally after this call.
@spec start_link([option()]) :: GenServer.on_start()
Starts a Chronicle connection process linked to the current process.