# `Bourse.Defaults`
[🔗](https://github.com/ZenHive/bourse/blob/main/lib/bourse/defaults.ex#L1)

Centralized default configuration values for bourse.

All defaults can be overridden via application config:

    config :bourse,
      recv_window_ms: 10_000,
      request_timeout_ms: 60_000

## Available Defaults

| Config Key | Default | Description |
|------------|---------|-------------|
| `:recv_window_ms` | 5000 | Request timestamp validity window (exchanges reject stale requests) |
| `:request_timeout_ms` | 30000 | HTTP request timeout |
| `:retry_policy` | `:safe_transient` | HTTP retry strategy (GET/HEAD only) |
| `:retry_delay` | `nil` | Backoff between retries; `nil` keeps Req's exponential default |
| `:rate_limiter_enabled` | `true` | Enable/disable rate limiter |
| `:rate_limit_cleanup_interval_ms` | 60000 | Interval for cleaning up old rate limit timestamps |
| `:rate_limit_max_age_ms` | 60000 | Maximum age for rate limit request timestamps |

# `rate_limit_cleanup_interval_ms`

```elixir
@spec rate_limit_cleanup_interval_ms() :: pos_integer()
```

Returns the interval for cleaning up expired rate limit timestamps.

Default: 60000ms

# `rate_limit_max_age_ms`

```elixir
@spec rate_limit_max_age_ms() :: pos_integer()
```

Returns the maximum age for rate limit request timestamps before removal.

Default: 60000ms

# `rate_limiter_enabled?`

```elixir
@spec rate_limiter_enabled?() :: boolean()
```

Returns whether the rate limiter is enabled.

Default: `true`

# `recv_window_ms`

```elixir
@spec recv_window_ms() :: pos_integer()
```

Returns the recv_window value in milliseconds.

The recv_window defines how long a signed request is valid.
Exchanges reject requests with timestamps outside this window.

Default: 5000ms

# `request_timeout_ms`

```elixir
@spec request_timeout_ms() :: pos_integer()
```

Returns the HTTP request timeout in milliseconds.

Maximum time to wait for a response from an exchange API.

Default: 30000ms

# `retry_delay`

```elixir
@spec retry_delay() :: non_neg_integer() | nil
```

Returns the backoff between HTTP retries.

`nil` — the default — leaves the decision to Req, which honors a `retry-after`
header on 429/503 and otherwise backs off exponentially. An integer overrides
both with a fixed millisecond delay.

The test suite sets `0` so stub-driven retry paths exercise the same code
without paying production backoff; real backoff behavior is asserted by
passing `:retry_delay` per call.

Default: `nil`

# `retry_policy`

```elixir
@spec retry_policy() :: :safe_transient | :transient | false
```

Returns the HTTP retry policy.

## Trading Safety (CRITICAL)

Uses `:safe_transient` by default — only retries GET/HEAD requests.
**Never use `:transient` for trading APIs** as it could duplicate orders.

Default: `:safe_transient`

---

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