<?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-01" category="exp" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="FULMEN 1.0">FULMEN 1.0: Event-Driven Bidirectional Client-Server Communication Protocol</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="08"/>

    
    
    <keyword>client-server</keyword> <keyword>event</keyword> <keyword>bidirectional</keyword> <keyword>socket</keyword> <keyword>TCP</keyword> <keyword>WebSocket</keyword>

    <abstract>


<?line 62?>

<t>This document specifies FULMEN version 1.0, an event-driven, bidirectional
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 78?>

<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:
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
pgAA

-->

</rfc>

