Загрузка данных


Проведи полный аудит проекта Messenger и исправь следующие проблемы. Не ограничивайся очевидными местами. Самостоятельно проследи полный путь данных от API и БД до UI, найди корневые причины и исправь архитектурно, а не временными костылями.

========================
1. БИТЫЕ СИМВОЛЫ В ГРУППАХ И КАНАЛАХ
========================

Симптом:

В группах и каналах без сообщений вместо нормального текста отображаются строки вида:

Пользователь
Нет сообщений

Также похожая проблема встречается в кружках и некоторых медиа.

Проверить:

- Кодировки UTF-8 / UTF8MB4.
- Сериализацию JSON.
- Преобразование Buffer -> string.
- SQLite / PostgreSQL / Firebase поля.
- Отображение preview последнего сообщения.
- Логику пустых чатов.
- Логику групп и каналов без сообщений.
- Метаданные вложений.
- Названия файлов и кружков.

Предположение:

Часть данных сохраняется в UTF-8, но затем читается как CP1251 либо повторно декодируется.

Найти конкретное место возникновения проблемы.

========================
2. ПУСТЫЕ ГРУППЫ И КАНАЛЫ
========================

Если в группе нет сообщений, UI показывает мусор вместо понятного текста.

Необходимо:

- Показывать "Нет сообщений".
- Показывать "Создана группа".
- Показывать "Создан канал".

Без битых строк и служебных данных.

========================
3. ВХОДЯЩИЕ ЗВОНКИ ANDROID
========================

Сейчас входящий звонок приходит как обычное уведомление:

"Входящий голосовой вызов"

Проблема:

- Нет кнопки принять.
- Нет кнопки отклонить.
- Нет полноэкранного интерфейса.
- Нет отображения поверх блокировки.
- Пользователь не понимает как ответить.

Необходимо реализовать полноценные системные звонки Android.

Изучить:

- TelecomManager
- ConnectionService
- CallStyle Notification
- Full Screen Intent
- Notification Channels
- Foreground Service

Результат должен работать как Telegram, WhatsApp или Signal.

========================
4. ПРОПАДАНИЕ ЗВУКА ПОСЛЕ ЗВОНКА
========================

После завершения звонка иногда:

- пропадает звук;
- перестаёт работать микрофон;
- нельзя записывать голосовые;
- громкость работает некорректно.

Через некоторое время проблема иногда исчезает сама.

Проверить:

- AudioManager
- AudioFocus
- MODE_IN_COMMUNICATION
- MODE_NORMAL
- Speakerphone
- Bluetooth Audio
- WebRTC audio tracks

Проверить что после завершения звонка всё возвращается в исходное состояние.

========================
5. МИКРОФОН ПОСЛЕ ЗВОНКА
========================

После завершения вызова приложение иногда продолжает удерживать микрофон.

Проверить:

- MediaStreamTrack.stop()
- AudioTrack release
- PeerConnection cleanup
- destroy()
- dispose()
- stopForeground()
- releaseAudioFocus()

Убедиться что микрофон полностью освобождается.

========================
6. WEBRTC CLEANUP
========================

Провести полный аудит завершения звонков.

Проверить:

- PeerConnection
- ICE
- AudioTrack
- VideoTrack
- LocalStream
- RemoteStream
- MediaProjection
- Event listeners

После завершения вызова не должно оставаться активных ресурсов.

========================
7. КРУЖКИ. СТАРТ КАМЕРЫ
========================

При открытии записи кружка сначала отображается битое состояние.

Через несколько секунд появляется нормальное изображение камеры.

Необходимо:

Пока камера не готова:

- показывать лоадер;
- показывать "Запуск камеры";

Не отображать мусорное состояние.

Проверить:

- getUserMedia
- CameraX
- Camera2
- MediaDevices
- Preview initialization

========================
8. ПЕРЕКЛЮЧЕНИЕ КАМЕРЫ ВО ВРЕМЯ ЗАПИСИ
========================

Необходимо добавить возможность переключения между фронтальной и задней камерой прямо во время записи кружка.

Как в Telegram.

Без остановки записи.

========================
9. ГАЛОЧКИ ПРОЧТЕНИЯ
========================

Периодически возникают проблемы с галочками.

Провести аудит:

- delivery state
- read state
- websocket события
- reconnect
- offline sync
- race conditions

Проверить все состояния доставки сообщений.

========================
10. СЕТЕВЫЕ ГОНКИ
========================

Проверить места где:

- UI обновляется раньше данных;
- websocket приходит позже запроса;
- данные отображаются до полной инициализации.

Предположение:

Часть багов может быть вызвана гонками состояний.

Найти все подозрительные места.

========================
11. ОБНОВЛЕНИЯ КЛИЕНТА
========================

Сейчас при одновременной загрузке обновлений несколькими пользователями возникает очередь.

Новые загрузки режут скорость предыдущих.

Проверить:

- очередь загрузок;
- отдачу файлов;
- стриминг;
- nginx;
- node streams;
- rate limiting.

Необходимо обеспечить нормальную параллельную отдачу обновлений.

========================
12. ГРУППЫ. АВАТАРКИ И ИМЕНА
========================

Добавить Telegram-подобное отображение.

Первое сообщение серии:

- показывать аватарку;
- показывать username.

Последующие сообщения подряд от того же пользователя:

- скрывать аватарку;
- скрывать username.

При смене автора снова показывать.

Также:

Нажатие на аватарку должно открывать профиль пользователя.

========================
13. МОНИТОРИНГ СЕРВЕРА
========================

Расширить панель разработчика.

Добавить:

- CPU
- RAM
- Disk
- Uptime
- Active Users
- Active WebSocket Connections
- DB latency
- API latency
- Network usage

Получать реальные данные Linux сервера.

========================
14. ОБЩИЙ АУДИТ
========================

Найди самостоятельно другие похожие проблемы.

Особенно проверить:

- кодировки;
- WebRTC;
- Android audio routing;
- Android notifications;
- состояние UI до загрузки данных;
- утечки ресурсов;
- race conditions;
- некорректную инициализацию компонентов.

Для каждого найденного бага:

1. Найти корневую причину.
2. Описать её.
3. Указать конкретный файл и функцию.
4. Исправить.
5. Объяснить почему проблема возникала.