<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 4.0.5) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-leopizzi-fulmen-00" category="exp" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title>FULMEN 1.0</title>

    <author initials="G." surname="Leopizzi" fullname="Giacomo Leopizzi">
      <organization abbrev="Riga Technical University">Information Technology Institute, Riga Technical University</organization>
      <address>
        <postal>
          <city>Riga</city>
          <code>LV-1048</code>
          <country>Latvia</country>
        </postal>
        <email>giacomo.leopizzi@rtu.lv</email>
      </address>
    </author>
    <author initials="J." surname="Grabis" fullname="Jānis Grabis" asciiInitials="J." asciiSurname="Grabis" asciiFullname="Janis Grabis">
      <organization abbrev="Riga Technical University">Information Technology Institute, Riga Technical University</organization>
      <address>
        <postal>
          <city>Riga</city>
          <code>LV-1048</code>
          <country>Latvia</country>
        </postal>
        <email>grabis@rtu.lv</email>
      </address>
    </author>
    <author initials="K." surname="Ābelnīca" fullname="Kaspars Ābelnīca" asciiInitials="K." asciiSurname="Abelnica" asciiFullname="Kaspars Abelnica">
      <organization abbrev="Riga Technical University">Information Technology Institute, Riga Technical University</organization>
      <address>
        <postal>
          <city>Riga</city>
          <code>LV-1048</code>
          <country>Latvia</country>
        </postal>
        <email>kaspars.abelnica@rtu.lv</email>
      </address>
    </author>
    <author initials="S." surname="Martorelli" fullname="Simone Martorelli">
      <organization>IBM</organization>
      <address>
        <postal>
          <city>Bratislava</city>
          <code>821 09</code>
          <country>Slovakia</country>
        </postal>
        <email>simone.martorelli@ibm.com</email>
      </address>
    </author>

    <date year="2026" month="August" day="05"/>

    
    
    <keyword>client-server</keyword> <keyword>event</keyword> <keyword>bi-directional</keyword> <keyword>socket</keyword> <keyword>TCP</keyword> <keyword>WebSocket</keyword>

    <abstract>


<?line 61?>

<t>This document specifies FULMEN version 1.0, an event-based, bi-directional
client-server communication protocol with a binary wire format. Within a
FULMEN connection, both the client and the server can send events. An event
is a message frame identified by a sequential identifier and addressed by a
UTF-8 path used for routing and dispatching; its sender can request an
acknowledgment, a response correlated to the event that carries a status
code describing the outcome of its processing. Events and acknowledgments
can carry a binary payload, either inline within the frame or delivered
incrementally in chunks through a stream. The protocol version in use is
negotiated during the connection handshake. FULMEN also defines an
extension mechanism, based on typed data units attached to protocol
messages, through which additional functionality can be introduced without
changes to the wire format.</t>



    </abstract>



  </front>

  <middle>


<?line 77?>

<section anchor="introduction"><name>Introduction</name>

<t>FULMEN is a client-server protocol. Similarly to HTTP, which is based on the
concept of request-response, FULMEN is designed around the concept of event
acknowledgment. In HTTP, the client strictly sends a request, and the server
is responsible for the responses. In FULMEN, both the client and server can
send events and acknowledgments. Before proceeding, it is necessary to
provide the reader with definitions of such terms in the context of this
protocol:</t>

<t><list style="symbols">
  <t>An event is a semantically significant, application-layer message frame
exchanged by the communicating parties, representing a discrete unit of
intent, data, or instruction. Each event has an identifier that is
unique within the connection context. Each event includes a path, a
UTF-8 encoded string for routing, dispatching, or topic identification. The
path provides each event with a logical addressing mechanism, enabling the
event to be dynamic and context-sensitive. An event <bcp14>MAY</bcp14> include a binary
payload.</t>
  <t>An acknowledgment is a structured response sent by the receiver of an event
upon explicit request of the event's sender. It provides a mechanism to
correlate an optional response to a given event whenever necessary for the
application layer. Each acknowledgment includes a status code to inform
about the result of event processing and <bcp14>MAY</bcp14> carry a payload.</t>
</list></t>

<t>Both event and acknowledgment <bcp14>MAY</bcp14> include a payload. The protocol supports
the payload as included within the frame, sent later, or in chunks with
separate future frames. In the latter case, a "stream" is used, and the
payload body delivery can be deferred to a future point.</t>

<t>The protocol supports extensions to guarantee extensibility. An extension is
a modular, typed data unit that can be added to some frames to add or adapt
core protocol functionalities without altering the protocol wire format or
breaking compatibility. Extensions are serialized using a TLV format attached
to the payload of some protocol messages.</t>

</section>
<section anchor="notation"><name>Conventions and Notation</name>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in <xref target="BCP14"/> (<xref target="RFC2119"/>) (<xref target="RFC8174"/>) when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

<t>The protocol exclusively uses big-endian byte order.</t>

<t>This document uses a pseudo-C struct in listings to clarify how fields are
serialized and deserialized from the wire format. <spanx style="verb">uint8</spanx>, <spanx style="verb">uint16</spanx>,
<spanx style="verb">uint32</spanx>, <spanx style="verb">uint64</spanx> represent an unsigned integer serialized respectively
using exactly 1, 2, 4, and 8 bytes. <spanx style="verb">string</spanx> is used to represent an
encoded UTF-8 string. The <spanx style="verb">string</spanx> is serialized as a <spanx style="verb">uint16</spanx> representing
the length of the string in bytes, followed by the bytes representing the
string. For example, the string "IETF" would be serialized as:</t>

<figure><artwork><![CDATA[
[0x00, 0x04, 0x49, 0x45, 0x54, 0x46]
]]></artwork></figure>

<t><spanx style="verb">data</spanx> represents an encoded buffer of binary bytes. As per the <spanx style="verb">string</spanx>, it
is serialized as a <spanx style="verb">uint16</spanx> representing the length of the buffer in bytes,
followed by the buffer itself. For example, the buffer [0x01, 0x02, 0x03]
would be serialized as:</t>

<figure><artwork><![CDATA[
[0x00, 0x03, 0x01, 0x02, 0x03]
]]></artwork></figure>

<t><spanx style="verb">opaque name[n]</spanx> represents exactly <spanx style="verb">n</spanx> bytes, serialized as-is without any
length prefix. More generally, the array notation <spanx style="verb">type name[count]</spanx>
represents <spanx style="verb">count</spanx> elements of the indicated type, serialized back-to-back
in order and without any length prefix; when <spanx style="verb">count</spanx> is the name of another
field of the structure, the number of elements is given by the value of
that field.</t>

<t>When declaring a pseudo-C struct, a field (or multiple fields) might be
wrapped within an "if" block. If so, the field (or the fields) are only
present whenever the bit flag is set in the if condition. The name of the bit
flag might be preceded by a "!" indicating the logical NOT operation. For
example, to represent that a field is there only if the bit flag named
"hello" is not set, the struct would contain the following:</t>

<figure><artwork><![CDATA[
if (!hello) {
    string example;
}
]]></artwork></figure>

<t>A C-like bit-field notation is used in the listings to represent bit flags.
Despite its appearance, it is not an actual C bit-field: it is only a
notation to describe the meaning of the individual bits of a single byte,
and no C compiler layout, padding, or memory alignment rule applies. The
bits are listed from the most significant to the least significant: the
first element of the bit-field is the most significant bit of the byte.
For example, in a structure declared as:</t>

<figure><artwork><![CDATA[
struct {
    bool a : 1; 
    void reserved : 7;
} FlagsExample
]]></artwork></figure>

<t>the flag <spanx style="verb">a</spanx> is the most significant bit of the byte (0x80), and the remaining
seven bits are reserved. The notation uses the <spanx style="verb">void</spanx> type to reserve space
for future flags. Reserved bits <bcp14>MUST</bcp14> be set to zero when a frame is sent
and <bcp14>MUST</bcp14> be ignored upon receipt.</t>

