# `ZenWebsocket.Examples.DeribitGenServerAdapter`
[🔗](https://github.com/ZenHive/zen_websocket/blob/v0.8.0/lib/zen_websocket/examples/deribit_genserver_adapter.ex#L1)

Production-ready supervised Deribit adapter with automatic reconnection.

Features: Monitor WebSocket client, auto-reconnect, restore auth/subscriptions.
Only 5 public functions for clean API. See DeribitRpc for available methods.

# `state`

```elixir
@type state() :: %{
  client: ZenWebsocket.Client.t() | nil,
  monitor_ref: reference() | nil,
  authenticated: boolean(),
  was_authenticated: boolean(),
  subscriptions: MapSet.t(String.t()),
  client_id: String.t() | nil,
  client_secret: String.t() | nil,
  url: String.t(),
  opts: keyword()
}
```

# `authenticate`

```elixir
@spec authenticate(GenServer.server()) :: :ok | {:error, term()}
```

Authenticates with Deribit using configured credentials.

## Returns
- `:ok` on successful authentication
- `{:error, :not_connected}` if not connected
- `{:error, :missing_credentials}` if credentials not configured
- `{:error, reason}` when Deribit replies with a JSON-RPC error body

# `child_spec`

Returns a specification to start this module under a supervisor.

See `Supervisor`.

# `get_state`

```elixir
@spec get_state(GenServer.server()) :: {:ok, state()}
```

Returns the current adapter state.

## Returns
`{:ok, state}` with the internal state map.

# `send_request`

```elixir
@spec send_request(GenServer.server(), String.t(), map()) ::
  {:ok, map()} | {:error, term()}
```

Sends a JSON-RPC request to Deribit.

## Parameters
- `adapter` - The adapter GenServer
- `method` - RPC method name
- `params` - Method parameters (default: %{})

## Returns
The response from Deribit or `{:error, reason}`.

# `start_link`

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

Starts the Deribit adapter GenServer.

## Options
- `:name` - GenServer name (required)
- `:client_id` - Deribit API client ID
- `:client_secret` - Deribit API client secret
- `:url` - WebSocket URL (defaults to test.deribit.com)
- `:heartbeat_interval` - Heartbeat interval in seconds
- `:handler` - Optional message handler function `(term() -> term())`

## Returns
`{:ok, pid}` on success.

# `subscribe`

```elixir
@spec subscribe(GenServer.server(), [String.t()]) :: :ok | {:error, term()}
```

Subscribes to Deribit channels for real-time data.

## Parameters
- `adapter` - The adapter GenServer
- `channels` - List of channel names

## Returns
- `:ok` on successful subscription
- `{:error, :not_connected}` if not connected
- `{:error, reason}` when Deribit replies with a JSON-RPC error body

---

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