diff --git a/AGENTS.md b/AGENTS.md index 40bff84f..7b7e551b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -299,6 +299,9 @@ UASYNC/LL_QUEUE/MEMORY/TIMING объединены в SYS, NORMALIZER/BBR — в │ ├── dm/ # Личные сообщения, E2E-вложения и offline-mailbox │ ├── call/ # Звонки и общий голосовой стек │ ├── radio/ # Групповая PTT-рация +│ ├── stream/ # Прямые трансляции: подписанные RS-блоки, выбор поставщиков, аудио/видео +│ ├── member_files/ # Файловое хранилище участников CHAT-группы и асинхронные передачи +│ ├── local_transport/ # Обнаружение устройств и доставка приглашений в локальной сети по UDP │ ├── proxy/ # SOCKS5, TCP/UDP/ICMP прокси │ ├── lwip_tcp/ # Встроенный lwIP TCP стек │ ├── media_delivery/ # Блоки медиа каналов и передача неизменяемых файлов @@ -336,13 +339,13 @@ UASYNC/LL_QUEUE/MEMORY/TIMING объединены в SYS, NORMALIZER/BBR — в - `tun_linux.c` `tun_freebsd.c` `tun_windows.c` - Platform-specific TUN implementations - `tun_route.c/h` - TUN routing table sync - `config_parser.c/h` - INI-style config file parsing -- `config_updater.c/h` - Config file modification utilities +- `config_updater.c/h` - Проверка и сохранение согласованных X25519-ключей и node_id в INI-конфиге - `control_server.c/h` - Control/monitoring server (etcpmon backend API) - `firewall.c/h` - Firewall rules (per-interface filtering) - `eim_nat.c/h` - Endpoint-Independent Mapping NAT engine -- `nat_transport.c/h` - NAT transport layer (packet relay) -- `ntp_time.c/h` - NTP time synchronization -- `ntp_node_time.c/h` - Inter-node time synchronization +- `nat_transport.c/h` - Передача IPv4 между отдельным TUN и удалённым NAT-провайдером через UTUN-router; локальный провайдер использует eim_nat +- `ntp_time.c/h` - Асинхронная NTP-синхронизация: поправка времени instance без изменения часов ОС +- `ntp_node_time.c/h` - Получение временной поправки от синхронизированных ETCP-пиров и диагностика расхождения часов - `broadcast.c/h` - Широковещательная рассылка данных по topo-группе (UUID-дедупликация, TTL) - `video/video.c/h` - Пробинг и транскодирование видео (FFmpeg, опционально; H.264/MP4 ≤720p) - `dnsmasq/` - Архив dnsmasq-2.93.tar.xz для встроенной сборки @@ -353,47 +356,55 @@ UASYNC/LL_QUEUE/MEMORY/TIMING объединены в SYS, NORMALIZER/BBR — в - `etcp_connections.c/h` - Socket and link management, INIT handshake, keepalive, PING/PONG - `etcp_session.c/h` - Согласование эпох ETCP-сессии через HELLO/CHALLENGE/CONFIRM и проверка принадлежности DATA сессии - `etcp_loadbalancer.c/h` - Multi-link load balancing with traffic shaper -- `etcp_debug.c/h` - ETCP packet dump/formatting +- `etcp_debug.c/h` - Диагностический разбор секций ETCP_DGRAM и форматирование IPv4-адресов - `etcp_dump.c/h` - ETCP дамп/декодирование пакетов - `etcp_bbr.c/h` - BBR congestion control for ETCP - `etcp_connect.c/h` - ETCP outbound connections - `etcp_keepalive.c/h` - Keepalive-пакеты, адаптивный период, смена режима standby/normal (мобильные узлы) - `auto_socket.c/h` - Автосоздание UDP+TCP сокетов на всех интерфейсах и линков к ETCP-соединениям (`auto_sockets=yes`) - `pkt_normalizer.c/h` - Packet fragmentation/reassembly (packer/unpacker) -- `packet_dump.c/h` - Packet hex dump utility -- `dummynet.c/h` - Network emulator integrated into utun (for testing) -- `secure_channel.c/h` - AES-CCM encryption with X25519 key exchange, pubkey obfuscation +- `packet_dump.c/h` - Текстовая сводка IPv4-пакета: адреса, поля транспорта и короткий hex-фрагмент +- `dummynet.c/h` - Двунаправленный UDP-эмулятор между заданными endpoint: задержка, ограничение скорости и случайные потери +- `secure_channel.c/h` - X25519, пакетное AES-128-CCM, потоковое AES-CTR, подписи Ed25519 и обфускация публичного ключа +- `etcp_padding.c/h` - Выбор длины случайного padding и периодическое обновление диапазона для instance/соединения +- `etcp_tx_stats.c/h` - Общая статистика исходящих очередей, inflight и подтверждённых за секунду байтов ядра - `crc32.c/h` - CRC32 checksums -- `stcp.c/h` - STCP протокол (Secure TCP) -- `stcp_server.c/h` - STCP сервер -- `stcp_client.c/h` - STCP клиент -- `stcp_link.c/h` - STCP линк-уровень +- `stcp.c/h` - Зашифрованные кадры поверх TCP: согласование ключей/эпох, AES-CTR, CRC, очереди и закрытие соединения +- `stcp_server.c/h` - Приём входящих STCP-соединений, handshake и передача готового соединения владельцу +- `stcp_client.c/h` - Исходящее STCP-подключение, в том числе через SOCKS5 и REALITY +- `stcp_link.c/h` - Подключение STCP к ETCP_LINK: передача пакетов, backpressure и жизненный цикл TCP-линка - `socks_client.c/h` - Исходящий SOCKS5-транспорт: TCP CONNECT и UDP ASSOCIATE с переподключением control-сокета - `node_conn_direct.c/h` - Общий прямой транспорт к пиру с отдельным handle каждого владельца; обновление линков по адресам узла -- `socket_monitor.c/h` - Socket state monitoring +- `socket_monitor.c/h` - Наблюдение за адресами интерфейсов и маршрутами ОС, обновление сетевого состояния ETCP-сокетов - `reality.c/h` - REALITY-style TLS ClientHello/ServerHello камуфляж для STCP - `reality_fingerprint.c/h` - Статические отпечатки (cipher suites, groups, ALPN) для REALITY-камуфляжа +- `reality_io.c/h` - Внешний REALITY-handshake и поток защищённых записей STCP, Finished, replay-защита и выбор relay +- `reality_record.c/h` - TLS-подобные AES-128-GCM записи: вывод ключей, счётчики направлений, padding и KeyUpdate - `reality_relay.c/h` - Релей неавторизованных клиентов на реальный HTTPS-сайт +- `stun_nat.c/h` - Проверка mapping/filtering NAT через внешние STUN-серверы, RFC 5780 и кеш результатов по IP/интерфейсу - `call_ring.c/h` - Кольцевой трейс контрольных точек освобождения ETCP/STCP-ресурсов для диагностики teardown/UAF **BBR (src/transport_layer/BBR/)** - `bbr_v3.c` - BBR congestion control algorithm v3 **Routing Layer (src/routing_layer/)** -- `routing.c/h` - Routing table (local) -- `route_lib.c/h` - Routing library -- `route6_lib.c/h` - IPv6 routing +- `routing.c/h` - Обмен IPv4-пакетами UTUN между локальным TUN и сервисом DATA ETCP-router +- `route_lib.c/h` - Локальная таблица IPv4-подсетей UTUN: добавление/удаление маршрутов и поиск узла назначения +- `route6_lib.c/h` - Локальная таблица IPv6-подсетей на radix tree с поиском по самому длинному префиксу - `route_ping.c/h` - Пинг цели через явно выбранного BGP-посредника для NAT-проверки -- `route_connectivity.c/h` - Route connectivity checks +- `route_connectivity.c/h` - Прямые UDP/TCP-пробы адресов узла для оценки достижимости и RTT при выборе пиров - `topo_group.c/h` - Сессии UTUN/CHAT (JOIN/ACCEPT, эпохи, READY), групповые запросы, NODEINFO/WITHDRAW и владение NCD - `topo_group_connect.c/h` - Подбор пиров CHAT-группы по роли: суперузлы → desktop → mobile; история/RTT внутри класса, backoff и standby burst - `topo_group_invite.c/h` - Получение описания канала через INVITE_INFO_REQ/RESP; добавление мембера реализовано в chat_join/chat_sync -- `topo_node.c/h` - Node management (модель узла: TOPO_NODE/TOPO_GROUP_NODE, сериализация, node_registry) -- `topo_node_sqlite.c/h` - SQLite persistence for nodes +- `topo_node.c/h` - Модель TOPO_NODE/TOPO_GROUP_NODE, подписанные снимки узлов, сериализация и общий node_registry +- `topo_node_sqlite.c/h` - Хранение подписанных снимков узлов, адресов, каналов и блоков мемберов в общей SQLite - `topo_recovery.c/h` - Восстановление потерянных маршрутов группы через READY-сессии, отмена попыток при stop - `conn_mgr.h` + `conn_mgr_core.c`/`conn_mgr_indirect.c`/`conn_mgr_monitor.c` + `conn_mgr_priv.h` — Connection Manager (handle-based API, 3-phase DIR/REV/IND) -- `etcp_router.c/h` - ETCP router/multiplexer (мультиплексирование каналов, transit forwarding) -- `nat_detection.c/h` - NAT type detection +- `etcp_router.c/h` - Надёжные логические каналы сервисов поверх BGP-маршрутов: ACK, окна, транзит и защита от циклов +- `route_tx_stats.c/h` - Скользящее окно подтверждённых payload-байтов логического канала для оценки скорости доставки +- `multicast.c/h` - Рассылка списку узлов группы с разделением маршрута на ветви, локальными подписками и отчётами о потерях +- `nat_detection.c/h` - Проверка mapping и доступности входящих рабочих сокетов через ETCP-пиров с учётом предварительных STUN-измерений +- `address_profile.h` - Профиль endpoint: изменение адреса, доступность входящих и источник измерения ETCP/STUN - `sock_match.c/h` - Классификация локальных сокетов и адресов пира, отбор совместимых пар для прямого подключения - `route_crypto.c/h` - Пред/пост-обработка SVC_ROUTE пакетов (encrypt-then-sign) @@ -408,9 +419,15 @@ UASYNC/LL_QUEUE/MEMORY/TIMING объединены в SYS, NORMALIZER/BBR — в - `member_sync.c/h` - Синхронизация участников каналов поверх merkle_sync. Два подписанных блока (мембер/владелец), по-блочное сравнение версий, верификация подписей. Удаление — только битая запись - `merkle_sync.c/h` - Универсальный движок синхронизации на Merkle-деревьях (5 уровней × 32 бакета, SHA256). Пиры обмениваются хешами и передают только различия; per-session out-очередь с backpressure. Не привязан к конкретному типу данных (коллбэки `data_ops`) - `merkle_tree.c/h` - Производный индекс Merkle-хешей в SQLite; восстанавливается из данных модели, обновляется с ними в одной транзакции -- `chat_profile.c` - Собственный профиль: имя узла, сетевые адреса, сохранение UI-состояния (часть chat_core) +- `chat_profile.c` - Подписанный профиль мембера: имя, аватар и опции сервисов; локальное UI-состояние (часть chat_core) - `chat_channel.c` - Создание и настройка каналов: таблицы, криптоключи, CHAT-группа и планировщик подключения (часть chat_core) - `chat_msg.c` - Отправка и приём сообщений: запись в локальную БД, автоматическая рассылка всем участникам канала (часть chat_core) +- `chat_feedback.c/h` - Подписанные реакции и ответы: версии состояния, сохранение отмен и Merkle-синхронизация между участниками +- `chat_poll.c/h` - Создание опросов, голосование, реакции и JSON-снимки результатов для UI/headless +- `chat_poll_codec.c` - Проверка и wire-кодеки опросов, ответов и реакций; общий каталог эмодзи (API в chat_poll.h) +- `chat_attachment.c/h` - Зашифрованные вложения канала: ключи, запросы доступа, ручное одобрение автора и сохраняемый outbox +- `chat_local.c/h` - Обнаружение устройств чата и обмен готовыми invite-ссылками через локальный UDP-транспорт +- `group_avatar.c/h` - Подписанная аватарка канала: хранение версии в SQLite, проверка подписи и передача блоков через router - `chat_status.c` - Сбор диагностики: текущее время, активные соединения, типы NAT. Отправляется в GUI (часть chat_core) - `chat_member.c/h` - Единая структура мембера для отображения в GUI (десктоп/headless/Android), фиксированная сериализация на проводе - `chat_admin.c/h` - Передача канального приватного ключа (прав админа) другому узлу @@ -422,7 +439,8 @@ UASYNC/LL_QUEUE/MEMORY/TIMING объединены в SYS, NORMALIZER/BBR — в **Личные сообщения (src/dm/)** - `dm_core.c/h` - Беседы двух узлов, подписанные E2E-сообщения, SQLite/outbox, доставка через router/mailbox и квитанции -- `dm_crypto.c/h` - Вывод ID беседы и ключа X25519, AES-256-CCM сообщений и потоковое шифрование/проверка медиа +- `dm_crypto.c/h` - Вывод ID беседы и ключа X25519, AES-256-CCM сообщений и E2E-контейнеры медиа через media_crypto +- `dm_history.c/h` - Локальное удаление истории и скрытие бесед; поколения задач и отпечатки удалённых сообщений против повторов - `dm_mailbox.c/h` - Offline-очередь суперузла: хранение подписанных сообщений и повтор доставки до квитанции получателя - `dm_media.c/h` - Подготовка, доставка и публикация E2E-вложений; ciphertext-хранилище и отдельные квитанции файлов - `dm_media_priv.h` - Внутренние SQL/control-операции для dm_media и dm_mailbox_media @@ -430,11 +448,25 @@ UASYNC/LL_QUEUE/MEMORY/TIMING объединены в SYS, NORMALIZER/BBR — в **Звонки (src/call/)** -- `call.c/h` - Сигналинг и медиа P2P-звонка через ETCP-router, состояния звонка и оптимизация пути через conn_mgr -- `call_proto.h` - Wire-формат сигналинга и медиа, треки/кодеки, причины завершения +- `call.c/h` - P2P аудио/видеозвонок: подписанный E2E-сигналинг, состояния, политика занятости и оптимизация пути через conn_mgr +- `call_priv.h` - Общее внутреннее состояние сессии для call.c и call_video_transport.c; доступ только из uasync +- `call_proto.h` - Wire-формат сигналинга, аудиокадров и управления видеотреком; треки/кодеки и причины завершения - `call_audio.c/h` - Общий аудио-движок: кодирование/декодирование Opus, jitter-буфер и тоны, API feed/pull PCM -- `call_jitter.cpp/h` - FIFO кодированных Opus-кадров, адаптивный запас и SoundTouch time-stretch при воспроизведении +- `call_jitter.cpp/h` - FIFO Opus, адаптивный сетевой запас, декодирование на pull и восстановление воспроизведения после пауз - `call_jitter_window.h` - Окно из десяти секундных интервалов для оценки глубины очереди и изменения задержки доставки +- `call_clock.h` - Метки времени захвата и снимок реально проигранного аудио для синхронизации видеотрека +- `call_delay.cpp/h` - Уменьшение накопленной задержки PCM прямым ускорением и SoundTouch с сохранением исходной шкалы времени +- `call_timeline.cpp/h` - Карта исходного PTS через обработку SoundTouch до позиции аудиоустройства +- `call_video.c/h` - Общий формат H.264/H.265 видеотрека, согласование возможностей и сборка кадров из фрагментов +- `call_video_bitstream.c/h` - Проверка конфигурации и IDR без reorder, профиля/уровня и геометрии H.264/H.265; KEY-пробы кодеков +- `call_video_transport.c/h` - Отдельные router-каналы control/audio/video, backpressure, привязка видео к аудио и запросы KEY +- `call_video_rate.c/h` - Регулятор битрейта и допуска новых видеокадров по скорости доставки, RTT и долгу очереди +- `call_video_port.c/h` - Потокобезопасный обмен кадрами и командами между платформенными video workers и uasync-транспортом +- `call_video_playout.c/h` - Расписание показа по аудиочасам, ожидание/отбрасывание кадров и подтверждение фактического показа +- `call_video_fixtures.h` - Встроенные H.264/H.265 KEY-пробы для проверки базовых режимов кодека +- `call_video_fast_fixtures.h` - KEY-пробы видеорежимов с частотой 60 fps +- `call_video_fullhd_fixtures.h` - KEY-пробы видеорежимов Full HD +- `call_video_portrait_fixtures.h` - KEY-пробы видеорежимов в портретной ориентации - `call_tones.c/h` - Генерация PCM-тонов паузы и завершения звонка - `call_headless.c/h` - Отдельный TCP-аудиосокет headless-клиента: обмен PCM; сигналинг остаётся на control-сокете @@ -445,14 +477,17 @@ UASYNC/LL_QUEUE/MEMORY/TIMING объединены в SYS, NORMALIZER/BBR — в - `radio_audio.c/h` - Общий аудио-движок: независимые RX/TX, Opus, микширование источников, ручной PTT и VAD-автомат - `radio_jitter.cpp/h` - Буфер кодированных кадров каждого источника с pre-roll и SoundTouch time-stretch на pull - `radio_vad.h` - Ресемплинг 48→16 кГц и автомат авто-PTT с подтверждением речи, задержкой завершения и учётом занятого канала +- `radio_auto.h` - Общий автомат автопередачи по VAD/уровню звука, без захвата аудио и сетевого I/O +- `radio_call.c/h` - Адресное приглашение участника в рацию канала: сигналинг вызова, занятость, принятие и отмена - `radio_headless.c/h` - TCP-аудиосокет headless-рации: PCM и команды начала/конца PTT **Прокси (src/proxy/)** - `proxy_protocol.h` - Общий TCP-протокол и управление потоком: CONNECTED, DATA, кредит WINDOW, упорядоченный FIN - `socks_proxy.c/h` - Клиентские SOCKS5 CONNECT и HTTP proxy/CONNECT, DNS и передача потока выбранному exit-узлу -- `udp_proxy.c/h` - UDP прокси -- `icmp_proxy.c/h` - ICMP прокси +- `http_proxy.c/h` - Потоковый HTTP/1.x кодек: проверка заголовков, разбор тела/chunked и учёт потреблённых байтов для WINDOW +- `udp_proxy.c/h` - Передача UDP из TUN через exit-узел, сопоставление ответов и удаление неактивных потоков +- `icmp_proxy.c/h` - Проксирование IPv4 ICMP echo через raw socket exit-узла с восстановлением исходных id/seq - `tcp_proxy_server.c/h` - Exit-сторона TCP-прокси: реальные исходящие сокеты, потоки по (peer, stream_id), окна и half-close - `tcp_proxy_client.c/h` - Клиентская сторона TCP-прокси: адаптер TUN/lwIP и обмен с настроенным exit через ETCP-router @@ -474,6 +509,45 @@ UASYNC/LL_QUEUE/MEMORY/TIMING объединены в SYS, NORMALIZER/BBR — в - `attachment.c/h` - Общие метаданные file/voice/video, проверка и компактная wire-сериализация - `voice_file.c/h` - Worker-кодирование PCM в контейнер Opus с длительностью и waveform для desktop/Android - `attachment_send.c/h` - Асинхронная подготовка голоса/видео и отправка в зафиксированный канал или DM +- `media_crypto.c/h` - Общие AES-256-CCM примитивы и порционное шифрование/проверка файлов для DM и групповых вложений +- `encrypted_file.c/h` - Контейнер группового вложения: шифрование метаданных/файла, проверка SHA256 и durable-публикация результата + +**Трансляции (src/stream/)** — live-аудио/видео CHAT-группы с подписью источника, Reed–Solomon и раздачей через участников. + +- `stream.c/h` - Жизненный цикл трансляции, локальные handles издателя/читателей, события и публикация подписок +- `stream_priv.h` - Внутренний доступ к сессиям, приём проверенных DATA/END и взаимодействие с планировщиком relay +- `stream_proto.h` - Форматы подписанной пачки и RS-частей, дескриптор источника, размеры и коды результата +- `stream_block.c/h` - Подпись пачки Ed25519 до RS-кодирования, разбор частей и проверка восстановленных данных +- `stream_buffer.c/h` - Ограниченное кольцо RS-частей: дедупликация, восстановление пачек, проверка подписи и вытеснение старых данных +- `stream_source.c/h` - Упаковка исходных байтов в подписанные RS-пачки, сброс неполной пачки по таймеру и завершение источника +- `stream_member.c/h` - Объявления источников и подписок в опциях подписанного мембера; разбор и проверка принадлежности источника +- `stream_wire.c/h` - Протокол выдач и relay: кодограммы управления, пути, метрики и подписанное завершение END +- `stream_network.c/h` - Выдача блоков через прямой ETCP, NCD-владение, управляющие очереди, аренда подписок и reverse-запросы +- `stream_optimizer.c/h` - Автоматический выбор и перенос поставщиков субпотоков, пробы доступности и привлечение relay +- `stream_metrics.c/h` - Оценка относительного отставания субпотока и истории проблем по часам источника без NTP +- `stream_load.c/h` - Учёт логической очереди DATA и её роста для обнаружения перегрузки раздающего узла +- `stream_media.c/h` - Формат uAV2: упаковка/проверка видеокадров, конфигурации кодека, PTS и Opus внутри FEC-пачек +- `stream_media_buffer.c/h` - Медиаиндекс общего RS-кольца и независимые курсоры audio/video; сборка кадров и восстановление с KEY +- `stream_publisher.c/h` - Общий потокобезопасный publisher desktop/Android: очередь готовых кадров, публикация и завершение с FIN +- `stream_viewer.c/h` - Независимые viewers: запрос ограниченных батчей по бюджетам треков, уведомления готовности и конца audio/video +- `stream_playback_audio.cpp/h` - Opus/SoundTouch и очередь готового PCM; ускорение без изменения высоты и привязка к позиции устройства +- `stream_playback_clock.c/h` - Общие часы воспроизведения и плавный догон live-потока по непрерывному запасу готового материала + +**Файлы участников (src/member_files/)** + +- `member_files.c/h` - Сервер и асинхронный клиент хранилища CHAT-группы: права доступа, запросы и события через защищённый router +- `protocol.c/h` - Wire-кодек файловых команд, снимки версий каталогов/файлов и токены временных загрузок +- `storage.c/h` - Серверные каталоги участников, квоты, файловые операции, временные загрузки и их очистка +- `transfer.c` - Передача файлов с CM handle, backpressure, дисковым worker, проверкой хеша и публикацией результата +- `disk.c/h` - Дисковые примитивы POSIX/Windows: безопасное разрешение путей без ссылок и I/O по 64-битному смещению +- `worker.c/h` - Единственный дисковый pthread с ограниченной очередью и возвратом результатов в uasync +- `private.h` - Внутреннее состояние запросов, передач, серверного хранилища и дискового worker + +**Локальная сеть (src/local_transport/)** + +- `local_transport.c/h` - Открытый UDP-транспорт LAN: обнаружение устройств, доставка сообщений с ACK/повторами и ограничения входящего потока +- `platform.c/h` - Снимок IPv4/IPv6 интерфейсов, broadcast/multicast-адреса, приём метаданных UDP и проверка локальности источника +- `protocol.h` - Wire-формат объявлений, сообщений и ACK: ID/эпохи устройств, ID запроса и проверка UTF-8 имени **Libraries (lib/)** - `u_async.c/h` - Async event loop (epoll/poll/select, timers via timeout_heap) @@ -484,6 +558,7 @@ UASYNC/LL_QUEUE/MEMORY/TIMING объединены в SYS, NORMALIZER/BBR — в - `mem.c/h` - Memory wrappers with leak tracking (`u_malloc`/`u_free`/`u_calloc`/`u_strdup`) - `serialize.c/h` - Binary serialization utilities - `reed_solomon.c/h` - Кодирование и восстановление пачки данных Рида—Соломона с настраиваемым числом субблоков и избыточностью +- `video_plane.c/h` - Копирование YUV-плоскости с поворотом 0/90/180/270°, учётом stride и проверкой границ без выделения памяти - `swm_min.c/h` - Sliding window minimum (for RTT min tracking) - `getmyip.c/h` - Локальный IP, который ОС выберет для UDP к заданному адресу (bind/connect/getsockname) - `myip.c` - My IP helper (no header) @@ -509,6 +584,16 @@ UASYNC/LL_QUEUE/MEMORY/TIMING объединены в SYS, NORMALIZER/BBR — в - `soundtouch-master/` - SoundTouch: изменение темпа аудио в jitter-буферах звонка и рации - `wintun.h` - Wintun API header for Windows TUN driver +**Проверки (tests/)** + +- `Makefile.am` - Состав тестовых целей, зависимости и отдельные проверки runner, service IDs и скрипта сборки +- `run_tests.py` - Запуск тестов ограниченным пулом с отдельными логами и последовательными барьерами для CPU/LAN-проверок +- `test_run_tests.py` - Проверки пула runner, эксклюзивного запуска, обработки ошибок и сигналов +- `test_service_ids.py` - Проверка уникальности ID транспортных и router-сервисов +- `test_build_script.py` - Регрессии выбора платформы, конфигурации и инкрементальной работы build.sh +- `stream_netns/` - Linux network namespaces: топологии, NAT/STUN-сценарии и проверка трансляций в изолированной сети +- `local_transport_ipv6.sh` - Проверка IPv6 link-local обнаружения и доставки в изолированной локальной сети + **Memory Pools in UTUN_INSTANCE:** - `data_pool` — для данных пакетов (payload), используется input_queue/output_queue фрагментами - `pkt_pool` — для struct ETCP_DGRAM (сетевые пакеты на отправку/приём) @@ -685,11 +770,18 @@ cmake .. && make -j4 | Файл | Назначение | |------|-----------| -| `main.cpp` | Точка входа, инициализация QApplication | -| `mainwindow.h/cpp` | Главное окно, списки каналов/DM/участников, сообщения, трей, события ядра и окна звонков | -| `chatview.h/cpp` | QListView с фоновым изображением, hover-сигнал, drag-to-select | +| `main.cpp` | Точка входа, QApplication, язык интерфейса и запуск единственного экземпляра профиля | +| `single_instance.h/cpp` | Блокировка каталога профиля и передача запроса показа окна уже работающему экземпляру | +| `gui_language.h` | Выбор языка интерфейса независимо от регионального формата дат и чисел | +| `mainwindow.h/cpp` | Главное окно, каналы/DM, трей, события ядра, звонки, локальные приглашения и окна трансляций | +| `chatview.h/cpp` | Список сообщений: фон, hover, выделение текста и прокрутка истории мышью/клавиатурой | | `messagelist.h/cpp` | Модель сообщений из БД, обновления доставки/медиа, анимации, состояние просмотра канала | | `messagedelegate.h/cpp` | QStyledItemDelegate: бабблы, текст, цитаты, реакции, оверлей анимаций | +| `messagefeedback.cpp` | Действия MessageList: создание опроса, голосование, выбор реакции и показ результатов | +| `attachment_key_ui.cpp` | Список запросов на расшифровку групповых вложений и решения автора о выдаче ключа | +| `message_links.h/cpp` | Разбор границ utun:// и HTTP/HTTPS ссылок для подсветки и обработки нажатий в сообщении | +| `message_notification.h/cpp` | Уведомление о сообщении без захвата фокуса, переход в беседу и скрытие после активности пользователя | +| `user_activity_monitor.h/cpp` | Ожидание первой активности через системный idle time либо события приложения | | `emoji.h/cpp` | EmojiData/EmojiCategory/EmojiType, 4 категории, `g_animatedEmojiMap` | | `emojipanel.h/cpp` | Эмодзи-пикер: QTabWidget + QGridLayout, EmojiButton с hover-анимацией | | `emojitabbar.h/cpp` | Кастомный QTabBar для эмодзи-панели | @@ -705,11 +797,13 @@ cmake .. && make -j4 | `invitedialog.h/cpp` | Диалог приглашения пользователя | | `invite_link.h/cpp` | Логика invite-ссылок | | `inviteby.h/cpp` | Диалог приглашения по invite-ссылке (отправка через узел) | +| `dminvitedialog.h/cpp` | Выбор канала для приглашения собеседника из DM с сопоставлением результата по request_id | | `settingsdialog.h/cpp` | Окно настроек | | `creategroupdialog.h/cpp` | Диалог создания группы | | `channelsettingsdialog.h/cpp` | Диалог настроек канала | | `renamedialog.h/cpp` | Диалог переименования | | `networksettingspage.h/cpp` | Страница сетевых настроек | +| `addressprofiletext.h` | Читаемое представление mapping, доступности входящих и источника NAT-измерения | | `nodespage.h/cpp` | Таблица узлов + дамп в настройках | | `statuspage.h/cpp` | Страница статуса (NTP + соединения + живые часы) | | `databasesettingspage.h/cpp` | Страница обслуживания БД в настройках | @@ -718,14 +812,32 @@ cmake .. && make -j4 | `audiodevicesettingspage.h/cpp` | Страница настроек аудиоустройств | | `sound_manager.h/cpp` | Общий miniaudio-контекст, уведомления/PCM, микширование голоса, маршруты устройств и восстановление | | `audio_device.h/cpp` | Жизненный цикл miniaudio-устройства, прогресс callbacks, пауза и повтор запуска после сбоя | +| `audio_buffer_tuning.h` | Подбор размера аппаратного аудиобуфера по повторным XRUN с сохранением настройки при reopen | +| `audio_capture.h/cpp` | Совместное использование одного микрофона трансляцией и рацией, подписки PCM и смена профиля захвата | +| `audio_capture_lease.h` | Владение захватом, исключающее одновременную работу publisher, звонка и записи голосового сообщения | | `audio_event_queue.h` | Ограниченная очередь PCM/команд с несколькими producers и резервом для управляющих событий | | `audio_frame_ring.h` | Предвыделенное SPSC-кольцо кадров переменной длины под mutex; при переполнении удаляет старейший | | `voice_audio_io.h/cpp` | Workers захвата/AEC и воспроизведения; упорядочивание PCM/PTT/mute и итоговый render-reference | +| `voice_capture_clock.h` | Непрерывные PTS захваченного PCM по позиции сэмплов с плавной поправкой аппаратного времени | +| `voice_playback_buffer.h` | Адаптивный запас готового PCM: увеличение после недостачи и уменьшение при стабильном выводе | | `audiorecorder.h/cpp` | Захват голосовых сообщений, worker обработки PCM, компрессор, индикатор уровня и передача записи задаче | | `voicemessageencoder.h/cpp` | Выбор Opus preset и создание медиа-каталога; кодирование выполняет общий voice_file | | `voiceplayback.h/cpp` | Воспроизведение голосовых сообщений | -| `callwindow.h/cpp` | Окно звонка: состояния, управление, путь соединения и статистика аудио | +| `callwindow.h/cpp` | Окно аудио/видеозвонка: управление, выбор камеры, локальное/удалённое видео и статистика | | `call_audio_engine.h/cpp` | Desktop-контур звонка: захват, VoiceAudioIo, общий выход SoundManager и завершение аудиосессии | +| `call_video_engine.h/cpp` | Desktop-видеозвонок: камера, TX/RX workers, обмен с ядром и показ кадров по аудиочасам | +| `call_video_encoder.h/cpp` | Кодер звонка: согласованный формат, смена битрейта с drain прежнего кодера и подтверждение настройки | +| `call_video_decoder.h/cpp` | FFmpeg-декодер H.264/H.265 с выбором GPU/CPU и сохранением PTS при задержанном выходе | +| `call_camera_capture.h/cpp` | Управление отдельным процессом камеры, каталог устройств/режимов и получение кадров | +| `call_camera_worker.cpp` | Процесс Qt-захвата камеры: настройка устройства, отбор кадров и выдача пикселей через shared memory | +| `call_camera_source.h` | Интерфейс backend камеры для процесса захвата и подстановки устройств в тестах | +| `call_camera_protocol.h` | Локальный протокол управляющих команд, каталога устройств и FRAME/ACK процесса камеры | +| `call_camera_buffer.h` | Владение shared-memory буфером пикселей между процессами захвата и GUI | +| `call_camera_rate.h` | Временное отключение снижения FPS из-за автоэкспозиции V4L2 с восстановлением настройки камеры | +| `call_video_cadence.h` | Отбор исходных кадров под заданный FPS без накопления ошибки дробного периода | +| `call_video_capture_clock.h` | Привязка времени камеры к монотонным часам с коррекцией задержки первого callback | +| `call_video_queue.h` | Ограниченная SPSC-очередь кадров между video workers без mutex и выделений памяти | +| `call_video_wake.h` | Пробуждение video worker по событию или абсолютному монотонному deadline на POSIX/Windows | | `radio_audio_engine.h/cpp` | Desktop-контур рации: независимые захват/прослушивание, PTT/VAD и подключение к общему выходу | | `radiopanel.h/cpp` | Панель активной рации: выбор аудиоустройств, VAD, PTT и состояние передачи из ядра | | `radiosettingspage.h/cpp` | Настройки рации и запись глобальных сочетаний PTT | @@ -736,6 +848,17 @@ cmake .. && make -j4 | `imageviewer_window.h/cpp` | Окно просмотра изображений | | `videoplayer_engine.h/cpp` | Движок декодирования видео | | `videoplayer_window.h/cpp` | Окно просмотра видео | +| `live_video_encoder.h/cpp` | Общий FFmpeg-кодер live-видео для звонка/трансляции, GPU/CPU, KEY-конфигурация и capture PTS | +| `video_frame_image.h` | Выделение выровненного RGB-буфера FFmpeg и передача владения QImage без копирования | +| `stream_publish_engine.h/cpp` | Публикация камеры/экрана и Opus: workers кодирования, локальный preview и завершение через общий publisher | +| `stream_publish_window.h/cpp` | Настройки и управление трансляцией; закрытие окна сохраняет работающий engine | +| `stream_portal_capture.h/cpp` | Захват экрана Wayland через ScreenCast portal/PipeWire, выбор монитора и режима курсора | +| `stream_screen_cursor.h/cpp`, `stream_screen_cursor_win.cpp` | Наложение системного курсора на кадр выбранного экрана средствами X11/Windows | +| `stream_video_modes.h` | Выбор размеров/FPS камеры и пропорционального масштабирования экрана для трансляции | +| `stream_qp_control.h` | Плавная корректировка потолка QP по фактическому выходному видеобитрейту | +| `stream_sources.h` | Разбор снимка активных источников канала из CHAT_EVT_STREAM_SOURCES | +| `streamplayer_window.h/cpp` | Просмотр live-потока: отдельные audio/video workers, смешивание PCM и синхронизация по часам устройства | +| `streamgrid_window.h/cpp` | Сетка трансляций канала и разворачивание плитки с сохранением плееров; своя плитка использует локальный preview | | `connmonitorwindow.h/cpp` | Окно мониторинга ETCP-соединений (standalone) | | `qrcode_utils.h/cpp` | Утилиты для QR-кодов | | `debug_ui.h` | Отладочный UI | @@ -745,9 +868,14 @@ cmake .. && make -j4 - `db/` — `db_manager.h/cpp`: доступ GUI к данным nodes, channels, msg_, peers_ и состоянию интерфейса; копия `db/sqlite3.c/h` не используется текущей CMake-целью, SQLite берётся из `lib/` - `transport/` — интеграция GUI с ядром; файлы перечислены ниже +- `src/avatars/` — `avatarmanager.h/cpp`: загрузка/публикация аватаров участников через member_files, подписанные ссылки и очередь передач; + `avatarcache.h/cpp`: дисковый кеш, подготовка изображений и очистка; `avatarcrop.h/cpp`: выбор области; + `avatargallery.h/cpp`: просмотр аватаров пользователя; `groupavatarmanager.h/cpp`: подготовка и кеш подписанных аватарок каналов +- `src/member_files/` — `browser.h/cpp`: браузер серверных файлов группы; `batch.h/cpp`: последовательные операции над файлами/деревьями, + фоновый локальный обход, загрузка/скачивание и отмена - `libutun/CMakeLists.txt` — состав и зависимости CMake-сборки общего ядра из `src/` и `lib/` - `CMakeLists.txt` — приложение vibechat, Qt-зависимости, ресурсы и цели GUI-тестов -- `tests/` — проверки аудиоустройств и восстановления, голосового тракта, jitter-буферов, PTT, кодирования и GUI-компонентов +- `tests/` — проверки аудиотракта, PTT, видеозвонка, захвата камеры/экрана, трансляций, файлового браузера и GUI-компонентов - `resources/` — `bg.jpg`, `chatgui.qrc` (встраивает 5 TGS в бинарник), `animations/*.tgs` - `zxing-cpp/` — встроенная библиотека QR-кодов; `third_party/qhotkey/` — исходники QHotkey @@ -761,6 +889,7 @@ cmake .. && make -j4 | `config_updater.h/cpp` | Изменение настроек в конфиге | | `miniaudio_impl.c` | Реализация single-header miniaudio в отдельной единице трансляции | | `audio_diagnostics.h/cpp` | Диагностика этапов аудио и событий backend; записывает метаданные без PCM | +| `stream_bridge.h/cpp` | Потокобезопасный мост к общим publisher/viewers: session IDs, каталог источников, запросы батчей и пробуждение workers | ### Система анимированных эмодзи @@ -864,6 +993,13 @@ void lottie_animation_destroy(Lottie_Animation *anim); - `src/routing_layer/topo_group.h` — протокол групповой сессии и критерий READY - `tests/test_chat_join_e2e.c`, `tests/test_topo_recovery.c`, `tests/test_services.c` — проверки join, recovery и жизненного цикла - `doc/dm_arch.md`, `doc/chat_call_arch.md` — личные сообщения и звонки +- `doc/call_video.txt` — видеотрек звонка: возможности кодеков, транспорт, битрейт, аудиочасы и показ кадров +- `doc/stream.txt` — трансляции: RS-пачки, выдачи/relay, выбор поставщиков, медиакурсоры и платформенные плееры +- `doc/stun_nat.md`, `doc/nat_detection.txt` — STUN-измерения и определение доступности рабочих UDP-сокетов +- `doc/member_files.txt` — файловое хранилище участников, права, wire-команды и передачи +- `doc/group_avatar.txt` — подписанная аватарка канала, хранение и репликация +- `doc/encrypted_attachments.md` — контейнер группового вложения, запросы ключа и ручная выдача доступа +- `doc/pm_invites.md`, `doc/message_links.md` — приглашения из личной беседы и ссылки внутри сообщений - `doc/proxy_protocol.md` — TCP/UDP/ICMP-прокси, управление окнами, half-close и проверки - `doc/lwip_nuances.md` — особенности адаптированного lwIP TCP-стека - `doc/linux_audio_recovery.md` — диагностика аудиотракта Linux, контракты владения и восстановление устройств @@ -906,7 +1042,11 @@ C-библиотека `utun_lite` собирает `lib/` и `src/` по `libut | `libutun_lite/photo_sender.c/h` | Отправка фотографий в канал с MIME-типом и размерами изображения | | `libutun_lite/video_sender.c/h` | Отправка видео через общий механизм подготовки вложений | | `libutun_lite/voice_recorder.c/h` | Накопление PCM записи, компрессор и отправка голоса через общий attachment_send | +| `libutun_lite/stream_bridge.c/h` | Android-мост к publisher/viewers: session IDs, готовые access units/Opus и ограниченные батчи треков | | `jni_bridge/android_jni_bridge.c/h` | JNI-команды и callbacks между Kotlin и C-ядром, события и аудио API | +| `jni_bridge/android_call_output_jni.c` | Вывод PCM звонка через AAudio с аппаратным тактированием и снимками позиции устройства | +| `jni_bridge/android_call_video_jni.c` | JNI видеозвонка: capabilities/формат, обмен кадрами с call_video_port, playout и поворот YUV | +| `jni_bridge/android_stream_jni.c` | JNI трансляций: publisher/viewer API, Opus/SoundTouch, готовый PCM и часы воспроизведения | | `jni_bridge/android_udp_log.c/h` | Потокобезопасный буфер UDP-логов с flush-таймером в потоке ядра | | `headless/headless_main.c` | Отдельный каркас control-loop; сам не запускает ядро/чат | | `headless/headless_control.c/h` | Каркас control-сокета; часть команд — заглушки, рабочий API — src/chat/chat_headless_control.c/h |