# `Snodo.Client.Transport`
[🔗](https://github.com/joshrotenberg/snodo/blob/v0.2.0/lib/snodo/client/transport.ex#L1)

Behaviour for the connection underneath `Snodo.Client`.

A transport moves one complete JSON-RPC request to a server and returns the
complete JSON-RPC response. `Snodo.Client` builds the request and decodes the
response, so a transport never interprets `result` or `error`.

`request/3` receives these options:

  * `:timeout` - milliseconds to wait for the response.
  * `:dialect` - the protocol dialect module that built the request. HTTP
    uses its `transport_policy/1` to derive headers.

Failures of the connection itself are `%Snodo.Error{kind: :transport}`. Use
`connection_error/2` (-32000) and `timeout_error/1` (-32001), the codes the
official TypeScript SDK uses for the same client-side conditions.

# `state`

```elixir
@type state() :: term()
```

# `close`

```elixir
@callback close(state()) :: :ok
```

# `connect`

```elixir
@callback connect(init_arg :: term(), opts :: keyword()) ::
  {:ok, state()} | {:error, Snodo.Error.t()}
```

# `request`

```elixir
@callback request(state(), message :: map(), opts :: keyword()) ::
  {:ok, map()} | {:error, Snodo.Error.t()}
```

# `connection_error`

```elixir
@spec connection_error(String.t(), term()) :: Snodo.Error.t()
```

The connection is closed, unreachable, or produced an unusable response.

# `timeout_error`

```elixir
@spec timeout_error(timeout()) :: Snodo.Error.t()
```

No response arrived within `timeout` milliseconds.

---

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