<t>Unless otherwise specified, enumerated types (<spanx style="verb">enum</spanx>) and bit-flag structures
are serialized as a single byte (<spanx style="verb">uint8</spanx>).</t>

</section>
<section anchor="transport"><name>Transport</name>

<t>FULMEN is an application-layer protocol and does not define its own
mechanisms for reliability, ordering, or congestion control. It therefore
requires an underlying transport that provides such guarantees.</t>

<t>This document defines the use of FULMEN over two transports, TCP
(<xref target="transport-tcp"/>) and WebSocket (<xref target="transport-websocket"/>). The lifetime of a
FULMEN connection coincides with the lifetime of the underlying connection.</t>

<section anchor="transport-tcp"><name>TCP</name>

<t>When FULMEN is carried over TCP <xref target="RFC9293"/>, the frames (<xref target="frame"/>) are sent
back-to-back over the TCP connection, with no additional framing.
A frame can be split across several TCP segments, and several frames 
can be carried by a single TCP segment; a receiver <bcp14>MUST NOT</bcp14> rely on any 
relationship between frame boundaries and transport-level boundaries.</t>

<t>Implementations <bcp14>SHOULD</bcp14> disable the Nagle algorithm by setting the TCP_NODELAY
socket option.</t>

<t>When the connection is established over TLS, the ALPN extension <xref target="RFC7301"/>
<bcp14>SHOULD</bcp14> be used with the following identifier:</t>

<figure><artwork><![CDATA[
fulmen/1
]]></artwork></figure>

</section>
<section anchor="transport-websocket"><name>WebSocket</name>

<t>When FULMEN is carried over WebSocket <xref target="RFC6455"/>, the client <bcp14>SHOULD</bcp14> include 
the subprotocol name <spanx style="verb">fulmen/1</spanx> in the <spanx style="verb">Sec-WebSocket-Protocol</spanx> header field 
of its opening handshake, and a server that accepts the connection echoes 
it as prescribed by <xref target="RFC6455"/>.</t>

<t>FULMEN is carried exclusively by WebSocket messages of type binary: a party
that receives a text message <bcp14>MUST</bcp14> terminate the connection with an Alert
message (<xref target="alert"/>) with code MALFORMED_FRAME.</t>

<t>The FULMEN byte stream is the concatenation, in the order received, of the payloads
of the binary messages. A receiver <bcp14>MUST NOT</bcp14> assume that a message boundary coincides
with a frame boundary. However, sending each frame as a single binary message is
<bcp14>RECOMMENDED</bcp14>.</t>

</section>
</section>
<section anchor="handshake"><name>Connection Establishment and Major Version Negotiation</name>

<t>A FULMEN connection, regardless of the transport, begins with a handshake. 
The handshake starts with a fixed sequence of 8 bytes sent by each party, 
and proceeds with the Hello and Welcome messages (<xref target="messages"/>), in which the 
minor version is negotiated. The 8 handshake bytes are:</t>

<t><list style="symbols">
  <t>the six octets 0x46 0x55 0x4C 0x4D 0x45 0x4E (the ASCII string "FULMEN");</t>
  <t>one byte, an 8-bit unsigned integer representing the FULMEN major version
to be used within the connection. The value 0 <bcp14>MUST NOT</bcp14> be sent by the client;</t>
  <t>one reserved byte. It <bcp14>MUST</bcp14> be set to zero when sent and <bcp14>MUST</bcp14> be ignored
upon receipt.</t>
</list></t>

<t>This 8-byte sequence is invariant: its format <bcp14>MUST</bcp14> remain identical across
all FULMEN major versions.</t>

<t>The client <bcp14>MUST</bcp14> send the 8 handshake bytes as the first bytes of the
connection, carrying the single major version it intends to use within the
connection. The client is free to decide whether to send the Hello message
(<xref target="hello"/>) immediately after its handshake bytes, without waiting for
the server: doing so is <bcp14>RECOMMENDED</bcp14>.</t>

<t>The server <bcp14>MUST</bcp14> respond with its own 8 handshake bytes. If the server
supports the major version indicated by the client, it <bcp14>MUST</bcp14> echo the same
major version; it is <bcp14>RECOMMENDED</bcp14> for the server to send the Welcome message
(<xref target="welcome"/>) immediately after its handshake bytes. 
If the server does not support the major version indicated by the client, it <bcp14>MUST</bcp14>
send the handshake bytes carrying the major version 0 and terminate the connection; 
in this case, the server <bcp14>MUST NOT</bcp14> attempt to interpret any byte received after the
client's handshake bytes.</t>

<t>A party that receives handshake bytes that do not begin with the six
octets "FULMEN" <bcp14>MUST</bcp14> terminate the connection.</t>

<t>Likewise, a client that receives handshake bytes carrying a major version that is neither 
the one it sent nor 0 <bcp14>MUST</bcp14> terminate the connection.</t>

<t><xref target="listing-handshake-example"/> shows the handshake bytes exchanged in a
FULMEN 1.0 connection.</t>

<figure title="FULMEN 1.0 handshake bytes" anchor="listing-handshake-example"><artwork><![CDATA[
Client -> Server:
    46 55 4C 4D 45 4E 01 00      ("FULMEN", major version 1)

Server -> Client:
    46 55 4C 4D 45 4E 01 00      ("FULMEN", major version 1)
]]></artwork></figure>

</section>
<section anchor="frame"><name>Frame</name>

<t><xref target="listing-frame"/> represents the generic FULMEN frame structure. The frame is
the unit sent over the wire. Thus, all the bytes received from the transport
(<xref target="transport"/>) after the handshake bytes <bcp14>MUST</bcp14> be decoded as frames and
later interpreted as described based on the <spanx style="verb">type</spanx> field.</t>

<t>All the fields of a message are serialized within the frame's <spanx style="verb">payload</spanx>
field. The sizes of the variable-length fields within a message
are constrained by the enclosing frame.</t>

<t>A party that decodes a frame whose <spanx style="verb">payload</spanx> does not conform to the
structure of the message indicated by the <spanx style="verb">type</spanx> field <bcp14>MUST</bcp14> terminate the
connection with an Alert message (<xref target="alert"/>) with code MALFORMED_FRAME.</t>

<figure title="FULMEN frame structure" anchor="listing-frame"><artwork><![CDATA[
struct {
    uint8 type;
    data  payload;
} FulmenFrame
]]></artwork></figure>

</section>
<section anchor="messages"><name>Messages</name>

<t>A message is a unit sent using a frame. Each message is represented by a
unique type identifier (8-bit unsigned integer).
The type identifier 0x00 is reserved and <bcp14>MUST NOT</bcp14> be used. 
A party that receives a frame whose <spanx style="verb">type</spanx> is 0x00 or is not supported <bcp14>MUST</bcp14>
terminate the connection with an Alert message (<xref target="alert"/>) with code
UNSUPPORTED_FRAME_TYPE.</t>

<t>The connection follows a strict lifecycle. The first message sent by the
client <bcp14>MUST</bcp14> be a Hello message (<xref target="hello"/>), and the first message sent by
the server <bcp14>MUST</bcp14> be a Welcome message (<xref target="welcome"/>). Once the Welcome message
has been sent, the handshake is complete, and Hello and Welcome messages
<bcp14>MUST NOT</bcp14> be sent again within the connection lifetime. 
With the exception of the Alert message (<xref target="alert"/>), which can be sent by either 
party at any point of the connection, no other message can be sent before the Welcome message 
has been received.
A party that receives a message violating this lifecycle <bcp14>MUST</bcp14>
terminate the connection with an Alert message with code
UNEXPECTED_MESSAGE.</t>

<section anchor="hello"><name>Hello</name>

