Jido.Messaging.Sender (Jido Messaging v1.0.0)

Copy Markdown View Source

Per-instance message sender with retry queue and exponential backoff.

Handles outbound message delivery with:

  • Queued delivery (non-blocking for callers)
  • Exponential backoff with jitter on failures
  • Configurable max attempts
  • Telemetry signals for delivery lifecycle

Signals Emitted

  • [:jido_messaging, :delivery, :queued]
  • [:jido_messaging, :delivery, :attempt]
  • [:jido_messaging, :delivery, :retry_scheduled]
  • [:jido_messaging, :delivery, :gave_up]

Summary

Functions

Returns a specification to start this module under a supervisor.

Get the external message ID for a previously sent message

Check if a message has already been sent (by idempotency key)

Get current queue size

Returns the Zoi schema

Get the sender pid for an instance

Types

delivery_job()

@type delivery_job() :: %{
  id: String.t(),
  message_id: String.t(),
  idempotency_key: String.t(),
  external_room_id: term(),
  payload: String.t(),
  attempts: non_neg_integer(),
  next_attempt_at: integer() | nil,
  metadata: map(),
  external_message_id: term() | nil
}

t()

@type t() :: %Jido.Messaging.Sender{
  base_backoff_ms: integer(),
  channel: any(),
  instance_id: binary(),
  instance_module: any(),
  instance_server: nil | nil | any(),
  max_attempts: integer(),
  max_backoff_ms: integer(),
  queue: any(),
  queue_size: integer(),
  sent_cache_size: integer(),
  sent_messages: map(),
  sent_order: [binary()]
}

Functions

child_spec(init_arg)

Returns a specification to start this module under a supervisor.

See Supervisor.

enqueue(pid, message_id, external_room_id, payload, metadata \\ %{})

@spec enqueue(pid(), String.t(), term(), String.t(), map()) ::
  {:ok, String.t()} | {:error, :queue_full}

Enqueue a message for delivery.

Returns {:ok, job_id} if queued successfully, {:error, :queue_full} if at capacity.

get_external_id(pid, idempotency_key)

@spec get_external_id(pid(), String.t()) :: {:ok, term()} | :not_found

Get the external message ID for a previously sent message

has_been_sent?(pid, idempotency_key)

@spec has_been_sent?(pid(), String.t()) :: boolean()

Check if a message has already been sent (by idempotency key)

queue_size(pid)

@spec queue_size(pid()) :: non_neg_integer()

Get current queue size

schema()

Returns the Zoi schema

start_link(opts)

whereis(instance_module, instance_id)

Get the sender pid for an instance