defmodule Spear.ClusterMember do
@moduledoc """
A struct representing a member of a cluster of EventStoreDBs
"""
@moduledoc since: "0.5.0"
import Spear.Records.Gossip
@typedoc """
A struct representing a member of a cluster of EventStoreDBs
These are returned by `Spear.cluster_info/2`.
## Examples
iex> Spear.cluster_info(conn)
{:ok,
[
%Spear.ClusterMember{
address: "127.0.0.1",
alive?: true,
instance_id: "eba4c27f-e443-4b21-8756-00845bc5cda1",
port: 2113,
state: :Leader,
timestamp: ~U[2021-04-19 17:25:17.875824Z]
}
]}
"""
@typedoc since: "0.5.0"
@type t :: %__MODULE__{
address: Mint.Types.address(),
port: :inet.port_number(),
timestamp: DateTime.t() | nil,
instance_id: String.t(),
state: state(),
alive?: boolean()
}
@typedoc """
A possible state for an EventStoreDB cluster member
"""
@typedoc since: "0.5.0"
@type state ::
:Initializing
| :DiscoverLeader
| :Unknown
| :PreReplica
| :CatchingUp
| :Clone
| :Follower
| :PreLeader
| :Leader
| :Manager
| :ShuttingDown
| :Shutdown
| :ReadOnlyLeaderless
| :PreReadOnlyReplica
| :ResigningLeader
defstruct ~w[address port timestamp instance_id state alive?]a
def from_member_info(
member_info(
instance_id: instance_id,
time_stamp: timestamp,
state: state,
is_alive: alive?,
http_end_point: end_point(address: address, port: port)
)
) do
timestamp =
case Spear.parse_stamp(timestamp) do
{:ok, datetime} -> datetime
_ -> nil
end
%__MODULE__{
instance_id: Spear.Uuid.from_proto(instance_id),
timestamp: timestamp,
state: state,
alive?: alive?,
address: address,
port: port
}
end
end