<dl>
  <dt>Type:</dt>
  <dd>
    <t>0x01</t>
  </dd>
  <dt>Sender:</dt>
  <dd>
    <t>client</t>
  </dd>
  <dt>Extensions:</dt>
  <dd>
    <t>supported</t>
  </dd>
</dl>

<t>It is the first message that <bcp14>MUST</bcp14> be sent over the open connection, after
the handshake bytes (<xref target="handshake"/>). In this message, the client lists all
the supported minor versions of the protocol.</t>

<t>It contains the following fields:</t>

<t><list style="symbols">
  <t><spanx style="verb">flags</spanx>, currently the only flag supported is <spanx style="verb">has_extensions</spanx>, indicating
if the message has some extensions included.</t>
  <t><spanx style="verb">ver_length</spanx>, an 8-bit unsigned integer representing the length in bytes of
the <spanx style="verb">supported_minor_versions</spanx> array.</t>
  <t><spanx style="verb">supported_minor_versions</spanx>, an array of 8-bit unsigned integers, each one
representing a minor version supported by the client. The array <bcp14>MUST NOT</bcp14> be empty:
a receiver of a Hello message with a <spanx style="verb">ver_length</spanx> of 0 <bcp14>MUST</bcp14> terminate the connection
with an Alert message (<xref target="alert"/>) with code MALFORMED_FRAME.</t>
  <t><spanx style="verb">extensions</spanx>, a <spanx style="verb">data</spanx> array containing the Data Transfer Objects (DTOs) of
the extensions carried by this message. Each DTO is encoded as later
described in this document.</t>
</list></t>

<t><xref target="listing-hello-payload"/> shows the message's payload.</t>

<figure title="Hello message payload" anchor="listing-hello-payload"><artwork><![CDATA[
struct {
    bool has_extensions : 1;
    void reserved       : 7;
} HelloFlags

struct {
    HelloFlags flags;
    uint8      ver_length;
    opaque     supported_minor_versions[ver_length];
    if (has_extensions) {
    data extensions;
    }
} HelloPayload
]]></artwork></figure>

</section>
<section anchor="welcome"><name>Welcome</name>

<dl>
  <dt>Type:</dt>
  <dd>
    <t>0x02</t>
  </dd>
  <dt>Sender:</dt>
  <dd>
    <t>server</t>
  </dd>
  <dt>Extensions:</dt>
  <dd>
    <t>supported</t>
  </dd>
</dl>

<t>It is the message sent by the server in response to the Hello message. As
shown by <xref target="listing-welcome-payload"/>, besides the extensions, the only field
is the <spanx style="verb">minor_version</spanx> representing the minor version, among the ones
supported by the client, that the server has picked to be used within this
connection. The connection is opened after receiving a Welcome message, and
the parties can begin sending other appropriate messages.
If the server supports none of the minor versions listed in the Hello message,
it <bcp14>MUST</bcp14> send an Alert message (<xref target="alert"/>) with code UNSUPPORTED_MINOR_VERSIONS and close
the connection. Likewise, a client that receives a Welcome message whose
<spanx style="verb">minor_version</spanx> was not listed in its Hello message <bcp14>MUST</bcp14> terminate the
connection with an Alert message (<xref target="alert"/>) with code
UNSUPPORTED_MINOR_VERSIONS.</t>

<figure title="Welcome message payload" anchor="listing-welcome-payload"><artwork><![CDATA[
struct {
    bool has_extensions : 1;
    void reserved       : 7;
} WelcomeFlags

struct {
    WelcomeFlags flags;
    uint8        minor_version;
    if (has_extensions) {
    data extensions;
    }
} WelcomePayload
]]></artwork></figure>

</section>
<section anchor="event"><name>Event</name>

<dl>
  <dt>Type:</dt>
  <dd>
    <t>0x03</t>
  </dd>
  <dt>Sender:</dt>
  <dd>
    <t>client, server</t>
  </dd>
  <dt>Extensions:</dt>
  <dd>
    <t>supported</t>
  </dd>
</dl>

<t>This message delivers an event (<xref target="listing-event-payload"/>).</t>

<figure title="Event message payload" anchor="listing-event-payload"><artwork><![CDATA[
struct {
    bool has_extensions     : 1;
    bool has_inline_payload : 1;
    bool requires_ack       : 1;
    void reserved           : 5;
} EventFlags

struct {
    uint64     event_id;
    EventFlags flags;
    string     path;
    if (!has_inline_payload) {
    uint32 stream_id;
    }
    if (has_inline_payload) {
    data payload;
    }
    if (has_extensions) {
    data extensions;
    }
} EventPayload
]]></artwork></figure>

<t>The event payload supports the following fields:</t>

<t><list style="symbols">
  <t><spanx style="verb">event_id</spanx>, a 64-bit unsigned integer representing the progressive
identifier of the current event. Each client and server has its own
sequence that <bcp14>MUST</bcp14> be unique to the FULMEN connection. It starts from zero, and
it <bcp14>MUST</bcp14> be incremented by one for each Event message sent. A party that
receives an Event message whose <spanx style="verb">event_id</spanx> is not the expected next value
of the sender's sequence <bcp14>MUST</bcp14> terminate the connection with an Alert
message (<xref target="alert"/>) with code INVALID_EVENT_ID.</t>
  <t><spanx style="verb">flags</spanx>, the following flags are supported:  <list style="symbols">
      <t><spanx style="verb">has_extensions</spanx>, as previously described.</t>
      <t><spanx style="verb">has_inline_payload</spanx>, if set, the payload of the event is written inline.
If not set, a stream identifier will be provided to retrieve the payload
later.</t>
      <t><spanx style="verb">requires_ack</spanx>, if set the sender of this event is expecting an
Acknowledgment message in response to the event.</t>
    </list></t>
  <t><spanx style="verb">path</spanx>, the path of the event. It <bcp14>MUST</bcp14> be a UTF-8 encoded string and <bcp14>MUST
NOT</bcp14> be empty. A path, to be valid, <bcp14>MUST</bcp14> contain exclusively the following
characters:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
A-Z a-z 0-9 - _ . ~ /
]]></artwork></figure>
  <vspace blankLines='1'/>
A path <bcp14>MUST NOT</bcp14> begin or end with the "/" character and
<bcp14>MUST NOT</bcp14> contain two consecutive "/" characters. 
A party that receives an Event message with an invalid path <bcp14>MUST</bcp14>
terminate the connection with an Alert message (<xref target="alert"/>) with code
INVALID_EVENT_PATH.</t>
  <t><spanx style="verb">stream_id</spanx>, only present if the flag <spanx style="verb">has_inline_payload</spanx> is not set. If
so, the 32-bit unsigned integer identifies the stream that will later
carry this event's payload.</t>
  <t><spanx style="verb">payload</spanx>, only present if the flag <spanx style="verb">has_inline_payload</spanx> is set. Represents
the binary payload of the event. A <spanx style="verb">payload</spanx> of length 0 is allowed: an
event that carries no payload is sent with the <spanx style="verb">has_inline_payload</spanx> flag
set and a zero-length <spanx style="verb">payload</spanx>.</t>
  <t><spanx style="verb">extensions</spanx>, same as the Hello message.</t>
</list></t>

</section>
<section anchor="acknowledgment"><name>Acknowledgment</name>

<dl>
  <dt>Type:</dt>
  <dd>
    <t>0x04</t>
  </dd>
  <dt>Sender:</dt>
  <dd>
    <t>client, server</t>
  </dd>
  <dt>Extensions:</dt>
  <dd>
    <t>supported</t>
  </dd>
</dl>

<t>As shown in <xref target="listing-ack-payload"/>, the message delivers an event
acknowledgment to the sender party. It contains the following fields:</t>

<t><list style="symbols">
  <t><spanx style="verb">event_id</spanx>, the 64-bit unsigned integer representing the identifier of the
