Raxol.Swarm.TacticalOverlay (Raxol v2.3.0)

View Source

CRDT-backed shared state visible to all nodes.

Maintains entities (LWW-Register per entity), waypoints (OR-Set), and annotations (LWW-Register per annotation). Syncs deltas to peers at a configurable interval, with full anti-entropy exchange periodically.

Summary

Types

entity()

@type entity() :: %{
  id: atom(),
  node: node(),
  position: {float(), float(), float()},
  heading: float(),
  status: :active | :damaged | :offline,
  last_updated: integer(),
  metadata: map()
}

pending_op()

@type pending_op() ::
  {:update_entity, atom(), Raxol.Swarm.CRDT.LWWRegister.t()}
  | {:add_waypoint, waypoint()}
  | {:remove_waypoint, waypoint()}
  | {:add_annotation, binary(), Raxol.Swarm.CRDT.LWWRegister.t()}

t()

@type t() :: %Raxol.Swarm.TacticalOverlay{
  annotations: %{required(binary()) => Raxol.Swarm.CRDT.LWWRegister.t()},
  anti_entropy_interval_ms: pos_integer(),
  anti_entropy_ref: reference() | nil,
  comms_manager: GenServer.server(),
  entities: %{required(atom()) => Raxol.Swarm.CRDT.LWWRegister.t()},
  node_id: node(),
  peers: [node()],
  pending_ops: [pending_op()],
  subscribers: [pid()],
  sync_interval_ms: pos_integer(),
  sync_ref: reference() | nil,
  waypoints: Raxol.Swarm.CRDT.ORSet.t()
}

waypoint()

@type waypoint() :: %{
  id: binary(),
  position: {float(), float(), float()},
  label: String.t(),
  created_by: node(),
  created_at: integer()
}

Functions

add_annotation(server \\ __MODULE__, annotation_id, data)

@spec add_annotation(GenServer.server(), binary(), map()) :: :ok

add_waypoint(server \\ __MODULE__, waypoint)

@spec add_waypoint(GenServer.server(), waypoint()) :: :ok

child_spec(init_arg)

Returns a specification to start this module under a supervisor.

See Supervisor.

get_all_entities(server \\ __MODULE__)

@spec get_all_entities(GenServer.server()) :: [entity()]

get_all_waypoints(server \\ __MODULE__)

@spec get_all_waypoints(GenServer.server()) :: [waypoint()]

get_overlay_state(server \\ __MODULE__)

@spec get_overlay_state(GenServer.server()) :: map()

receive_delta(server \\ __MODULE__, from_node, ops)

@spec receive_delta(GenServer.server(), node(), [term()]) :: :ok

Receive a delta from a remote peer. Called via :rpc.cast.

receive_full_state(server \\ __MODULE__, from_node, remote_state)

@spec receive_full_state(GenServer.server(), node(), map()) :: :ok

Receive full state for anti-entropy exchange.

remove_waypoint(server \\ __MODULE__, waypoint_id)

@spec remove_waypoint(GenServer.server(), binary()) :: :ok

set_peers(server \\ __MODULE__, peers)

@spec set_peers(GenServer.server(), [node()]) :: :ok

start_link(opts \\ [])

@spec start_link(keyword()) :: GenServer.on_start()

subscribe(server \\ __MODULE__)

@spec subscribe(GenServer.server()) :: :ok

update_entity(server \\ __MODULE__, entity_id, data)

@spec update_entity(GenServer.server(), atom(), map()) :: :ok