Quiver.Pool.HTTP3.Connection (quiver v0.3.0)

Copy Markdown View Source

gen_state_machine process owning a single HTTP/3 connection via :quic_h3.

Translates {:quic_h3, _, _} events into caller replies. Supports buffered request/response, response streaming, request body streaming, and GOAWAY-driven connection draining.

State machine:

:connecting -> :connected -> :draining

The worker transitions to :draining on receiving a peer-initiated {:quic_h3, _, {:goaway, GoawayId}} or self-initiated {:quic_h3, _, {:goaway_sent, GoawayId}} event. While draining, in-flight requests with stream_id < goaway_id continue to completion; everything else fails with Quiver.Error.H3GoAway. New :forward_request / :forward_stream messages are refused. The worker stops :normal when no requests remain.

Note: request body streaming uses {:stream_chunk, sid, chunk} and {:stream_end, sid} info messages, whereas the HTTP/2 sibling uses different naming. Aligning the two is tracked separately.

Summary

Functions

Returns the peer's advertised concurrent stream limit once the connection has reached :connected. Returns 0 while still handshaking.

Types

origin()

@type origin() :: {atom(), String.t(), :inet.port_number()}

t()

@type t() :: %Quiver.Pool.HTTP3.Connection{
  config: keyword(),
  goaway_id: non_neg_integer() | nil,
  h3_conn: pid() | nil,
  h3_conn_mon: reference() | nil,
  handshake_start: integer() | nil,
  monitors: map(),
  origin: origin(),
  peer_max_streams: non_neg_integer(),
  pending_during_connect: [tuple()],
  pool_pid: pid() | nil,
  requests: map(),
  stream_idle_timeout: non_neg_integer(),
  stream_tasks: map(),
  stream_to_ref: map()
}

Functions

connected(arg1, msg, data)

connecting(arg1, msg, data)

draining(arg1, msg, data)

max_streams(pid)

@spec max_streams(pid()) :: non_neg_integer()

Returns the peer's advertised concurrent stream limit once the connection has reached :connected. Returns 0 while still handshaking.

start_link(opts)

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