event this message is acknowledging. It correlates an event with its
Acknowledgment message.</t>
  <t><spanx style="verb">flags</spanx>, the following are currently supported:  <list style="symbols">
      <t><spanx style="verb">has_extensions</spanx>, same as the Hello message.</t>
      <t><spanx style="verb">has_inline_payload</spanx>, same as the Event message.</t>
      <t><spanx style="verb">has_status_description</spanx>, if set, the payload includes a string to
clarify the meaning of the status further.</t>
    </list></t>
  <t><spanx style="verb">status</spanx>, an 8-bit unsigned integer representing the status of the message.
It works similarly to the HTTP Response Status Code. Its purpose is to
provide the sender with information about how the processing of the Event
is completed. The status code 0 is reserved and <bcp14>MUST NOT</bcp14> be used.</t>
  <t><spanx style="verb">status_description</spanx>, a <spanx style="verb">string</spanx> present if the flag
<spanx style="verb">has_status_description</spanx> is set. It represents an optional message that can
be sent along the status to clarify it further (for example, by providing
an error description).</t>
  <t><spanx style="verb">stream_id</spanx>, same as for the Event message.</t>
  <t><spanx style="verb">payload</spanx>, same as for the Event message.</t>
  <t><spanx style="verb">extensions</spanx>, same as for the Hello message.</t>
</list></t>

<t>A party that receives an Acknowledgment message whose <spanx style="verb">event_id</spanx> does not
correspond to an event it sent with the <spanx style="verb">requires_ack</spanx> flag set, or that
has already been acknowledged, <bcp14>MUST</bcp14> terminate the connection with an Alert
message (<xref target="alert"/>) with code UNEXPECTED_EVENT_ACK.</t>

<figure title="Acknowledgment message payload" anchor="listing-ack-payload"><artwork><![CDATA[
enum Status {
    OK                  =  1,
    INVALID_ARGUMENT    =  2,
    UNAUTHENTICATED     =  3,
    PERMISSION_DENIED   =  4,
    NOT_FOUND           =  5,
    ALREADY_EXISTS      =  6,
    FAILED_PRECONDITION =  7,
    OUT_OF_RANGE        =  8,
    CONFLICT            =  9,
    RESOURCE_EXHAUSTED  = 10,
    CANCELLED           = 11,
    DEADLINE_EXCEEDED   = 12,
    RATE_LIMITED        = 13,
    INTERNAL_ERROR      = 14,
    UNAVAILABLE         = 15,
    PROTOCOL_VIOLATION  = 16
}

struct {
    bool has_extensions         : 1;
    bool has_inline_payload     : 1;
    bool has_status_description : 1;
    void reserved               : 5;
} AckFlags

struct {
    uint64   event_id;
    AckFlags flags;
    Status   status;
    if (has_status_description) {
    string status_description;
    }
    if (!has_inline_payload) {
    uint32 stream_id;
    }
    if (has_inline_payload) {
    data payload;
    }
    if (has_extensions) {
    data extensions;
    }
} AcknowledgmentPayload
]]></artwork></figure>

</section>
<section anchor="stream"><name>Stream</name>

<dl>
  <dt>Type:</dt>
  <dd>
    <t>0x05</t>
  </dd>
  <dt>Sender:</dt>
  <dd>
    <t>client, server</t>
  </dd>
  <dt>Extensions:</dt>
  <dd>
    <t>supported</t>
  </dd>
</dl>

<t>A message that delivers a chunk of the payload whenever the event or the
acknowledgment message declares its intention to use it for payload streaming
functionality. <xref target="listing-stream-payload"/> shows the message's payload.</t>

<t>The stream status 0 is reserved and <bcp14>MUST NOT</bcp14> be used.</t>

<t>In a Stream message, the <spanx style="verb">stream_id</spanx> always refers to a stream initiated by
the message's sender. A stream consists of zero or more chunks with status
HAS_MORE followed by a final chunk with status ENDED; the complete payload
of the stream is the concatenation, in the order received, of the <spanx style="verb">payload</spanx>
fields of all its chunks. The <spanx style="verb">payload</spanx> of an ENDED chunk can be empty.</t>

<t>The initiator can terminate a stream abnormally at any moment by sending a
chunk with status ABORTED, whose <spanx style="verb">payload</spanx> <bcp14>MUST</bcp14> be empty; upon receiving
it, the receiver <bcp14>MUST</bcp14> discard all the previously received chunks of the
stream. A stream ends when a chunk with status ENDED or ABORTED is
received.</t>

<t>Each party allocates stream identifiers from its own sequence, which <bcp14>SHOULD</bcp14> start
from zero and <bcp14>SHOULD</bcp14> be incremented by one for each new stream the party
initiates (by declaring it in an Event or Acknowledgment message).
A stream identifier can be reused upon reception of a Stream Ack message with 
status RECEIVED from the counterpart (<xref target="stream-ack"/>).
A party that receives an Event, Acknowledgment, or Stream message violating
these rules <bcp14>MUST</bcp14> terminate the connection with an Alert message
(<xref target="alert"/>) with code INVALID_STREAM_ID.</t>

<t>FULMEN version 1.0 does not provide per-stream flow control. A receiver that
cannot keep up with an incoming stream can cancel it using the Stream Ack
message (<xref target="stream-ack"/>).</t>

<t>Stream messages of different streams, as well as Stream messages and other
messages, <bcp14>MAY</bcp14> be freely interleaved; the chunks of a single stream <bcp14>MUST</bcp14> be
sent in order. Implementations <bcp14>MAY</bcp14> adopt a prioritization system to decide
the order in which frames are sent.</t>

<figure title="Stream message payload" anchor="listing-stream-payload"><artwork><![CDATA[
enum StreamStatus {
    HAS_MORE = 1,
    ENDED    = 2,
    ABORTED  = 3
}

struct {
    bool         has_extensions : 1;
    void         reserved       : 7;
} StreamFlags

struct {
    uint32       stream_id;
    StreamFlags  flags;
    StreamStatus status;
    data payload;
    if (has_extensions) {
    data extensions;
    }
} StreamPayload
]]></artwork></figure>

</section>
<section anchor="stream-ack"><name>Stream Ack</name>

<dl>
  <dt>Type:</dt>
  <dd>
    <t>0x06</t>
  </dd>
  <dt>Sender:</dt>
  <dd>
    <t>client, server</t>
  </dd>
  <dt>Extensions:</dt>
  <dd>
    <t>supported</t>
  </dd>
</dl>

<t>A message sent by the receiver of a stream to its initiator
(<xref target="listing-stream-ack-payload"/>). Similarly to the Acknowledgment message, the
<spanx style="verb">stream_id</spanx> of a Stream Ack message <bcp14>MUST</bcp14> always be the same as that of the received
Stream message.</t>

<t>FULMEN version 1.0 supports two status values:</t>

<t><list style="symbols">
  <t>ABORT, used to request the cancellation of an incoming stream. Upon
receiving it, the initiator of the stream <bcp14>MUST NOT</bcp14> send further HAS_MORE
chunks and <bcp14>MUST</bcp14> confirm the cancellation by sending a final Stream
message with status ABORTED for the stream. The party that requested the
cancellation <bcp14>MUST</bcp14> ignore any HAS_MORE chunk of the stream received while
waiting; the stream ends when a final chunk is received.</t>
  <t>RECEIVED, used to acknowledge the termination of a stream. A party that
receives a final Stream message (status ENDED or ABORTED) <bcp14>MUST</bcp14> respond
with a Stream Ack message with status RECEIVED.</t>
</list></t>

<t>After receiving a Stream Ack message with status RECEIVED, the initiator can
consider that stream identifier as valid for reuse.</t>

<t>Once a party considers a stream terminated,
it <bcp14>MUST</bcp14> ignore every message referring to that stream identifier, with the
exception of the reception of a Stream Ack message with status RECEIVED.
Only upon the re-declaration of the stream identifier by
a new Event or Acknowledgment message do messages referring to that
identifier become valid again, as they refer to the new stream.</t>

