Gomux is a high-performance stream multiplexer inspired from SiaMux. It allows you to operate many distinct bidirectional streams on top of a single underlying connection. It transparently encrypts all data using XChaCha20-Poly1305 with a pre-shared key.
A gomux session is an exchange of frames between two peers over a shared connection.
All integers in this spec are little-endian.
A frame consists of a frame header followed by a payload. A header is 8 bytes and defined as:
| Bits | Type | Name | Description |
|---|---|---|---|
| 32 | uint32 | ID | The ID specifies which stream a frame belongs to. Streams are numbered sequentially, starting at 0. To prevent collisions, streams initiated by the client peer use even IDs, while the server peer uses odd IDs. |
| 32 | uint32 | Length | The length specifies the length of the payload or window update. |
| 32 | uint32 | Flags | Determines the type of frame and how it should be processed. |
The flags are defined as:
| Value | Name | Description |
|---|---|---|
| 0 | Data | Indicates a payload of size length follows the frame. |
| 1 | Keepalive | Indicates a keepalive frame. Contain no payload and merely serve to keep the underlying connection open. |
| 2 | OpenStream | Indicates to the accepting peer the creation of a new stream. |
| 3 | CloseRead | Closes the stream for reading. |
| 4 | CloseWrite | Closes the stream for writing. |
| 5 | CloseStream | Indicates that the stream has been closed by the peer. |
| 6 | WindowUpdate | Indicates to the peer that length bytes have been read from the stream ID read buffer. |
| 7 | CloseMux | Indicates the shutdown of the stream multiplexer. |