defmodule HTTP.WebTransport.SendStream do @moduledoc """ Writable byte stream owned by a WebTransport session. """ defstruct [:transport, :ref] @type t :: %__MODULE__{transport: HTTP.WebTransport.t(), ref: term()} @call_timeout 5_000 @spec write(t(), iodata(), keyword() | map()) :: :ok | {:error, term()} def write(%__MODULE__{transport: transport, ref: stream_ref}, data, options \\ []) do options = if is_map(options), do: Map.to_list(options), else: options GenServer.call(transport.pid, {:send_stream, stream_ref, data, options}, @call_timeout) catch :exit, _reason -> {:error, :closed} end @spec close(t()) :: :ok | {:error, term()} def close(%__MODULE__{transport: transport, ref: stream_ref}) do GenServer.call(transport.pid, {:close_send_stream, stream_ref}, @call_timeout) catch :exit, _reason -> {:error, :closed} end @spec abort(t(), keyword() | map()) :: :ok | {:error, term()} def abort(%__MODULE__{transport: transport, ref: stream_ref}, options \\ []) do options = if is_map(options), do: Map.to_list(options), else: options code = Keyword.get(options, :code, 0) GenServer.call(transport.pid, {:abort_send_stream, stream_ref, code}, @call_timeout) catch :exit, _reason -> {:error, :closed} end end