<t>A Stream Ack message that refers to a stream identifier that
its receiver has never allocated <bcp14>MUST</bcp14> be treated as a violation, and the
receiving party <bcp14>MUST</bcp14> terminate the connection with an Alert message
(<xref target="alert"/>) with code INVALID_STREAM_ID.</t>

<figure title="Stream Ack message payload" anchor="listing-stream-ack-payload"><artwork><![CDATA[
enum StreamAckStatus {
    ABORT = 1,
    RECEIVED = 2
}

struct {
    bool            has_extensions : 1;
    void            reserved       : 7;
} StreamAckFlags

struct {
    uint32          stream_id;
    StreamAckFlags  flags;
    StreamAckStatus status;
    if (has_extensions) {
    data extensions;
    }
} StreamAckPayload
]]></artwork></figure>

</section>
<section anchor="heartbeat"><name>Heartbeat</name>

<dl>
  <dt>Type:</dt>
  <dd>
    <t>0x07</t>
  </dd>
  <dt>Sender:</dt>
  <dd>
    <t>client, server</t>
  </dd>
  <dt>Extensions:</dt>
  <dd>
    <t>not supported</t>
  </dd>
</dl>

<t>Either party sends it as a "keep-alive" mechanism. As shown in
<xref target="listing-heartbeat-payload"/>, it includes a token; the receiving party <bcp14>MUST</bcp14>
respond with a Heartbeat Ack message (<xref target="heartbeat-ack"/>) carrying the same
token, allowing the sender to correlate the two messages.
There is no restriction on token reuse: the token generation strategy is left 
to the sender. The message does not support extensions.</t>

<figure title="Heartbeat message payload" anchor="listing-heartbeat-payload"><artwork><![CDATA[
struct {
    void reserved : 8;
} HeartbeatFlags

struct {
    HeartbeatFlags flags;
    uint8          token;
} HeartbeatPayload
]]></artwork></figure>

</section>
<section anchor="heartbeat-ack"><name>Heartbeat Ack</name>

<dl>
  <dt>Type:</dt>
  <dd>
    <t>0x08</t>
  </dd>
  <dt>Sender:</dt>
  <dd>
    <t>client, server</t>
  </dd>
  <dt>Extensions:</dt>
  <dd>
    <t>not supported</t>
  </dd>
</dl>

<t>Sent upon reception of a Heartbeat message. As shown in
<xref target="listing-heartbeat-ack-payload"/>, it <bcp14>MUST</bcp14> include the same token received in
the Heartbeat message. The message does not support extensions.</t>

<figure title="Heartbeat Ack message payload" anchor="listing-heartbeat-ack-payload"><artwork><![CDATA[
struct {
    void reserved : 8;
} HeartbeatAckFlags

struct {
    HeartbeatAckFlags flags;
    uint8             token;
} HeartbeatAckPayload
]]></artwork></figure>

</section>
<section anchor="extensions-message"><name>Extensions</name>

<dl>
  <dt>Type:</dt>
  <dd>
    <t>0x09</t>
  </dd>
  <dt>Sender:</dt>
  <dd>
    <t>client, server</t>
  </dd>
  <dt>Extensions:</dt>
  <dd>
    <t>supported</t>
  </dd>
</dl>

<t>A message that only consists of extensions. Its purpose is to deliver the
information needed to allow an additional mechanism to work correctly. As
shown by <xref target="listing-extensions-payload"/>, it works as the Hello message, but
it does not include a flag since the data are always present due to the
nature of the message itself. The <spanx style="verb">extensions</spanx> field <bcp14>MUST</bcp14> contain at least
one DTO (<xref target="extensions-dto"/>): a receiver of an Extensions message carrying
no extensions <bcp14>MUST</bcp14> terminate the connection with an Alert message
(<xref target="alert"/>) with code MALFORMED_FRAME.</t>

<figure title="Extensions message payload" anchor="listing-extensions-payload"><artwork><![CDATA[
struct {
    data extensions;
} ExtensionPayload
]]></artwork></figure>

</section>
<section anchor="alert"><name>Alert</name>

<dl>
  <dt>Type:</dt>
  <dd>
    <t>0x0B</t>
  </dd>
  <dt>Sender:</dt>
  <dd>
    <t>client, server</t>
  </dd>
  <dt>Extensions:</dt>
  <dd>
    <t>not supported</t>
  </dd>
</dl>

<t>Shown in <xref target="listing-alert-payload"/>, a message used to deliver an alert code
to the other party. The Alert message always terminates the connection;
after sending or receiving an Alert message, a party <bcp14>MUST</bcp14> consider the
connection closed, and no further message can be sent. Consequently, every
orderly connection termination ends with an Alert message; a graceful
termination is signaled with the code CONNECTION_CLOSE.
The alert code 0 is reserved and <bcp14>MUST NOT</bcp14> be used.</t>

<figure title="Alert message payload" anchor="listing-alert-payload"><artwork><![CDATA[
enum AlertCode {
    CONNECTION_CLOSE           =   1,
    UNSUPPORTED_MINOR_VERSIONS =   2,
    UNKNOWN_EXTENSION          =   3,
    UNSUPPORTED_FRAME_TYPE     =   4,
    MALFORMED_FRAME            =   5,
    INVALID_EVENT_ID           =   6,
    INVALID_STREAM_ID          =   7,
    INVALID_EVENT_PATH         =   8,
    HEARTBEAT_FAILURE          =   9,
    UNEXPECTED_EVENT_ACK       =  10,
    MISSING_EVENT_ACK          =  11,
    LIMITS_EXCEEDED            =  12,
    UNEXPECTED_MESSAGE         =  13,
    EXTENSION_FAILURE          =  14,

    UNKNOWN_ERROR              = 255
}

struct {
    bool has_description : 1;
    void reserved        : 7;
} AlertFlags

struct {
    AlertFlags flags;
    AlertCode  code;
    if (has_description) {
    string     description;
    }
} AlertPayload
]]></artwork></figure>

</section>
</section>
<section anchor="extensions"><name>Extensions</name>

<t>The protocol supports extensions to transport additional typed
payload. Extensions can be of two categories:</t>

<t><list style="symbols">
  <t>Protocol Extensions (PE). Those are extensions that are defined by the
protocol specification. Every Protocol Extension defined by a version of
the protocol is mandatory to implement: each client/server that
advertises support for a FULMEN version <bcp14>MUST</bcp14> support all the Protocol
Extensions defined by that version's specification. For FULMEN version
1.0, these are the extensions defined in this document.</t>
  <t>Application Extensions (AE). Those are extensions defined by the
application that uses the FULMEN protocol. The application developers are
responsible for ensuring the correct versioning of the extension itself.</t>
</list></t>

<t>A 16-bit unsigned integer identifies each extension type. The most
significant bit of the extension type determines its category: when it is
not set (types 0x0001 to 0x7FFF), the extension is a PE; when it is set
(types 0x8000 to 0xFFFF), the extension is an AE.
The extension type 0x0000 is reserved and <bcp14>MUST NOT</bcp14> be used.</t>

<t>The use of Application Extensions <bcp14>MUST</bcp14> be declared in advance. A connection
in which AEs are to be used <bcp14>MUST</bcp14> include the Application Extensions List
extension (<xref target="extensions-application-extensions-list"/>) in its Hello
message. If the Hello message does not carry the Application Extensions
List extension, no AE can be used within the connection. A party that
receives an AE type that was not declared <bcp14>MUST</bcp14> terminate the connection
with an Alert message (<xref target="alert"/>) with code UNKNOWN_EXTENSION.</t>

<t>A party that receives an extension type (either PE or AE) that it does not
support <bcp14>MUST</bcp14> ignore it.</t>

