Current section
Files
Jump to
Current section
Files
include/webtransport.hrl
%% Copyright (c) 2026, Benoit Chesneau.
%% Licensed under the Apache License, Version 2.0.
%%
%% @doc WebTransport Protocol Definitions
%%
%% draft-ietf-webtrans-overview-12 - Protocol Framework
%% draft-ietf-webtrans-http2-14 - WebTransport over HTTP/2
%% draft-ietf-webtrans-http3-15 - WebTransport over HTTP/3
-ifndef(WEBTRANSPORT_HRL).
-define(WEBTRANSPORT_HRL, 1).
%% ============================================================================
%% HTTP/2 WebTransport Capsule Types (draft-ietf-webtrans-http2-14)
%% ============================================================================
-define(WT_PADDING, 16#190B4D38).
-define(WT_RESET_STREAM, 16#190B4D39).
-define(WT_STOP_SENDING, 16#190B4D3A).
-define(WT_STREAM, 16#190B4D3B).
-define(WT_STREAM_FIN, 16#190B4D3C).
-define(WT_MAX_DATA, 16#190B4D3D).
-define(WT_MAX_STREAM_DATA, 16#190B4D3E).
-define(WT_MAX_STREAMS_BIDI, 16#190B4D3F).
-define(WT_MAX_STREAMS_UNI, 16#190B4D40).
-define(WT_DATA_BLOCKED, 16#190B4D41).
-define(WT_STREAM_DATA_BLOCKED, 16#190B4D42).
-define(WT_STREAMS_BLOCKED_BIDI, 16#190B4D43).
-define(WT_STREAMS_BLOCKED_UNI, 16#190B4D44).
-define(WT_CLOSE_SESSION, 16#190B4D45).
-define(WT_DRAIN_SESSION, 16#190B4D46).
%% HTTP Datagram capsule (RFC 9297)
-define(DATAGRAM, 16#00).
%% ============================================================================
%% HTTP/3 WebTransport (draft-ietf-webtrans-http3-15)
%% ============================================================================
%% HTTP/3 Settings.
%%
%% The WT settings (wt_enabled, wt_initial_max_data, etc.) are now
%% defined as atoms in erlang_quic (quic_h3.hrl) and erlang_h2 (h2.hrl).
%% Use the atom keys directly in settings maps rather than integer macros.
%%
%% Legacy draft-02 compat uses a separate integer codepoint not in either
%% upstream library:
-define(SETTINGS_ENABLE_WEBTRANSPORT_DRAFT02, 16#2b603742).
%% HTTP/3 Unidirectional Stream Type
-define(WT_UNI_STREAM_TYPE, 16#54).
%% HTTP/3 Bidirectional Stream Signal
-define(WT_BIDI_SIGNAL, 16#41).
%% HTTP/3 Capsule Types (session management)
-define(WT_CLOSE_SESSION_H3, 16#2843).
-define(WT_DRAIN_SESSION_H3, 16#78ae).
%% HTTP/3 Error Codes
-define(WT_BUFFERED_STREAM_REJECTED, 16#3994bd84).
-define(WT_SESSION_GONE, 16#170d7b68).
-define(WT_FLOW_CONTROL_ERROR, 16#045d4487).
-define(WT_ALPN_ERROR, 16#0817b3dd).
-define(WT_REQUIREMENTS_NOT_MET, 16#212c0d48).
%% Application error code base
-define(WT_APP_ERROR_FIRST, 16#52e4a40fa8db).
%% ============================================================================
%% Stream State (defined first, referenced by session)
%% ============================================================================
-record(wt_stream, {
id :: non_neg_integer(),
type :: bidi | uni,
state = open :: open | half_closed_local | half_closed_remote | closed,
%% Flow control
send_window :: non_neg_integer(),
recv_window :: non_neg_integer(),
%% Buffers
send_buffer = <<>> :: binary(),
recv_buffer = <<>> :: binary()
}).
%% ============================================================================
%% Session State
%% ============================================================================
-record(wt_session, {
id :: non_neg_integer(),
transport :: h2 | h3,
path :: binary(),
authority :: binary(),
state = open :: open | draining | closed,
%% Flow control (for H2, managed by capsules)
local_max_data :: non_neg_integer(),
remote_max_data :: non_neg_integer(),
local_max_streams_bidi :: non_neg_integer(),
local_max_streams_uni :: non_neg_integer(),
remote_max_streams_bidi :: non_neg_integer(),
remote_max_streams_uni :: non_neg_integer(),
%% Active streams
streams :: #{non_neg_integer() => #wt_stream{}},
stream_count_bidi :: non_neg_integer(),
stream_count_uni :: non_neg_integer()
}).
%% ============================================================================
%% Default Settings
%% ============================================================================
-define(DEFAULT_MAX_DATA, 1048576). %% 1 MB
-define(DEFAULT_MAX_STREAM_DATA, 262144). %% 256 KB
-define(DEFAULT_MAX_STREAMS_BIDI, 100).
-define(DEFAULT_MAX_STREAMS_UNI, 100).
-define(DEFAULT_MAX_SESSIONS, 100).
%% ============================================================================
%% Datagram size ceilings
%% ============================================================================
%%
%% H2 datagrams travel as capsules over the CONNECT stream, bounded by the
%% HTTP/2 default initial stream window (65535 bytes). The capsule header
%% (type varint + length varint) consumes a few bytes; we reserve 64 bytes
%% of headroom to leave room for the RFC 9297 DATAGRAM capsule framing and
%% any intermediate HTTP/2 framing overhead.
-define(WT_H2_DATAGRAM_MAX, 65471). %% 65535 - 64
%% H3 datagrams are QUIC datagrams prefixed with a quarter-stream-id varint.
%% The peer-advertised `max_datagram_frame_size' (we set 65535) caps the
%% whole encoded datagram — payload + session-id varint — so we reserve
%% 8 bytes for the worst-case varint encoding of the session id.
-define(WT_H3_DATAGRAM_MAX, 65527). %% 65535 - 8
-endif.