Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Конверт
Заголовки передаются внутри полезной нагрузки: сообщение, которому они нужны, пишется как rs1:
или rs2: и base64, а остальные пишутся как есть.
Схема текстом
- Сообщение для публикации заголовки и полезная нагрузка → Есть заголовки, начало с rs1: или rs2: или, в канале, нагрузка, которую изменит строка?
- Есть заголовки, начало с rs1: или rs2: или, в канале, нагрузка, которую изменит строка? → Полезная нагрузка пишется как есть: нет
- Есть заголовки, начало с rs1: или rs2: или, в канале, нагрузка, которую изменит строка? → Каждый заголовок уцелеет в строке?: да
- Каждый заголовок уцелеет в строке? → rs1: base64( длина u32, строки name: value, нагрузка): да
- Каждый заголовок уцелеет в строке? → rs2: base64( длина u32, длина, имя, длина, значение .., нагрузка): нет
- Читатель открывает любой конверт; всё остальное читается как нагрузка без заголовков
Ни у одного клиента нет места для заголовков: сообщение - это ключ потока и полезная нагрузка. Поэтому издатель записывает заголовки в полезную нагрузку, внутрь конверта, а подписка снова его открывает.
Сообщение без заголовков пишется как есть. Записанный так файл остаётся простым потоком полезных
нагрузок, который понимает любой читатель sea-streamer. Полезная нагрузка, которая начинается с
rs1: или rs2:, всё равно помещается в конверт, иначе читатель принял бы её за конверт.
Канал передаёт текст в UTF-8, по строке на сообщение, а читатель на другом конце обрезает у каждой строки пробелы. Поэтому в канале полезная нагрузка, которая не является UTF-8, содержит перевод строки или начинается либо заканчивается пробельным символом, тоже помещается в конверт и приходит целиком.
Оба конверта - это префикс и base64, поэтому любой из них помещается в строку. Внутри сначала идёт
длина блока заголовков в порядке big-endian, затем сам блок, затем полезная нагрузка. rs1: пишет
каждый заголовок строкой name: value, и его читают прежние выпуски этого крейта. Он выбирается,
когда каждый заголовок читается из такой строки без изменений. rs2: пишет каждое имя и значение
со своей длиной, поэтому передаёт любые байты, и выбирается для остальных случаев.
Читатель открывает любой из двух конвертов и добавляет заголовок stream-sequence. Всё, что не
является правильно сформированным конвертом, читается как полезная нагрузка без заголовков. Как
сервис читает и задаёт заголовки, показывает страница Заголовки
в компонентах.