<t>When the processing of a supported extension fails in a way that prevents
the connection from continuing, the party <bcp14>MAY</bcp14> terminate the connection with
an Alert message (<xref target="alert"/>) with code EXTENSION_FAILURE and <bcp14>SHOULD</bcp14> include 
an appropriate description.</t>

<section anchor="extensions-dto"><name>Data Transfer Object</name>

<t>Each extension is serialized using the structure shown in
<xref target="listing-ext-frame"/>. When a message carries more than one extension, the
DTOs are encoded back-to-back within the <spanx style="verb">extensions</spanx> field; a receiver <bcp14>MUST</bcp14>
parse ExtensionFrame structures until the length of the enclosing <spanx style="verb">data</spanx>
field is exhausted.</t>

<t>A message <bcp14>MUST NOT</bcp14> carry more than one extension of the same type; a receiver 
of a message violating this rule <bcp14>MAY</bcp14> terminate the
connection with an Alert message (<xref target="alert"/>) with code EXTENSION_FAILURE.</t>

<t>When the <spanx style="verb">has_extensions</spanx> flag of a message supporting it is set, the <spanx style="verb">extensions</spanx> field
<bcp14>MUST</bcp14> contain at least one DTO: a receiver of a message whose
<spanx style="verb">has_extensions</spanx> flag is set and whose <spanx style="verb">extensions</spanx> field contains no DTOs
<bcp14>MUST</bcp14> terminate the connection with an Alert message (<xref target="alert"/>) with code
MALFORMED_FRAME.</t>

<t>The definition of each extension lists the messages that can carry it. An
extension <bcp14>MUST NOT</bcp14> be attached to a message that its definition does not
list; a party that receives an extension carried by a message that is not
allowed to carry it <bcp14>MUST</bcp14> terminate the connection with an Alert message
(<xref target="alert"/>) with code EXTENSION_FAILURE.</t>

<figure title="Extension Frame" anchor="listing-ext-frame"><artwork><![CDATA[
struct {
    uint16 type;
    data   payload;
} ExtensionFrame
]]></artwork></figure>

</section>
<section anchor="extensions-authentication"><name>Authentication</name>

<dl>
  <dt>Extension type:</dt>
  <dd>
    <t>0x01</t>
  </dd>
  <dt>Messages:</dt>
  <dd>
    <t>Hello, Event</t>
  </dd>
</dl>

<t>The extension payload begins with a one-byte (unsigned 8-bit integer) value
indicating the type of authentication method used. The interpretation of the
subsequent payload depends on this value. Version 1.0 defines the following
types:</t>

<t><list style="symbols">
  <t>Type 0, basic authentication. The payload consists of two back-to-back encoded strings.
The first represents a username and the second its password.</t>
  <t>Type 1, token-based authentication. The payload consists of a single string
representing the authentication token.</t>
</list></t>

<t>When the extension is carried by a Hello message and the authentication
fails, the server <bcp14>MUST</bcp14> terminate the connection with an Alert message
(<xref target="alert"/>) with code EXTENSION_FAILURE. When the extension is carried by an
Event message and the authentication fails, the receiver <bcp14>SHOULD</bcp14> reject the
event with an Acknowledgment message with status UNAUTHENTICATED (when an
acknowledgment is expected) and <bcp14>MAY</bcp14> terminate the connection with an Alert
message with code EXTENSION_FAILURE.</t>

</section>
<section anchor="extensions-contenttype"><name>ContentType</name>

<dl>
  <dt>Extension type:</dt>
  <dd>
    <t>0x02</t>
  </dd>
  <dt>Messages:</dt>
  <dd>
    <t>Event, Acknowledgment</t>
  </dd>
</dl>

<t>The payload of the extension consists of bytes representing the UTF-8 encoded
IANA Media Type <xref target="RFC6838"/> of the payload.</t>

</section>
<section anchor="extensions-metadata"><name>Metadata</name>

<dl>
  <dt>Extension type:</dt>
  <dd>
    <t>0x03</t>
  </dd>
  <dt>Messages:</dt>
  <dd>
    <t>Event, Acknowledgment</t>
  </dd>
</dl>

<t>The extension allows the sender to attach application metadata to an Event
or Acknowledgment message, conceptually similar to HTTP header fields, while
leveraging the binary wire format of FULMEN. The extension payload consists
of a single CBOR <xref target="RFC8949"/> map. Each key of the map <bcp14>MUST</bcp14> be either a CBOR
text string or a CBOR unsigned integer, and <bcp14>MUST</bcp14> be unique within the map;
the value associated with a key can be of any CBOR type.</t>

<t>In FULMEN version 1.0, unsigned integer keys carry no meaning; a receiver
<bcp14>MUST</bcp14> ignore every entry whose key is an unsigned integer, and a sender
<bcp14>MUST NOT</bcp14> include such entries.</t>

</section>
<section anchor="extensions-application-extensions-list"><name>Application Extensions List</name>

<dl>
  <dt>Extension type:</dt>
  <dd>
    <t>0x04</t>
  </dd>
  <dt>Messages:</dt>
  <dd>
    <t>Hello</t>
  </dd>
</dl>

<t>The extension allows the client to declare, during the handshake, the
Application Extensions available to the application
(<xref target="listing-app-ext-list-payload"/>). The declared AE types are the only
Application Extensions that can be used within the connection, by either
party, as described in <xref target="extensions"/>. It contains the following fields:</t>

<t><list style="symbols">
  <t><spanx style="verb">application_uuid</spanx>, a 16-byte UUID <xref target="RFC9562"/> identifying the application.
Since AE types are for private use, the UUID qualifies the namespace in
which the listed Application Extensions are defined.</t>
  <t><spanx style="verb">application_extensions</spanx>, the list of AE types available to the client,
preceded by <spanx style="verb">ae_count</spanx>, the number of its elements.</t>
</list></t>

<t>If the server does not recognize the <spanx style="verb">application_uuid</spanx>, it <bcp14>MUST</bcp14> send an
Alert message (<xref target="alert"/>) with code UNKNOWN_EXTENSION and close the
connection.</t>

<figure title="Application Extensions List extension payload" anchor="listing-app-ext-list-payload"><artwork><![CDATA[
struct {
    opaque application_uuid[16];
    uint8  ae_count;
    uint16 application_extensions[ae_count];
} ApplicationExtensionsListPayload
]]></artwork></figure>

</section>
<section anchor="extensions-allowed-event-paths"><name>Allowed Event Paths</name>

<dl>
  <dt>Extension type:</dt>
  <dd>
    <t>0x05</t>
  </dd>
  <dt>Messages:</dt>
  <dd>
    <t>Hello, Welcome, Extensions</t>
  </dd>
</dl>

<t>The extension allows each party to declare the event paths it is willing to
receive. As shown in <xref target="listing-allowed-event-paths-payload"/>, the payload
consists of a list of strings, each one representing a path pattern to be
matched against event paths.</t>

<t>A path pattern is a sequence of segments separated by the "/" character,
like the paths it is matched against. Each segment of a pattern is one of
the following:</t>

<t><list style="symbols">
  <t>a literal segment, composed of the path characters listed in <xref target="event"/>:
it matches only an identical path segment;</t>
  <t>the segment "*": it matches exactly one path segment, whatever its
content;</t>
  <t>the segment "**", which can only appear as the last segment of a
pattern: it matches any number of path segments, including zero.</t>
</list></t>

<t>A path matches a pattern when its
segments can be aligned with the pattern's segments according to the rules
above; the alignment <bcp14>MUST</bcp14> always cover the entire path, never
only a substring. For example, the pattern "sensors/*/temperature"
matches the path "sensors/kitchen/temperature" but neither
"sensors/temperature" nor "sensors/kitchen/hvac/temperature"; the pattern
"logs/**" matches "logs", "logs/app", and "logs/app/error"; the pattern
"config/reload" matches only the path "config/reload".</t>

