defmodule HTTP.WebTransport.StreamQueue do
@moduledoc """
Queue handle for incoming WebTransport streams.
"""
defstruct [:transport, :kind]
@type kind :: :incoming_bidirectional | :incoming_unidirectional
@type t :: %__MODULE__{transport: HTTP.WebTransport.t(), kind: kind()}
@call_timeout 5_000
@spec read(t(), keyword() | map()) ::
{:ok, HTTP.WebTransport.BidirectionalStream.t() | HTTP.WebTransport.ReceiveStream.t()}
| {:error, term()}
def read(%__MODULE__{transport: transport, kind: kind}, options \\ []) do
options = if is_map(options), do: Map.to_list(options), else: options
timeout = Keyword.get(options, :timeout, :infinity)
GenServer.call(transport.pid, {:read_stream_queue, kind, timeout}, call_timeout(timeout))
catch
:exit, {:timeout, _call} -> {:error, :timeout}
:exit, _reason -> {:error, :closed}
end
defp call_timeout(:infinity), do: :infinity
defp call_timeout(timeout) when is_integer(timeout) and timeout >= 0, do: timeout + 1_000
defp call_timeout(_timeout), do: @call_timeout
end