# FluxDesk protocol v1

FluxDesk 0.2 открывает два end-to-end `SslStream`-соединения. В LAN они
работают непосредственно поверх TCP, а в internet-режиме — поверх
`WebSocketDuplexStream` и blind relay. Viewer создаёт общий `SessionId`;
`ChannelKind` различает video и control.

Каждое сообщение имеет framing:

```text
uint32  body length, big-endian
byte    message type
byte[]  typed payload
```

До проверки pairing code host принимает не более 4 KiB. Управляющие сообщения
ограничены 256 байтами, а глобальный предел видеосообщения равен 64 MiB.

## Каналы

Control:

```text
ClientHello → ServerHello
MouseMove | MouseButton | MouseWheel | KeyEvent | Ping
Pong ←
```

Video:

```text
ClientHello → ServerHello
VideoInit ←
JpegFrame | TileFrame ←
```

При изменении размера host отправляет новый `VideoInit`, затем обязательный
`JpegFrame`. `JpegFrame.Generation` создаёт новую reference epoch. Viewer
принимает `TileFrame` только после keyframe того же поколения и проверяет
монотонный `FrameId`.

Tile — полная lossless-замена одной выровненной ячейки сетки. Кодирование:

- `RawBgra32`;
- `Brotli`.

Внутренний TLS шифрует оба канала независимо от транспорта. Первый сертификат доверяется только после ручного
сравнения SHA-256 fingerprint; второй канал pin-ится к уже подтверждённому
сертификату.