<t>A pattern is invalid if it is empty, if any of its segments is empty
(like a path, a pattern cannot begin or end with "/" or contain two
consecutive "/" characters), if any of its segments contains the "*"
character without being exactly "*" or "**" (for example, "foo*" and
"***" are invalid segments), if a "**" segment appears in a position
other than the last, or if it contains any character that is neither a
valid path character nor "*". A party that receives a list containing an
invalid pattern <bcp14>MUST</bcp14> terminate the connection with an Alert message
(<xref target="alert"/>) with code EXTENSION_FAILURE.</t>

<t>A party <bcp14>MUST NOT</bcp14> send an Event message whose path does not match at least
one of the patterns most recently declared by the other party. A party
that receives such an Event <bcp14>MAY</bcp14> terminate the connection with an Alert
message (<xref target="alert"/>) with code INVALID_EVENT_PATH.</t>

<t>A newly received list completely replaces the previously received one (for
example, a list received within an Extensions message replaces the list
received during the handshake). An empty list (<spanx style="verb">path_count</spanx> equal to 0)
means that the other party cannot send any Event message at all. If a party
has never sent this extension, no path restriction applies to the events it
receives.</t>

<figure title="Allowed Event Paths extension payload" anchor="listing-allowed-event-paths-payload"><artwork><![CDATA[
struct {
    uint8  path_count;
    string allowed_paths[path_count];
} AllowedEventPathsPayload
]]></artwork></figure>

</section>
<section anchor="extensions-configuration"><name>Configuration</name>

<dl>
  <dt>Extension type:</dt>
  <dd>
    <t>0x06</t>
  </dd>
  <dt>Messages:</dt>
  <dd>
    <t>Welcome, Extensions</t>
  </dd>
</dl>

<t>The extension allows the server to communicate its connection policy
(<xref target="listing-configuration-payload"/>). It contains the following fields:</t>

<t><list style="symbols">
  <t><spanx style="verb">stale_timeout</spanx>, the number of seconds after which the server considers
the connection stale: if the server does not receive any frame for
<spanx style="verb">stale_timeout</spanx> seconds, it <bcp14>MAY</bcp14> close the connection. The value 0 means
that the server does not apply any stale timeout.</t>
  <t><spanx style="verb">disable_heartbeats</spanx>, controls whether the client can send Heartbeat
messages. The value 0 indicates that the client can send them; any other
value indicates that the client <bcp14>MUST NOT</bcp14> send them. If the client sends a
Heartbeat message while not allowed to, the server <bcp14>MAY</bcp14> send an Alert
message (<xref target="alert"/>) with code HEARTBEAT_FAILURE and close the connection.</t>
  <t><spanx style="verb">ack_timeout</spanx>, the maximum number of seconds a party <bcp14>SHOULD</bcp14> wait for the
Acknowledgment of an Event message sent with the <spanx style="verb">requires_ack</spanx> flag set.
Once the timeout has elapsed, the waiting party <bcp14>MAY</bcp14> terminate the
connection with an Alert message (<xref target="alert"/>) with code MISSING_EVENT_ACK.
The value 0 means that no deadline applies.</t>
  <t><spanx style="verb">heartbeat_timeout</spanx>, the maximum number of seconds a party <bcp14>SHOULD</bcp14> wait
for the Heartbeat Ack message after sending a Heartbeat message. Once the
timeout has elapsed, the waiting party <bcp14>MAY</bcp14> terminate the connection with
an Alert message (<xref target="alert"/>) with code HEARTBEAT_FAILURE. The value 0
means that no deadline applies.</t>
  <t><spanx style="verb">max_payload_size</spanx>, the maximum size in bytes of the <spanx style="verb">payload</spanx> field of
Event, Acknowledgment, and Stream messages sent by the client. The value
0 means that the server does not apply that limit.</t>
  <t><spanx style="verb">max_streams</spanx>, the maximum number of streams the client can keep
simultaneously open. The value 0 means that the server does not apply
that limit.</t>
</list></t>

<t>If the client exceeds a declared limit, the server <bcp14>MAY</bcp14> send an Alert
message (<xref target="alert"/>) with code LIMITS_EXCEEDED and close the connection.</t>

<t>The extension can also be carried by an Extensions message to update the
policy previously communicated. If the server has never sent such an extension,
no limits or timeouts apply.</t>

<figure title="Configuration extension payload" anchor="listing-configuration-payload"><artwork><![CDATA[
struct {
    uint16 stale_timeout;
    uint8  disable_heartbeats;
    uint16 ack_timeout;
    uint16 heartbeat_timeout;
    uint16 max_payload_size;
    uint16 max_streams;
} ConfigurationPayload
]]></artwork></figure>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>FULMEN does not mandate the use of a specific security protocol. However, a
FULMEN connection <bcp14>SHOULD</bcp14> be established over a protocol that ensures the
confidentiality and integrity of the communication. 
For the transports defined in this document,
this means running the TCP transport (<xref target="transport-tcp"/>) over TLS <xref target="RFC8446"/>
and using
the "wss" URI scheme for the WebSocket transport
(<xref target="transport-websocket"/>).</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<section anchor="iana-alpn"><name>ALPN Protocol Identifier</name>

<t>This document requests that IANA register the following entry in the "TLS
Application-Layer Protocol Negotiation (ALPN) Protocol IDs" registry created
by <xref target="RFC7301"/>:</t>

<dl>
  <dt>Protocol:</dt>
  <dd>
    <t>FULMEN/1</t>
  </dd>
  <dt>Identification Sequence:</dt>
  <dd>
    <t>0x66 0x75 0x6c 0x6d 0x65 0x6e 0x2f 0x31 ("fulmen/1")</t>
  </dd>
  <dt>Reference:</dt>
  <dd>
    <t>This document</t>
  </dd>
</dl>

</section>
<section anchor="iana-websocket"><name>WebSocket Subprotocol Name</name>

<t>This document requests that IANA register the following entry in the
"WebSocket Subprotocol Name Registry" created by <xref target="RFC6455"/>:</t>

<dl>
  <dt>Subprotocol Identifier:</dt>
  <dd>
    <t>FULMEN/1</t>
  </dd>
  <dt>Subprotocol Common Name:</dt>
  <dd>
    <t>FULMEN version 1</t>
  </dd>
  <dt>Subprotocol Definition:</dt>
  <dd>
    <t>This document, <xref target="transport-websocket"/></t>
  </dd>
</dl>

<t>The identifier registered in the "Sec-WebSocket-Protocol" header field is
"fulmen/1".</t>

<t>This document makes no other requests of IANA.</t>

