diff --git a/doc/stream.txt b/doc/stream.txt index 106eae36..7054493c 100644 --- a/doc/stream.txt +++ b/doc/stream.txt @@ -393,6 +393,14 @@ adm_tags — блок владельца, для самоуправляемых - stream_subscriptions: список (source_node_id, source_epoch), на которые узел локально подписан. Формат — совместимые с существующим плоским userinfo строковые значения; список кодируется однозначно, со строгим разбором 64-битных IDs без потери точности через JSON numbers. +Зафиксированный формат: + stream_source = ":::" + stream_subscriptions = ":,..." +Отсутствующая/пустая опция означает отсутствие активности. Подписки отсортированы по source_node_id, затем эпохе; +нулевые IDs/эпохи, дубликаты, неверные разделители, ведущие нули decimal и переполнение отвергаются. +Активная публикация требует записи собственной трансляции в stream_subscriptions. +Максимум элементов списка — MS_USERINFO_MAX/34; фактически доступное число дополнительно ограничено +размером всего JSON с именем, аватаркой и прочими сохранёнными опциями. Две stream-опции меняются атомарно. Источник включает свою трансляцию в собственные подписки. Список относится к трансляциям, а не к сетевым handles или выбранным upstream-поставщикам. @@ -492,9 +500,21 @@ Stop/destroy выполняются по правилам ядра, вне callb ./build.sh --no-gui -j4 и ./check.sh прошли: 143 passed, 0 failed, 0 skipped; отдельные proxy/full, burst и load также PASS. Лог: /tmp/stream-check.log. -[ ] Включение в жизненный цикл чат-сервиса: - контекст модуля в UTUN_INSTANCE, публичные локальные подписки/публикация, события потребителя, - stream_source/stream_subscriptions в блоке мембера, сохранение остальных userinfo и BGP-фильтр кандидатов. +[+] Включение в жизненный цикл чат-сервиса — 11.10.2026: + stream.c/h — контекст в UTUN_INSTANCE, локальные handles публикации/подписки, общий экземпляр и буфер. + DATA/GAP/END/CLOSED доставляются отложенно через один callback экземпляра ядра; + callback может закрывать handles, заимствованные данные живут до его возврата. + stream_member.c/h — канонические опции, проверка подписанного профиля/ключа и членства, + online-кандидаты только из живых BGP-путей этой CHAT-группы; мобильный источник допускается, relay исключается. + chat_core_set_my_profile_options — атомарная замена опций с сохранением имени, аватарки и остальных userinfo. + При старте снимаются оставшиеся после аварии собственные опции; смена эпохи/ключа или утрата членства отменяют подписку. + Удаление группы и остановка CHAT отменяют таймеры/события, отсоединяют handles и освобождают буферы; + detached handle остаётся во владении вызывающего до stream_close, общий UTUN/транспорт сохраняется. + test_stream_service: четыре живых ядра, Merkle-обмен через ETCP, две группы, общий буфер двух владельцев, + BGP withdraw с сохранённой опцией, смена эпохи, потеря своего членства, удаление канала, restart и отмена таймера. + Проверены rollback размера/SQLite, FEC-доставка непрозрачных байтов и закрытие из DATA callback, DATA перед END. + Тест прошёл, счётчик живых аллокаций после destroy вернулся к нулю. Лог: /tmp/stream-service-test-final.log. + Найденная тестом утечка существующих BGP-путей исправлена: записи освобождаются до контейнера node_paths. [ ] Сетевая выдача: raw/router IDs, INFO и поколения сессий, 64-битные handles, SUBSCRIBE/RENEW/CLOSED, @@ -508,4 +528,7 @@ Stop/destroy выполняются по правилам ядра, вне callb пути/защита от циклов, стартовые 32 пробы, дальнейший темп 1/с и полный цикл не чаще 30 с, постепенный перенос с перекрытием, failover, несколько источников и независимое закрытие на общем ETCP. -Текущие компоненты — основа модуля данных; сетевые bindings, Merkle-опции и вызовы из UTUN_INSTANCE ещё не подключены. +Текущие компоненты включают основу данных, локальный API и Merkle/BGP-интеграцию в CHAT. +Сетевая выдача DATA между stream-экземплярами ещё не подключена: test_stream_service передаёт блоки +во внутренний dispatcher явно, а опции распространяет настоящим Merkle-обменом поверх ETCP. +Следующий этап — raw/router bindings, отдельные NCD-владельцы и REVERSE_REQ, выдачи из кольца с handles/арендой. diff --git a/doc/tasks.md b/doc/tasks.md index ba9b2f53..4b2f54a9 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -9,8 +9,13 @@ подписанные FEC-блоки 1300 байт, общий буфер 32 МБ, относительные timestamp-метрики, источник с таймером 100 мс и категория stream. test_stream_core прошёл; ./check.sh: 143 passed, 0 failed, 0 skipped; proxy/full, burst и load — PASS. - Следующий этап — жизненный цикл CHAT и опции мембера через Merkle с фильтром BGP, - затем NCD-выдачи/reverse, общий отправитель/перегрузка и оптимизация путей. + 11.10.2026 подключены жизненный цикл CHAT, локальные handles/API и события потребителя, + атомарные опции мембера через Merkle, подписанные профили и BGP-фильтр кандидатов. + test_stream_service прошёл на четырёх ядрах: две группы, смена эпохи/членства, restart, + rollback профиля, закрытие из callback и нулевой остаток аллокаций после destroy. + Лог: /tmp/stream-service-test-final.log. Исправлена выявленная утечка BGP node_paths при удалении узла. + Следующий этап — сетевая выдача DATA: NCD/reverse, handles/аренда и курсоры кольца; + затем общий отправитель/перегрузка и оптимизация путей. [+] **test_reality_tls: коллизии порта слушателя** — 10.10.2026: В общем прогоне 140 passed, 1 failed: stcp_server_create не смог занять порт 34922, bind errno=98 (EADDRINUSE).