# `Quiver.Transport`
[🔗](https://github.com/edlontech/quiver/blob/main/lib/quiver/transport.ex#L1)

Behaviour for socket transports.

Transports are passive by default. Use `activate/1` to switch to
`{active, :once}` mode for receiving a single socket message.
All callbacks return the (potentially updated) transport struct.

# `option`

```elixir
@type option() :: {atom(), term()}
```

# `t`

```elixir
@type t() :: struct()
```

# `activate`

```elixir
@callback activate(transport :: t()) :: {:ok, t()} | {:error, t(), term()}
```

# `close`

```elixir
@callback close(transport :: t()) :: {:ok, t()}
```

# `connect`

```elixir
@callback connect(host :: String.t(), port :: :inet.port_number(), opts :: [option()]) ::
  {:ok, t()} | {:error, term()}
```

# `controlling_process`

```elixir
@callback controlling_process(transport :: t(), pid :: pid()) ::
  {:ok, t()} | {:error, t(), term()}
```

# `recv`

```elixir
@callback recv(transport :: t(), length :: non_neg_integer(), timeout :: timeout()) ::
  {:ok, t(), binary()} | {:error, t(), term()}
```

# `send`

```elixir
@callback send(transport :: t(), data :: iodata()) :: {:ok, t()} | {:error, t(), term()}
```

# `upgrade`
*optional* 

```elixir
@callback upgrade(
  socket :: :gen_tcp.socket(),
  host :: String.t(),
  port :: :inet.port_number(),
  opts :: [option()]
) :: {:ok, t()} | {:error, term()}
```

---

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