</section>
</section>


  </middle>

  <back>



    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="RFC6455">
  <front>
    <title>The WebSocket Protocol</title>
    <author fullname="I. Fette" initials="I." surname="Fette"/>
    <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
    <date month="December" year="2011"/>
    <abstract>
      <t>The WebSocket Protocol enables two-way communication between a client running untrusted code in a controlled environment to a remote host that has opted-in to communications from that code. The security model used for this is the origin-based security model commonly used by web browsers. The protocol consists of an opening handshake followed by basic message framing, layered over TCP. The goal of this technology is to provide a mechanism for browser-based applications that need two-way communication with servers that does not rely on opening multiple HTTP connections (e.g., using XMLHttpRequest or s and long polling). [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6455"/>
  <seriesInfo name="DOI" value="10.17487/RFC6455"/>
</reference>
<reference anchor="RFC7301">
  <front>
    <title>Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension</title>
    <author fullname="S. Friedl" initials="S." surname="Friedl"/>
    <author fullname="A. Popov" initials="A." surname="Popov"/>
    <author fullname="A. Langley" initials="A." surname="Langley"/>
    <author fullname="E. Stephan" initials="E." surname="Stephan"/>
    <date month="July" year="2014"/>
    <abstract>
      <t>This document describes a Transport Layer Security (TLS) extension for application-layer protocol negotiation within the TLS handshake. For instances in which multiple application protocols are supported on the same TCP or UDP port, this extension allows the application layer to negotiate which protocol will be used within the TLS connection.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7301"/>
  <seriesInfo name="DOI" value="10.17487/RFC7301"/>
</reference>
<reference anchor="RFC8446">
  <front>
    <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
    <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
    <date month="August" year="2018"/>
    <abstract>
      <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
      <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8446"/>
  <seriesInfo name="DOI" value="10.17487/RFC8446"/>
</reference>
<reference anchor="RFC6838">
  <front>
    <title>Media Type Specifications and Registration Procedures</title>
    <author fullname="N. Freed" initials="N." surname="Freed"/>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <author fullname="T. Hansen" initials="T." surname="Hansen"/>
    <date month="January" year="2013"/>
    <abstract>
      <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="13"/>
  <seriesInfo name="RFC" value="6838"/>
  <seriesInfo name="DOI" value="10.17487/RFC6838"/>
</reference>
<reference anchor="RFC8949">
  <front>
    <title>Concise Binary Object Representation (CBOR)</title>
    <author fullname="C. Bormann" initials="C." surname="Bormann"/>
    <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
    <date month="December" year="2020"/>
    <abstract>
      <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
      <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="94"/>
  <seriesInfo name="RFC" value="8949"/>
  <seriesInfo name="DOI" value="10.17487/RFC8949"/>
</reference>
<reference anchor="RFC9293">
  <front>
    <title>Transmission Control Protocol (TCP)</title>
    <author fullname="W. Eddy" initials="W." role="editor" surname="Eddy"/>
    <date month="August" year="2022"/>
    <abstract>
      <t>This document specifies the Transmission Control Protocol (TCP). TCP is an important transport-layer protocol in the Internet protocol stack, and it has continuously evolved over decades of use and growth of the Internet. Over this time, a number of changes have been made to TCP as it was specified in RFC 793, though these have only been documented in a piecemeal fashion. This document collects and brings those changes together with the protocol specification from RFC 793. This document obsoletes RFC 793, as well as RFCs 879, 2873, 6093, 6429, 6528, and 6691 that updated parts of RFC 793. It updates RFCs 1011 and 1122, and it should be considered as a replacement for the portions of those documents dealing with TCP requirements. It also updates RFC 5961 by adding a small clarification in reset handling while in the SYN-RECEIVED state. The TCP header control bits from RFC 793 have also been updated based on RFC 3168.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="7"/>
  <seriesInfo name="RFC" value="9293"/>
  <seriesInfo name="DOI" value="10.17487/RFC9293"/>
</reference>
<reference anchor="RFC9562">
  <front>
    <title>Universally Unique IDentifiers (UUIDs)</title>
    <author fullname="K. Davis" initials="K." surname="Davis"/>
    <author fullname="B. Peabody" initials="B." surname="Peabody"/>
    <author fullname="P. Leach" initials="P." surname="Leach"/>
    <date month="May" year="2024"/>
    <abstract>
      <t>This specification defines UUIDs (Universally Unique IDentifiers) --
also known as GUIDs (Globally Unique IDentifiers) -- and a Uniform
Resource Name namespace for UUIDs. A UUID is 128 bits long and is
intended to guarantee uniqueness across space and time. UUIDs were
originally used in the Apollo Network Computing System (NCS), later
in the Open Software Foundation's (OSF's) Distributed Computing
Environment (DCE), and then in Microsoft Windows platforms.</t>
      <t>This specification is derived from the OSF DCE specification with the
kind permission of the OSF (now known as "The Open Group"). Information from earlier versions of the OSF DCE specification have
been incorporated into this document. This document obsoletes RFC
4122.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9562"/>
  <seriesInfo name="DOI" value="10.17487/RFC9562"/>
</reference>
<referencegroup anchor="BCP14" target="https://www.rfc-editor.org/info/bcp14">
  <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
    <front>
      <title>Key words for use in RFCs to Indicate Requirement Levels</title>
      <author fullname="S. Bradner" initials="S." surname="Bradner"/>
      <date month="March" year="1997"/>
      <abstract>
        <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
      </abstract>
    </front>
    <seriesInfo name="BCP" value="14"/>
    <seriesInfo name="RFC" value="2119"/>
    <seriesInfo name="DOI" value="10.17487/RFC2119"/>
  </reference>
  <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
    <front>
      <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
      <author fullname="B. Leiba" initials="B." surname="Leiba"/>
      <date month="May" year="2017"/>
      <abstract>
        <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
      </abstract>
    </front>
    <seriesInfo name="BCP" value="14"/>
    <seriesInfo name="RFC" value="8174"/>
    <seriesInfo name="DOI" value="10.17487/RFC8174"/>
  </reference>
</referencegroup>



    </references>





  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA9V92VYcSZLou39FNHpo6JOZAgmpEJrqmRSkSkyxXUBVXVNd
ByIzA4hRZkRORCSI0qHP3O+5v9Efdm31JRag1NXnzOgBQSwe5ubmtpt5v983
VVrNku1o5f3H/YPRYbQxWF8x03ySxXO4Oi3iy6o/S/JF+uuvaf9yOZsnWX99
3UziKrnKi7vtKPm8MOVyPE/LMs2z6m4Br+2Nzt6bdFFsR1WxLKsX6+tv1l+Y
m+3opTGfkrvbvJhumyjqR5NZmmRVv0yKm6SgK8kNXKDfxml/mhbJpIJh4xld
KvPJp4Tvnu0c0/8/JuNTvmriZXWdFzxwmpXb0XeDaF9Ah4tRxHP6Lo0n+TwP
b+XFFYCdXebFPMYPRmfJ5DrLZ/nVHVwuAUnLKulFJ+lVzLfSSTyLPmYpwF2m
1Z0OEo/HRQITffjBCfzCz/Cf+RTg2v+hv7G+uSVXllmF2N2Pq5uUn0rmcTrb
jq4Y/IEuyr8V1XIwu3Gz/vdB9F0Rj9PSm/O///3/ZmnpX4/LSZq+X85m8kBc
u/+/CCEEdAMN3w+iv//3OJllf/9/k9hDxfdxuYiLsn6zhg99aogPpfLM/x6c
fGLwB7GA38DO6SA6iIsqL5LZzN8cp+k8z5L6PZ74uwMPrncFoKCcxTc+dH/c
erERrb/5Ywje6Sy/iT+FAJb0ncHcfuff0vF8AIRtTMbovUlwJ5+833m9+eqV
/PrNy/UN+XVrc/O1PrD1ckuvvtl8I7++efHmpf766vWLbWP6/X4Uj8uqiCfA
Lc6ugeCB0S2Bo1VRuUgm6WWalJHwQVoJWGLgh70ozpgv9cdxmUx7ddYUcDGY
93y+RKQTiSyKvMon+Sy6TavrKIZXs7i4g7+KJGJCGkQ/wq00i2Ij357kWcaD
w6dyeK26ToRVAihT+lM/BqCVCVwj+MpBNBRQDcwujuZJWcZX8KUCVjdKp3AD
ZzmNxndwt0z+a4lXgPbsrYK+EE+nBbwqD5qPZ+/7W9EiBlCWeBEAj4p8WaXZ
FT0+TYHcqglM4uptlFYlgSTQFfiREgE38eRTlt/OkukV4hzQCjfLRZ6VMLu8
ADIAoQKzy2mCNAv4La5gmKLApQGIq7halgapLZom5aRIxwgDPg/gAObh/0uC
APA+gRnA3UE0ItzwxAIQYCSAEIe/c0uziO9meQyrnMCywCTSbJbClrjlRcJP
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
QNSjatDvUzaU+f/RVvIFAqYAAA==

-->

</rfc>

