diff --git a/doc/stream.txt b/doc/stream.txt index a4a18a04..66210201 100644 --- a/doc/stream.txt +++ b/doc/stream.txt @@ -1,7 +1,7 @@ Модуль стриминга. Техническое задание, этап 1. -Статус аудита 26.10.2026: сверка завершена только для stream_proto.h, -stream_block.h, stream_source.h и stream_media.h; остальные разделы проверены частично. +Статус аудита 26.10.2026: сверка завершена для stream.h, stream_proto.h, +stream_block.h, stream_source.h, stream_media.h и stream_optimizer.h; остальные разделы проверены частично. Расхождение допуска deleted устранено: stream_member_load читает принятый флаг в том же SELECT, что и профиль, и возвращает STREAM_ERR_NOT_MEMBER до crypto. Штатный test_stream_member проверяет подписи/версии, source/supplier/self, @@ -11,6 +11,9 @@ stream_block.h, stream_source.h и stream_media.h; остальные разде Дефект publisher_block устранён: помещающийся Opus уходит в отдельную аудиопачку, ожидающее видео получает следующий слот actor. Штатный test_stream_publisher проверяет 23 сценария границ, продвижения треков и OPENING/FIN; раздел 7 отчёта. +При продолжении найден дефект expire_controls: ожидается длина INFO_REQ8 вместо9, +поэтому просроченный запрос удаляется без закрытия его пробы. Аудит остановлен; +реализация не исправлена, изолированное подтверждение и вариант исправления — раздел8 отчёта. 1. Цель и принятые решения @@ -553,8 +556,12 @@ Stop/destroy выполняются по правилам ядра, вне callb stream.c/h — контекст в UTUN_INSTANCE, локальные handles публикации/подписки, общий экземпляр и буфер. DATA/GAP/END/CLOSED доставляются отложенно через один callback экземпляра ядра; callback может закрывать handles, заимствованные данные живут до его возврата. + DATA/GAP/END используют общую позицию сессии и не повторяются для каждого raw handle; + медиакурсоры отдельных handles независимы. Последний owner закрывает сессию; + после FIN оставшиеся owners удерживают кольцо, publisher close без FIN отсоединяет их. stream_member.c/h — канонические опции, проверка подписанного профиля/ключа и членства, - online-кандидаты только из живых BGP-путей этой CHAT-группы; мобильный источник допускается, relay исключается. + online-кандидаты только из живых BGP-путей этой CHAT-группы; мобильный источник допускается, + мобильный промежуточный поставщик требует подписанную роль supernode. chat_core_set_my_profile_options — атомарная замена опций с сохранением имени, аватарки и остальных userinfo. При старте снимаются оставшиеся после аварии собственные опции; смена эпохи/ключа или утрата членства отменяют подписку. Удаление группы и остановка CHAT отменяют таймеры/события, отсоединяют handles и освобождают буферы; diff --git a/src/stream/stream.h b/src/stream/stream.h index 0c483380..ee143a50 100644 --- a/src/stream/stream.h +++ b/src/stream/stream.h @@ -1,7 +1,7 @@ /* stream — публикация и приём трансляций CHAT-группы с подписью источника и восстановлением потерь через Reed–Solomon. * Источник: publish_open → publish_write или publish_block → publish_finish → close. * Приём: subscribe_open для событий байтового потока либо media_open → media_read для аудио/видео; затем close. - * Одна сессия/RS-кольцо на группу и источник; эпоха и режим выбора поставщиков общие для её handles. + * Одна живая сессия/RS-кольцо на группу и источник; эпоха и режим выбора поставщиков общие для её handles. * Все вызовы — uasync-поток. Для открытия нужны запущенный чат, живая CHAT-группа и проверенный собственный мембер. * Коды результатов — STREAM_* из stream_proto.h; открываемый *out заранее NULL и не меняется при отказе. */