defmodule CCXT.Defaults do @moduledoc """ Centralized default configuration values for ccxt_client. All defaults can be overridden via application config: config :ccxt_client, 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) | | `: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 | """ @default_recv_window_ms 5_000 @default_request_timeout_ms 30_000 @default_retry_policy :safe_transient @default_rate_limiter_enabled true @default_rate_limit_cleanup_interval_ms 60_000 @default_rate_limit_max_age_ms 60_000 @doc """ 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: #{@default_recv_window_ms}ms """ @spec recv_window_ms() :: pos_integer() def recv_window_ms do Application.get_env(:ccxt_client, :recv_window_ms, @default_recv_window_ms) end @doc """ Returns the HTTP request timeout in milliseconds. Maximum time to wait for a response from an exchange API. Default: #{@default_request_timeout_ms}ms """ @spec request_timeout_ms() :: pos_integer() def request_timeout_ms do Application.get_env(:ccxt_client, :request_timeout_ms, @default_request_timeout_ms) end @doc """ 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` """ @spec retry_policy() :: :safe_transient | :transient | false def retry_policy do Application.get_env(:ccxt_client, :retry_policy, @default_retry_policy) end @doc """ Returns whether the rate limiter is enabled. Default: `true` """ @spec rate_limiter_enabled?() :: boolean() def rate_limiter_enabled? do Application.get_env(:ccxt_client, :rate_limiter_enabled, @default_rate_limiter_enabled) end @doc """ Returns the interval for cleaning up expired rate limit timestamps. Default: #{@default_rate_limit_cleanup_interval_ms}ms """ @spec rate_limit_cleanup_interval_ms() :: pos_integer() def rate_limit_cleanup_interval_ms do Application.get_env( :ccxt_client, :rate_limit_cleanup_interval_ms, @default_rate_limit_cleanup_interval_ms ) end @doc """ Returns the maximum age for rate limit request timestamps before removal. Default: #{@default_rate_limit_max_age_ms}ms """ @spec rate_limit_max_age_ms() :: pos_integer() def rate_limit_max_age_ms do Application.get_env(:ccxt_client, :rate_limit_max_age_ms, @default_rate_limit_max_age_ms) end @doc false @spec raw_defaults() :: %{ recv_window_ms: pos_integer(), request_timeout_ms: pos_integer(), retry_policy: atom(), rate_limiter_enabled: boolean(), rate_limit_cleanup_interval_ms: pos_integer(), rate_limit_max_age_ms: pos_integer() } def raw_defaults do %{ recv_window_ms: @default_recv_window_ms, request_timeout_ms: @default_request_timeout_ms, retry_policy: @default_retry_policy, rate_limiter_enabled: @default_rate_limiter_enabled, rate_limit_cleanup_interval_ms: @default_rate_limit_cleanup_interval_ms, rate_limit_max_age_ms: @default_rate_limit_max_age_ms } end end