%%% @doc RFC 9298 section 5 - inner framing for HTTP Datagrams.
%%%
%%% On top of the HTTP/3 datagram delivery (RFC 9297, already handled
%%% by `quic_h3'), each MASQUE payload is preceded by a Context ID
%%% varint. Context 0 carries raw UDP payloads; non-zero contexts are
%%% reserved for future extensions (compression, ICMP, QUIC-aware
%%% proxying).
-module(masque_datagram).
-export([encode/2, decode/1]).
-export_type([context_id/0]).
-type context_id() :: non_neg_integer().
-include("masque.hrl").
%% @doc Build the HTTP Datagram payload for `Payload' carried under
%% context `ContextId'. Returns an iolist.
-spec encode(context_id(), iodata()) -> iodata().
encode(ContextId, Payload) when is_integer(ContextId), ContextId >= 0 ->
[quic_varint:encode(ContextId), Payload].
%% @doc Decode an HTTP Datagram payload.
-spec decode(binary()) ->
{ok, {context_id(), binary()}} | {error, malformed_varint}.
decode(Bin) when is_binary(Bin) ->
try
{ContextId, Rest} = quic_varint:decode(Bin),
{ok, {ContextId, Rest}}
catch
error:{incomplete, _} -> {error, malformed_varint};
error:badarg -> {error, malformed_varint}
end.