# `Jido.Messaging.Sender`
[🔗](https://github.com/agentjido/jido_messaging/blob/v1.0.0/lib/jido_messaging/sender.ex#L1)

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]`

# `delivery_job`

```elixir
@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`

```elixir
@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()]
}
```

# `child_spec`

Returns a specification to start this module under a supervisor.

See `Supervisor`.

# `enqueue`

```elixir
@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`

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

Get the external message ID for a previously sent message

# `has_been_sent?`

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

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

# `queue_size`

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

Get current queue size

# `schema`

Returns the Zoi schema

# `start_link`

# `whereis`

Get the sender pid for an instance

---

*Consult [api-reference.md](api-reference.md) for complete listing*
